Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Оптимизация в LINDO

..pdf
Скачиваний:
10
Добавлен:
12.11.2023
Размер:
4.57 Mб
Скачать

физически изменить предел ненулевых элементов при его работе. Поэтому необходимо выйти из LINDО и перезагрузить его, предварительно сохранив сделанную работу. После перезапуска будет установлен новый предел ненулевых элементов. Если предел ненулевых элементов устанавливается слишком большим для имеющейся памяти, LJNDO будет автоматически уменьшать размер, чтобы программу можно было запустить. Можно проверить, каков фактически физический предел ненулевых элементов, используя команду About в меню Help. Эта команда показывает номер версии LINDO, авторскую информацию и предельное число ограничений, переменных и ненулевых элементов для данной копии LINDO.

Отметим также, что LINDO использует это пространство как рабочую область в течение оптимизации. В этой области памяти LINDO хранит инверсную матрицу базиса вместе со структурными ненулевыми элементами. Можно попытаться разместить некоторое число дополнительных ненулевых элементов сверх того, что требуется. Если LINDO был ^загружен без ненулевого пространства, то он прервет оптимизацию и сообщит об ошибке.

Iteration Limit

LINDO использует симплекс-метод для проведения оптимизации. Симплексметод выполняется сериями итераций, заканчивающихся, когда найдено оптимальное решение. В каждой итерации перспективная переменная вносится в решение, а другая переменная одновременно приводится к нулю и удаляется из текущего решения.

LINDO предоставляет возможность ограничить число итераций. Это предельное значение заносится в поле Iteration Limit. Если LINDO превысит предел итераций до завершения оптимизации, то будет предложепо два варианта: 1) остановиться, для чего нажать кнопку «Cancel», - LINDO завершит процесс оптимизации и выдаст наилучший полученный результат; 2) продолжить оптимизацию, введя дополнительное число итераций и нажав кнопку ОК, - процесс оптимизации будет продолжен, и если будет превышен уже новый предел, то снова выйдет сообщение для дополнительного приращения предела итераций.

По умолчанию предел итераций равен None, другими словами, число итераций не ограничено.

Initial Constraint Tolerance

Final Constraint Tolerance

Из-за конечной точности вычислений с плавающей точкой на цифровых компьютерах, LINDO не может всегда удовлетворить каждое ограничение точпо. Учитывая это, LINDO имеет два внутренних допуска, которые определяют максимальную допустимую величину нарушения ограничения. Опции Initial Constraint Tolerance (Начальный допуск) используются, когда решение только начинается и ограничения могут быть относительно свободными, для того чтобы увеличить скорость решения. Когда LINDO приблизится к оптимальному решению, произойдет переключение на конечный допуск (Initial Constraint Tolerance), который должен быть более жестким, для того чтобы обеспечить точное конечное решение.

Значение по умолчанию для начального допуска - 0.8'5, а для конечного - О.Г5 Необходимость изменения этих значений может возникнуть при неразрешимости задачи из-за нарушения некоторых условий (LINDO сообщает о всех нарушениях). Так, если бюджет отражен в модели в миллиардах рублей,'то расхождение в несколько рублей и тем более копеек несущественно. В этом случае допуски могут быть ослаблены, что обеспечит разрешимость модели.

21

Entering Variable Tolerance

Небазисныс переменные вводятся в решение, если они способны улучшить критерий. Это переменные с отрицательными относительными оценками (уменьшенными стоимостями). Из-за ошибок округления в вычислениях с плавающей точкой переменная может оцениваться как улучшающая, тогда как фактически она не влияет или отрицательно влияет на критерий. Допуск позволяет избежать таких ошибок. Переменные с отрицательными относительными оценкам^ абсолютное значение которых превосходит допуск вводимых переменных, будут рассматриваться как потенциальные кандидаты для ввода в решение. По умолчанию значение допуска вводимых переменных равно 0.7'5.

Pivot Size Tolerance

Симлекс-преобразоваыие выполняется на основе направляющего (ведущего, разрешающего) элемента. Он не должен равняться нулю. Если он очень мал, то из-за ограниченной точности арифметики с плавающей точкой есть шанс, что основной элемент.- просто фантом, состоящий из шума, вызванного ошибкой округления в результате большого числа преобразований обратной матрицы. Такой элемент может привести к неуправляемому поведению решающего блока. Допуск направляющего элемента делит элементы на правильные и неправильные.

