我已将变量 Itvs[units][activities][results] 定义为间隔,将 resAlloc 定义为整数。 resAlloc 的值影响 Itvs 中每个间隔的大小。然而,当尝试使用 cumulFunction-pulse 计算每天分配的总资源时,我遇到了一个限制,因为 resAlloc 被声明为决策变量 (dvar),无法在这种情况下直接处理。
int reqRes [u in units][i in activities][r in resources] = sum (t in unitTypes) unitConfig [u][t] * resInAct [t][i][r];
dvar interval resItvs [units][activities][resources] optional;
dvar int+ allocRes [units][activities][resources];
dexpr int resDuration [u in units][i in activities][r in resources] = (reqRes[u][i][r] != 0) ? reqRes[u][i][r] div allocRes[u][i][r]: 0;
cumulFunction resUsage [r in resources] =
sum(u in units, i in activities) pulse(resItvs[u][i][r], allocRes[u][i][r]);
我的目标是利用累积函数 resUsage,遵守资源可用性所施加的限制。
forall (r in resources) resUsage [u] <= resAvail [r]
除了使用pulse或cumulFunction之外,可能还有其他可用的方法。 谢谢。
您可以使用替代法来进行乘法。
using CP;
range r=1..5;
dvar interval it;
dvar interval it_alternatives[r] optional;
cumulFunction c=sum(i in r)pulse(it_alternatives[i],10*i);
dvar int x in r;
maximize x;
subject to
{
alternative(it,it_alternatives);
startOf(it)==2;
endOf(it)==4;
c<=30;
x==sum(i in r) (i*presenceOf(it_alternatives[i]));
}
int v[i in 0..5]=cumulFunctionValue(c,i);
execute
{
writeln(v);
writeln(x);
}
给予
[0 0 30 30 0 0]
3