如何在Cplex中进行条件求和?喜欢Excel中的sumifs?

时间:2015-01-31 14:54:58

标签: sum constraints conditional mathematical-optimization cplex

我想在我的模型中对所有使用过的资源进行求和(它的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]; 

但它没有用。它在运行后在问题浏览器中产生了真正的约束(我不知道为什么)并且它使这个约束无效。

任何想法如何解决它?

2 个答案:

答案 0 :(得分:1)

有几种方法可以将您的问题放入整数编程框架中。关于这个主题有books。我认为这是最简单的表述。

我认为在你的问题中,r [i,k]和d [i]是已知的,并且时间范围被分解为离散的时间段。

  • on [i,t]指示活动i在时间t处于活动状态
  • 开始[i,t]指示活动i在时段t开始时开始
  • 结束[i,t]指示活动i在时段t结束时完成

所以在[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;
}