#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"}>}