Обход элементов набора в наборе кортежей с использованием OPL - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь смоделировать проблему, используя OPL, cplex.Я застрял в ограничении.У меня есть набор кортежей в формате:

N_set = {
 <1, {180}>
 <8, {546, 154}>
 <11, {193, 532, 43, 363}>
 ...
};

Так что я в основном пытаюсь использовать структуру карты.Учитывая целое число, я хочу быть в состоянии достигнуть набора основных ответвлений к нему.Я использовал кортеж, который включает в себя набор для достижения этой цели.Приведенный ниже код не является полным, это упрощенная версия того, что я пытаюсь сделать, но все еще не работает.Ниже приведена ошибка, которую я получаю:

Определение формального параметра "t2" типа {int} не поддерживается в этом контексте.

В основном я хочу узнать, как яможно перебирать элементы j в этом наборе t2 .Предположим, dec1 и dec2 - мои переменные решения.Моя структура выглядит следующим образом:

tuple Neighborhood {
 int e1;
 {int} neigh;  
}

{Neighborhood} N_set = ...;

forall(p in P)
{               
    sum(<t1, t2> in N_set, j in t2) dec1[j][p]) == card(t2) * dec2[p]; 
};

Я совершенно новый для языка.Может быть, то, что я пытаюсь сделать, совершенно неправильно.Буду признателен за любые предложения.

Спасибо.

1 Ответ

2 голосов
/ 08 мая 2019

Вы не можете суммировать по кортежу так, как вы пытались. Тем не менее, вы можете написать это так:

sum(t in N_set, j in t.neigh) ...

Вместо того, чтобы поднимать поле кортежа в t1 и t2, вы просто получите их в t.e1 и t.neigh сейчас.

...