Упорядоченные пары
Упорядоченная пара объектов, будь то числа или строки, записывается с объектами, разделенными запятой и заключенными в скобки: ("PITT","STL")
Как предполагает термин «упорядоченный», важно, какой объект стоит первым: ("PITT","STL") не совпадает с (”STL”,"PITT").
Пары могут быть собраны в наборы, как отдельные объекты. Разделенный запятыми список пар может быть заключен в фигурные скобки для обозначения буквального набора упорядоченных пар:
{("PITT","STL"),("PITT","FRE"),("PITT","DET"),("CLEV","FRE")}
{(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)}
Поскольку наборы упорядоченных пар часто бывают большими и подвержены изменениям, они редко появляются явно в моделях AMPL. Вместо этого они описываются символически различными способами.
{ORIG, DEST} {i in ORIG, j in DEST}
В зависимости от того, требует ли контекст фиктивных индексов i и j.
Многопериодная модель производства использует набор всех пар из набора строк (представляющих продукты) и набора чисел (представляющих недели):
{PROD, 1..T} {p in PROD, t in 1..T}
Различные наборы компонентов модели, такие как параметр revenue и переменная Sell, индексируются по этому набору. Когда на отдельные компоненты ссылаются в модели, они должны иметь два индекса, как в revenue[p,t] или Sell[p,t]. Порядок индексов всегда совпадает с порядком объектов в парах. В этом случае первый индекс должен ссылаться на строку в PROD, а второй на число в 1..T.
Индекcное выражение типа {p in PROD, t in 1..T} является AMPL транскрипцией фразы: для всех p в P, t = 1...T из алгебраической записи. В этом случае нет оснований думать в терминах упорядоченных пар. С другой стороны, мы можем модифицировать транспортную модель, чтобы подчеркнуть роль пар «источник-пункт назначения» как «связи» между городами, определив этот набор пар явно:
set LINKS = {ORIG,DEST}; cost и Trans могут быть проиндексированы по LINKS: param cost {LINKS} >= 0; var Trans {LINKS} >= 0;
В целевой функции, сумма затрат на все перевозки может быть записана так:
minimize Total_Cost: sum {(i,j) in LINKS} cost[i,j] * Trans[i,j];
Необходимо обратить внимание, что когда фиктивные индексы проходят через набор пар, таких как LINKS, они должны быть определены в паре: (i,j). Было бы ошибкой суммировать по {k in LINKS}. Полная модель показана ниже.
set ORIG; # origins set DEST; # destinations set LINKS = {ORIG,DEST}; param supply {ORIG} >= 0; # amounts available at origins param demand {DEST} >= 0; # amounts required at destinations check: sum {i in ORIG} supply[i] = sum {j in DEST} demand[j]; param cost {LINKS} >= 0; # shipment costs per unit var Trans {LINKS} >= 0; # units to be shipped minimize Total_Cost: sum {(i,j) in LINKS} cost[i,j] * Trans[i,j]; s.t. Supply {i in ORIG}: sum {j in DEST} Trans[i,j] = supply[i]; s.t. Demand {j in DEST}: sum {i in ORIG} Trans[i,j] = demand[j];
Объявление набора пар координат
Cледующий пример объявляет набор пар координат x и y.
set coord:= {(520.0000, -200.0000),(-961.9101, 314.7838) ...};