约束 - 线性规划 - CPLEX

时间:2016-05-21 18:21:27

标签: linear-programming cplex

如何在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

谢谢,

1 个答案:

答案 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表示数字足够大(它们在remxremy上形成一个约束)。或者,您可以使用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%正确)。