Как решить ошибку «Обратные вызовы отключены в gurobi»? - PullRequest
0 голосов
/ 01 апреля 2020

В настоящее время я расследую МИЛП в Пьомо с Гуроби. Я хотел бы иметь возможность добавлять сокращения во время B & B и обнаружил, что функции обратного вызова могут быть использованы для этой цели. Однако, когда я пытаюсь реализовать функцию обратного вызова, я получаю следующую ошибку: «обратные вызовы отключены для решателя gurobi» (или: обратные вызовы отключены для gurobi_persistent). Эта ошибка не кажется очень распространенной, у кого-то есть опыт с ней?

Я совершенно новичок в Pyomo и gurobi.

Мой код следующий (пример, который я нашел в документации по Pyomo).

from gurobipy import GRB
import pyomo.environ as pe
#from pyomo.core.expr.taylor_series import taylor_series_expansion

m = pe.ConcreteModel()
m.x = pe.Var(bounds=(0, 4))
m.y = pe.Var(within=pe.Integers, bounds=(0, None))
m.obj = pe.Objective(expr=2*m.x + m.y)
m.cons = pe.ConstraintList()  # for the cutting planes

def _add_cut(xval):
    # a function to generate the cut
    m.x.value = xval
    return m.cons.add(m.y >= ((m.x - 2)**2))

_add_cut(0)  # start with 2 cuts at the bounds of x
_add_cut(4)  # this is an arbitrary choice

opt = pe.SolverFactory('gurobi_persistent')
opt.set_instance(m)
#opt.set_gurobi_param('PreCrush', 1)
#opt.set_gurobi_param('LazyConstraints', 1)

def my_callback(cb_m, cb_opt, cb_where):
    if cb_where == GRB.Callback.MIPSOL:
        cb_opt.cbGetSolution(vars=[m.x, m.y])
        if m.y.value < (m.x.value - 2)**2 - 1e-6:
            cb_opt.cbLazy(_add_cut(m.x.value))

opt.set_callback(my_callback)
opt.solve()
assert abs(m.x.value - 1) <= 1e-6
assert abs(m.y.value - 1) <= 1e-6

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...