Использование библиотеки gurobipy
Python для Gurobi Я хотел бы получить все возможные модели во время работы решателя, чтобы хранить или обрабатывать их на лету. Я обнаружил, что обратные вызовы кажутся лучшим способом сделать это. Однако:
- Достаточно ли проверить
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)