Cplex 给出错误的结果
Cplex giving wrong result
我创建了一个示例 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 文件中的关键字,很长一段时间以来(可能在 CPLEX 之后)已被弃用V4.0,1995 年)。它保留在代码中只是为了与旧的 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
视为二进制变量。
我创建了一个示例 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 文件中的关键字,很长一段时间以来(可能在 CPLEX 之后)已被弃用V4.0,1995 年)。它保留在代码中只是为了与旧的 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
视为二进制变量。