Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Оптимізаційны методи та моделі.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
5.7 Mб
Скачать

IV. Динамічне програмування

4.1. Метод динамічного програмування

Динамічне програмування (інакше «динамічне планування») є особливий метод оптимізації рішень, спеціально пристосований до так званих «багатокрокових» (або «багатоетапних») операцій.

Уявімо собі деяку операцію Q, яка розпадається на ряд послідовних «кроків» або «етапів», — наприклад, діяльність галузі промисловості протягом ряду господарських років; або ж подолання групою літаків декількох смуг протиповітряної оборони; або ж послідовність тестів, що застосовуються при контролі апаратури. Деякі операції (подібно вищенаведеним) розчленовуються на кроки природно; в деяких членування доводиться вводити штучно — скажімо, процес наведення ракети на ціль можна умовно розбити на етапи, кожен з яких займає якийсь час Δt.

Отже, розглянемо операцію Q, що складається з m кроків (етапів). Нехай ефективність операції характеризується якимось показником W, який ми для стислості будемо в цій главі називати «виграшем». Припустимо, що виграш W за всю операцію складається з виграшів на окремих кроках:

(4.1)

де — виграш на i-м кроці.

Якщо W має таку властивість, то його називають «адитивним критерієм».

Операція Q, про яку йде мова, являє собою керований процес, тобто ми можемо обирати якісь параметри, що впливають на його хід і результат, причому на кожному кроці вибирається якесь рішення, від якого залежить виграш на даному кроці і виграш за операцію в цілому. Будемо називати це рішення «кроковим управлінням». Сукупність усіх крокових управлінь є управління операцією в цілому. Позначимо його буквою х, а крокові управління — літерами :

(4.2)

Слід мати на увазі, що у загальному випадку — не числа, а, може бути, вектори, функції і т.д.

Потрібно знайти таке управління х, при якому виграш W буде максимальним:

(4.3)

Те управління х *, при якому цей максимум досягається, будемо називати оптимальним управлінням. Воно складається з сукупності оптимальних крокових управлінь:

(4.4)

Той максимальний виграш, який досягається при цьому управлінні, ми будемо позначати W *:

(4.5)

Формула (4.5) читається так: величина W * є максимум з усіх W (x) при різних управліннях х (максимум береться за всім управлінням х, можливим в даних умовах).

Розглянемо кілька прикладів багатокрокових операцій і для кожного з них пояснимо, що розуміється під «управлінням» і який «виграш» (показник ефективності) W.

1. Планується діяльність групи промислових підприємств на період m господарських років. На початку періоду на розвиток групи виділені якісь кошти М, які повинні бути якось розподілені між підприємствами. У процесі роботи підприємства вкладені в нього кошти частково витрачаються (амортизуються), а частково зберігаються і знову можуть бути перерозподілені. Кожне підприємство за рік приносить дохід, що залежить від того, скільки коштів у нього вкладено. На початку кожного господарського року наявні кошти перерозподіляються між підприємствами. Ставиться питання: яку кількість коштів на початку кожного року потрібно виділяти кожному підприємству, щоб, сумарний дохід за m років був максимальним?

Виграш W (сумарний дохід) являє собою суму доходів на окремих кроках (роках):

(4.6)

і, значить, має властивість адитивності.

Управління на i-м кроці полягає в тому, що на початку i-гo року підприємствам виділяються якісь кошти (перший індекс — номер кроку, другий — номер підприємства). Таким чином, крокове управління є вектор з k складовими:

(4.7)

Зрозуміло, величини у формулі (4.6) залежать від кількості вкладених у підприємства коштів.

Управління х всій операцією складається із сукупності всіх крокових управлінь:

(4.8)

Потрібно знайти такий розподіл коштів по підприємствах і по роках (оптимальне управління х*), при якому величина W досягає максимуму.

У цьому прикладі крокові управління були векторами; в наступних прикладах вони будуть простіше і виражатися просто числами.

2. Космічна ракета складається з m ступенів, а процес її виведення на орбіту — з m етапів, в кінці кожного з яких черговий ступінь скидається. На всіх ступенях (без урахування «корисного» ваги кабіни) виділено якaсь загальна вага:

де — вага i-ої ступені.

У результаті i-гo етапу (згоряння і скидання i-й ступені) швидкість ракети зростає. А Δ залежне від ваги даної ступені і сумарної ваги. Як потрібно розподілити вагу G між ступенями, щоб швидкість ракети V при її виведення на орбіту була максимальна?

У даному випадку показник ефективності (виграш) буде

(4.9)

