如何在SCIP中完全禁用预求解(presolve)功能?
如何在SCIP中完全禁用预求解功能?
要彻底禁用SCIP的预求解功能,仅设置你提到的lp/presolving = false、concurrent/presolvebefore = false、presolving/maxrounds = 0是不够的——SCIP的预求解由多个独立子模块组成,默认部分子模块仍会执行初始简化操作。你需要添加并设置以下所有参数,或者通过API直接关闭全量预求解:
方法1:通过参数文件设置
将以下参数全部添加到你的SCIP配置文件,或通过命令行/API逐个设置:
presolving/maxrounds = 0 presolving/maxrestarts = 0 lp/presolving = false concurrent/presolvebefore = false presolving/dualreds = false presolving/aggressive = false presolving/fiximplied = false presolving/implied = false presolving/strongreds = false presolving/zerocoeffs = false
这些参数的作用分别是:
- 关闭预求解的轮次循环与重启机制
- 禁用LP求解阶段的预处理
- 关闭并行求解前的预求解步骤
- 逐一禁用对偶简化、激进预求解、隐含变量固定、隐含约束推导、强约束简化、零系数清理等所有预求解子模块
方法2:通过SCIP API直接关闭(更便捷)
如果是通过C/C++/Python等API调用SCIP,可在创建SCIP实例后直接执行:
// C API示例 SCIPsetPresolving(scip, SCIP_PARAMSETTING_OFF);
这个调用会一次性关闭所有预求解相关模块,无需逐个设置参数。
设置完成后,你的原始模型将完全保留:THATROW和LASTROW约束不会被删除,COLONE、COLTHREE等变量也不会被固定为单点值,此时SCIPgetDualSolVal和SCIPgetVarRedcost就能返回对应原始模型变量与约束的正确结果。
内容的提问来源于stack exchange,提问作者Peter Notebaert
相关产品推荐
相关产品推荐

