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

4.2. Приклади розв’язання задач динамічного програмування

У цьому параграфі розглянемо (і навіть вирішимо до кінця) кілька простих (до крайності спрощених) прикладів завдань динамічного програмування.

1. Прокладка найвигіднішого шляху між двома пунктами. Згадаймо завдання 4 попереднього параграфа і вирішимо її до кінця у вкрай (і навмисно) спрощених умовах. Нам потрібно спорудити шлях, що з’єднує два пункти А і В, з яких другий лежить на північний схід від першого. Для простоти припустимо, що прокладання шляху складається з ряду кроків, і на кожному кроці ми можемо рухатися або строго на схід, або строго на північ; будь-який шлях з А в В являє собою східчасту ламану лінію, відрізки якої паралельні одній з координатних осей (рис. 4.1).

Рис. 4.1.

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

Як це зробити? Можна поступити одним з двох способів: або перебрати всі можливі варіанти шляху, і вибрати той, на якому витрати мінімальні (а при великому числі відрізків це дуже і дуже важко!); Або розділити процес переходу з А в В на окремі кроки (один крок — один відрізок) і оптимізувати управління по кроках. Виявляється, другий спосіб незрівнянно зручніше! Тут, як і скрізь в дослідженні операцій, позначаються переваги цілеспрямованого, організованого пошуку рішення перед наївним «сліпим» перебором.

Продемонструємо, як це робиться, на конкретному прикладі. Розділимо відстань від А до В у східному напрямку, скажімо, на 7 частин, а в північному — на 5 частин (в принципі дроблення може бути як завгодно дрібним). Тоді будь-який шлях з А в В складається з m = 7 + 5 = 12 відрізків, спрямованих на схід чи на північ (рис.4.2). Проставимо на кожному з відрізків число, що виражає (в якихось умовних одиницях) вартість прокладки шляху з цього відрізку. Потрібно вибрати такий шлях з А в В, для якого сума чисел, що стоять на відрізках, мінімальна.

Рис. 4.2.

Будемо розглядати споруджуваний шлях як керовану систему S, що переміщається під впливом управління з початкового стану А в кінцевий В. Стан цієї системи перед початком кожного кроку буде характеризуватися двома координатами: східної (х) і північної (у), обидві — цілочисельні (0 ≤ х ≤ ≤ 7, 0 ≤ y ≤ 5). Для кожного із станів системи (вузлової точки прямокутної сітки на рис. 4.2) ми повинні знайти умовне оптимальне керування: йти нам з цієї точки на північ (управління «с») або на схід (управління «в»). Вибирається це управління так, щоб вартість всіх кроків, що залишилися до кінця (включаючи даний) була мінімальна. Цю вартість ми як і раніше будемо називати «умовним оптимальним виграшем» (хоча в даному випадку це не «виграш», а «програш») для даного стану системи S перед початком чергового кроку.

Процедуру умовної оптимізації будемо розгортати у зворотному напрямку — від кінця до початку. Перш за все зробимо умовну оптимізацію останнього, 12-го кроку. Розглянемо окремо правий верхній кут нашої прямокутної сітки (рис. 4.3). Де ми можемо перебувати після 11-го кроку?

Тільки там, звідки за один (останній) крок можна потрапити в В, тобто в одній з точок або .

Якщо ми знаходимося в точці , у нас немає вибору (управління вимушене): треба йти на схід, і це обійдеться нам у 10 одиниць. Запишемо це число 10 в окіл точки , а оптимальне керування покажемо короткої стрілкою, що виходить із і спрямованої на схід. Для точки управління теж вимушене (північ), витрата до кінця дорівнює 14, ми його запишемо в окіл точки . Таким чином, умовна оптимізація останнього кроку зроблена, і умовний оптимальний виграш для кожної з точок , знайдений і записаний у відповідному околі.

