我正在使用一些MIP模型,这些模型只有二进制变量作为整数变量,表示网络中的可选元素。我不想求解完整的MIP,而是想尝试一种算法,在该算法中,我执行以下步骤:
据我所知,使用warmstarts作为最后一个解决方案(包括solve()调用后通过变量修正进行的更改)将有助于该算法提供可行的解决方案,并为模型绑定。在第2步和第3步中,我还使用deactivate()和activate()方法来更改目标和移除约束。对于约束,我还编写了代码,在重新激活后将变量设置为可行的解决方案。
执行时
results=优化器。求解(self.pyM,warmstart=True,tee=True)
在使用GUOONY时,GUOONY似乎没有使用pyomo模型中的当前变量值,而是只使用上一次解决()结果中的值,而没有随后的更改(将变量固定为1/0,调整约束值)。我假设这是因为如果我不重新激活约束并运行一个模型,其中没有二进制文件可以被删除,日志报告一个工作的MIP开始,而当激活它时,它确实给出了相同的输出:
Read MIP start from file /tmp/tmp3lq2wbki.gurobi.mst
[some parameters settings and model characteristics]
User MIP start did not produce a new incumbent solution
User MIP start violates constraint c_e_x96944_ by 0.450000000
不管我是否注释掉调整值的代码。我还希望代码片段能够正常工作,因为我单独测试了它,并在display()方法的帮助下检查了约束体的值是否位于两个边界之间。在步骤2中,日志中只有上面的read MIP起始行,但没有说明发生了什么。
是否可以告诉Pyomo使用Pyomo模型中的值,或者更新。mst文件和更新的pyomo模型值?
我发现了这个古洛比持久类https://pyomo.readthedocs.io/en/stable/library_reference/solvers/gurobi_persistent.html
我试过了
import pyomo.solvers.plugins.solvers.gurobi_persistent as gupyomo
[...]
test = gupyomo.GurobiPersistent(model = self.pyM)
for variable in adjustedVariables:
test.update_var(variable)
test.update()
但这既不会产生输出/错误,也不会改变行为。因此,我认为这不是正确的方法,或者我用错了。
其他信息:古罗比9.0。2俾莫5.7。1.
如果代码的特定部分可能会有帮助我可以提供他们但我不确定是否和什么部分可以相关的问题
所以似乎对我有用的是
优化器。在我的代码开头使用优化器设置_实例(self.pyM)。每当我修改变量var[index]之类的内容时,更新_var(var[index]),而不是上面的代码。