Чтобы использовать решение к экземпляру модели используются команды model, data, и solve:
model diet.mod; data diet.dat; solve; MINOS 5.5: optimal solution found. 6 iterations, objective 88.2
Команда model присваивает имя файлу, который содержит объявления модели, а команда data объявляет файл, который содержит значения данных для компонентов модели. Команда solve отправляет модель и данные задачи оптимизации - решающему устройству. Результаты решения извлекаются для отображения и проверки. В этом разделе более подробно рассмотрены основные функции AMPL для настройки и решения моделей.
Объявление модели и ввод данных
AMPL взаимодействует с «текущей» моделью, которая после ввода команды solve будет отправлена решателю. В начале интерактивного сеанса текущая модель пуста. Команда model читает объявления объектов модели из файла и добавляет их в текущую модель. Команда data читает данные из файла, чтобы предоставить значения для объектов, ранее объявленных в текущей модели. Таким образом, можно использовать несколько команд model или data для построения задачи оптимизации, считывая различные части модели и данных из разных файлов.
Объекты модели и их данные можно ввести непосредственно в командной строке AMPL. Объявления в моделях, такие как param, var и subject, действуют как команды, которые добавляют компоненты в текущую модель. Операторы данных также действуют как команды, которые предоставляют значения данных для уже определенных компонентов, таких как наборы и параметры. Поскольку операторы модели и данных очень похожи, AMPL нужно сообщить что мы собираемся вводить. AMPL всегда запускается в режиме «model». Оператор data (без имени файла) переключают интерпретатор в режим «данных» data, а оператор model (без имени файла) переключает его обратно. Любая команда (например: option, solve или subject to), которая не начинается как оператор данных data, также имеет эффект переключения режима данных, обратно в режим model. Если модель объявляет более одной целевой функции, AMPL по умолчанию передает их все решателю. Большинство решателей решают только одну целевую функцию. По умолчанию, выбирается первая целевая функция. Команда objective позволяет определить целевую функцию из множества для передачи решателю. Команда состоит из ключевого слова objective, за которым следует имя целевой функции объявленной в декларации minimize или maximize:
objective Total_Number;
Если модель имеет индексированный набор целей, тогда при использовании команды objective, необходимо указать точный нижний индекс целевой функции, чтобы указать, какую из ее модификаций следует выбрать для решения:
objective Total_Cost["A&P"];
Решение модели
Команда solve запускает серию действий. Во-первых, - заставляет AMPL генерировать конкретную проблему оптимизации на основе предоставленной модели и данных. В случае отсутствия на данном этапе некоторых данных, AMPL выдает сообщение об ошибке. Сообщение об ошибке также появляется, если полученные значения данных нарушают какие-либо ограничения, налагаемые фразами в объявлениях var или param или в операторах check. В связи с тем, что ограничение может сложным образом зависеть от множества различных значений данных, AMPL не приступает к проверке данных до тех пор, пока пользователь не введет команду solve. Арифметические ошибки, такие как деление на ноль, также обнаруживаются на этом этапе.
После того, как проблема оптимизации сгенерирована, AMPL переходит в фазу «предварительного решения» presolve, которая пытается облегчить проблему для решателя. Иногда предварительное решение уменьшает размер проблемы так, что ее значительно легче решить. По умолчанию, работа presolve происходит за кулисами, и пользователю не нужно вмешиваться в работу данного этапа. В редких случаях, когда существует более одного оптимального решения для получения необходимого результата пользователь может корректировать алгоритм работы этапа presolve.
…constraint …[…] cannot hold: body <= … cannot be >= …; difference = …
Когда presolve обнаруживает, что решение невозможно, выполнение программы останавливается и не направляется в решатель. Например, если резко сократить доступность одного ресурса в steel4.mod, AMPL выдаст сообщение об ошибке:
model steel4.mod; data steel4.dat; let avail[’reheat’] := 10; solve; presolve: constraint Time[’reheat’] cannot hold: body <= 10 cannot be >= 11.25; difference = -1.25
После выполнения всех проверок и преобразований модели и данных, AMPL отправляет всё выбранному пользователем решателю. Каждая версия AMPL распространяется с определенным решателем по умолчанию, который используется автоматически, если пользователь не определит никаких других инструкций. Указав запись option solver, можно посмотреть название установленного по умолчанию решателя:
option solver; option solver minos;
Если имеется более одного решателя, можно переключаться между ними, изменяя параметр solver:
solve; MINOS 5.5: optimal solution found. 15 iterations, objective 515033 reset; model steelT.mod; data steelT.dat; option solver cplex; solve; CPLEX 8.0.0: optimal solution; objective 515033 16 dual simplex iterations (0 in phase I) reset; model steelT.mod; data steelT.dat; option solver snopt; solve; SNOPT 6.1-1: Optimal solution found. 15 iterations, objective 515033
В этом примере мы сбрасываем модель и данные задачи между решениями, так что решатели вызываются с одинаковыми начальными условиями и их производительность можно сравнить между собой. Без сброса модели и данных, полученное решение, найденное одним решателем, будет передано другому, возможно, предоставляя последнему существенное преимущество. Передача информации от одного решения другому наиболее полезна, когда серию аналогичных проходов нужно отправить одному и тому же решателю.
Практически любой решатель может работать с линейной программой, хотя программы, специально предназначенные для линейного программирования, обычно дают лучшую производительность. Другие виды задач оптимизации, такие как нелинейные и целочисленные, могут быть решены только решателями, разработанными специально для них. Такие сообщения, как «игнорирование целостности» (‘ignoring integrality’) или «не могут обрабатывать нелинейности» (‘can’t handle nonlinearities’), указывают на то, что вы не выбрали решатель, подходящий для вашей модели.
Если оптимизационные задачи не слишком сложны, можно использовать AMPL, не обращаясь к инструкциям для конкретного решателя. Если решение занимает очень много времени, или возвращается в AMPL без какого-либо сообщения «оптимальное решение», то необходимо прочитать инструкцию настроек по используемому решателю. Каждый решатель представляет собой сложный набор алгоритмов и алгоритмических стратегий, из которых можно сделать множество комбинаций выбора. Для большинства задач решатель автоматически делает правильный выбор, но также можно передать свой собственный выбор через параметры AMPL. Подробная информация может варьироваться в зависимости от каждого решателя, поэтому для получения дополнительной информации необходимо обратиться к инструкциям, прилагаемым к AMPL и конкретному решателю. Если для оптимизации задачи требуется много времени, тогда может понадобиться отображение некоторых доказательств прогресса решателя. Указания для этого также содержатся в инструкциях для конкретного решателя.