Тепер давайте оптимізувати передостанній (11-й) крок. Після предпредостаннього (10-го) кроку ми могли опинитися в одній з точок (рис. 4.4). Знайдемо для кожної з них умовне оптимальне керування і умовний оптимальний виграш. Для точки управління вимушене: йти на схід; обійдеться це нам до кінця в 21 одиницю (11 на даному кроці, плюс 10, записаних в околі при ). Число 21 записуємо в околі точки . Для точки управління вже не вимушене: ми можемо йти як на схід, так і на північ. У першому випадку ми витратимо на даному кроці 14 одиниць і від до кінця — ще 14, всього 28 одиниць. Якщо підемо на північ, витратимо 13 + 10, всього 23 одиниці. Значить, умовне оптимальне керування в точці — йти на північ (відзначаємо це стрілкою, а число 23 записуємо в гуртку у ). Для точки управління знову вимушене («з»), обійдеться це до кінця в 22 одиниці (ставимо стрілку на північ, число 22 записуємо в околі при ).

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

у(північ)

Рис. 4.5.

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

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

Тобто перші чотири кроки ми повинні робити на північ, наступні два — на схід, потім знову один на північ і решта п’ять — на схід. Задача вирішена.

Зауважимо, що в ході умовної оптимізації ми можемо зіткнутися з випадком, коли обидва управління для деякої точки на площині є оптимальними, тобто приводять до однакової витрати коштів від цієї точки до кінця. Наприклад, в точці з координатами (5; 1) обидва управління «с» і «в» є оптимальними і дають витрати до кінця рівними 62. З них ми довільно вибираємо будь-яке (в нашому випадку ми вибрали «с»; з тим же успіхом ми могли б вибрати «в»). Такі випадки неоднозначного вибору оптимального управління постійно зустрічаються в динамічному програмуванні; надалі ми спеціально відзначати їх не будемо, а просто виберемо довільно будь-який з рівноцінних варіантів. Від цього свавілля, зрозуміло, може залежати оптимальне керування всім процесом, але не оптимальний виграш. Взагалі, в задачах динамічного програмування (як і в завданнях лінійного) розв’язок далеко не завжди єдиний.

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

x =(с,с,в,в,в,в,с,в,в,в,с,с).

Підрахуємо витрати для цієї траєкторії. Вони будуть рівні:

W = 10 +12 + 8 + 10 + 11 + 13 + 15 + 8 + 10 + 9 + 8 +14 = 128,

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

Зробимо одне попутне зауваження. Уважний читач, мабуть, зауважив, що в нашій задачі точки А і В (початок і кінець) в принципі нічим одна від одної не відрізняються: можна було б будувати умовні оптимальні управління не з кінця до початку, а з початку до кінця, а безумовні — у зворотному напрямку. Дійсно, це так: у будь-якій задачі динамічного програмування «початок» і «кінець» можна поміняти місцями. Це абсолютно рівносильно описаній раніше методиці в розрахунковому відношенні, але дещо менш зручно при словесному поясненні ідеї методу: легше аргументувати, посилаючись на «вже сформовані» умови до початку даного кроку, ніж на ті, які ще «чекають» після цього кроку. По суті ж обидва підходи абсолютно рівнозначні.

2. Задача про розподіл ресурсів. Метод динамічного програмування дозволяє з успіхом вирішувати багато економічних задач. Розглянемо одну з найпростіших таких задач. У нашому розпорядженні є якийсь запас засобів (ресурсів) К, який повинен бути розподілений між т підприємствами П1, П2,..., ПM. Кожне з підприємств Пi при вкладенні в нього якихось коштів х приносить дохід, що залежить від х, тобто представляє собою якусь функцію φi (x). Всі функції φi (x) (i = 1, 2,..., т) задані (зрозуміло, ці функції — неспадні). Виникає питання, як потрібно розподілити засоби між підприємствами, щоб в сумі вони дали максимальний дохід?

Ця задача легко вирішується методом динамічного програмування. Хоча у своїй постановці вона не містить згадки про час, можна все ж операцію розподілу коштів подумки розгорнути в якійсь послідовності, вважаючи за перший крок вкладення коштів у підприємство П1, за другий — у П2 і т.д.

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

(4.13)

Вирішимо цю задачу спочатку в загальному, формульному вигляді, а потім — для конкретних числових даних. Знайдемо для кожного i-гo кроку умовний оптимальний виграш (від цього кроку і до кінця), якщо ми підійшли до даного кроку з запасом коштів S. Позначимо умовний оптимальний виграш Wi (S), а відповідне йому умовне оптимальне керування — кошти, вкладені в I-е підприємство, — xi (S).

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

,

а умовний оптимальний виграш

Переймаючись цілою гамою значень S (розташовуючи їх досить тісно), ми для кожного значення S будемо знати xm(S) і Wm(S). Останній крок оптимізований.

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

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

