我试图表明变量x,y,z必须全部不同,并且它们只接受值1,2或3(当然,这是一个玩具示例):
min: x+y+z;
1 <= x <= 3;
1 <= y <= 3;
1 <= z <= 3;
但为了完成这项工作,我仍然需要访问布尔运算符或者!=运算符,这在lpsolve中似乎不存在!我怎么能这样做?我想这样做:
x != y;
x != z;
y != z;
由于
编辑:
这是我目前的代码:
/* Objective function */
min: 1;
/* Variable bounds */
1 <= x1 <= 4;
1 <= x2 <= 4;
1 <= x3 <= 4;
1 <= x4 <= 4;
x1 + x2 + x3 + x4 = 10;
x1 < x2;
x2 < x3;
x3 < x4;
int x1;
int x2;
int x3;
int x4;
lpsolve给我的结果是:
x1 = 1
x2 = 3
x3 = 3
x4 = 3
这是错误的。为什么呢?
答案 0 :(得分:0)
总的来说,我会同意迈克尔·拉法格(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
那么(i) x+1 <=y
和(ii)是琐碎的,但是如果r=1
那么(ii) y+1 <= x
和(i)是琐碎的。
现在我们从上方将解决方案应用于OP问题时,我们可以为OP问题和M=4
中的所有变量对建立一个不等式(i)和(ii)的线性程序:
/* 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