获取根节点松弛解决方案

时间:2019-04-20 15:14:19

标签: python gurobi

我正在使用Gurobi / Python开发B&C框架,我想检索根节点问题的最佳解决方案。我该怎么办?。

谢谢。

1 个答案:

答案 0 :(得分:2)

我们很可能希望使用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