(4.14)

Це означає, що береться максимальне значення по x<s всіх х, які тільки можливі (вкласти більше, ніж S, ми не можемо), від виразу, що стоїть у фігурних дужках. Цей максимум і є умовний оптимальний виграш за два останні кроки, а те значення х, при якому цей максимум досягається, — умовне оптимальне керування на (m – 1)-му кроці.

Далі оптимізуємо (m – 2)-й, (m – 3)-й і т.д. кроки. Взагалі, для будь-якого iго кроку будемо знаходити умовний оптимальний виграш за всі кроки з цього і до кінця за формулою

(4.15)

і відповідне йому умовне оптимальне керування xi(S) — те значення х, при якому цей максимум досягається.

Продовжуючи таким чином, дійдемо, нарешті, до 1го підприємства П1. Тут нам не потрібно буде варіювати значення S; ми точно знаємо, що запас коштів перед першим кроком дорівнює К:

(4.16)

Отже, максимальний виграш (дохід) від вкладання усіх коштів підприємств знайдений. Тепер залишається тільки «прочитати рекомендації». Те значення х, при якому досягається максимум (4.4), і є оптимальне управління на 1-му кроці. Після того як ми вкладемо ці кошти у 1-е підприємство, у нас їх залишиться К – . «Читаючи» рекомендацію для цього значення S, виділяємо другу підприємству оптимальну кількість коштів: = (К – ), і т. д. до кінця.

А тепер вирішимо чисельний приклад. Вихідний запас коштів К = 10 (умовних одиниць), і потрібно його оптимальним чином розподілити між п’ятьма підприємствами (т = 5). Для простоти припустимо, що вкладаються тільки цілі кількості коштів. Функції доходу φi (x) задано в табл. 4.1.

У кожному стовпці, починаючи з певної суми вкладень, доходи перестають зростати (реально це відповідає тому, що кожне підприємство здатне «освоїти» лише обмежена кількість засобів). Зробимо умовну оптимізацію так, як це було описано вище, починаючи з останнього, 5-го кроку. Кожен раз, коли ми підходимо до чергового кроку, маючи запас засобів S, ми пробуємо виділити на цей крок те чи інше кількість коштів, беремо виграш на даному кроці по табл. 4.1, складаємо з уже оптимізованим виграшем на всіх наступних кроках до кінця (враховуючи, що коштів у нас залишилося вже менше, як раз на таку кількість коштів, яку ми виділили) і знаходимо то вкладення, на якому ця сума досягає максимуму. Це вкладення і є умовне оптимальне керування на даному кроці, а сам максимум — умовний оптимальний виграш.

Таблиця 4.1

X

1

2

3

4

5

6

7

8

0,5

1,0

1,4

2,0

2,5

2,8

3,0

3,0

0,1

0,5

1,2

1,8

2,5

2,9

3,5

3,5

0,6

1,1,

1,2

1,4

1,6

1,7

1,8

1,8

0,3

0,6

1,3

1,4

1,6

1,7

1,8

1,8

1,0

1,2

1,3

1,3

1,3

1,3

1,3

1,3

У табл. 4.2 дані результати умовної оптимізації по всіх кроків.

Таблиця 4.2

S

i=5

i=4

i=3

i=2

i=1

x5(S)

W5(S)

x4(S)

W4(S)

x3(S)

W3(S)

x2(S)

W2(S)

x1(S)

W1(S)

1

2

3

4

5

6

7

8

9

10

[1]

2

3

4

5

6

7

8

9

10

1,0

1,2

1,3

1,3

1,3

1,3

1,3

1,3

1,3

1,3

[0]

1

2

3

3

4

5

5

6

7

1,0

1,3

1,6

2,3

2,5

2,6

2,7

2,8

2,8

2,8

0

1

[2]

2

1

2

2

4

5

5

1,0

1,6

2,1

2,4

2,9

3,4

3,6

3,7

3,9

4,1

0

0

0

0

0

5

5

[5]

7

7

1,0

1,6

2,1

2,4

2,9

3,5

4,1

4,6

5,1

5,6

[2]

[5,6]

