gurobipy 中的回调函数产生错误消息

Callback function in gurobipy yields error messages

在处理我的项目时,我需要使用回调函数更改我的 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'

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

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

您应该按如下方式调用 optimize

m.optimize(cb)

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

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

cb2 的情况下,这只是打印 3002,即 gb.GRB.Callback.MIP_NODCNT 的整数表示。 (See here.) optimize 的参数计算结果为 None.

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