де Δi — виграш (прирощення швидкості) на i-м кроці. Управління х являє собою сукупність ваг всіх ступенів :

Оптимальним управлінням х* буде розподіл ваг по ступенях, для яких швидкість V максимальна. У цьому прикладі шаговое управління — одне число, а саме, вага даної ступені.

3. Власник автомашини експлуатує її на протязі m років. На початку кожного року він може прийняти одне з трьох рішень:

1) продати машину і замінити її новою;

2) ремонтувати її і продовжувати експлуатацію;

3) продовжувати експлуатацію без ремонту.

Крокові управління — вибір одного з цих трьох рішень. Безпосередньо числами вони не виражаються, але можна приписати першому рішенню чисельне значення 1, другому — 2, третьому — 3. Які потрібно прийняти рішення по роках (тобто як чергувати керування 1, 2,3), щоб сумарні витрати на експлуатацію, ремонт і придбання нових машин були мінімальні?

Показник ефективності (в даному випадку це не «виграш», а «програш», але це не суттєво) дорівнює

(4.10)

де — витрати в i-м році. Величину W потрібно дослідити на мінімум.

Управління операцією в цілому являє собою якусь комбінацію чисел 1, 2, 3, наприклад:

що означає: перші два роки експлуатувати машину без ремонту, наступні три роки її ремонтувати, на початку шостого року продати, купити нову, потім знову експлуатувати без ремонту і т.д. Будь-яке управління являє собою вектор (сукупність чисел):

(4.11)

де кожне з чисел має одне з трьох значень: 1, 2 або 3. Потрібно вибрати сукупність чисел (4. 11), при якій величина (4. 10) мінімальна.

4. Прокладається ділянка залізничної колії між пунктами А і В (рис. 4.1). Місцевість пересічена, включає лісисті зони, пагорби, болота, річку, через яку треба будувати міст. Потрібно так провести дорогу з А в В, щоб сумарні витрати на спорудження дільниці були мінімальні.

У цьому завданні, на відміну від трьох попередніх, немає природного членування на кроки: його доводиться вводити штучно, для чого, наприклад, можна відрізок АВ розділити на t частин, провести через точки поділу прямі, перпендикулярні АВ, і вважати за «крок» перехід з однієї такої прямої на іншу. Якщо провести їх досить близько одне від одного, то можна вважати на кожному кроці ділянку шляху прямолінійним. Крокові управління на i-му кроці представляють собою кут , який становить ділянку шляху з прямою АВ. Управління всією операцією складається із сукупності крокових управлінь:

Потрібно вибрати таке (оптимальне) управління х*, при якому сумарні витрати на спорудження усіх ділянок мінімальні:

(4.12)

Отже, ми розглянули кілька прикладів багатокрокових задач дослідження операцій. А тепер поговоримо про те, як можна вирішувати такі завдання?

Будь-які багатокрокові задачі можна вирішувати по-різному: або шукати відразу всі елементи рішення на всіх m кроках, або ж будувати оптимальне управління крок за кроком, на кожному етапі розрахунку оптимізуючи лише один крок. Зазвичай другий спосіб оптимізації виявляється простіше, ніж перший, особливо при великому числі кроків.

Така ідея поступової, покрокової оптимізації і лежить в основі методу динамічного програмування. Оптимізація одного кроку, як правило, простіше оптимізації всього процесу: краще, виявляється, багато раз вирішити порівняно просту задачу, ніж один раз — складну.

З першого погляду ідея може здатися досить тривіальною. Справді, чого здавалося б, простіше: якщо важко оптимізувати операцію в цілому, розбити її на ряд кроків. Кожен такий крок буде окремою, маленькою операцією, оптимізувати яку вже неважко. Треба вибрати на цьому кроці таке управління, щоб ефективність цього кроку була максимальна. Чи не так?

Ні, зовсім не так! Принцип динамічного програмування аж ніяк не передбачає, що кожен крок оптимізується окремо, незалежно від інших. Навпаки, шаговое управління повинне вибиратися далекоглядно, з урахуванням всіх його наслідків у майбутньому. Що толку, якщо ми виберемо на даному кроці управління, при якому ефективність цього кроку максимальна, якщо цей крок позбавить нас можливості добре виграти на наступних кроках?

Нехай, наприклад, планується робота групи промислових підприємств, з яких частина зайнята випуском предметів споживання, а решта виробляють для них машини. Завдання операції — отримати за m років максимальний обсяг випуску предметів споживання. Припустимо, плануються капіталовкладення на перший рік. Виходячи з вузьких інтересів цього кроку (року), ми повинні були б усі готівкові кошти вкласти у виробництво предметів споживання. Але чи правильно буде таке рішення з точки зору ефективності операції в цілому? Очевидно, немає. Це рішення — марнотратне, недалекоглядне. Маючи на увазі майбутнє, треба виділити якусь частку коштів і на виробництво машин. Від цього обсяг продукції за перший рік, звичайно, знизиться, зате будуть створені умови для його збільшення в наступні роки.

