Cplex 给出错误结果

问题描述 投票:0回答:2

我创建了一个示例

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-ToolsSCIP 求解器)进行了测试,给出了正确的结果。

我错过了什么?

mathematical-optimization cplex or-tools mixed-integer-programming scip
2个回答
1
投票

如果你改变

Integer
 A
End

进入

Generals
 A
End

您将得到正确的解决方案


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.