Определение и использование именованного окружения
Точно так же, как существует текущая проблема в любой точке сеанса AMPL, также существует текущее окружение environment. В то время как проблема включает в себя список нефиксированных переменных и невыбранных целей и ограничений, окружение записывает значения всех параметров AMPL. Присваивая имена различным средам, скрипт может легко переключаться между различными наборами настроек параметров.
В режиме работы по умолчанию, текущая среда всегда имеет то же имя, что и текущая проблема. В начале сеанса AMPL текущая среда называется Initial, и каждый последующий оператор problem, который определяет новую именованную проблему, также определяет новое окружение, имеющее то же имя, что и проблема. Окружение изначально наследует все настройки параметров, которые существовали при ее создании. Вновь созданное окружение сохраняет дополнительные настройки, которые используются пока она актуальна.
Любое problem или solve, которое изменяет текущую проблему, также переключается на соответственно названную среду с соответствующими параметрами.
В качестве примера, скрипт для проблемы раскроя устанавливает модель и данные, а затем выполняет нужные действия:
option solver cplex, solution_round 6; option display_1col 0, display_transpose -10; problem Cutting_Opt: Cut, Number, Fill; option relax_integrality 1; problem Pattern_Gen: Use, Reduced_Cost, Width_Limit; option relax_integrality 0;
Опции solver и три других изменяются (с помощью первых двух операторов option) перед любым оператором problem. Следовательно, их новые настройки наследуются и остаются неизменными в дальнейшей части сценария. При определении новой проблемы и новой среды с именем Cutting_Opt, они становятся актуальными. Последующие изменения опции relax_integrality в 1 . После этого, когда Cutting_Opt будет являться текущей проблемой (и средой) в сценарии, relax_integrality будет иметь значение 1. Другой оператор problem и option делают то же самое для проблемы (и среды) Pattern_Gen, за исключением того, что значение параметра relax_integrality равно 0 для этой среды.
Результатом этих первоначальных операторов является обеспечение правильной настройки для каждого из последующих операторов solve в цикле повтора. Результатом решения Cutting_Opt является установка текущей среды в Cutting_Opt, тем самым устанавливая relax_integrality в 1 и вызывая линейное ослабление задачи оптимизации резки.
Точно так же, результатом решения Pattern_Gen является решение проблемы генерации шаблона в виде целочисленной программы. Вместо этого, мы могли бы использовать операторы option в цикле, чтобы переключать настройку relax_integrality, но при таком подходе мы сохранили цикл - ключевую часть сценария - настолько простым, насколько это возможно.
В более сложных ситуациях можно объявить именованные среды независимо от именованных проблем, используя оператор, который состоит из ключевого слова environment, за которым следует имя:
environ Master;
Окружение имеет свое собственное пространство имен. Если имя ранее не использовалось в качестве имени окружения, тогда оно связывается со всеми текущими значениями параметров. В противном случае оператор устанавливает значения параметров в соответствии с настройками этой среды. Ранее объявленная среда также может быть связана с новой именованной проблемой. Помещая environ и имя среды перед двоеточием в операторе problem:
problem MasterII environ Master: ...
Именованная среда автоматически становится текущей, когда связанная с ней проблема становится актуальной. Обычное создание среды с тем же именем, что и проблема, в этом случае отменяется.
Удалено: Индексированная коллекция сред может быть объявлена в операторе environ, поместив индексное выражение AMPL после имени среды. Затем имя «подписывается» обычным способом для обозначения отдельных сред.
Именованные среды обрабатывают изменения так же, как и именованные проблемы. Если значение параметра изменяется, когда какая-то конкретная среда является текущей, записывается новое значение, и это значение будет восстанавливаться всякий раз, когда эта среда снова станет текущей.