Python+Google OR-Tools+SCIP求解器如何获取相对MIP gap
解答
完全可以查询,求解器的当前相对MIP gap存储和求解终止的触发条件没有关联,只要求解过程中至少找到了一个可行解,就能直接通过OR-Tools的内置接口获取数值。
具体用法如下:
- 首先确认求解返回状态为
FEASIBLE或者OPTIMAL,仅当存在可行解时gap查询才有意义 - 直接调用求解器实例的
MIPRelativeGap()方法即可获取当前的相对MIP gap,无需手动计算上下界 - 你也可以通过
MIPGap()获取绝对MIP gap,通过Objective().Value()获取当前最优可行解的目标值;MIPRelativeGap()返回的数值逻辑和SCIP原生日志输出的gap完全一致,计算公式为|可行解最优目标值 - 松弛问题下界| / max(|可行解最优目标值|, |松弛问题下界|),自动适配最小化/最大化问题场景
参考代码示例:
from ortools.linear_solver import pywraplp # 初始化SCIP求解器 solver = pywraplp.Solver.CreateSolver("SCIP") # 你的模型构建代码 # ...... # 示例设置30秒时间限制作为终止条件 solver.SetTimeLimit(30 * 1000) # 触发求解 status = solver.Solve() if status in (pywraplp.Solver.OPTIMAL, pywraplp.Solver.FEASIBLE): print(f"当前最优可行解目标值: {solver.Objective().Value():.4f}") print(f"当前相对MIP Gap: {solver.MIPRelativeGap():.4%}") else: print("未找到有效可行解,无法计算MIP Gap")
内容的提问来源于stack exchange,提问作者sixflags
相关产品推荐
相关产品推荐

