Алгебраическое описание ограничения AMPL может быть записано любым из следующих способов:
arith-expr <= arith-expr arith-expr = arith-expr arith-expr >= arith-expr const-expr <= arith-expr <= const-expr const-expr >= arith-expr >= const-expr
Каждое const-expr должно быть арифметическим выражением, не содержащим переменных, а arith-expr может быть любым допустимым арифметическим выражением(линейным для линейных программ). Для формулировки задачи "по столбцам", один из arith-exprs может быть задан как:
to_come to_come + arith-expr arith-expr + to_come
Чаще всего ограничение типа «шаблон» состоит, как в наших примерах, из to_come, оператора отношения и const-expr. Все линейные ограничения представлены в объявлениях var, а to_come указывает, к чему они относятся. Если ограничение шаблона содержит переменные, они должны быть из предыдущих объявлений var, и модель становится своего рода гибридом между строковой и столбцовой формами.
Выражение для целевой функции может также включать to_come . Если целевая функция - это сумма линейных элементов, полностью определяемых последующими объявлениями var, как в наших примерах, выражение для цели - to_come вовсе может быть опущено.
В объявлении var коэффициенты ограничения могут быть указаны одной или несколькими фразами, состоящими из ключевого слова coeff, необязательного выражения индексации, имени ограничения и арифметического выражения. Если выражение индексации присутствует, коэффициент создается для каждого элемента набора индексации. В противном случае генерируется один коэффициент. Индексное выражение также может принимать специальную форму {if logic-expr}, в этом случае коэффициент генерируется только в том случае, если логическое выражение принимает значение true.
Наши простые примеры требовали только одной фразы coeff в каждом объявлении var, однако в целом отдельная фраза coeff требуется для каждого отдельного индексированного набора ограничений, в котором появляется переменная.
Коэффициенты целевой функции могут быть указаны таким же образом, за исключением того, что ключевое слово obj используется вместо coeff.
Фраза obj в объявлении var аналогична фразе obj, используемой в объявлениях arc для сетей. Коэффициенты ограничения для сетевых переменных, определенных объявлением дуги, обычно задаются фразами from и to, но также могут присутствовать фразы coeff. Они могут быть полезны, если необходимо дать описание по столбцам «боковых» ограничений, которые применяются в дополнение к ограничениям баланса потоков. В качестве примера ниже показано, как можно использовать фразу coeff для модели многопродуктового потока, рассматриваемой здесь, полностью по столбцам.
set CITIES; set LINKS within (CITIES cross CITIES); set PRODS; param supply {CITIES,PRODS} >= 0; # Количество предложения по городам param demand {CITIES,PRODS} >= 0; # Количество спроса по городам check {p in PRODS}: sum {i in CITIES} supply[i,p] = sum {j in CITIES} demand[j,p]; param cost {LINKS,PRODS} >= 0; # стоимость доставки/1000 коробок param capacity {LINKS,PRODS} >= 0; # максимальная вместимость param cap_joint {LINKS} >= 0; # максимальное количество отправленных пакетов / ссылка minimize Total_Cost; node Balance {k in CITIES, p in PRODS}: net_in = demand[k,p] - supply[k,p]; subject to Multi {(i,j) in LINKS}: to_come <= cap_joint[i,j]; arc Ship {(i,j) in LINKS, p in PRODS} >= 0, <= capacity[i,j,p], from Balance[i,p], to Balance[j,p], coeff Multi[i,j] 1.0, obj Total_Cost cost[i,j,p];
Файл netmcol.mod на сайте AMPL.