提问者:小点点

使用来自Pyomo模型的更新值进行预热


我正在使用一些MIP模型,这些模型只有二进制变量作为整数变量,表示网络中的可选元素。我不想求解完整的MIP,而是想尝试一种算法,在该算法中,我执行以下步骤:

  1. 解决所有二进制文件都固定为零的问题
  2. 解决所有二进制文件固定为一个的问题
  3. 使用目标差异作为预算,从选项库中删除一些目标贡献过于昂贵的二进制文件,然后再次求解;重复此步骤,直到迭代过程中没有保留二进制文件或没有删除二进制文件
  4. 解决简化的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.

如果代码的特定部分可能会有帮助我可以提供他们但我不确定是否和什么部分可以相关的问题


共1个答案

匿名用户

所以似乎对我有用的是

优化器。在我的代码开头使用优化器设置_实例(self.pyM)。每当我修改变量var[index]之类的内容时,更新_var(var[index]),而不是上面的代码。