Optimization 如何在MRCPSP中最小化外部资源的总成本?

Optimization 如何在MRCPSP中最小化外部资源的总成本?,optimization,scheduling,cplex,constraint-programming,ibm-ilog-opl,Optimization,Scheduling,Cplex,Constraint Programming,Ibm Ilog Opl,嗨,我正在尝试建立一个目标函数模型,以最小化模式2的使用成本(使用外部资源的模式)。当我想要限制总时间0)脉冲(模式[m],m.dmdExtRes[r]),我会感到困惑; 执行{ cp.param.FailLimit=10000; } 最小化和(模式中的m)(m.ExtCost*m.pt)*maxl(模式[m]); //最小化最大任务数endOf(Taskss[t]); 服从{ //以成本为单位的资源生产率替代模式 forall(t在任务中,m在模式中){ //如果(m.costprod*m.p

嗨,我正在尝试建立一个目标函数模型,以最小化模式2的使用成本(使用外部资源的模式)。当我想要限制总时间0)脉冲(模式[m],m.dmdExtRes[r]),我会感到困惑; 执行{ cp.param.FailLimit=10000; } 最小化和(模式中的m)(m.ExtCost*m.pt)*maxl(模式[m]); //最小化最大任务数endOf(Taskss[t]); 服从{ //以成本为单位的资源生产率替代模式 forall(t在任务中,m在模式中){
//如果(m.costprod*m.pt==0&&0,您能简化您的模型以说明您的问题吗? 我在模型中没有看到任何值50或25

此外:

  • 我不明白你为什么在这里使用“max”:
最小化和(模式中的m)(m.ExtCost*m.pt)*maxl(模式[m])


  • 我不明白你为什么要为每个任务和每个模式(!)发布此约束。它独立于任务和模式:对于所有(t在任务中,m在模式中){totaltime对于“最小值”,你不应该使用最小值或最大值,因为你在处理单例时,直接使用的是

    因此,我将简化公式如下:

    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]; 
    } 
    
    t.RelDate..(maxint div 2)-1中的dvar间隔任务[t in Tasks];
    dvar间隔模式[模式中的m]可选大小m.pt;
    dexpr int totaltime=总和(模式中的m)大小(模式[m]);
    dexpr int totalExtCost=sum(模式中的m)(m.ExtCost*sizeOf(模式[m]);
    累积函数输入[输入中的r]=
    和(模式中的m:m.dmdIntRes[r]>0)脉冲(模式[m],m.dmdIntRes[r]);
    累积函数拉伸[r在拉伸中]=
    和(模式中的m:m.dmdExtRes[r]>0)脉冲(模式[m],m.dmdExtRes[r]);
    执行{
    cp.param.FailLimit=10000;
    }
    最大限度地降低总成本;
    服从{
    //以成本为单位的资源生产率替代模式
    forall(任务中的t)
    备选方案(任务[t],所有(模式中的m:m.taskId==t.id)模式[m]);
    //我不知道下面的约束应该做什么!
    //forall(t在任务中,m在模式中)
    
    //(sum(t在任务中)sum(m在模式中)m.costprod*m.pt第一个问题应该是使用min?对不起,因为我还是个新手。第二个问题我想最小化成本,应该是有时间限制,对吗?顺便说一句,我已经编辑了我的问题
    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]; 
    }