Таблиця побудована так: у першому стовпці даються значення запасу засобів S, з яким ми підходимо до цього кроку. Далі таблиця розділена на п’ять пар стовпців, відповідно номеру кроку. У першому стовпці кожної пари наводиться значення умовного оптимального управління, у другому — умовного оптимального виграшу. Таблиця заповнюється зліва направо, зверху вниз. Рішення на п’ятому — останньому — кроці вимушене: виділяються всі засоби; на всіх інших кроках рішення доводиться оптимізувати. В результаті послідовної оптимізації 5го, 4го, третій, 2го і 1го кроків ми отримаємо повний список всіх рекомендацій з оптимального керування і безумовний оптимальний виграш W* за всю операцію — в даному випадку він дорівнює 5,6. В останніх двох стовпцях таблиці 4.2 заповнена тільки один рядок, так як стан системи перед початком першого кроку нам в точності відомо: S0 = К = 10.

Оптимальні управління на всіх кроках виділені рамкою. Таким чином, ми отримали остаточний висновок: треба виділити першому підприємству дві одиниці з десяти, другому — п’ять одиниць, третьому — дві, четвертому — жодної, п’ятому — одну одиницю. При цьому розподілі дохід буде максималь­ний і дорівнює 5,6.

Щоб читачеві було зрозуміло, як заповнюється таблиця 4.2, продемонструємо це на одному зразку розрахунку. Нехай, наприклад, нам потрібно оптимізувати рішення х3 (7) — як поступати на третьому кроці, якщо ми підійшли до нього з запасом коштів S = 7, і скільки максимум ми можемо виграти на всіх, що лишилися кроках, включаючи третій? Припустимо, що всі кроки після третього (4й і 5й) вже оптимізовані, тобто заповнені дві перші пари стовпців табл. 4.2. Знайдемо х3 (7) і W3 (7). Для цього складемо допоміжну табличку (див. табл. 4.3).

Таблица 4.3

x

7 – x

φ 3 (x)

W4 (7 – x)

φ 3(x) + W4 (7 – x)

7

6

5

4

3

2

1

0

0

1

2

3

4

5

6

7

1.8

1.7

1.6

1.4

1.2

1.1

0.6

0

0

1.0

1.3

1.6

2.3

2.5

2.6

2.7

1.8

2.7

2.9

3.0

3.5

3.6

3.2

2.7

У першому її стовпці перераховані всі можливі вкладення х на третьому кроці, не перевершують 5 = ​​7. У другому стовпці — те, що залишиться після такого вкладення від запасу коштів S = 7. У третьому стовпці — виграш на третьому кроці від вкладення коштів х у третє підприємство (заповнюється за стовпцем φ3 (x) табл. 8.1). У четвертому стовпці — оптимальний виграш на всіх залишилися кроки (четвертому та п’ятому) за умови, що ми підійшли до четвертого кроку з рештою засобів (заповнюється за стовпцем i = 4 табл. 4.2).

У п’ятому стовпці — сума двох виграшів: крокового і оптимізованого подальшого при даному вкладенні х у третій крок. З усіх виграшів останнього стовпця вибирається максимальний (у табл. 4.3 він дорівнює W3 (7) = 3,6, а відповідне управління x (7) = 2). Виникає питання: а якщо в допоміжній таблиці типу 4.3 максимум досягається не за однієї х, а при двох чи більше? Відповідаємо: абсолютно все одно, яке з них вибрати; від цього виграш не залежить. Взагалі, в задачах динамічного програмування рішення зовсім не повинно бути єдиним (ми про це вже згадували).

3. Завдання про завантаження машини. Користуючись методом динамічного програмування, можна з успіхом вирішувати ряд задач оптимізації, описаних в розділі 3, зокрема, деякі задачі цілочисельного програмування.

Як приклад розглянемо задачу про завантаження машини (ми вже згадували про неї в попередньому розділі): є певний набір предметів П1, П2, ..., Пn (кожен в єдиному примірнику); відомі їх ваги q1, q2, ..., qn і вартості с1, c2, ..., сn. Вантажопідйомність машини дорівнює Q. Питається, які з предметів потрібно взяти в машину, щоб їх сумарна вартість (при сумарній вазі ≤ Q) була максимальна?

