如何通过Gurobi获取所提供MIP起始解的目标值
Gurobi 计算预设MIP起始解对应目标值的实现方案
问题背景
在Gurobi建模流程中,我们可以通过为变量设置start属性的方式便捷传入自定义MIP初始解,基础实现示例如下:
from gurobipy import Model mdl = Model() x = mdl.addVar(vtype="I") y = mdl.addVar(ub = 5, vtype="I") # 为变量设置自定义起始解 x.start = 2.0 y.start = 1.0 mdl.setObjective(x*x - y*y) mdl.addConstr(x <= 2.0*y) mdl.optimize()
在上述示例中,我们预设的起始解(x=2, y=1)对应的目标值为3。实际需求是:通过Gurobi内置接口直接获取这个预设起始解的目标值,不需要手动代入目标函数逐值计算。
实际使用时存在两个使用限制:
mdl.objVal属性仅能在调用mdl.optimize()完成完整求解流程后才可访问- 求解完成后
mdl.objVal返回的是求解得到的最优解目标值,并非我们预先设置的起始解的目标值
具体实现方法
Gurobi的Model类内置calcObjVal()方法,可直接基于当前模型中已存入的变量解值,代入目标函数计算返回对应的目标值,全程不需要触发完整的优化求解流程。
操作逻辑非常直接:
- 完成所有变量
start属性的赋值,将自定义起始解全部写入模型上下文 - 无需调用
optimize(),直接调用mdl.calcObjVal()即可拿到对应目标值
修改后的可直接计算起始解目标值的示例代码如下:
from gurobipy import Model mdl = Model() x = mdl.addVar(vtype="I") y = mdl.addVar(ub = 5, vtype="I") x.start = 2.0 y.start = 1.0 mdl.setObjective(x*x - y*y) mdl.addConstr(x <= 2.0*y) # 直接计算当前预设起始解对应的目标值 init_obj_val = mdl.calcObjVal() print("预设起始解的目标值为:", init_obj_val)
代码运行后输出的结果为3,和手动计算的结果完全一致。
使用注意事项
calcObjVal()仅做目标值的代入计算,不会校验当前的变量值是否满足所有约束的可行性,无论解是否合法都能返回计算结果- 该接口不依赖模型的求解状态,哪怕模型还未执行过
update()操作、没有完成优化求解,只要目标函数和变量的解值已经在模型上下文中存在,就能正常返回计算结果 - 如果后续手动修改变量的解值(比如临时给
x.X赋其他值),calcObjVal()会实时基于最新的变量值计算目标,不会固定指向最初设置的start属性值
内容的提问来源于stack exchange,提问作者Ronaldinho
相关产品推荐
相关产品推荐

