Cplex求解test.lp模型返回错误结果,OR-Tools(SCIP)求解正常是何原因
问题描述
我创建了一个示例test.lp文件,内容如下:
Maximize y Subject To +x1+100M+3M2+x4-y+A=0 x1-M-M2-10x4>=-20 x1 - 3 M + M2 <= 100 M - 3.5 x4 + M2= 0 A+x1<=140 Bounds x1<= 40 2 <= x4 <= 3 0<=x1 Binary M Integer A End
我使用全部默认设置,依次执行命令read test.lp -> opt -> d sol v -求解,得到的结果如下:
Variable Name Solution Value y 172.500000 x1 40.000000 M 1.000000 M2 9.500000 x4 3.000000 A 1.000000
但正确结果应为y=271.5和A=100,其余变量的取值没有问题。我用Google OR-Tools的SCIP求解器测试同一模型得到了正确结果,请问我遗漏了什么设置,或是操作哪里有误?
问题原因与解决方法
这个问题通常是求解器预设(presolve)阶段的处理逻辑异常,或者LP文件解析时符号识别错误导致的,可按以下步骤排查解决:
- 先验证读入的模型和你编写的内容是否一致,执行
disp prob vars命令查看所有变量属性:
确认A的类型为整数、下界为0,且第一个约束中A的系数为+1、y的系数为-1,老旧版本的CPLEX等求解器经常会因为行首多余的加号出现系数解析错误的问题。 - 关闭求解器预设功能后重新求解:
先执行set preind 0命令关闭预设,再执行opt求解,基本就能得到正确结果。预设功能会在求解前自动化简模型,部分场景下会错误识别整数变量的系数方向,导致遗漏最优解。 - 可以在LP文件的
Bounds块中明确声明整数变量A的上下界,哪怕上界标注为A <= 1e6也可以,避免部分求解器对无显式上界的整数变量做异常默认处理。
内容的提问来源于stack exchange,提问作者Dr.PB
相关产品推荐
相关产品推荐