Неважко помітити, що це завдання, по суті, нічим не відрізняється від попереднього (розподіл ресурсів між n підприємствами), але є дещо простішим за нього. Справді, процес завантаження машини можна уявляти собі як такий, що складається з n кроків; на кожному кроці ми відповідаємо на питання: брати даний предмет в машину або не брати? Управління на i-ому кроці дорівнює одиниці, якщо ми цей (i-й) предмет беремо, і нулю — якщо не беремо. Це означає, що на кожному кроці у нас всього два управління, а це дуже приємно. А чим ми будемо характеризувати стан системи S перед черговим кроком? Очевидно, вагою S, яка ще залишилась в нашому розпорядженні до кінця (повного завантаження машини) після того, як попередні кроки виконані (якісь предмети завантажені в машину). Для кожного із значень S ми повинні знайти Wi(S) — сумарну максимальну вартість предметів, якими можна «довантажити» машину при даному значенні S, і покласти xi(S) = 1, якщо ми цей (i-й) предмет беремо в машину, і xi(S) = 0 якщо не беремо. Після цього ці умовні рекомендації повинні бути прочитані, і справа зроблена!

Вирішимо до кінця конкретний числовий приклад: є шість предметів, вага та вартість яких вказані в табл. 4.4. Сумарна вантажопідйомність машини Q = 35 одиниць ваги. Необхідно вказати номери предметів, які потрібно включити у вантаж, щоб їх сумарна вартість була максимальна.

Таблиця 4.4

Предмет Пі

П1

П2

П3

П4

П5

П6

Вага qi

4

7

11

12

16

20

Вартість сі

7

10

15

20

27

34

Предмети в таблиці 4.4 пронумеровані в порядку зростання ваги; вартості їх також зростають, що не обов’язково, але природно. Заздалегідь зрозуміло, що завантажувати машину предметами великої ваги і малої вартості є недоцільним.

Як і раніше, будемо надавати S тільки цілі значення.

Умовна оптимізація рішення показана в таблиці 4.5, де в кожному рядку для відповідного номера кроку (номери предмета) наведені: умовне оптимальне управління xi та умовний оптимальний виграш W ⃰.

Таблиця 4.5

S

і = 6

і = 5

і = 4

і = 3

і = 2

і = 1

xi

Wi

xi

Wi

xi

Wi

xi

Wi

xi

Wi

xi

Wi

1

2

3

4

5

6

7

8

9

10

11

12

13

0

0

0

0

0

0

0

0

0

0

0

1

0

0

0

0

0

0

0

0

0

0

2

0

0

0

0

0

0

0

0

0

0

3

0

0

0

0

0

0

0

0

0

0

4

0

0

0

0

0

0

0

0

0

0

5

0

0

0

0

0

0

0

0

0

0

6

0

0

0

0

0

0

0

0

0

0

7

0

0

0

0

0

0

0

0

1

10

8

0

0

0

0

0

0

0

0

1

10

9

0

0

0

0

0

0

0

0

1

10

10

0

0

0

0

0

0

0

0

1

10

11

0

0

0

0

0

0

1

15

0

15

Закінчення табл. 4.5

1

2

3

4

5

6

7

8

9

10

11

12

13

12

0

0

0

0

1

20

0

20

0

20

13

0

0

0

0

1

20

0

20

0

20

14

0

0

0

0

1

20

0

20

0

20

15

0

0

0

0

1

20

0

20

0

20

16

0

0

0

27

0

27

0

27

0

27

17

0

0

1

27

0

27

0

27

0

27

18

0

0

1

27

0

27

0

27

0

27

19

0

0

1

27

0

27

0

27

1

30

20

1

34

0

34

0

34

0

34

0

34

21

1

34

0

34

0

34

0

34

0

34

22

1

34

0

34

0

34

0

34

0

34

23

1

34

0

34

0

34

1

35

1

37

24

1

34

0

34

0

34

1

35

1

37

25

1

34

0

34

0

34

1

35

1

37

26

1

34

0

34

0

34

1

35

1

37

27

1

34

0

34

0

34

1

42

1

44

28

1

34

0

34

0

47

0

47

0

47

29

1

34

0

34

1

47

0

47

0

47

30

1

34

0

34

1

47

0

47

0

47

31

1

34

0

34

1

47

1

49

0

49

32

1

34

0

34

1

54

0

54

0

54

33

1

34

0

34

1

54

0

54

0

54

34

1

34

0

34

1

54

0

54

0

54

35

1

34

0

34

1

54

0

54

0

57

0

57