Этот фрагмент кода в AMPL правильно решает алгоритм сопоставления пар:
set Student;.
# student tuples inside Student x Student
set Pair within {Student, Student};
# sparse value in that tuples
param value {Pair};
var x {Pair} binary; # decision var
maximize total_value: sum {(i,j) in Pair} value[i,j] * x[i,j];
s.t. perfect_match {i in Student}: # constraint
sum {(i,j) in Pair} x[i,j] + sum {(j,i) in Pair} x[j,i] = 1;
data;
set Student := A B C D E F G H I J;
# sparse set of student tuples
set Pair: A B C D E F G H I J :=
A - - - - - - - - - -
B + - - - - - - - - -
C + + - - - - - - - -
D + + + - - - - - - -
E + + + + - - - - - -
F + + + + + - - - - -
G + + + + + + - - - -
H + + + + + + + - - -
I + + + + + + + + - -
J + + + + + + + + + -;
# sparse matrix with scores
param 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 .;
Этот код работает плавно, но он громоздок, потому что нужно в два раза объявлять, какие кортежи студентов действительны, и значение, связанное с этими кортежами.
Другой вопрос показывает альтернативный синтаксис (показанный ниже) для такой ситуации в ответе. Тот же синтаксис показан в статье 2011 года Дарина Инглэнд из Миннесотского университета (Формулировки математического программирования с использованием AMPL) на стр. 5.
# sparse matrix with scores
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 возникает ошибка:
malformed header: extra ':' (last colon)
Есть ли какое-то решение для определения заданных кортежей и значений заданных кортежей всего в одном объявлении?