【问题标题】:How to terminate gurobi callback using pyomo?如何使用 pyomo 终止 gurobi 回调?
【发布时间】:2021-06-07 04:34:10
【问题描述】:

我正在使用 pyomo 及其“gurobi_persistent”接口来解决 MIP。我试图实现一个回调,它检查一个足够小的最优性差距,如果达到它就会终止。当然,这必须以某种方式发生,即当前的解决方案将被读回 pyomo 模型。我不知道该怎么做。当满足停止条件时,我得到

AttributeError: 'GurobiPersistent' 对象没有属性 '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)

我将不胜感激有关如何实现所需行为的一些提示。 祝你有美好的一天!

【问题讨论】:

    标签: callback pyomo gurobi


    【解决方案1】:

    通过检查 gurobi_directgurobi_persistent 上的 Pyomo 文档,这似乎是不可能的。您需要使用 Gurobi Python API 实现回调。

    实现某个 MIPGap 的另一种方法是简单地将这个间隙设置为 termination value

    【讨论】:

    • 嗨,马特,谢谢您的回答。有时 Pyomo 可能很麻烦。最初,我只打算解决 MIP 模型(实际上是基于 ZIB 所做工作的气体网络 =))。在一年前左右遇到回调的一些问题后,我直接去了 gurobipy。然而,现在我可能也实现了一些非线性模型,并回到 Pyomo 以便能够使用其他求解器,例如 SCIP。 MIPGap 参数建议是一个很好的提示,应该可以解决问题。谢谢!
    • 如果你还是想使用 SCIP,你应该尝试PySCIPOpt 来避开 Pyomo 层。
    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多