【问题标题】:Obtain all feasible solutions in Python while Gurobi is running在 Gurobi 运行时用 Python 获取所有可行的解决方案
【发布时间】:2020-03-12 14:20:00
【问题描述】:

使用Gurobigurobipy Python 库我想在求解器运行时获取所有可行模型,以便即时存储或处理它们。我发现callbacks 似乎是最好的方法。然而:

  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)

【问题讨论】:

    标签: python linear-programming gurobi


    【解决方案1】:

    目前除了 (a) 之外没有其他方法可以从回调中查询解决方案值。 一般来说,只有改进的解决方案才能被认为是“新的解决方案”。可以肯定的是,您可以对照前任者检查客观价值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多