You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Google OR-Tools的MPSolver返回首个可行解?RELATIVE_MIP_GAP用法验证

MIP(最大化BP问题)求解:获取首个可行解与RELATIVE_MIP_GAP参数疑问

问题背景

我有一个计算耗时过长的MIP(BP,最大化)问题,希望让MPSolver返回其找到的首个可行解,同时确认自己是否正确使用了RELATIVE_MIP_GAP求解器参数,尝试了两种方法:

方法1:回调函数

查阅文档后发现,MPSolver不支持求解迭代过程的回调机制(仅CpSolver支持),无法实现找到首个可行解即停止的逻辑。

方法2:以相对间隙作为终止准则

我用Kotlin代码尝试设置RELATIVE_MIP_GAP:

val mpSolverParameters = MPSolverParameters().apply {
    setDoubleParam(MPSolverParameters.DoubleParam.RELATIVE_MIP_GAP, 1.0)
}
solver.solve(mpSolverParameters)

根据文档注释,RELATIVE_MIP_GAP设为0.05代表5%的间隙,因此1.0应对应100%的间隙。按预期,设置1.0后求解器找到任意可行解就该停止(我的目标函数始终为正,不存在符号问题,整数解与连续松弛解的相对差异必然在100%范围内),但实际设置未生效:添加时间限制时,求解器会在时间结束后返回解;移除时间限制后,求解器会持续运行,远超之前时间限制的时长仍不返回结果。

可行解决方案

  • Laurent Perron的两项建议均适用于当前场景。
  • 若使用SCIP求解器,可调用solver.setSolverSpecificParametersAsString("limits/solutions = 1")获取首个可行解(解质量较差,可按需增大参数值);同时可调用求解器对象的setTimeLimit(timeInMs)方法设置时间限制,到时间后返回当前找到的最优可行解,未找到解则返回未求解状态。
  • 目前仍未明确RELATIVE_MIP_GAP参数未生效的原因,该参数属于API而非求解器特定参数。

内容的提问来源于stack exchange,提问作者Tamás Sajti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:36:22