Параметры описывают данные, требуемые моделью, и указывают, как модель будет ссылаться на значения данных в последующих выражениях. Простейшее объявление параметра состоит из ключевого слова param и имени:
param T;
В любой точке модели после этого объявления, - T может использоваться для ссылки на числовое значение.
Общий вид конструкции объявления параметров
Общий вид конструкции объявления параметров имеет следующий вид:
param name alias indexing attributes;
attributes могут быть одним из следующих типов:
- binary
- integer
- symbolic
- relop expr, relop: < <= = == != <> > >=
- in sexpr
- = expr
- default expr
Ключевое слово integer ограничивает параметр целыми числами. binary ограничивает значение 0 или 1. Если указано symbolic (символический) значение, то параметр может принимать любое литеральное или числовое значение (с округлением, как для членства в наборе), Атрибуты, включающие операторы сравнения, указывают, что параметр должен удовлетворять заданному отношению. Атрибут in указывает на то, что значения параметра должны находится в заданном наборе интервале. Атрибуты = и default аналогичны соответствующим атрибутам в объявлениях наборов и являются взаимоисключающими. Рекурсивные определения индексированных параметров разрешены, если присвоенные значения могут быть вычислены в последовательности, которая ссылается только на ранее вычисленные значения. Например:
param N =5; param comb{n in 0..N, k in 0..n} = if k=0 or k=n then 1 else comb[n-1,k-1] + comb[n-1,k]; display comb;
вычисляет количество сочетаний из n по k, то есть как количество всех (нестрогих) подмножеств (выборок) размера k в n-элементном множестве.
В рекурсивном определении symbolic (символьного) параметра ключевое слово symbolic должно предшествовать всем ссылкам на параметр.
Чаще всего за именем в объявлении параметра следует индексное выражение:
param avail{1..T}; # Индексирование по параметру T param demand{DEST,PROD}; # Индексирование 2-м наборам DEST,PROD param revenue{p in PROD, AREA[p], 1..T}; # Индексирование по набору PROD, индексированному набору AREA[p] и параметру T
Параметр определен для каждого элемента набора, указанного в выражении индексации. Таким образом, параметр однозначно определяется его именем и связанным с ним элементом набора. В остальной части модели можно обращаться к этому параметру, написав его имя и заключив в квадратные скобки «подписки»:
avail[i] #Если индексирование выполняется по простому набору, тогда имеется один нижний индекс. demand[j,p] revenue[p,a,t]
Если индексирование выполняется по набору пар, троек или длинных кортежей, тогда должен быть соответствующий список пар, троек или длинных индексов, разделенных запятыми. Индексы могут принимать любую форму для выражений. Неиндексированный параметр является скалярным значением. Параметр, индексированный по простому набору, имеет характеристики вектора или массива, если индексирование происходит по последовательности целых чисел:
param avail{1..T};
Параметры avail[1], avail[2], ... , avail[T], имеют очевидную аналогию с векторами линейной алгебры или массивами языков программирования. Концепция вектора в AMPL носит боле общий характер, и он может быть проиндексирован по наборам строк, которые даже не нужно упорядочивать. Индексирование по наборам строк лучше всего подходит для параметров, которые соответствуют местам, продуктам и другим объектам, для которых нумерация не является особенно естественной. Индексирование по последовательностям чисел больше подходит для параметров, которые соответствуют неделям, этапам и т.п., которые по своей природе имеют тенденцию быть упорядоченными и пронумерованными.
Параметр, индексированный по набору пар, похож на двумерный массив или матрицу. Если индексирование выполняется по всем парам из двух наборов, как в:
set ORIG; set DEST; param cost {ORIG,DEST};
тогда параметр cost[i,j] имеет аналогию с матрицей - хотя индексы, скорее всего, будут строками, а не числами. Однако если индексирование выполняется по подмножеству пар:
set ORIG; set DEST; set LINKS within {ORIG,DEST}; param cost {LINKS};
тогда cost[i,j] существует только для тех i из ORIG и j из DEST, для которых определены значения (i,j) в LINKS. В этом случае cost - это «разреженная» матрица.
Аналогичные комментарии применимы к параметрам, индексированным для троек и длинных кортежей, которые напоминают массивы более высокого измерения в языках программирования.
Использование параметра для определения элементов набора
Значения параметра могут используются для отбора элементов нового набора S_Test:
set Set_A; set Set_B; set Set_C; param P_Test {Set_A, Set_B, Set_C}; set S_Test = {i in Set_A, j in Set_B: exists{k in Set_C} P_Test[i,j,k] > 0}; В набор S_Test войдут элементы наборов Set_A, Set_B, для которых значение P_Test[i,j,k] > 0.