关于SCIP求解大型LP:指定初始解限时寻优的技术咨询
大型LP求解:指定初始解并优化SCIP效率
问题背景
使用SCIP求解大型LP问题耗时30秒,推测预求解步骤是主要耗时原因。需求为:向求解器提供一个优于随机初始化的初始可行解,使其在限定时间内找到更优的可行解。
SOPLEX邮件列表官方回复(中文翻译)
针对该需求,可通过以下配置调整SCIP的行为:
- 关闭或弱化预求解:若预求解是耗时核心,可直接关闭预求解来减少启动耗时。在SCIP中执行参数设置:
SCIPsetIntParam(scip, "presolving/maxrounds", 0);若不想完全关闭,也可降低预求解轮数(例如设为5),平衡预求解的优化效果与耗时。 - 导入自定义初始可行解:SCIP支持导入用户提供的可行解,具体操作步骤如下:
- 创建解对象:
SCIPcreateSol(scip, &sol, NULL) - 为每个变量设置初始值:
SCIPsetSolVal(scip, sol, var, your_initial_value) - 验证解的可行性:
SCIPisSolFeasible(scip, sol, TRUE, &is_feasible) - 确认可行后,将解添加至求解器:
SCIPaddSol(scip, sol, FALSE)
- 创建解对象:
- 调整参数以优先寻找更优解:为让求解器在限定时间内优先改进可行解,可配置以下参数:
- 设置时间限制:
SCIPsetRealParam(scip, "limits/time", 你的限时秒数) - 提高启发式算法调用频率,例如随机舍入启发式:
SCIPsetIntParam(scip, "heuristics/randround/freq", 5),快速生成更优的可行解 - 降低分支定界的优先级,让求解器将更多资源投入到启发式找解中:
SCIPsetIntParam(scip, "branching/pscost/priority", -1)
- 设置时间限制:
内容的提问来源于stack exchange,提问作者Zohar Levi
相关产品推荐
相关产品推荐

