Функция обратного вызова в gurobipy выдает сообщения об ошибках - PullRequest
0 голосов
/ 12 марта 2019

Во время работы над моим проектом мне нужно изменить модель 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, ни где я мог бы найти и проверить это.Буду признателен за любую помощь.

Я не включил всю модель, так как она работает нормально.Если это важно для решения, я отредактирую вопрос и добавлю код.

1 Ответ

0 голосов
/ 12 марта 2019

Вы должны вызвать optimize следующим образом:

m.optimize(cb)

Метод optimize ожидает аргумент функции типа.

В вашем коде cb(m, gb.GRB.Callback.MIP) будет оцениваться (и станет константой) перед началом оптимизации.

В случае cb2 это просто выводит 3002, т. Е.целочисленное представление gb.GRB.Callback.MIP_NODCNT.( См. Здесь. ) Аргумент optimize оценивается как None.

В случае cb, вызов cbGet пытается получить доступ к обратному вызову модели, которыйне определено.Это NoneType в сообщении об ошибке.

...