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