我创建了一个示例
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 求解器)进行了测试,给出了正确的结果。
我错过了什么?
如果你改变
Integer
A
End
进入
Generals
A
End
您将得到正确的解决方案
Integer
(或 Integers
、或 Int
、或 Ints
)是 LP 文件中的一个关键字,已被弃用很长时间(可能在 1995 年的 CPLEX V4.0 之后)。它保留在代码中只是为了与旧的 LP 文件兼容,并且在写入 LP 文件时不会被 CPLEX 使用。
它曾经的工作原理如下。如果指定了变量的界限,则该变量是一般整数。如果未指定界限,则该变量是二进制的。
在您的情况下,由于
A
没有出现在 Bounds
部分中,因此它被视为二进制变量。事实上,它在 CPLEX 计算的解决方案中所具有的值与此一致。
在 CPLEX Interactive 中使用
display problem all
将显示 CPLEX 已知的整个问题。在你的情况下,这结束于
[...]
Bounds
0 <= x1 <= 40
0 <= M <= 1
2 <= x4 <= 3
0 <= A <= 1
All other variables are >= 0.
Binaries
M A
您可以看到 CPLEX 如何将
A
视为二元变量。