Работа с AMPL из командной строки
Модели записываются в виде текстового файла <имя файла>.mod. При написании модели на языке AMPL можно использовать любой текстовый редактор.
При написании моделей используются основные команды AMPL. AMPL‑модель содержит описания объектов модели, т.е. множеств, переменных, параметров, целевой функции и ограничений. Для описания объектов используются служебные слова set,var,param,minimize/maximize,subjectto (или кратко s.t.). При этом AMPL-модель содержит несколько типов элементов, подробнее описываемых ниже: декларации с ключевыми словами: set(множество индексов)param(параметр), var(переменная), arc(дуга – для описания сетевых моделей);из целевых функций вида maximize minimize ограничений subject to (при ограничениях), node (вершина – для описания сетевых моделей).
Во многом синтаксис команд AMPL очень подобен C. AMPL поддерживает такие функции, как abs(), cos(), sin(), log(), sqrt(), exp() с использованием основных операций +, -, *, /, ^ или **. Все команды оканчиваются точкой с запятой «;». К командам вывода относятся display, а также команды write и print. К другим полезным элементам option – для изменения опций AMPL или решателя, include – чтение из отдельного файла, а также quit – для выхода из AMPL.
Имена (идентификаторы) состоят из латинских букв (прописных и строчных), цифр и знаков подчеркивания. Символ # означает начало комментария. Все, что находится за этим символом, игнорируется AMPL. Комментарии могут быть также ограничены символами /* и */, причем они могут отделены друг от друга несколькими строками.
Команды AMPL используют простой синтаксис:
Переменные описываются с использованием служебного слова var.
Параметры описываются с использованием служебного слова param.
Суммирование записывается так: sum{i in 1..n}.
Служебные слова AMPL (такие как var, param, solve, maximizeи др.), а также имена функций (например, sum,log, sin) зарезервированы и не могут использоваться для имен объектов. К служебным зарезервированным словам относятся также for, if, elseif, else, while, file, system.
Индексы переменных и ограничений заключаются в квадратные скобки (например, a[i]).
Числа могут записываться в разных форматах. Так, 0.0123, 1.23D-2, 1.23e-2, 1.23E-2 ‑ это эквивалентные записи одного и того же числа 0,0123.
Литералы – это строки, заключенные в кавычки (одинарные или двойные). Например, ‘abc’, ‘x’, ‘y’, “ABC”.
Команда вида
include <имя файла>
вставляет указанный файл.
Команды
model; include < имя файла >
data; include < имя файла >
могут быть сокращены до следующих:
model < имя_файла >;
data < имя_файла >;
Команда commandsаналогична команде include, но это оператор и должен оканчиваться точкой с запятой.
В AMPL модель и данные разделены. Множества, описанные в модели, не имеют размеров или заданных элементов. Использование в модели множества индексов означает лишь то, что используются элементы этого множества, причем неважно, сколько их имеется. Задание величин делается только в файле данных, который имеет вид <имя файла>.dat. Здесь элементы множеств и параметры определяются явно, повторно записывая служебное слово, имя объекта и перечисляя значения после ":=".
Рис.2.1. Схема работы системы моделирования AMPL.
Пример создания моделиAMPL
Решить следующую задачу, используя решатель MINOS[9] при ограничениях |
Создадим следующий текстовый файл с именем ex1.mod
# ex1.mod - Model var x1 >= 0, <= 3; # Задание нижней и верхней границ переменной x1 var x2 >= 0, <= 3; # Задание нижней и верхней границ переменной x2 minimize z: x1 + x2; # Целевая функция z s.t. con1: x1 * x2 >= 4; # Ограничение 1 – ему присвоено имя con1 data; # Задание начальной точки для решателя var x1 := 1; var x2 := 1; |
Далее наберите >ampl (находясь в папке, где есть исполнимый файл ampl). Появится командное окно AMPL с подсказкой ampl:
В окне AMPL наберите следующие команды для решения этой задачи (не забудьте о точке с запятой ";" в конце каждой команды) для решения этой задачи с помощью решателя MINOS (по умолчанию).
ampl: include ex1.mod; ampl: solve; ampl: display x1, x2, z; |
AMPL выдает следующую информацию о решении x1 = 2, x2 = 2 с оптимальным значением целевой функции z = 4.
MINOS 5.5: optimal solution found. 15 iterations, objective 4 Nonlin evals: constrs = 38, Jac = 37. x1 = 2 x2 = 2 z = 4 |
Для редактирования текстового файла (в связи с обнаруженными ошибками или необходимостью изменения модели), внесите необходимые изменения в текстовом файле модели и сохраните его. Затем в окне AMPL наберите следующие команды для ввода измененной модели:
ampl: reset;
ampl: model ex1.mod;
Запишем на AMPL модель целочисленного линейного программирования (ЦЛП) вида:
при ограничениях
,
Описание параметра m в AMPL выглядит так:
param m; |
Аналогично опишем параметр n:
param n;
Опишем множества индексов и :
set I=1..m;
set J=1..n;
|
|
которая означает, что ‑ бинарная переменная, принимающая только значения 0 или 1.
Описание целевой функции выглядит следующим образом:
maximize z: sum {j in 1..n} c[j] * x[j]; |
Ограничения запишутся так:
con{i in 1..m}: sum {j in 1..n} a[i,j] * x[j] <= b[i];
Таким образом, модель ЦЛП записывается на AMPL в виде ip.mod:
param m;param n;set I:=1..m;set J:=1..n;param c {J};param b {I};param a {I, J}; var x {J} binary;maximize obj: sum{j in J}c[j]*x[j];subject to res {i in I}:sum{j in J}a[i,j]*x[j]<= b[i];
Для решения конкретной задачи ЦЛП вида
при ограничениях
можно использовать описанный выше файл модели ip.mod вместе с файлом данных ip.dat следующего вида
param m:=2;param n:=3;param c [1] 2 [2] 3 [3] 1;param b [1] 2 [2] 4;param a: 1 2 3:= 1 1 2 1 2 2 3 2;В окне AMPL набираем операторы:
model ip.mod;
data ip.mod;
option solver lpsolve;
solve;
display x, obj;
В результате получим:
LP_SOLVE 4.0.1.0: optimal, objective 3
5 simplex iterations
3 branch & bound nodes: depth 2
x [*] :=
1 1
2 0
3 1
;
obj = 3
Замечание.Записьoption solver lpsolve; означает явное задание решателя задач смешанного целочисленного линейного программирования lp_solve (http:// lpsolve.sourceforge.net/).
Дата добавления: 2016-06-05; просмотров: 1630;