我正在使用Gurobi / Python开发B&C框架,我想检索根节点问题的最佳解决方案。我该怎么办?。
谢谢。
答案 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