Создайте список кортежей в OPL со сценариями, основанными на условиях

#cplex #opl

#cplex #opl

Вопрос:

Я пытаюсь написать скрипт на OPL, который будет принимать матрицу nxm из единиц и 0 и возвращать для каждого n соответствующее m, где значение равно 1.

Допустим, я определил свои данные следующим образом:

 col = {"r1","r2","r3"};
row = {"s1","s2"};
value = [   [1 0 1]
            [1 0 0]]; 
  

Мой код выглядит примерно так прямо сейчас:

 {string} row = ...;
{string} col = ...;
float value[row][col] = ...;
{string} t = {};

tuple P {
  string id;
  {string} list;

{P} myPs;

execute {
  for (var i in row) {
    t.clear();
    var id = i;
    for (var j in col) {
        if (value [i][j] == 1)
            {t.add(j);}
    }
    myPs.add(id, t);;
  }    
  writeln(myPs);
}
  

Я пытаюсь получить результат, который будет:

 {   <"s1" {"r1" "r3"}>
    <"s2" {"r1"}>}
  

Прямо сейчас результатом mypsявляется:

 {   <"s1" {"r1"}>
    <"s2" {"r1"}>}
  

Ответ №1:

Для модели я бы предпочел написать

 {string} row = ...;
{string} col = ...;
float value[row][col] = ...;


tuple P {
  string id;
  {string} list;
}

{string} listPerId[id in row]={j | j  in col: value[id][j] == 1};

{P} myPs={<id,listPerId[id]> | id in row};

execute {
writeln(myPs);
}  
  

который дает

 {<"s1" {"r1" "r3"}> <"s2" {"r1"}>}