我想在我的模型中对所有使用过的资源进行求和(它的rcpsp模型) 我怎么能在CPLEX中做到这一点? 起初我写了这个:
forall(k in K)
forall(t in 1..f[nAct])
sum(i in I:f[i]-d[i]<=t-1 && t<=f[i]) r[i,k] <= aR[k];
(注意:K是资源的范围,nAct是活动的数量,f [i]是数组dvar并且表示活动i的结束时间,d [i]是i的持续时间,r [i,k]是活动i的k的必需资源,aR [k]是k的可用资源。)
问题是cplex在总和条件下不接受决策变量。 我改成了:
forall(k in K)
forall(t in 1..f[nAct])
sum(i in I) (f[i]-d[i]<=t-1 && t<=f[i])*r[i,k] <= aR[k];
但它没有用。它在运行后在问题浏览器中产生了真正的约束(我不知道为什么)并且它使这个约束无效。
任何想法如何解决它?
答案 0 :(得分:1)
有几种方法可以将您的问题放入整数编程框架中。关于这个主题有books。我认为这是最简单的表述。
我认为在你的问题中,r [i,k]和d [i]是已知的,并且时间范围被分解为离散的时间段。
所以在[i,t]中替换条件f [i] -d [i]&lt; = t-1&amp;&amp; T&LT; = F [I])* R [I,K] 您的约束变为
forall(k in K)
forall(t in 1..f[nAct])
sum(i in I : r[i,k] = 1) on[i,t] <= aR[k];
您还需要添加约束来强制执行on,start和off的定义。
forall(t in 2..f[nAct])
forall(i in I)
on[i,t-1] - on[i,t] = end[i,t-1] - start[i,t];
forall(i in I)
on[i,0] = start[i,0];
forall(i in I)
sum(t in 1..f[nAct]) start[i,t] = 1;
forall(i in I)
sum(t in 1..f[nAct]) end[i,t] = 1;
forall(i in I)
sum(t in 1..f[nAct]) on[i,t] = d[i];
答案 1 :(得分:0)
您可以使用dexpr来操纵决策变量。以下是来自同一资源IBM Knowledge Center的示例。
没有dexpr
dvar int x in 0..20;
dvar int y in 0..20;
dvar int d;
dvar int s;
maximize (d);
subject to {
d==x-y;
s==x+y;
s<=15;
s<=x-2*y;
d>=2;
d<=y+8;
1<=d;
}
使用dexpr
dvar int x in 0..20;
dvar int y in 0..20;
dexpr int d=x-y;
dexpr int s=x+y;
maximize (d);
subject to {
s<=15;
s<=x-2*y;
d>=2;
d<=y+8;
1<=d;
}