Массив множеств в CPLEX OPL - PullRequest
       99

Массив множеств в CPLEX OPL

0 голосов
/ 23 апреля 2020

Я пытаюсь реализовать массив множеств в 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;
    }
  }
}

My вопросы:

  • - возможен ли вообще массив множеств?

  • - так, как я могу заполнить элементы моего набора? opl.item в этом случае не работает.

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете использовать сценарии 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);
}
...