Есть ли какое-то решение для определения набора кортежей и значений набора
кортежи только в одной декларации?
Редкая версия, которую вы разместили, работает для меня; изначально я получил сообщение об ошибке «пара не является набором», но это было связано с несовпадением регистра с «парой»; как только я это исправил, он сделал именно то, что должен. Я не мог воспроизвести ошибку, которую вы упоминаете. Полный рабочий код:
set Student;
# student tuples inside Student x Student
set Pair within {Student, Student};
# sparse value in that tuples
param value {Pair};
data;
set Student := A B C D E F G H I J;
param: Pair: value: A B C D E F G H I J :=
A . . . . . . . . . .
B 3 . . . . . . . . .
C 5 8 . . . . . . . .
D 1 -4 7 . . . . . . .
E 2 -1 9 2 . . . . . .
F 2 5 3 2 9 . . . . .
G 8 2 1 1 3 -2 . . . .
H 2 3 3 4 5 1 1 . . .
I 13 -1 3 4 4 -5 2 2 . .
J 1 2 6 6 7 -4 5 6 1 .;
(используя AMPL 3.1.0.201510231950, если это имеет значение)
Другие опции для разреженного ввода данных:
param: pair: value :=
A B 3
A C 5
B C 8
...
;
С другой стороны:
param: pair: value :=
[A,*]
B 3
C 5
D 1
...
J 1
[B,*]
C 8
D -4
...
J 2
...
;
Я так и не понял, возможно ли сделать это в двумерной таблице, как код, который вы опубликовали; это было бы более читабельно для небольших наборов данных, но я в основном работаю с большими.
Вы также можете устранить дублирование учеников, объявив «Пара» как набор пар, а затем определив «Студент» как набор всех значений, которые отображаются в качестве одного из членов кортежа в паре:
set Pair dimen 2;
param Value{Pair};
set Students := setof{(i,j) in Pair} i union setof{(i,j) in Pair} j;
Затем определите Pair и Value, как указано выше, и Student получен из Pair.