Как написать, если условие в CPLEX OPL - PullRequest
0 голосов
/ 26 марта 2020

Я создаю набор с именем BlockBelow, как показано в следующем коде (это является частью более крупной модели).

При этом я получаю некоторые блоки как пустые - данные таковы, что вероятно дать пустые наборы для некоторых блоков. Однако я хочу сделать проверку и заполнить пустые наборы BlockBelow, как показано ниже

{blockType} BlockBelow[b1 in PitBlocksType] =
     {b | b in PitBlocksType: b1.i == b.i -1 &&
                        (b1.k  == b.k ) &&
                         (b1.j  == b.j) };





execute{
for(var i in PitBlocksType){

if ( BlockBelow[i] == {} ) BlockBelow[i] = i;

writeln(i, BlockBelow[i]);
  }
} 

Код без строки if дает вывод, как показано ниже в журнале сценариев, где видны пустые наборы, которые необходимо заполнить:

<"P74" 2 3 10> {<"P106" 3 3 10>}
 <"P75" 2 3 11> {<"P107" 3 3 11>}
 <"P76" 2 3 12> {}
 <"P77" 2 4 2> {<"P108" 3 4 2>}
 <"P78" 2 4 3> {<"P109" 3 4 3>}
 <"P79" 2 4 4> {<"P110" 3 4 4>}
 <"P80" 2 4 5> {<"P111" 3 4 5>}
 <"P81" 2 4 6> {<"P112" 3 4 6>}
 <"P82" 2 4 7> {<"P113" 3 4 7>}
 <"P83" 2 4 8> {<"P114" 3 4 8>}
 <"P84" 2 4 9> {<"P115" 3 4 9>}
 <"P85" 2 4 10> {<"P116" 3 4 10>}
 <"P86" 2 4 11> {<"P117" 3 4 11>}
 <"P87" 3 2 2> {}
 <"P88" 3 2 3> {}
 <"P89" 3 2 4> {}
 <"P90" 3 2 5> {}
 <"P91" 3 2 6> {}
 <"P92" 3 2 7> {}

Я получаю ошибку для оператора if. Любые предложения о том, как преодолеть это - либо с помощью if, либо с помощью любого другого метода для достижения цели заполнения пустых множеств i

---- РЕДАКТИРОВАТЬ ПОСЛЕ ОТВЕТА -------- -------

Извините, я забыл упомянуть, что {blockType} является кортежем

tuple blockType {
    key string id;
    int i;
    int j;
    int k;
 };

Я попробовал функцию card (), но это не так не работает для кортежа

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Чтобы проверить, сколько элементов у вас в наборе:

{int} a={1};
{int} b={};

int sizea=card(a);
int sizeb=card(b);

execute
{
var sizea2=Opl.card(a);
var sizeb2=Opl.card(b);
var sizea3=a.size;
var sizeb3=b.size;

writeln(sizea,sizea2,sizea3);
writeln(sizeb,sizeb2,sizeb3);
}

, что дает

111
000
1 голос
/ 26 марта 2020

В сценариях вы не можете использовать {} в качестве литерала для наборов для представления пустого набора. Вы можете использовать функцию card () , чтобы получить мощность множества. Пустой набор будет иметь мощность 0.

...