在Gurobi运行时,用Python获取所有可行的解决方案



使用Gurobi的gurobipyPython库,我想在求解器运行时获得所有可行的模型,以动态存储或处理它们。我发现回调似乎是最好的方法。然而:

  1. 检查where == GRB.Callback.MIPSOL是否足以获得所有可行的解决方案,如下面的代码所示?是否保证目标函数在回调的连续MIPSOL调用之间严格改进
  2. 如果我试图从回调中读取变量的值(下面的(b)行(,我会得到一个AttributeError,而cbGetSolution(下面的(a)行(工作正常,但会迫使我将返回列表中的每个值映射到适当的变量。有没有办法使(b)生产线正常工作
import gurobipy as gp
from gurobipy import GRB
model = gp.Model("mymodel")
y = model.addVar(vtype=GRB.INTEGER)
x = model.addVar(vtype=GRB.INTEGER)
model.update()
model.addConstr(x + 3 * y <= 1000)
model.addConstr(5 * x + y <= 1000)
model.setObjective(x + y, GRB.MAXIMIZE)
def mycallback(model, where):
if where == GRB.Callback.MIPSOL:
print("Feasible solution:", model.cbGetSolution(model._vars))  # (a) Ok
print("Feasible solution:", x.x, y.x)  # (b) AttributeError
model._vars = model.getVars()
model.optimize(mycallback)
if model.status == GRB.OPTIMAL:
print("Optimal solution:", x.x, y.x)

目前除了(a(从回调中查询解决方案值之外,没有其他方法。一般来说,只有改进的解决方案才能被视为"新的解决方案"。可以肯定的是,您可以将目标值与以前的任职者进行比较。

您还可以使用SolFiles参数立即将新的解决方案写入磁盘。

相关内容

最新更新