Команда: include
AMPL предоставляет несколько команд, которые импортируют данные из других файлов. Команда:
include filename
заменяется содержимым файла filename. include может появляться в любом месте, даже по середине другого утверждения и не требует завершающей точки с запятой.
Команда: Model, data
Команды model и data, которые появляются в большинстве наших примеров, являются особыми случаями include, которые переводят интерпретатор команд в режим модели или данных перед чтением указанного в filename файла. include же оставляет режим без изменений. Для простоты, примеры в этой книге всегда предполагают, что model читает файл объявления модели, а data читает файл значений данных. Можно использовать любое количество model, data и include для чтения любого количества файлов. Единственным отличием указанных команд является режим, который устанавливается в начале чтения. Например, при работе с небольшой моделью может оказаться удобным хранить в одном файле все объявления модели, команды и все операторы данных. Или вариант с отдельными файлами *.mod и *.dat и командой include которая прочитает эти файлы. В качестве иллюстрации, приведен следующий пример: если файл dietu.run содержит следующие команды:
model dietu.mod; data dietu.dat; solve; option display_1col 5; option display_round 1; display Buy;
Тогда команда include dietu.run загрузит модель и данные, запустит решение задачи и отобразит оптимальные значения переменных:
include dietu.run; MINOS 5.5: optimal solution found. 6 iterations, objective 74.27382022 Buy [*] := BEEF 2.0 FISH 2.0 MCH 2.0 SPG 5.3 CHK 10.0 HAM 2.0 MTL 6.2 TUR 2.0 ;
Когда импортируемый файл сам содержит команду include, команды model или data, чтение первого файла приостанавливается, пока включается содержимое импортируемого файла. В этом примере команда include dietu.run вызывает последующий импорт файлов dietu.mod и dietu.dat.
С помощью команды include особенно удобно загружать список параметров среды (изменить параметры по умолчанию), которые пользователь желает установить перед запуском других команд. Можно настроить автоматическое включение такого файла при запуске. Можно даже сделать так, чтобы AMPL записывал такой файл автоматически в конце сеанса, так что бы настройки параметров восстановились при следующем запуске.
Команда: commands
commands filename;
очень похоже на include, но является утверждением, которое требует завершающей точки с запятой и может появляться только в контексте, где утверждение является допустимым.
Чтобы проиллюстрировать использование commands, рассмотрим, как мы могли бы выполнить простой анализ чувствительности многопериодной проблемы производства.
На неделе 3 доступно только 32 часа времени производства, по сравнению с 40 часами в другие недели. Предположим, что мы хотим видеть, какую дополнительную прибыль можно получить за каждый дополнительный час на неделе 3. Мы можем достигнуть этого, путем многократного решения, отображения значений решения и увеличения avail[3]:
model steelT.mod; data steelT.dat; solve; MINOS 5.5: optimal solution found. 15 iterations, objective 515033 display Total_Profit >steelT.sens; option display_1col 0; option omit_zero_rows 0; display Make >steelT.sens; display Sell >steelT.sens; option display_1col 20; option omit_zero_rows 1; display Inv >steelT.sens; let avail[3] := avail[3] + 5; solve; MINOS 5.5: optimal solution found. 1 iterations, objective 532033 display Total_Profit >steelT.sens; option display_1col 0; option omit_zero_rows 0; display Make >steelT.sens; display Sell >steelT.sens; option display_1col 20; option omit_zero_rows 1; display Inv >steelT.sens; let avail[3] := avail[3] + 5; solve; MINOS 5.5: optimal solution found. 1 iterations, objective 549033
Чтобы продолжить использовать значения avail[3] с шагом от 5 до 62, нужно выполнить еще четыре цикла решения таким же образом. Можно избежать необходимости вводить одни и те же команды снова и снова, создав новый файл, содержащий команды для повторения:
solve; display Total_Profit >steelT.sens; option display_1col 0; option omit_zero_rows 0; display Make >steelT.sens; display Sell >steelT.sens; option display_1col 20; option omit_zero_rows 1; display Inv >steelT.sens; let avail[3] := avail[3] + 5;
Если мы вызываем этот файл steelT.sa1, мы можем выполнить все команды в нем, набрав однострочные команды steelT.sa1 нужное количество раз:
model steelT.mod; data steelT.dat; commands steelT.sa1; MINOS 5.5: optimal solution found. 15 iterations, objective 515033 commands steelT.sa1; MINOS 5.5: optimal solution found. 1 iterations, objective 532033 commands steelT.sa1; MINOS 5.5: optimal solution found. 1 iterations, objective 549033 commands steelT.sa1; MINOS 5.5: optimal solution found. 2 iterations, objective 565193
Весь вывод команды display перенаправляется в файл steelT.sens. Можно с таким же успехом заставить вывод появиться на экране. В этом и многих других случаях можно заменить include на commands. В общем, лучше всего использовать commands в командных сценариях, однако, нужно быть внимательным чтобы избежать неожиданного взаимодействия с repeat, for и if утверждениями.