lp_solve 忽略琐碎的限制

lp_solve ignoring trivial restrictions

我为 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

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

是的,当 lp_solve 进行预处理时,它完全消除了您的约束。然后 X 是二进制的事实开始出现并且 Objective 函数显示为 100。(错误地)

您可以通过 运行 -stats 标志看到这种情况:

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

零约束和 nan% 密度可能导致这种意外行为。

有几个解决方法。

  1. 如果你完全消除 X bin; 约束,它会正确解决它并给你一个 objective 值 0。

  2. 另一个 'hack-like' 修复是向您的普通约束添加一个虚拟变量。现在整个约束由 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%

希望对您有所帮助。