Опции вывода

Эти опции позволяют контролировать размер и тип информации, выводимой UNDO.

Status Window (Окно статуса)

Всякий раз, когда LINDO начинает решение модели, выдается окно статуса, в котором отображается ход процесса решения в реальном времени. Если убрать пометку из окна Status Window, UNDO в дальнейшем не будет автоматически показывать окно статуса. Тем не менее, его можно восстановить в любое время в процессе оптимизации, запустив команду Open Status Window из меню Window.

По умолчанию UNDO показывает окно статуса всякий раз, когда ведется решение.

Terse Output (Краткий вывод)

Если опция не отмечена, UNDO автоматически будет записывать отчет о решении в окно отчета (Report Window) после решения модели. Включение опции Terse Output подавляет такой вывод. Однако всегда можно запросить отчет о решении, используя команду Reports|Solution. Включение Terse Output также подавляет вывод трассировочных сообщений в окно отчета при решении модели целочисленного программирования.

По умолчанию опция Terse Output не включена.

Page Length Limit (Предел длины страницы)

Эта опция позволяет указать LINDO число строк, после которых приостанавливается вывод в окно отчетов и ожидается нажатие кнопки More.

По умолчанию предел длины страницы не установлен.

22

Terminal Width (Ширина строки терминала)

Когда выполняются последовательные операции ввода/вывода, UNDO учитывает ширину строки терминала. Таким образом, вывод строк в окно отчетов выравнивается в пределах терминальной ширины и вводимые записи обрезаются по ней. Ширина строки может бьггь задана в соответствующем поле. При этом нельзя задать меньше 40 и больше 132 символов в строке. Когда UNDO читает входной файл, любые символы, выходящие за установленный здесь предел, не распознаются UNDO и могут повлиять на решение модели. Чтобы избежать этого, ограничения и критериальная функция могут быть записаны в несколько строк. Разделить любую строку можно везде, за исключением середины коэффициента или имени переменной.

По умолчанию ширина строки равна 80.

Go То Line

..Gtrl + Т

Команда Go То Line позволяет перейти на нужную строку в текущем окне. Номер строки вводится в поле Line number to go to. Можно также перейти сразу в верх или низ окна, щелкнув на кнопке Go to Тор или Go to End.

Paste Symbol_____ Ctrl + P

Команда Paste Symbol выдает диалоговое окно, которое помогает в построении или дополнении модели. Это окно Содержит все символы, зарезервированные в синтаксисе LINDO, плюс все имена переменных и строк, определенные ранее в модели. Пример такого окна для транспортной модели показан на рис..2...

Рис. 2

Если дважды щелкнуть на символе (или имени), он будет добавлен в буфер обмена Paste Buffer. Можно добавлять столько элементов, сколько нужно для записи, например, дополнительного ограничения. Получаемое выражение видно в поле Paste

23

Buffer. Чтобы перевести содержимое буфера обмена в окно с текущей моделью в позицию курсора, нужно нажать кнопку Paste. Можно также делать ввод прямо в буфер обмена. Нажатие кнопки Clear приводит к стиранию содержимого буфера обмена (поля Paste Buffer).

Например, для добавления ограничения X I1 + Х21 <= 14 в существующую модель нужно дважды щелкнуть на следующих элементах:

1.X I1 в списке переменных,

2.Знак плюс в списке зарезервированных слов.

3.Х21 в списке переменных.

4.Знак <= в списке зарезервированных слов.

Наконец, непосредственно ввести в поле Paste Buffer справа от неравенства число 14 (рис. 3). Теперь можно вставить это неравенство в .окно модели в позицию курсора, нажав кнопку Paste.

Рис. 3

Примечание. При использовании команды Paste Symbol UNDO компилирует текущую модель для построения списков имен переменных и строк, выдаваемых в окне команды. Если LINDO не может компилировать модель, команда Paste Symbol не будет выполнена.

Select All_________Ctrl + А

Команда Select All выделяет весь текст в текущем окне для копирования и других целей.

24

Меню Solve

Меню Solve содержит все команды, составляющие ядро решающего устройства LINDO.

Solve____________ Ctrl + S

