微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Pyomo模型中的更新值进行热启动

如何解决使用Pyomo模型中的更新值进行热启动

我正在使用某些MIP模型,这些模型仅具有二进制变量作为整数变量,这些整数变量表示网络中的可选元素。除了要解决完整的MIP之外,我还想尝试一种执行以下步骤的算法:

  1. 解决所有二进制文件都固定为零的问题
  2. 解决所有二进制文件都固定为一个的问题
  3. 使用目标差异作为预算,从选项库中删除一些目标成本太高的二进制文件并再次求解;重复此步骤,直到在迭代过程中没有剩余二进制文件或没有二进制文件删除
  4. 解决一些二进制设置为零的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]。,而不是上面的代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。