问题描述
我正在使用某些MIP模型,这些模型仅具有二进制变量作为整数变量,这些整数变量表示网络中的可选元素。除了要解决完整的MIP之外,我还想尝试一种执行以下步骤的算法:
- 解决所有二进制文件都固定为零的问题
- 解决所有二进制文件都固定为一个的问题
- 使用目标差异作为预算,从选项库中删除一些目标成本太高的二进制文件并再次求解;重复此步骤,直到在迭代过程中没有剩余二进制文件或没有二进制文件被删除
- 解决一些二进制设置为零的MIP减少问题,这减少了实际二进制变量的数量
根据我的理解,该算法将受益于使用warmstarts作为最后的解决方案,包括solve()调用之后将通过变量修复进行的更改,从而为模型提供了可行的解决方案。我还使用deactivate()-和activate()方法来更改目标并在步骤2和3中删除约束。对于约束,我还编写了将变量重新激活后将其设置为可行解的代码。
执行时
results = optimizer.solve(self.pyM,warmstart=True,tee=True)
使用Gurobi似乎gurobi不使用pyomo模型中的当前变量值,而是仅使用最后一个solve()-结果中的值,而无需随后进行更改(将变量固定为一/零,为约束)。 我之所以这样假设是因为,如果我不重新激活约束并运行无法删除任何二进制文件的模型,则日志会报告一个有效的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步中,日志中只有上面读取的MIP起始行,但没有说明发生了什么。
是否可以告诉Pyomo使用Pyomo模型中的值,或者使用更新后的pyomo模型值来更新.mst文件?
我发现了这个Gurobi持久班 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 pyomo 5.7.1
如果代码的特定部分可能有帮助,我可以提供它们,但我不确定与该问题是否相关以及哪些部分可能与该问题相关
解决方法
所以似乎对我有用的是使用
optimizer.set_instance(self.pyM) 在我的代码开始时使用 optimizer.update_var(var[index]) 每当我改变一些东西,比如修复变量 var[index]。,而不是上面的代码。