二进制LP与整数LP

时间:2015-01-03 19:05:34

标签: linear-programming lpsolve

我想知道为什么以下线性程序之间存在差异。它们写在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

1 个答案:

答案 0 :(得分:1)

是的,这是lpSove与单变量约束有关的一个小怪癖。

在问题A中,设置'bin x'最终会覆盖约束'x&gt; = 1'。这就是为什么给出0作为最优解。

来自documentation

  

请注意,对于变量的边界,不应该在之前放置标签   他们。这是因为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