Получить решение для релаксации корневых узлов - PullRequest
0 голосов
/ 20 апреля 2019

Я работаю над платформой B & C в Gurobi / Python, и я хотел бы получить оптимальное решение проблемы корневого узла. Как я могу это сделать?

Спасибо.

1 Ответ

2 голосов
/ 20 апреля 2019

Скорее всего, мы захотим использовать 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
...