如何使用 pyomo 终止 gurobi 回调?
How to terminate gurobi callback using pyomo?
我正在使用 pyomo 及其 'gurobi_persistent' 界面来求解 MIP。我试图实现一个回调,检查是否有足够小的最优性差距,如果达到则终止。当然,这必须以某种方式发生,当前解决方案将被读回 pyomo 模型。我不知道该怎么做。当满足停止条件时,我得到
AttributeError: 'GurobiPersistent' object has no attribute 'terminate'
通常,在 gurobipy 中,语句 model.terminate() 应该有效。
另请参阅下面我的回调定义。
solver = pe.SolverFactory('gurobi_persistent')
solver.set_instance(m)
def my_callback(cb_m, cb_opt, cb_where):
if cb_where == GRB.Callback.MIP:
# General MIP callback
objbst = cb_opt.cbGet(GRB.Callback.MIP_OBJBST)
objbnd = cb_opt.cbGet(GRB.Callback.MIP_OBJBND)
if abs(objbst - objbnd) < percentGap * (1.0 + abs(objbst)):
print('Stop early - {} % gap achieved'.format(percentGap*100))
# statement that does not exist
cb_opt.terminate()
solver.set_callback(my_callback)
solver.solve(tee=True)
如果能提供一些有关如何实现所需行为的提示,我将不胜感激。
祝你有个美好的一天!
从 gurobi_direct and gurobi_persistent 上的 Pyomo 文档来看,这似乎根本不可能。您需要使用 Gurobi Python API.
实现回调
实现特定 MIPGap 的另一种方法是简单地将此间隙设置为 termination value。
我正在使用 pyomo 及其 'gurobi_persistent' 界面来求解 MIP。我试图实现一个回调,检查是否有足够小的最优性差距,如果达到则终止。当然,这必须以某种方式发生,当前解决方案将被读回 pyomo 模型。我不知道该怎么做。当满足停止条件时,我得到
AttributeError: 'GurobiPersistent' object has no attribute 'terminate'
通常,在 gurobipy 中,语句 model.terminate() 应该有效。 另请参阅下面我的回调定义。
solver = pe.SolverFactory('gurobi_persistent')
solver.set_instance(m)
def my_callback(cb_m, cb_opt, cb_where):
if cb_where == GRB.Callback.MIP:
# General MIP callback
objbst = cb_opt.cbGet(GRB.Callback.MIP_OBJBST)
objbnd = cb_opt.cbGet(GRB.Callback.MIP_OBJBND)
if abs(objbst - objbnd) < percentGap * (1.0 + abs(objbst)):
print('Stop early - {} % gap achieved'.format(percentGap*100))
# statement that does not exist
cb_opt.terminate()
solver.set_callback(my_callback)
solver.solve(tee=True)
如果能提供一些有关如何实现所需行为的提示,我将不胜感激。 祝你有个美好的一天!
从 gurobi_direct and gurobi_persistent 上的 Pyomo 文档来看,这似乎根本不可能。您需要使用 Gurobi Python API.
实现回调实现特定 MIPGap 的另一种方法是简单地将此间隙设置为 termination value。