Отдельные элементы набора
Можно разрешить параметру представлять значения символьных строк. Для этого необходимо указать ключевое слово symbolic в объявлении параметра. Значения символического параметра могут быть строками или числами, как и элементы набора. Строковые значения не могут участвовать в арифметике. Основная цель использования символических параметров заключается в назначении отдельных элементов набора, которые должны обрабатываться специально. Например, в модели транспортного потока есть набор пунктов, два из которых обозначены как вход и выход. Символические параметры могут использоваться для представления этих двух элементов:
set INTER; param entr symbolic in INTER; param exit symbolic in INTER, <> entr;
В операторах данных соответствующая строка присваивается каждому символическому параметру:
set INTER := a b c d e f g ; param entr := a ; param exit := g ;
Эти параметры впоследствии используются при определении цели и ограничений.
maximize Entering_Traff: sum{(entr,j) in ROADS} Traff [entr,j]; subject to Balance{k in INTER diff {entr,exit}}:sum{(i,k) in ROADS} Traff[i,k] = sum{(k,j) in ROADS} Traff[k,j];
Описательные строки элементов набора
Другое использование символических параметров - связать описательные строки с элементами набора. Рассмотрим, например, набор origins транспортной модели. Когда мы ввели этот набор, мы описали каждый исходный город с помощью строки из 4 символов и более длинной описательной строки.
Короткие строки стали членами набора ORIG AMPL, в то время как более длинные строки не сыграли никакой дальнейшей роли. Чтобы сделать оба доступны, мы могли бы объявить
set ORIG; param orig_name {ORIG} symbolic; param supply {ORIG} >= 0; Тогда в данных мы могли бы указать: param: ORIG: orig_name supply := GARY "Gary, Indiana" 1400 CLEV "Cleveland, Ohio" 2600 PITT "Pittsburgh, Pennsylvania" 2900 ;
Поскольку длинные строки не имеют формы имен AMPL, их нужно заключать в кавычки. Они по-прежнему не играют никакой роли в модели или получающейся в результате линейной программе, но их можно получить в документальных целях с помощью команд display и printf.
В следующем примере мы сохранением результаты var MG в MG_tot, если они относятся к символическому типу L или R:
model; set NB; # {'NB_10LQ_1', 'NB_10LP_2','NB_20R'} param NB_type {NB} symbolic default "LQ" in {"LQ", "LP", "R"}; #{LQ ="10LQ", LP = "10LP", R = "20"} set NB_tot; #{'NB_10', 'NB_20'} param NB_tot_type {NB_tot} symbolic default "L" in {"L", "R"}; #{L = "10", R="20"} set PD; #{1,2,3,4} var MG {i in NB, j in PD} default 0 ; #<= some_value, >= some_value; param MG_tot {i in NB_tot, j in PD} default 0; data; set NB := NB_10LQ_1 NB_10LP_2 NB_20R ; set NB_tot := NB_10 NB_20 ; param NB_type := NB_10LQ_1 LQ NB_10LP_2 LP NB_20R R ; set PD := 1 2 3 4 ; let{j in PD}MG_tot['NB_10',j]:= sum{i in NB: NB_type[i] = 'LQ' or NB_type[i] ='LP'}MG[i,j]; let{j in PD}MG_tot['NB_20',j] := sum{i in NB: NB_type[i] = 'R'} MG[i,j];
Еще один пример использования символических параметров для описания модели:
set M; # ресурсы set K; # продукты set Kall{M} within K; # Kall[m] - набор всех продуктов, произведенных на ресурсе m param mu{K} symbolic in M; # mu[k] ресурс, на котором производится продукт k sum {i in Kall[mu[k]]}… Kall[mu[k]] - это совокупность всех продуктов, которые производятся на ресурсе, производящем продукт k.
Использование Symbolic параметра для доступа к элементам набора
Symbolic параметр можно использовать для доступа к элементам набора по значению параметра.
set A:= {'a','b'}; param B{A} symbolic; let B['a']:= 'a1'; let B['b']:= 'b1'; display {i in A: B[i] == 'a1'};