CPLEX OPL中的数组

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

我试图在CPLEX中实现一个集合数组。

最终的结果应该是这样的。

{int} Z[1..6] = [{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4},{2,3,4},{2,3,4},{2,3,4}]

每个数组元素都是由另外两个数组衍生出来的。

int X[1..6] = [1,1,1,2,2,2]
int Y[1..6] = [5,5,5,4,4,4]

所以Z的每一个元素代表了数组X和Y的元素之间的ints范围。

我试着用下面的代码来做。

range A = 1..6;
execute calculateZ{
  for(var i in A){
    for(v = X[i]; v <= Y[i]; v++){
      Opl.item(W[i],v-1) = v;
    }
  }
}

我的问题是:

  • -集合数组是否可能?

  • -opl.item在这种情况下似乎并不适用,我试图在CPLEX中实现一个集合数组。

arrays set cplex opl
1个回答
0
投票

你可以使用OPL脚本,但我更愿意依靠OPL建模部分。

int X[1..6] = [1,1,1,2,2,2];
int Y[1..6] = [5,5,5,4,4,4];

{int} Z[i in 1..6] = asSet(X[i]..Y[i]);

execute
{
writeln(Z);
}

给出

[{1 2 3 4 5} {1 2 3 4 5} {1 2 3 4 5} {2 3 4} {2 3 4} {2 3 4}]

PS:

后来你问我如何在脚本中做到这一点。

range r=1..6;

int X[r] = [1,1,1,2,2,2];
int Y[r] = [5,5,5,4,4,4];

{int} Z[i in r] = asSet(X[i]..Y[i]);
{int} Z2[i in r];

execute
{
for(var i in r) for(var j=X[i];j<=Y[i];j++) Z2[i].add(j);  

writeln(Z);
writeln(Z2);
}
© www.soinside.com 2019 - 2024. All rights reserved.