Команда Solve - основная команда, используемая из этого меню. Она заставляет UNDO начать решение активной модели. Если это относительно маленькая модель, то команда может выполниться почти мгновенно. Если модель большая, то команда Solve потенциально может выполняться несколько часов.

После ввода команды Solve LINDO проверяет, модифицирована ли модель и нуждается ли она в компиляции. Если ошибки компиляции отсутствуют, LINDO открывает окно, называемое UNDO1Solver Status (Статус решателя). Это окно показывает текущее состояние процесса решения (рис. 4).

Рис. 4

Описание варьируемых полей и управлений в окне дано в табл. 4.

 

 

 

 

 

 

Таблица 4

 

Статус текущего решения. Возможные значения: Optimal

Status

(Оптимальное),

Feasible

(Разрешимое),

Infeasible

 

(Неразрешимое), Unbounded (Неограниченное)

 

Iterations

Число выполненных итераций

 

 

 

Infeasibility

Количество нарушенных ограничений

 

 

Objective

Текущее значение критерия

 

 

 

 

Значение критерия наилучшего найденного целого

BestIP

решения.

Только для

моделей

целочисленного

 

программирования

 

 

 

 

IP Bound

Теоретическая граница критерия для IP модели

 

25

Branches

Elapsed Time

Update Interval

Interrupt Solver

Close

Окончание табл. 4

Число целых переменных, по которым выполнено ветвление решателем UNDOIP

Время, прошедшее после запуска решения Частота обновления (в секундах) информации в окне

статуса. С ростом частоты время решения увеличивается Нажатие этой кнопки прерывает решение и возвращает лучшее текущее найденное решение Нажатие этой кнопки приводит к закрытию окна статуса

Когда команда Solve завершится, решение будет выведено в окно отчетов, где оно может быть просмотрено, отредактировано и напечатано. Если модель сформулирована корректно, окно статуса будет показывать оптимальное решение. Если окно статуса показывает, что модель неразрешима или неограниченна, тогда полученные результата непригодны и^'рдель'ВдЬкдается в изменении. Если модель не содержит целые переменные и не является квадратичной, команда Debug может помочь в поиске причин неразрешимости или неограниченности.

Если требуется подавить автоматический вывод отчетов о решении после выполнения команды Solve, то надо отметить позицию Terse output в диалоге Options.

Окно отчетов может содержать до 6<fOOQ символов информации. Если потребуется, LINDО будет стирать выведенную информацию из верхней части окна отчетов, чтобы освободить пространство для нового вывода в конец окна. Очень длинный отчет о решении можно перенаправить в дисковый файл, используя команду File]Log Output. Этот файл затем может быть’ просмотрен во внешнем текстовом редакторе или с помощью команды UNDO View из меню File.

Если модель линейная, то после записи отчета'о решении UNDO выдаст запрос на выполнение анализа чувствительности и рангового анализа. При утвердительном ответе результаты анализа будут также направлены в окно отчетов. Эти отчеты можно запросить и позднее, в любое время, используя команду Reports|Range. Дополнительная информация приводится при описании команды Range.

Compile Model

Ctrl + E

Перед решением модель необходимо скомпилировать в арифметическую форму, используемую UNDO для решения. UNDO будет делать это автоматически, но можно запросить компиляцию в любое время, запустив команду Compile Model. Пока компилируется модель, UNDO показывает окно, в котором отражается процесс компиляции по мере его выполнения и выводится количество ограничений, перемендах и ненулевых коэффициентов, найденных в модели к текущему моменту.

Дели UNDO во время компиляции найдет синтаксическую ошибку, он выведет номер строки, где произошла ошибка, и переместит курсор на эту строку.

Компиляция может потребоваться в различных случаях. Во-первых, можно использовать команду компиляции для проверки синтаксиса модели. Во-вторых, компиляция модели строит таблицы имен переменных и строк, требуемых в команде Paste Symbol. Наконец, запуск команды компиляции удаляет любой сохраненный для модели базис. UNDO сохраняет базис в памяти для использования в качестве стартовой точки после модификации модели для ускорения ее решения (начинает

26

решение с этой точки). Запуск, команды компиляции заставляет LINDO стереть базис, и все последующие комапдй ^б1уе будут выполняться с самого начала.

Debug___________Ctrl + D

