总的来说,我同意 Michael Laffargue 的观点,即在 lpSolve 中不可能有像a < b
真正的 a,b 这样的东西。但是对于整数表达式,情况有点不同。
也许我们可以从一个更简化的问题开始。让我们考虑两个整数变量 x 和 y 以及一个常数 M 使得
1 <= x <= M and 1<=y<=M
。如果 x 和 y 可能不相等,则 x>y 或 y>x。但由于两者都是整数,因此只有以下不等式之一成立
x+1 <= y
y+1 <= x
我们可以通过引入一个二元变量 r 来强制上述不等式中只有一个成立,使得对于 x,y, r 以下不等式同时成立:
(i) x+1 <= y+ Mr
(ii) y+1 <= x+M-Mr
因为如果r=0
then(i) x+1 <=y
和 (ii) 是微不足道的,但如果r=1
then(ii) y+1 <= x
和 (i) 是微不足道的。
当我们现在将上面的解决方案应用于 OP 问题时,我们可以为来自 OP 问题的所有变量对和 建立一个具有不等式 (i) 和 (ii) 的线性程序M=4
:
/* Objective function */
min: 1;
/* Variable bounds */
1 <= x1 <= 4;
1 <= x2 <= 4;
1 <= x3 <= 4;
1 <= x4 <= 4;
r_12 <= 1;
r_13 <= 1;
r_14 <= 1;
r_23 <= 1;
r_24 <= 1;
r_34 <= 1;
/* This is done automatically because all x1,..,x4 are different
x1 + x2 + x3 + x4 = 10;
*/
/* Apply (i) and (ii) to all pairs of x1,..x4
(i) x+1 <= y + Mr
(ii) y+1 <= x + M-Mr
*/
x1 + 1 <= x2 + 4 r_12;
x2 + 1 <= x1 + 4 - 4 r_12;
x1 + 1 <= x3 + 4 r_13;
x3 + 1 <= x1 + 4 - 4 r_13;
x1 + 1 <= x4 + 4 r_14;
x4 + 1 <= x4 + 4 - 4 r_14;
x2 + 1 <= x3 + 4 r_23;
x3 + 1 <= x2 + 4 - 4 r_23;
x2 + 1 <= x4 + 4 r_24;
x4 + 1 <= x2 + 4 - 4 r_24;
x3 + 1 <= x4 + 4 r_34;
x4 + 1 <= x3 + 4 - 4 r_34;
/*
x1 < x2;
x2 < x3;
x3 < x4;
*/
int r_12;
int r_13;
int r_14;
int r_23;
int r_24;
int r_34;
int x1;
int x2;
int x3;
int x4;
解决上面的 MILP 会得到一个完全x1,..,x4
不同的解决方案:
x1=3
x2=1
x3=2
x4=4