3

我想知道为什么以下线性程序之间存在差异。它们以LP 文件格式编写。我认为这x=1将是两种情况下的最佳解决方案。

方案一:

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
4

1 回答 1

1

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

在您的问题 A 中,设置“bin x”最终会覆盖约束“x >=1”。这就是为什么给出0作为最优解。

文档中:

请注意,对于变量的界限,您不应在它们之前放置标签。这是因为 lp_solve 使这成为一个额外的限制。如果您不在单个变量之前放置标签,则 lp_solve 不必为变量的边界创建额外的行,从而获得更好的性能。

所以最好写:

 x1 >= 1;

 r_x1: x1 >= 1;

请注意,这仅适用于单个变量,因此 myrow: x1 + x2 >= 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
于 2015-01-08T22:08:28.903 回答