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.5A=100,其他变量的值好像没问题。

这也通过 google OR-ToolsSCIP 求解器)进行了测试,给出了正确的结果。

我错过了什么?

如果你改变

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 视为二进制变量。