Для обработки особых ситуаций предусмотрены дополнительные функции формата данных AMPL.
Значения по умолчанию
Операторы данных предоставляют значения для параметров конкретной модели. AMPL сообщит об ошибке, если указано значение для несуществующего параметра:
error processing param cost: invalid subscript cost[’PITT’,’DET’,’coils’] discarded.
Erorr:…no value for …[…]
Или, если не указано значение для существующего параметра:
error processing objective Total_Cost: no value for cost[’CLEV’,’LAN’,’coils’]
Сообщение об ошибке появляется обычно после ввода команды solve, когда AMPL пытается использовать параметр-нарушитель. Если одно и то же значение появляется много раз в операторе данных, можно избежать его многократного указания. Фраза default (по умолчанию) предоставляет значение параметра, которое будет использоваться, когда явное значение не задано. Например, если параметр cost проиндексирован по всем возможным тройкам:
set ORIG; set DEST; set PROD; param cost {ORIG,DEST,PROD} >= 0;
тогда, с целью обозначения недействующих маршрутов, можно назначить для таких маршрутов очень высокую стоимость:
param cost default 9999 := [*,*,bands]: FRA DET LAN WIN STL FRE LAF := CLEV 27 9 12 . 26 . 17 PITT 24 . . 13 28 99 . [*,*,coils]: FRA DET LAN WIN STL FRE LAF := GARY . . 11 . 16 . 8 CLEV 23 8 10 9 21 . . PITT . . . . . 81 . ;
Отсутствующим значениям параметра cost["GARY","FRA","bands"], а также значениям, которые явно помечены как "пропущенные" с использованием точки (например, cost["GARY","FRA","coils"]), присваивается значение 9999. Всего присваивается 24 значения по 9999.
Значения по умолчанию default
Функция default особенно полезна, если необходимо, чтобы всем параметрам индексированной коллекции было присвоено одно и то же значение. Например, для модели транспортировки, когда необходимо установить значения запасов и потребностей 1, запись имеет следующий вид:
param supply {ORIG} >= 0; param demand {DEST} >= 0;
В данных указывается только значение по умолчанию:
param supply default 1; param demand default 1;
Поскольку никакие другие значения не указаны, по умолчанию 1 присваивается каждому элементу спроса и предложения. Объявление параметров в модели может включать выражение default. Это альтернативный способ указать значение по умолчанию:
param cost {ORIG,DEST,PROD} >= 0, default 9999;
Однако указанная запись в режиме model приведет к генерации и хранению большого количества 9999 в файле данных. Чтобы избежать этой проблемы, лучше добавить фразу default (по умолчанию) в операторе data. Фраза default должна появляться в модели, если необходимо, чтобы ее значение "по умолчанию" каким-то образом зависело от других данных. Например, разные произвольно большие затраты могут быть заданы для каждого продукта:
param huge_cost {PROD} > 0; param cost {ORIG, DEST, p in PROD} >= 0, default huge_cost[p];
Проиндексированные коллекции наборов
Для индексированной коллекции наборов отдельные операторы данных указывают элементы каждого набора в коллекции. Например, наборы с именем AREA индексируются набором PROD:
set PROD; #продукты set AREA{PROD}; # место продаж для каждого продукта Членство этих наборов задано следующим образом: set PROD:= bands coils ; set AREA[bands] := east north ; set AREA[coils] := east west export ;
Любой из форматов операторов данных для набора, может использоваться с индексированными коллекциями наборов. Единственное отличие состоит в том, что имя набора после ключевого слова set индексируется.
Что касается других наборов, то можно отметить, что одно или несколько значений в индексированной коллекции должны быть пустыми, с пустым списком элементов.
В качестве дополнительного примера рассмотрим определение данных для параметра дохода revenue индексированного по индексированному набору:
set PROD; # продукты set AREA{PROD}; # места продажи для каждого продукта param T > 0; # количество периодов param revenue{p in PROD, AREA[p], 1..T} >= 0;
Поскольку набор индексов AREA[p] потенциально различен для каждого продукта, срезы по первому измерению PROD являются наиболее удобными.
Таблица доходов для каждого продукта p с местами продажи AREA[p] (строки), и неделями с 1..T (столбцы) представлена ниже:
param T := 4 ; set PROD := bands coils ; set AREA[bands] := east north ; set AREA[coils] := east west export ; param revenue := [bands,*,*]: 1 2 3 4 := east 25.0 26.0 27.0 27.0 north 26.5 27.5 28.0 28.5 [coils,*,*]: 1 2 3 4 := east 30 35 37 39 west 29 32 33 35 export 25 25 25 28 ;
Значения по умолчанию default
Если необходимо предоставить оператору данных только те значения индексированной коллекции, которые не являются пустыми, определите пустой набор как значение по умолчанию в модели:
set AREA{PROD} default {};
В противном случае AMPL сообщит о наборах, чьи данные не указаны.
Начальные значения для переменных
При желании можно назначить начальные значения переменным модели, используя любой из вариантов для указания значений параметрам. Имя переменной обозначает ее значение, а имя ограничения обозначает значение связанной двойной переменной. Любой оператор данных param может указывать начальные значения для переменных. Имя переменной или ограничения просто используется вместо имени параметра в любом из форматов, описанных в предыдущих разделах этой главы. Ключевое слово var может быть заменено на param в начале оператора данных. Например, следующая таблица данных присваивает начальные значения для переменной Trans:
var Trans: FRA DET LAN WIN STL FRE LAF := GARY 100 100 800 100 100 500 200 CLEV 900 100 100 500 500 200 200 PITT 100 900 100 500 100 900 200 ;
В качестве другого примера, одна таблица может давать значения для параметров rate, profit и market и начальные значения для переменных Make:
param: rate profit market Make := bands 200 25 6000 3000 coils 140 30 4000 2500 plate 160 29 3500 1500 ;
Все ранее описанные функции для значений "по умолчанию" также применяются к переменным. Начальные значения переменных (а также значения выражений, включающие эти начальные значения) могут быть просмотрены до того, как будет введена команда solve, используя команды display либо print и printf. Начальные значения необязательно передаются решающему устройству. После решения возвращенные переменные больше не имеют своих начальных значений. Но даже в этом случае можно обратиться к начальным значениям, поместив соответствующий суффикс после имени переменной. Наиболее распространенное использование начальных значений - это предоставить оптимальную вероятность для построения решения нелинейной оптимизации. Данный вопрос обсуждается более подробно в главе Нелинейные модели.