Первоначальная модель может содержать ошибки разного рода. Поиск ошибок в большой модели - не простая задача. Команда Debug обычно сужает поиск в случаях, когда ошибки приводят к неразрешимости модели или неограниченности критерия.

При обнаружении неразрешимости Debug прежде всего пытается найти одно или несколько «критических» ограничений. Ограничение критическое, если его исключение делает модель разрешимой. Эти ограничения идентифицируются Debug •как SUFFICIENT SET (ROWS) - ДОСТАТОЧНОЕ МНОЖЕСТВО (Строк). Не каждая неразрешимая модель имеет критические ограничения. Независимо от того, найдены или нет критические ограничения, команда Debug также определяет множество ограничений, таких как границы столбца, которое составляет NECESSARY SET (ROWS)-HEOBXOflHMOE МНОЖЕСТВО (Строк). Такое множество имеет признак неразрешимости, нр. если .любой элемент этого множества будет удален, тогда оно станет разрешимым;* Такимобразом, необходимо сделать по крайней мере одну коррекцию в НЕОБХОДИМОМ МНОЖЕСТВЕ, чтобы модель стала разрешимой.

При обнаружении нео1раниченной модели Debug стремится найти одну или более «критических» переменных. Эти переменные определяются Debug как SUFFICIENT SET (COLS) - ДОСТАТОЧНОЕ МНОЖЕСТВО (Столбцов). Переменные критические, если их фиксация делает модель ограниченной. Независимо от результатов определения критических переменных' команда Debug также идентифицирует множество переменных, которое составляет NECESSARY SET (COLS)-HEOBXOflHMOE МНОЖЕСТВО (Столбцов). Такое множество имеет свойство быть неограниченным, но, если любую переменную в этом множестве зафиксировать, оно станет ограниченным.

Итак, если полная модель была бы разрешимой за исключением ошибок в одной строке, эта строка была бы указана в ДОСТАТОЧНОМ МНОЖЕСТВЕ строк. НЕОБХОДИМОЕ МНОЖЕСТВО строк - это такое множество, при наличии которого модель остается неразрешимой.

Например,

пусть в

модели,

C:\LINDG\PniM1.LTX

 

пах 2x1*7x2

 

1

приведенной на рис. 5, вместо значения

 

St

 

 

 

коэффициента 5.5

в последнем ограни­

 

+ 2x2 < J»

1

2)

Х1

-:фа

чении ввели ошибочно 0.55.

выдалось

3)

2x1

+ х2< 2

о?S

При

ее

решении

Л)

0.55x1

♦ х2 > 5

3?

сообщение об ошибке - недопустимости

lend

 

 

 

 

8

ч

^..

Ss

и ее суммарной величине (рис.

6).

;i

После

запуска команды Debug

 

 

 

 

 

получен отчет в ее окне (рис. 7).

 

 

 

 

 

Как видно из отчета, команда правильно

идентифицировала как ошибочное

ограничение в 4-й строке.

Для устранения недопустимости возможны следующие коррективы ограничения: изменение RHS, изменение направления, изменение коэффициента переменной в ограничении или изменение верхней или нижней границы переменной, входящей в ограничение. А при неограниченности возможны такие коррективы в столбце, как: изменение критериального коэффициента, изменение коэффициента в некотором ограничении, изменение знака неравенства в некотором ограничении, где перемешай вызывает сомнение, задание верхней или нижней границы конечной.

П

1

Reports Window

 

 

ш щ

 

 

 

 

В

 

 

 

 

 

| SUFFICIENT SET (ROUS), CORRECT ONE OF:

 

i

4)

0,55 X1

+ X2

>“ S

 

fc;

 

Я NECESSARY SET

(ROUS),

CORRECT ONE OF:

jgj

i;i

SUBJECT TO

 

 

 

 

 

 

и»

8

2)

X1 + 2 X2 <-

U

 

Рис. 7

Pivot_____________ Ctrl + N

