如何在CPLEX(线性编程)中编写这样的约束?
forall(p in P, x in X, y in Y)
if ((remx[p,x] <= 0) OR (remy[p,y] <= 0)) then
pbl[p,x,y] == 0 // MUST be 0
else
pbl[p,x,y] == 1 OR == 0 // can be 0 or 1
其中pbl是决策变量(矩阵),remx和remy是一个普通的矩阵变量,p,x,y是索引。
我不能使用if-then
谢谢,
答案 0 :(得分:1)
我认为使用(连续)线性编程无法做到这一点,但使用混合整数编程我们可以使用二进制变量。
攻击这种方法的一种方法是使用一堆不等式,如:
remx[p,x] <= 0 + bx[p,x]*M
remx[p,x] >= 0 - (1-bx[p,x])*M
remy[p,y] <= 0 + by[p,y]*M
remy[p,y] >= 0 - (1-by[p,y])*M
pbl[p,x,y] >= bx[p,x]+by[p,y]-1
pbl[p,x,y] <= bx[p,x]
pbl[p,x,y] <= bx[p,x]
bx[p,x],bx[p,x] in {0,1}
其中M
表示数字足够大(它们在remx
和remy
上形成一个约束)。或者,您可以使用Cplex中的指标约束来模拟含义:
bx[p,x]=0 => remx[p,x] <= 0
bx[p,x]=1 => remx[p,x] >= 0
by[p,y]=0 => remy[p,y] <= 0
by[p,y]=1 => remy[p,y] >= 0
pbl[p,x,y] = 1 => bx[p,x]+by[p,y] = 2
pbl[p,x,y] = 0 => bx[p,x]+by[p,y] <= 1
(注意:问题已经改变,因此这些片段不再100%正确)。