SCIP库中重复求解MILP问题无响应,求正确实现方案
SCIP同程序对比有无初始解的性能方案
复制问题实例是可行且推荐的方案
直接复制问题实例分别求解是完全正确的做法,这也是SCIP官方常用的对比不同求解场景的方式,能彻底避免首次求解后状态固化导致二次求解无动作的问题。
具体操作步骤
- 初始化第一个SCIP实例(
scip1),加载目标MILP问题,不设置初始解,调用SCIPsolve(scip1)完成求解,记录时间、节点数等性能数据。 - 初始化第二个SCIP实例(
scip2),加载完全相同的MILP问题,将scip1中得到的可行解/最优解通过SCIPstartSol(scip2, NULL, FALSE, FALSE, FALSE)和SCIPsetSolVal(scip2, sol, var, val)接口设为初始解,再调用SCIPsolve(scip2)并记录性能数据。 - 求解结束后分别调用
SCIPfree(&scip1)和SCIPfree(&scip2)释放资源。
重置SCIP状态的替代方案(不推荐)
若不想复制实例,可尝试重置SCIP状态,但操作复杂度高且易出错:
- 调用
SCIPfreeTransform(scip)释放转换后的问题,将SCIP阶段回退至SCIP_STAGE_PROBLEM。 - 重新加载原问题,同时通过
SCIPsetIntParam(scip, "misc/restart", 1)等参数重置求解参数、剪枝树、解池等状态,清理所有残留解。 - 此方法需确保所有求解状态被彻底清理,否则易引发异常,因此更建议用复制实例的方式。
关键注意事项
- 两个实例的问题、求解参数必须完全一致,仅初始解的有无作为变量,保证对比结果的有效性。
- 设置初始解时需确保解的可行性,否则SCIP会自动忽略该解,影响对比结论。
内容的提问来源于stack exchange,提问作者Arseniy Spiridonov
相关产品推荐
相关产品推荐

