【问题标题】:How to minimize total cost of external resource in MRCPSP?如何最小化 MRCPSP 中外部资源的总成本?
【发布时间】:2021-04-19 06:20:48
【问题描述】:

您好,我正在尝试制作一个具有目标函数的模型,以最大限度地降低模式 2 使用成本(使用外部资源的模式)。当我想限制总时间

tuple Task {
  key int id;
  {int} succs;
  int RelDate;
}
{Task} Tasks = ...;

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

dvar interval Taskss [t in Tasks] in t.RelDate..(maxint div 2)-1; 
dvar interval mode[m in Modes] optional  size m.pt;
dexpr int totaltime = sum(m in Modes) presenceOf(mode[m]) * ( m.pt); //boolean expression
//dexpr int totalExtCost = sum(m in Modes) presenceOf(mode[m])* (m.ExtCost * m.pt);


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 sum(m in Modes) (m.ExtCost * m.pt) * maxl (presenceOf(mode[m]));
//minimize max(t in Tasks) endOf(Taskss[t]);
  
subject to {
 //Alternative mode of resource productivity in Cost's unit
  forall (t in Tasks, m in Modes) {
 // if(m.costprod *m.pt == 0 && 0 <= 559717712) presenceOf(mode[first(Modes)]);
  
    alternative(Taskss[t], all(m in Modes: m.taskId==t.id) mode[m]);
}
forall (t in Tasks, m in Modes)
  (sum(t in Tasks)sum(m in Modes) m.costprod * m.pt <= 285740966 in 0..NbDays-14) != presenceOf(mode[first(Modes)]);
  
//External resource's budget limitation
forall ( t in Tasks, m in Modes )
  totaltime <= 50;
//forall ( m in Modes )
  //totalExtCost <= 30000000;
 //Resource Usage
  forall (r in IntRes)
    IntResUsage[r] <= CapIntRes[r];
  forall (r in ExtRes)
    ExtResUsage[r] <= CapExtRes[r];    

【问题讨论】:

    标签: optimization scheduling cplex constraint-programming ibm-ilog-opl


    【解决方案1】:

    您能否简化您的模型以说明您的问题? 我在模型中看不到任何值 50 或 25。

    还有:

    • 我不明白你为什么在这里使用“max”:minimize sum(m in Modes) (m.ExtCost * m.pt) * maxl (presenceOf(mode[m]));

    • 我不明白你为什么要为每个任务和每个模式发布这个约束(!)。它独立于任务和模式: forall ( t in Tasks, m in Modes ) { totaltime

    顺便说一句,出于可读性的原因,您还可以将表达式:“presenceOf(mode[m]) * (m.pt)”改写为“sizeOf(mode[m])”。如果模型持续时间是一个常数,那么从性能的角度来看,这两个公式应该或多或少相似,但如果持续时间是一个决策变量,那么带有“sizeOf(model[m])”的公式肯定会更好。

    【讨论】:

    • 第一个问题应该是使用 min?对不起,因为我还是个新手。对于第二个问题,我想尽量减少成本,应该是有时间限制的吧?顺便说一句,我已经编辑了我的问题
    【解决方案2】:

    对于'min',你不应该使用最小值或最大值,因为你正在处理一个单例,你直接使用presenceOf。

    所以我将公式简化如下:

    dvar interval Tasks [t in Tasks] in t.RelDate..(maxint div 2)-1; 
    dvar interval mode[m in Modes] optional  size m.pt;
    dexpr int totaltime    = sum(m in Modes) sizeOf(mode[m]); 
    dexpr int totalExtCost = sum(m in Modes) (m.ExtCost*sizeOf(mode[m]));
    
    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 totalExtCost;
      
    subject to {
     // Alternative mode of resource productivity in Cost's unit
      forall (t in Tasks)
        alternative(Tasks[t], all(m in Modes: m.taskId==t.id) mode[m]);
      
      // I have no hint what the constraints below are supposed to do !
      // forall (t in Tasks, m in Modes)
      //  (sum(t in Tasks) sum(m in Modes) m.costprod * m.pt <= 285740966 in 0..NbDays-14) != presenceOf(mode[first(Modes)]);
      
      // External resource's budget limitation
      totaltime <= 50;
      // totalExtCost <= 30000000;
      // Resource Usage
      forall (r in IntRes)
        IntResUsage[r] <= CapIntRes[r];
      forall (r in ExtRes)
        ExtResUsage[r] <= CapExtRes[r]; 
    } 
    

    那么我仍然不明白将“totalTime”限制为 50 的问题。它确实不妨碍计算“totalTime=25”的解决方案,即 25

    其实我不明白你的问题。您似乎说“totalTime

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多