Получите все возможные решения в Python, пока Gurobi работает - PullRequest
0 голосов
/ 12 марта 2020

Использование библиотеки gurobipy Python для Gurobi Я хотел бы получить все возможные модели во время работы решателя, чтобы хранить или обрабатывать их на лету. Я обнаружил, что обратные вызовы кажутся лучшим способом сделать это. Однако:

  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)

1 Ответ

0 голосов
/ 12 марта 2020

В настоящее время нет другого способа, кроме (a) запрашивать значения решения из обратного вызова. В целом, только улучшающие решения должны быть найдены как «новое решение». Чтобы быть уверенным, вы можете сравнить объективное значение с предыдущим действующим.

Вы также можете использовать параметр SolFiles , чтобы сразу же записать новые решения на диск.

...