【发布时间】:2020-03-12 14:20:00
【问题描述】:
使用Gurobi 的gurobipy Python 库我想在求解器运行时获取所有可行模型,以便即时存储或处理它们。我发现callbacks 似乎是最好的方法。然而:
- 检查
where == GRB.Callback.MIPSOL是否足以获得所有个可行的解决方案,如下面的代码?是否保证目标函数在回调的连续MIPSOL调用之间严格改进? - 如果我尝试从回调内部读取变量的值(下面的
(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