Python OR Tools调用SCIP求解MIP的可行解存储与终止条件设置问题
OR-Tools 搭配 SCIP 求解 MIP 问题操作指南
1、获取分支定界迭代过程中的中间可行解
要保存分支定界输出中标注*的局部最优可行解,可通过OR-Tools提供的求解器回调机制实现,在每次SCIP找到新的改进可行解时自动触发回调执行保存逻辑,示例代码如下:
from ortools.linear_solver import pywraplp # 自定义回调类 class SaveIntermediateSolutionsCallback(pywraplp.SolverCallback): def __init__(self, solver, variables): super().__init__() self.solver = solver self.variables = variables # 用于存储所有中间可行解,可自行修改为落盘等逻辑 self.intermediate_solutions = [] def Run(self): # 监听「找到新原可行解」事件,对应输出中带*的解 if self.Event() == pywraplp.Solver.BRANCHING_SOLUTION: current_obj = self.ObjectiveValue() current_var_vals = {var.name(): self.SolutionValue(var) for var in self.variables} self.intermediate_solutions.append({ "objective_value": current_obj, "variable_values": current_var_vals }) # ------------- 调用示例 ------------- # 初始化SCIP求解器 solver = pywraplp.Solver.CreateSolver('SCIP') # 此处省略你自己的建模逻辑(变量定义、约束添加、目标函数设置) # ... # 注册回调 all_vars = [你建模时定义的所有变量对象] callback = SaveIntermediateSolutionsCallback(solver, all_vars) solver.SetCallback(callback) # 启动求解 status = solver.Solve() # 求解结束后可直接读取所有中间解 print(callback.intermediate_solutions)
2、设置终止条件(%gap/运行时长)
两个终止条件可单独或同时配置,先触发的条件会优先结束求解,配置方法如下:
2.1 设置最长运行时长
调用求解器的SetTimeLimit方法即可,入参单位为毫秒,示例:
# 示例设置最长求解时间为1小时 solver.SetTimeLimit(3600 * 1000)
2.2 设置MIP gap阈值
可通过两种方式配置,效果一致:
- 方式一:使用通用MIP参数配置
from ortools.linear_solver.pywraplp import MPSolverParameters params = MPSolverParameters() # 设置相对gap为1%,即上下界差距小于1%时终止 params.SetDoubleParam(MPSolverParameters.RELATIVE_MIP_GAP, 0.01) # 如需设置绝对gap,使用ABSOLUTE_MIP_GAP参数即可 # params.SetDoubleParam(MPSolverParameters.ABSOLUTE_MIP_GAP, 5) # 求解时传入参数 status = solver.Solve(params)
- 方式二:使用SCIP专属参数配置
# 直接设置SCIP参数,同时配置相对gap 1%、绝对gap 5 solver.SetSolverSpecificParametersAsString("limits/gap=0.01, limits/absgap=5")
内容的提问来源于stack exchange,提问作者Julio
相关产品推荐
相关产品推荐

