раничений, переменных и матрицы, содержащей коэффициенты функций ограничений. Важно отметить, что эти данные определяются пользователем до начала использования модели. На рис. 2.12 видно, что мы использовали имена Constr (Ограничения), Var (Переменные) и ConsVar(Constr,Var) (это массив коэффициентов, размерности ConstrxVar). Конечно, вы можете использовать любые другие
Шодель Reddy Mikks - данные внутри модели; MODEL:
TITLE Reddy mikks model;
I--------------------алгебраическое определение модели ЛП;
SETS:
Constr: Rhs; Var: С, X;
ConsVar (Constr, Var) : Aij ; ENDSETS
1------------------------------------построение модели;
MM-esUM( Var(j) : C(j)*X(j) ); ! целевая функция;
SFOR( Ограничения;
Constr (i) : esiM( Var (j) : Aij (i, j ) *X (j) )<=Rhs (i) ) ;
I------------------------------------данные для модели;
DATA:
Constr = Ml M2 Demandl Demand2; Rhs = 24 6 1 2; Var = XI X2; С = 5 4; Aij =64
-1 1
0 1;
E HDD AT A END
Рис. 2.12. Листинг LINGO модели Reddy Mikks
имена по вашему выбору. Ограничения имеют числовые значения правой части, вектор этих значений назовем Rhs (от Right-hand side - правая часть). Отношение между ограничениями и их правыми частями задается оператором Constr: Rhs; Аналогично оператор Var: С, X;
указывает, что каждой переменной X соответствует в целевой функции коэффициент С (X и С - векторы). Наконец, матрица, содержащая коэффициенты функций ограничений, названа Aij с помощью оператора
ConsVar(Constr,Var): Ai j ;
Теперь заданы все элементы, необходимые для построения алгебраической модели. Используя фиктивный индекс j для представления переменной у, целевая функция строится как
MAX=@SUM( Var(j): C(j)*X(j) );
Этот оператор задает целевую функцию как сумму произведений C(j)*X(j), причем сумма берется по всем элементам множества Var(j). Ограничение i строится следующим образом:
Constr (i) :@STJM( Var(j): Aij (i, j ) *X (j ) )<=Rhs(i)
Для вычисления всех ограничений из множества Constr(i) используется цикл
@FOR(Constr(i):
@SUM( Var(j): Aij(i,j)*X(j) )<=Rhs(i) ) ;
Отметим, что тело цикла @FOR ограничивается круглыми скобками.
Последний раздел листинга на рис. 2.12 содержит данные, подставляемые в алгебраическую модель. Так, множество Constr определяется как множество из четырех ограничений, названных Ml, М2, Demandl и Demandl (Cnpocl и Спрос2). Отметим обязательные пробелы между именами - по их числу определяется количество элементов в множестве. В следующей строке вектору Rhs присваиваются значения правых частей ограничений 24, 6, 1 и 2. Элементам множества Var обычно даются имена XI и Х2 (если модель имеет только две переменные). Соответственно, С присваиваются два элемента, 5 и 4, значения коэффициентов целевой функции. Наконец, массиву Aij присваиваются значения коэффициентов левых частей ограничений в соответствии с определением множества ConsVar(Constr,Var). Не обязательно помещать элементы каждого ограничения в отдельной строке, как в листинге на рис. 2.12. Здесь это сделано для удобства чтения.
По умолчанию в LINGO предполагается, что все переменные неотрицательны. Свободные переменные (т.е. такие, которые могут принимать как положительные, так и отрицательные, значения) задаются с помощью оператора @FREE. Например, если Х2 - свободная переменная, то в модели она должна быть описана оператором @FREE(X(2));
Этот оператор можно вставить в любое место листинга после оператора ENDSETS, даже в оператор цикла.
Стандартный выходной результат работы программы LINGO представлен на рис. 2.13. Оптимальное решение записано как Х(Х1) = 3 и Х(Х2) = 1.5 со значением целевой функции 21. В нижней части выходного отчета выводится список значений дополнительных переменных для каждого ограничения (строки 2- 5) вместе с соответствующими двойственными ценами (столбец Dual Prices). В строке 1 приведено значение целевой функции. Остальные значения в выходном отчете повторяют входные данные модели.
Выходной отчет программы LINGO можно настраивать, выводя только необходимые данные. Отметим, что в этот отчет не включаются автоматически результаты анализа чувствительности оптимального решения. Вместе с тем LINGO предоставляет возможности проведения такого анализа и вывода его результатов.
Мощность и гибкость таких программ, как LINGO, заключается в том, что входные данные модели не обязательно должны быть включены непосредственно в модель, как это сделано в листинге на рис. 2.12. Входные данные могут находиться во внешних файлах. На рис. 2.14 показан листинг модели Reddy Mikks, где с помощью оператора @FILE присоединяются два внешних файла. Содержимое этих файлов показано на рис. 2.15. Таким образом, заменяя эти файлы другими, можно просчитывать модель для разных входных данных.
Моделирование в AMPL. Используем ту же модель Reddy Mikks для описания работы программы AMPL. На рис. 2.16 показан листинг этой модели, созданный в AMPL (файл ch2AmplReddyMikks.mod). Как и в примере LINGO, служебные слова AMPL здесь выделены полужирным шрифтом.
Первым в листинге стоит оператор set, определяющий ограничения и переменные модели с помощью задаваемых пользователем имен Constr и Var (мы сохранили здесь имена из модели LINGO для того, чтобы можно было сравнить модели
в LINGO и AMPL). Далее с помощью оператора param задаются имена элементов целевой функции и ограничений. Так, С определяет коэффициенты целевой функции как функция множества Var. Rhs определяет значения правых частей ограничений как функция множества Constr, a Aij - коэффициенты левых частей ограничений как функция множеств Constr и Var.
Global optimal solution found at step: 4
Objective value: 21.00000
Model Title: REDDY MIKKS MODEL
Variable | | Value | Reduced Cost |
RHS ( | | | 00000 | | .000000 |
RHS ( | | | .00000 | | .000000 |
RHS( DEMAND1) | | .00000 | | ,000000 |
RHS( DEMAND2) | | ,00000 | | .000000 |
| | | ,00000 | | .000000 |
| | | ,00000 | | .000000 |
| | | ,00000 | | ,000000 |
| | | ,50000 | | .000000 |
AIJ( Ml, | | | ,00000 | | .000000 |
AIJ( Ml, | | | ,00000 | | .000000 |
AIJ( M2, | | | ,00000 | | .000000 |
AIJ( M2, | | | ,00000 | | .000000 |
AIJ( DEMAND1, | | | 00000 | | ,000000 |
AIJ( DEMAND1, | | | ,00000 | | ,000000 |
AIJ( DEMAND2, | | 0.000000 | | ,000000 |
AIJ( DEMAND2, | | | 00000 | | ,000000 |
| Slack oc Surplus | Dual Pcice |
| 21.0000 | 1.00000 |
| 0.000000 | 0.750000 |
| 0.000000 | 0.500000 |
| 2.50000 | 0.000000 |
| 0 . 500000 | 0.000000 |
Рис. 2.13. Выходной отчет программы LINGO
!Модель Reddy Mikks - входные данные во внешних файлах; MODEL:
TITLE Reddy mikks model;
1--------------------алгебраическое определение модели ЛП;
SETS :
Constr: Rhs;
Vac: С, X;
ConsVar(Constr,Van): Aij; ENDSETS
i------------------------------------построение модели;
MAX=@SUM( Var (j) : C(j)*X(j) ); !целевая функция;
SFOR ( Ограничения;
Constr(i) :@SUM( Var(j) : Aij (i, j) *X (j) )<=Rhs (i) ) ;
i------------------------------------данные для модели;
DATA:
Constr=@FIL,E(ch2LingoFldata.lng) ; !чтение из файла; Rhs = 24 б 1 2; Var = XI Х2; С = 5 4;
Aij=@FILE (ch2LingoFldata.lng) ; !чтение из файла; EHDDATA END
Рис. 2.14. Листинг LINGO модели Reddy Mikks с внешними файлами