在 CP 模型(Laborie 等人 2018 的简化版本)中,我有一个 cumulFunction rUsage 指示随时间变化的材料需求,由当前区间变量的需求率 dmdR 导出:
dvar interval mode[m in Modes] optional size m.pt;
cumulFunction rUsage = sum(m in Modes) pulse (mode[m], m.dmdR)
在我的示例中,材料需求结果如下:
rUsage: stepwise{0 -> 0, 5 -> 1, 4 -> 2, 6 -> 3}
为了满足该材料需求,应先使用 A 类材料,然后再使用 B 类材料。 一段时间内给定量的材料 A 由 supplyA 提供:
int supplyA[h in 1..3] = [5, 100, 5];
我的问题是如何导出物料B的剩余需求,即得到
bUsage: stepwise{0 -> 2, 1 -> 3}
换句话说:如何从 cumul 函数中减去与时间相关的参数,同时确保结果函数非负(例如在给定示例中的时间 2 处)?
我尝试通过附加区间变量和相应的 cumulFunction 对材料 A 的消耗进行建模。然而,我无法对 A 的部分消耗进行建模(在供应高于总物质需求的时期)。
提前致谢!
最终的答案是:
using CP;
range horizon = 0..2;
tuple Mode { key int id; int pt; int dmdR; };
{Mode} Modes = {<1,1,5>, <2,1,4>, <3,1,6>} ;
int capacityA [horizon] = [3, 100, 5];
int capacityB [horizon] = [5, 5, 5];
dvar interval mode[m in Modes] size m.pt;
cumulFunction levelR = sum(m in Modes) pulse(mode[m], m.dmdR);
cumulFunction supplyA = sum(h in horizon) pulse(h, h+1, capacityA[h]);
dvar interval additionalSupplyB[h in horizon] optional in h..h+1;
cumulFunction supplyB = sum(h in horizon) pulse(additionalSupplyB[h], 1, capacityB[h]);
cumulFunction totalSupply = supplyA + supplyB;
dvar sequence line in all(m in Modes) mode[m];
minimize staticLex(max(m in Modes) endOf(mode[m]), sum(h in horizon) heightAtStart(additionalSupplyB[h], supplyB, 0));
subject to {
noOverlap(line);
totalSupply - levelR >= 0;
}
execute{
writeln("----");
writeln("Total Resource Usage: ", levelR);
writeln("----");
writeln("B Usage: ", supplyB);
}