二进制 LP 与整数 LP
binary LP vs. integer LP
我想知道为什么以下线性程序之间存在差异。它们写在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
是的,这是 lpSove
的一个小怪癖,与单变量约束有关。
在您的问题 A 中,设置 'bin x' 最终会覆盖约束 'x >=1.' 这就是为什么给出 0 作为最优解的原因。
Note that for bounds on variables, you should not put labels before
them. This is because lp_solve then makes this an extra restriction.
If you don't put a label before single variables then lp_solve doesn't
have to create an extra row for bounds on variables, resulting in better performance.
So it is better to write:
x1 >= 1;
than
r_x1: x1 >= 1;
Note that this is only for single variables, so
myrow: x1 + x2 >= 2;
performs as well as
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
我想知道为什么以下线性程序之间存在差异。它们写在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
是的,这是 lpSove
的一个小怪癖,与单变量约束有关。
在您的问题 A 中,设置 'bin x' 最终会覆盖约束 'x >=1.' 这就是为什么给出 0 作为最优解的原因。
Note that for bounds on variables, you should not put labels before them. This is because lp_solve then makes this an extra restriction. If you don't put a label before single variables then lp_solve doesn't have to create an extra row for bounds on variables, resulting in better performance.
So it is better to write:
x1 >= 1;
than
r_x1: x1 >= 1;
Note that this is only for single variables, so myrow: x1 + x2 >= 2;
performs as well as
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