В настоящее время я расследую МИЛП в Пьомо с Гуроби. Я хотел бы иметь возможность добавлять сокращения во время 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
Спасибо.