我想知道为什么以下线性程序之间存在差异。它们写在LP file format中。我认为x=1
将是两种情况下的最佳解决方案。
计划A:
min: x;
x >= 1;
bin x;
输出:
Value of objective function: 0
Actual values of the variables:
x 0
程序B(使用整数约束和两个附加约束模拟二进制约束):
min: x;
x >= 1;
x <= 1;
x >= 0;
int x;
输出:
Value of objective function: 1.00000000
Actual values of the variables:
x 1
答案 0 :(得分:1)
是的,这是lpSove
与单变量约束有关的一个小怪癖。
在问题A中,设置'bin x'最终会覆盖约束'x&gt; = 1'。这就是为什么给出0作为最优解。
请注意,对于变量的边界,不应该在之前放置标签 他们。这是因为lp_solve会使这成为额外的限制。 如果你没有在单个变量之前放置标签,那么lp_solve不会 必须为变量的边界创建一个额外的行,从而提高性能。
所以最好写一下:
x1 >= 1;
大于
r_x1: x1 >= 1;
请注意,这仅适用于单个变量,所以 myrow:x1 + x2&gt; = 2;
和
一样好x1 + x2 >= 2;
在问题A中,您有一个变量约束。如果未明确命名,则“bin”声明会覆盖该约束。正如您正确指出的那样,如果您通过命名来明确约束,那么lpSolve将为x1创建一个新行,从而遵守约束并且'bin'不能覆盖它。
min: x;
a: x >= 1.0;
bin x;
会给你:
Value of objective function: 1.00000000
Actual values of the variables:
x 1