【问题标题】:Constraints - linear programming- CPLEX约束 - 线性规划 - CPLEX
【发布时间】:2016-09-18 21:23:48
【问题描述】:

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

谢谢,

【问题讨论】:

    标签: linear-programming cplex


    【解决方案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% 正确)。

    【讨论】:

    • 有效!但是我留下了一些东西...如果条件为真,pbl[p,x,y] 必须为 0,但如果不是,则可能为 1 或 0...我的意思是,还有其他约束可以管理这个
    • 一种方式的影响通常更容易建模
    • 那么,是否可以不使用混合整数编程?
    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多