我为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
这种行为有什么解释?我做错了什么?当对较大问题存在类似限制时,也会发生这种情况。
答案 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%
零限制和纳米密度可能导致这种意外行为。
有几种解决方法。
如果完全消除X bin;
约束,它将正确解决并给出客观值0。
另一个&#39; hack-like&#39;修复是为您的普通约束添加一个虚拟变量。现在整个约束由lp_solve记录。
例如,尝试将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%
希望有所帮助。