CP 优化器:从 minValue 0 的 cumul 函数中减去时间相关值

问题描述 投票:0回答:1

在 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 的部分消耗进行建模(在供应高于总物质需求的时期)。

提前致谢!

constraint-programming cp-optimizer
1个回答
0
投票

作为记录,可以在此处找到副本和讨论: https://community.ibm.com/community/user/ai-datascience/discussion/cp-optimizer-subtracting-time-dependent-value-from-cumul-function-with-minvalue-0#bm339bc2dd-e890-4892 -ab52-0191e5614233

最终的答案是:

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);
}

© www.soinside.com 2019 - 2024. All rights reserved.