Фундаментальная операция симплекс-алгоритма, используемого UNDO, включает введение в решение переменной, которая до этого имела нулевое значение, и одновременно обращение в нуль выводимой переменной. Эта операция называется Pivot. Команда Pivot позволяет выполнить такую операцию по заданию пользователя, путем; выбора переменной (столбца) и строки для последующего симплекспреобразования. Команда Pivot не имеет значительного практического использования, но она представляет большой интерес для изучения симплекс-алгоритма, особенно когда это связано с командой Tableau (симплекс-таблица). Команда Tableau может быть использована для просмотра текущей симплекс-таблицы, чтобы помочь в выборе перспективной переменной и направляющей (разрешающей) строки. После запуска команды Pivot появляется окно, в котором можно выбрать переменную и/или строку, установив опцию Use Mine и введя в соответствующее поле (или поля) нужное имя. Результат появится в окне отчетов и будет включать значения выбранной переменной и критерия после симплекс-преобразования. Можно выбрать только переменную, а выбор строки оставить UNDO, и наоборот.

28

Preemptive Goal

Ctrl + G

Команда Preemptive Goal выполняет лексикографическую оптимизацию модели. Она применяется для решения задачи со многими критериями, когда пользователь упорядочивает критерии по их важности (первый критерий - самый важный). LINDO начинает оптимизагцп^.с первого критерия. Найдя оптимальное значение для первого критерия, затем оптимизирует второй критерий при сохранении первым своего оптимального значения. Получив оптимальные значения для первого и второго критерия, решатель оптимизирует третий критерий и так далее.

Такой проблеме соответствует типичная ситуация, когда первый критерий обеспечивает минимизацию затрат или максимизацию прибыли, а второй критерий “сглаживает” это оптимальное решение в некотором смысле. Пользователь обычно предпочитает решения, которые дают более равномерный разброс удовлетворения условий. Так, задача целевого: программирования может иметь первой целью минимизацию стоимости удовлетворения всех требований и второй - минимизацию максимума превышения любого требования.

Лексикографический подход дает пользователю хороший инструмент решения многокритериальных задач. При построении 'модели"все критерии записываются в области целевой функции своими именами в порядке уменьшения значимости и с одним направлением оптимизации, Например,. если^ц^вЕт^тфитерий “Затраты”, а второй “Качество” то запись будет такой:

MIN Затраты - Качество

Сами выражения этих критериев записываются в области условий в виде равенств с нулевой правой частью. Например, для первого критерия следует записать:

...Затраты - 5Xi - 8Х*~'3.2Хз = О

Команда Preemptive Goal может быть применена к линейным и целочисленным моделям и неприменима к квадратичным задачам.

Меню Reports

Меню отчетов содержит все команды, которые могут быть использованы для генерирования отчетов о решении модели. Чтобы сгенерировать отчет, нужно сначала сделать окно с моделью активным, щелкнув на нем мышкой или выбрав из меню Window, и затем запустить желаемую команду из меню отчетов. Команды меню рассмотрены ниже.

Solution__________ Alt + О

Эта команда выдает стандартный отчет о решении в окно отчетов для текущего активного окна модели. Обычно UNDO автоматически генерирует отчет о решении как часть команда Solve (решить).. Автоматическая выдача отчета о решении может не выполняться, если в команде Options установить опцию Terse. Тогда для получения отчета потребуется запустить команду Solution. Она выводит диалоговое окно, в котором можно выбрать вариант отчета: со всеми переменными или только с ненулевыми. В последнем случае UNDO включит в отчёт только те переменные, значения которых отличны от нуля, и только те строки, которые их содержат. Это может значительно снизить размер отчета о решении. Для примера рассмотрим такую

29

задачу. Некоторая фирма "Кама” планирует производство двух видов продукции, по которым известны нормы расхода ресурсов четырех видов и прибыль. Известно также количество ресурсов, которыми располагает фирма. Требуется определить оптимальный план выпуска продукции. Задавшись конкретными значениями исходных величин и используя синтаксис LINDO, получим модель, показанную на рис. 8.

Рис. 8

Отчет о результатах решения этой задачи приведен на рис.9.

В самом начале отчета выдается значение целевой функции (критерия). Ниже отчет разбивается на две секции. Первая секция содержит переменные, вторая секция строки (т.е. ограничения). В секции переменных одна строка для каждой переменной включает имя переменной, ее значение и ее относительную оценку. Последняя показывает, насколько изменился бы критерий при увеличении данной переменной на единицу. Reduced costs (относительные оценки) имеют смысл в линейных и квадратичных моделях, но, в общем, могут быть проигнорированы, когда решается модель целочисленного программирования. Относительные оценки действительны

только в 01раниченном диапазоне значений переменных.

30