Элементы объявленного набора обычно указываются в файле данных модели AMPL с расширением *.dat. Раздельное размещение математической модели и данных в различных файлах с расширениями *.mod и *.dat соответственно, рекомендуется для большинства приложений математического программирования. Если модель небольшая, тогда можно объявить набор и указать его элементы в одном файле модели *.mod.
Набор представляет собой совокупность ноль (пустой набор) или более элементов.
В AMPL набор записывается в виде списка элементов, разделенных запятыми, между фигурными скобками "{}".
{1, 2, 3, 4, 5, 6, 7, 8, 9 }
set PROD default {};
Объявление элементов набора в режиме model
model; set PROD = {1, 2, "u","p"}; set PROD2 = PROD diff {1}; display PROD2;
В данном случае необходимо все элементы набора обернуть фигурными скобками "{}", а строковые элементы набора – обернуть одинарными ‘ ’ или двойными “ ” кавычками. В этом случае, если пользователь решит назначить элементы набора PROD далее в режиме data, данная запись вызовет сообщение об ошибке AMPL:
PROD was defined in the model.
Однако, определение элементов набора в области model лучше всего ограничить случаями, когда количество элементов в наборе невелико, а сам набор является фундаментальным элементом модели, или не ожидается частого изменения его элементов.
Объявление элементов набора в режиме data
model; set PROD; set PROD2 = PROD diff {1}; data; set PROD := 1, 2, u p; display PROD2;
Здесь, командой model мы переводим интерпретатор AMPL в режим model. Затем, в режиме model объявляем набор с именем PROD. Далее, мы объявляем второй набор с именем PROD2 через ранее объявленный набор PROD, исключив из него элемент {1}. После этого, мы переводим AMPL в режим data и назначаем элементы набора PROD. В заключение, мы инициируем отображение для пользователя элементов набора PROD2. Обратите внимание, что AMPL делает различие между 1, и набором {1}, который состоит из одного элемента. Так, запись: set PROD2 = PROD diff 1;
приведет к ошибке т.к. из набора можно исключить или добавить только элементы другого набора (перечень которых должен быть заключен в фигурные скобки {}), но никак не строковые или числовые значения 1, 2, u p. В пределах действия оператора data, запятая воспринимается AMPL как пробел. Поэтому элементы набора (u p) могут разделяться знаком «,» либо любым количеством пробелов.
Пример: Объявление набора на основе данных других наборов с использованием функции match
model; set PROD:= {'HSTT', 'QRTL', 'HSPQ', 'HSET', 'LNK', 'SPLNK', 'XGHS'}; set PROD2:= {i in PROD: match (i,'HS') and match (i,'TT')};
Набор PROD2 формируется из элементов набора PROD у которых в названии одновременно встречаются сочетания 'HS' и 'TT'