首页 > 解决方案 > If else 在 CPLEX OPL 中的日期

问题描述

我想做,如果第 15 天的总生产任务“i”* 持续时间 <= 不等于我们的目标,则选择替代 2,否则选择替代 1。我在元组上制作了数据。但我仍然无法确定在第 x 天计算的结果必须或多或少。这是我的模型。

Tuple Precedence {
  key int id;
  {int}   succs;
  int RelDate;
  int VolCost;
}
{Precedence} Precedences = ...;

tuple Mode {
  key int taskId;
  key int id;
  int pt;
  int costprod;
  int dmdIntRes [IntRes];
  int dmdExtRes [ExtRes];
}
{Mode} Modes = ...;

dvar interval Tasks [p in Precedences]in p.RelDate..EndMax   ; //in p.RelDate..EndMax in 0..EndMax
dvar interval mode[m in Modes] optional  size m.pt;
//dvar boolean m1 [m in Modes];

cumulFunction IntResUsage[r in IntRes] = 
  sum (m in Modes: m.dmdIntRes[r]>0) pulse(mode[m], m.dmdIntRes[r]);
  
cumulFunction ExtResUsage[r in ExtRes] = 
  sum (m in Modes: m.dmdExtRes[r]>0) pulse(mode[m], m.dmdExtRes[r]);
  
execute {
        cp.param.FailLimit = 10000;
}
 
minimize max(p in Precedences) endOf(Tasks[p]);
subject to {
  forall (p in Precedences, m in Modes) {
 
    alternative(Tasks[p], all(m in Modes: m.taskId==p.id) mode[m])

这是我的模式元组数据示例

Modes = {
  < 0, 1, 3,  700000,[ 2 ], [ 0 ]  >,
  < 0, 2, 2, 1060000,[ 2 ], [ 1 ] >,
  < 1, 1,24,   70313,[ 2 ], [ 0 ]  >,
  < 1, 2,20,   80357,[ 2 ], [ 1 ]  >,
  < 2, 1,24,  143750,[ 5 ], [ 0 ]  >,
  < 2, 2,20,  164286,[ 5 ], [ 1 ]  >,
  < 3, 1, 5, 1500000,[ 6 ], [ 0 ]  >,

标签: optimizationschedulingcplexoplconstruction

解决方案


如何在 OPL 中的替代函数中创建 if 和 else 中所述?

你可以依靠存在

使用您的 .dat

Modes = {
  < 0, 1, 3,  700000,[ 2 ], [ 0 ]  >,
  < 0, 2, 2, 1060000,[ 2 ], [ 1 ] >,
  < 1, 1,24,   70313,[ 2 ], [ 0 ]  >,
  < 1, 2,20,   80357,[ 2 ], [ 1 ]  >,
  < 2, 1,24,  143750,[ 5 ], [ 0 ]  >,
  < 2, 2,20,  164286,[ 5 ], [ 1 ]  >,
  < 3, 1, 5, 1500000,[ 6 ], [ 0 ]  >,
  };

.mod

using CP;

int EndMax=100;
range IntRes=1..1;
range ExtRes=2..2;

tuple Precedence {
  key int id;
  
}
{Precedence} Precedences = {<1>};

tuple Mode {
  key int taskId;
  key int id;
  int pt;
  int costprod;
  int dmdIntRes [IntRes];
  int dmdExtRes [ExtRes];
}
{Mode} Modes = ...;

dvar interval Tasks [p in Precedences]in 1..1000; 
dvar interval mode[m in Modes] optional size m.pt;



 
minimize max(p in Precedences) endOf(Tasks[p]);
subject to {
  forall (p in Precedences, m in Modes) {
 
    alternative(Tasks[p], all(m in Modes: m.taskId==p.id) mode[m]);   
}   

// if then with presenceOf
  forall (p in Precedences)
      (lengthOf(Tasks[p])>=15) == presenceOf(mode[first(Modes)]);

} 

工作,可以帮助你的语法


推荐阅读