【问题标题】:CPLEX: how to use array in summation?CPLEX:如何在求和中使用数组?
【发布时间】:2017-03-16 11:19:35
【问题描述】:

整数规划。 我尝试在 Cplex 中建模以下约束:

i ∑(τ=s-Dur(i)+1)to s x_(i,r,t,τ) ≤1, ∀r,∀t,∀s]

其中 x_(i,r,t,s) 是决策变量。 变量τ=s-Dur(i)+1 用作辅助变量。 无法对包含数组的总和进行建模。谢谢。

 range I = 1..operations;
 range J = 1..surgeons;
 range T = 1..timeBlock;
 range S = 1..timePeriod;
 range R = 1..room;

int Duration[I] =...;


//DVars
dvar int assignment[I][R][T][S] in 0..1;

//Objective function

maximize sum (i in I, r in R, t in T, s in S) (Duration[i] * assignment[i][r][t][s]);


// constraint
forall (r in R, t in T, s in S)
{
sum(i in I, s-Duration[i]+1 in s) (assignment[i][r][t][s-Dur[i]+1]) <= 1;
}

【问题讨论】:

  • 您可能需要进行一些预处理来创建不同的值集和值子集以用作索引集,而不是当前编写总和的方式。

标签: arrays sum cplex


【解决方案1】:

我会将您的约束重写为:

sum(i in I: s-Duration[i]+1 in S) (assignment[i][r][t][s-Duration[i]+1]) <= 1;

还有:

int operations=2;
int surgeons=3;
int timeBlock=2;
int timePeriod=2;
int room=4;
range I = 1..operations;
range J = 1..surgeons;
range T = 1..timeBlock;
range S = 1..timePeriod;
range R = 1..room;

int Duration[i in I] =i;


//DVars
dvar int assignment[I][R][T][S] in 0..1;

//Objective function

maximize sum (i in I, r in R, t in T, s in S) (Duration[i] * assignment[i][r][t][s]);

subject to
{
// constraint
forall (r in R, t in T, s in S)
{
sum(i in I: s-Duration[i]+1 in S) (assignment[i][r][t][s-Duration[i]+1]) <= 1;
}
}

【讨论】:

  • 谢谢,这解决了之前的错误。但是,为了获得正确的功能,我需要以下内容:forall (r in R, t in T, s in S) { sum(i in I: s-Duration[i]+1 in s) (assignment[i][r][t][s-Duration[i]+1]) &lt;= 1; } 将 S 替换为 s,因为我需要总和中的 forall 给出的 s。这可能吗?谢谢。
  • sum(i in I: s-Duration[i]+1 in s) 没有任何意义,因为 s 是一个值,而不是范围或集合。你的意思是在 s..TimePeriod 中吗?
猜你喜欢
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多