lp_solve忽略了琐碎的限制

时间:2018-05-25 11:08:37

标签: linear-programming lpsolve

我为lp_solve制作了一个非常简单的线性问题。

$ cat test.txt 
max: 100X ;

X <= 0 ;

bin X ;

正确答案应该是X必须为0,因为它是一个二进制变量,并且由于限制而不能为1。但结果是:

$ lp_solve test.txt 

Value of objective function: 100.00000000

Actual values of the variables:
X                               1

这种行为有什么解释?我做错了什么?当对较大问题存在类似限制时,也会发生这种情况。

1 个答案:

答案 0 :(得分:0)

是的,当lp_solve执行预处理时,它完全消除了您的约束。然后事实是X是二进制的,并且目标函数显示为100.(不正确)

您可以通过使用-stats标志运行来发现这种情况:

./lp_solve -stat test.lp
Constraints: 0
Variables  : 1
Integers   : 1
Semi-cont  : 0
SOS        : 0
Non-zeros  : 0  density=nan%

零限制和纳米密度可能导致这种意外行为。

有几种解决方法。

  1. 如果完全消除X bin;约束,它将正确解决并给出客观值0。

  2. 另一个&#39; hack-like&#39;修复是为您的普通约束添加一个虚拟变量。现在整个约束由lp_solve记录。

  3. 例如,尝试将test.lp更改为:

    max: 100X ;
    
    X  + x_dummy <= 0 ; 
    
    bin X ;
    

    现在给出了正确的:

    Constraints: 1
    Variables  : 2
    Integers   : 1
    Semi-cont  : 0
    SOS        : 0
    Non-zeros  : 2  density=100.000000%
    

    希望有所帮助。