【问题标题】:CPLEX dvar as conditionCPLEX dvar 作为条件
【发布时间】:2017-06-02 14:42:16
【问题描述】:

我在尝试寻找资源约束调度问题的解决方案时遇到了这个问题。每当我将 dvar 作为 forall 循环中的条件或 if 条件时,我都会遇到错误,指出“不允许决策变量(或表达式)“S”。

range activity = 1..16;
dvar float+ S[activity];

dvar float+ rd[jobs];

forall (i in activity)
 forall (t in T:S[i]<=t<=S[i]+D[i]) //boolean b 
        b[i][t]==1;

forall (t in T)
  forall (k in R)
    sum (i in activity)b[i][t]*V[i][k]<=Rk[k];//human resources constraint

  forall (j in jobs)
  forall (t in T:rd[j]<=t<=S[maxact[j]])//boolean y
  y[j][t]==1;

【问题讨论】:

    标签: linear-programming cplex mixed-integer-programming


    【解决方案1】:

    这是一个非常常见的错误。您正在编写的代码是构建 cplex 的模型。您(dvars,如您的 S)中的 cplex 变量通常在模型求解之前没有值,因此您不能在模型构建过程中使用它们的值。您需要重构您的问题,并且您可能需要在模型中使用额外的 bool 或 int 变量或指示符约束。

    【讨论】:

    • 非常感谢。您的回答非常有用。
    【解决方案2】:
    range activity = 1..16; 
    dvar float+ S[activity];
    range jobs=1..3; 
    range T=1..3; 
    range R=1..4;
    dvar boolean b[activity][T]; 
    dvar boolean y[jobs][T]; 
    int D[activity];
    int Rk[R]; int V[activity][R]; int maxact[j in jobs]=1;
    
    dvar float+ rd[jobs];
    
    subject to { 
     forall (i in activity)  
      forall (t in T) //boolean b 
         ((S[i]<=t) &&(t<=S[i]+D[i])) => (b[i][t]==1);
    
     forall (t in T)   forall (k in R)
      sum (i in activity)b[i][t]*V[i][k]<=Rk[k];//human resources constraint
    
       forall (j in jobs)   forall (t in T)//boolean y  
     ((rd[j]<=t) &&
     (t<=S[maxact[j]])) =>  (y[j][t]==1); 
    }
    

    会起作用

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      相关资源
      最近更新 更多