Ще приклад. Припустимо, що в задачі 4 (прокладка залізничної колії з А в В) ми спокусилися ідеєю відразу ж кинутися до найлегшого (дешевого) напрямку. Що користі від економії на першому кроці, якщо в подальшому він заведе нас (буквально чи фігурально) в «болото»?

Значить, плануючи багатокрокову операцію, треба вибирати управління на кожному кроці з урахуванням всіх його майбутніх наслідків на ще наступні кроки. Управління на i-ім кроці вибирається не так, щоб виграш саме на цьому кроці був максимальний, а так, щоб була максимальна сума виграшів на всіх кроках, які залишилися до кінця плюс даний.

Проте з цього правила є виняток. Серед всіх кроків є один, який може плануватися просто, без огляду на майбутнє. Який це крок? Очевидно, останній! Цей крок, єдиний з усіх, можна планувати так, щоб він сам, як такий, приніс найбільшу вигоду.

Тому процес динамічного програмування зазвичай розгортається від кінця до початку: перш за все планується останній, m-й крок. А як його спланувати, якщо ми не знаємо, чим скінчився передостанній? Тобто не знаємо умов, до яких ми приступаємо до останнього кроку?

Ось тут-то і починається саме головне. Плануючи останній крок, потрібно зробити різні припущення про те, чим скінчився передостанній, (m – 1)-й крок, і для кожного з цих припущень знайти умовне оптимальне керування на m-му кроці («умовне» тому, що воно вибирається виходячи з умови, що передостанній крок скінчився так-то і так-то).

Припустимо, що ми це зробили, і для кожного з можливих результатів передостаннього кроку знаємо умовне оптимальне управління і відповідний йому умовний оптимальний виграш на m-му кроці. Дуже добре! Тепер ми можемо оптимізувати управління на передостанньому, (m – 1)-му кроці. Знову зробимо всі можливі припущення про те, чим скінчився попередній, (m – 2)-й крок, і для кожного з цих припущень знайдемо таке управління на (m – 1)-му кроці, при якому виграш за останні два кроки (з яких той вже оптимізовано!) максимальний. Так ми знайдемо для кожного результату (m – 2)-го кроку умовне оптимальне керування на (m – 1)-му кроці і умовний оптимальний виграш на двох останніх кроках. Далі, «задкуючи назад», оптимізуємо управління на (m – 2)-м кроці і т.д., поки не дійдемо до першого.

Припустимо, що це умовні оптимальні управління та умовні оптимальні виграші за весь «хвіст» процесу (на всіх кроках, починаючи від даного і до кінця) нам відомі. Це означає: ми знаємо, що треба робити, як керувати на даному кроці і що ми за це отримаємо на «хвості», в якому б стані не був процес до початку кроку. Тепер ми можемо побудувати вже не умовно оптимальне, а просто оптимальне управління х * й знайти не умовно оптимальний, а просто оптимальний виграш W *.

Справді, нехай ми знаємо, в якому стані була керована система (об’єкт управління S) на початку першого кроку. Тоді ми можемо вибрати оптимальне управління на першому кроці. Застосувавши його, ми змінимо стан системи на деяке нове ; в цьому стані ми підійшли до другого кроку.

Тоді нам теж відомо умовне оптимальне керування , яке до кінця другого кроку переводить систему в стан , і т.д. Що стосується оптимального виграшу W * за всю операцію, то він нам уже відомий: адже саме на основі його максимальності ми вибирали управління на першому кроці.

Таким чином, в процесі оптимізації управління методом динамічного програмування багатокроковий процес «проходиться» двічі: перший раз — від кінця до початку, в результаті чого знаходяться умовні оптимальні управління та умовні оптимальні виграші, другий раз — від початку до кінця, коли нам залишається тільки «прочитати» вже готові рекомендації і знайти безумовне оптимальне управління х *, що складається з оптимальних крокових управлінь ..

Перший етап — умовної оптимізації — незрівнянно складніше і довше другого. Другий етап майже не вимагає додаткових обчислень.

Автор не лестить себе надією, що з такого опису методу динамічного програмування читач, який не зустрічався з ним до цих пір, зрозуміє по-справжньому його ідею. Істинне розуміння виникає при розгляді конкретних прикладів, до яких ми і перейдемо.