在 cumulFunction 中使用 dvar int

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

我已将变量 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之外,可能还有其他可用的方法。 谢谢。

resources constraints cplex cumulative-sum opl
1个回答
0
投票

您可以使用替代法来进行乘法。

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
© www.soinside.com 2019 - 2024. All rights reserved.