Скорее всего, мы захотим использовать MIPNODE callback . Обратите внимание, что обратный вызов MIPNODE будет вызываться один раз для каждого прохода разреза во время решения корневого узла. Значение MIPNODE_NODCNT останется равным 0, пока корневой узел не будет завершен. Если вы запрашиваете значения релаксации во время корневого узла, первый обратный вызов MIPNODE даст релаксацию без плоскостей резания, а последний даст релаксацию после применения всех корневых разрезов.
Вот пример, который запрашивает решение для релаксации при каждом проходе разреза в корневом узле (для вычисления объективного значения, для иллюстрации) и завершает оптимизацию после завершения корневого узла.
import sys
from gurobipy import *
def mycallback(model, where):
if where != GRB.Callback.MIPNODE:
return
nodecount = model.cbGet(GRB.Callback.MIPNODE_NODCNT)
if nodecount > 0:
print("Root node completed, terminate now")
model.terminate()
return
if model.cbGet(GRB.Callback.MIPNODE_STATUS) == GRB.Status.OPTIMAL:
x = model.cbGetNodeRel(model._vars)
objval = 0.0
for idx, c in enumerate(model._coef):
objval += x[idx] * c
print(f"Root relaxation value: {objval}")
if len(sys.argv) < 2:
print('Usage: callback.py filename')
quit()
model = read(sys.argv[1])
model._vars = model.getVars()
model._coef = [v.obj for v in model._vars]
model.Params.OutputFlag = 0
model.optimize(mycallback)
Если вы запустите приведенный выше код с примером модели p0033.mps
(распространяется вместе с примерами из установки Gurobi), вы должны увидеть:
Read MPS format model from file /Library/gurobi811/mac64/examples/data/p0033.mps
Reading time = 0.00 seconds
P0033: 16 rows, 33 columns, 98 nonzeros
Root relaxation value: 2839.4918382913806
Root relaxation value: 2941.4
Root relaxation value: 2952.0
Root relaxation value: 2953.325
Root relaxation value: 2966.7142857142853
Root relaxation value: 2972.0083333333337
Root relaxation value: 2973.171211242146
Root relaxation value: 3023.0025940337223
Root relaxation value: 3033.999999999998
Root relaxation value: 3056.7500000000005
Root relaxation value: 3057.8333333333335
Root relaxation value: 3057.8333333333335