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% 密度可能导致这种意外行为。
有几个解决方法。
如果你完全消除 X bin;
约束,它会正确解决它并给你一个 objective 值 0。
另一个 'hack-like' 修复是向您的普通约束添加一个虚拟变量。现在整个约束由 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%
希望对您有所帮助。
我为 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% 密度可能导致这种意外行为。
有几个解决方法。
如果你完全消除
X bin;
约束,它会正确解决它并给你一个 objective 值 0。另一个 'hack-like' 修复是向您的普通约束添加一个虚拟变量。现在整个约束由 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%
希望对您有所帮助。