首页 > 解决方案 > gurobipy 中的回调函数会产生错误消息

问题描述

在处理我的项目时,我需要使用回调函数更改我的 MIP 模型。我密切关注文档,但总是收到错误消息。
我相信,错误来自 cbGet 函数,没有这个,我得到一个输出,虽然我不知道它是否正确。

没有回调函数,我的模型工作得很好。

这是我的代码:

import gurobipy as gb
...
some code with the model
...
def cb(mod, where):
    if where == gb.GRB.Callback.MIP:
        print(mod.cbGet(gb.GRB.Callback.MIP_NODCNT))
def cb2(mod, where):
    if where == gb.GRB.Callback.MIP:
        print(gb.GRB.Callback.MIP_NODCNT)
m.optimize(cb(m, gb.GRB.Callback.MIP))

请注意,如果我cb2用作回调函数,我会得到退出代码 0 和输出。我不确定这个输出是否正确。
但是当我cb用作回调函数时,我收到错误消息

Traceback (most recent call last):
    File "C:/Users/dbigb/PycharmProjects/MA/MIP_model.py", line 39, in <module> m.optimize(cb(m, gb.GRB.Callback.MIP))
    File "C:/Users/dbigb/PycharmProjects/MA/MIP_model.py", line 32, in cb print(mod.cbGet(gb.GRB.Callback.MIP_NODCNT))
    File "model.pxi", line 4136, in gurobipy.Model.cbGet
    AttributeError: 'NoneType' object has no attribute '_cbdata'

我不明白哪个属性是无,既不知道这_cbdata是什么,也不知道在哪里可以找到并检查它。任何帮助,将不胜感激。

我没有包括整个模型,因为它工作正常。如果这对解决方案很重要,我将编辑问题并添加代码。

标签: pythonattributeerrorgurobi

解决方案


您应该optimize按如下方式调用:

m.optimize(cb)

optimize方法需要一个函数类型的参数。

在您的代码中,cb(m, gb.GRB.Callback.MIP)将在开始优化之前进行评估(并成为常量)。

在这种cb2情况下,这只是打印3002,即 的整数表示gb.GRB.Callback.MIP_NODCNT。(见这里。) 的论点optimize计算为None

在这种cb情况下,调用cbGet尝试访问未定义的模型回调。这是NoneType错误消息中的。


推荐阅读