CPLEX OPL 中的集合数组
Array of sets in CPLEX OPL
我正在尝试在 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 的元素之间的整数范围
我试着用下面的代码来做:
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 在这种情况下似乎不起作用。
您可以使用 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);
}
我正在尝试在 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 的元素之间的整数范围
我试着用下面的代码来做:
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 在这种情况下似乎不起作用。
您可以使用 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);
}