Скачиваний:
48
Добавлен:
30.05.2020
Размер:
689.54 Кб
Скачать

Перейдемо до реалізації основної частини алгоритму тексту програми мовою програмування Pascal:

f o r і :- 1 to n do

{Перегляд усіх пар елементів а, і to..}

f o r j := 1 t o m d o

 

if a[i] = b[j]

{Якщо a, = to;, то}

t h e n c[i, j] := c[i - 1, j - 1 ] + 1; {збільшуємо кількість пар елементів, що збіглися,}

e l s e if с[І — 1, j] > с[І, j — 1 ]

{у протилежному випадку визначаємо}

t h e n с[і, j] := с[І - 1, j] {довжину найбільшої поточної підпослідовності.} elsecfi, j] :=с[і, j - 1];

Для коректної роботи алгоритму необхідно виконати таку початкову ініціалізацію:

for І := 0 to n do с[І, 0] := 0;{Створення фіктивного нульового стовпця зі значеннями 0.} f o r j := 0 to m do C[0, j] := 0;{Створення фіктивного нульового рядка зі значеннями 0.}

Виведення результату:

writeln(f_OUt, c[n, т ] ) ; {Виведення довжини найбільшої спільної підпослідовності.} {Ініціалізація виведення значень}

і := n; j := m; k := 0;

 

{найбільшої спільної підпослідовності.}

w h i l e (І > 1) a n d (j > 1) do

 

{Перегляд елементів таблиці.}

begin

 

 

if а[і]= b[j]

 

{Якщо а,= bj, то}

t h e n b e g i n

 

{збереження поточного елемента}

inc(k); rez[k] : = а [ і ] ;

{найбільшої спільної підпослідовності,}

d e c ( і); dec(j)

{перехід до попереднього діагонального елемента;}

end

 

 

e l s e if с[І, j - 1 ] > С[І - 1, j]

{у протилежному випадку}

t h e n dec(j)

 

{перехід до сусіднього зліва елемента}

e l s e dec(i);

 

{або до сусіднього зверху елемента.}

end;

 

 

if а[і]= b[j]

 

{Перевірка збігання а, = to, або а, = ЬД

t h e n b e g i n inc(k); rez[k] := a[i] e n d ;

{і збереження цього значення.}

f o r І := k d o w n to 1 do

 

{Виведення у зворотному порядку}

write(f_OUt, rez[i], ' '); {збережених значень найбільшої спільної підпослідовності.}

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

Тестування описаного вище алгоритму повинно передбача­ ти як невеликі за розміром послідовності, так і достатньо вели­ кі, наприклад при п ^ 100, т < 100. Серед тестів повинні бути такі, які містять тільки одну спільну під послідовність, кілька спільних підпослідовностей і такі, які не містять жодної (послі­ довності at і Ь складаються з різних елементів). Рекомендуєть­ ся також модифікувати розроблену програму і розглянути ви­ падки, коли елементами послідовностей at і Ьу є символи.

212

Задача про розподіл ресурсів

Ця задача має пряме відношення до прикладних економіч­ них задач і може бути розв'язана методом динамічного програ­ мування, її умова формулюється наступним чином.

Інвестиції у розмірі К одиниць коштів повинні бути розпо­ ділені між п підприємствами. Відомо, який дохідрг^ (j=l,2,..., п) дає кожне з визначених підприємств при вкладанні у нього і оди­ ниць коштів (1 ^ і ^ К). Необхідно визначити, як найкраще роз­ поділити інвестиційні кошти між підприємствами, щоб сумарний дохід був максимальним. Під час розв'язування задачі врахувати, що змінні К та і набувають лише цілих невід'ємних значень.

Розглянемо конкретний приклад

для випадку, коли інвестиції в розмірі

і

Рі

Р2

Рз

РІ

6 одиниць коштів вкладаються у 4 під­

1

0,5

0,1

1,1

1,0

приємства. Дохід цих підприємств за­

 

 

 

 

 

2

1,0

0,8

1,9

2,0

даний таблично (мал. 123). Які логічні

 

 

 

 

 

3

1,4

1,6

1,4

2,5

висновки можна зробити, проаналізу­

вавши ці дані? По-перше, дохід кожно­

4

2,0

2,5

1,5

2,5

го підприємства зростає зі зростанням

 

 

 

 

 

5

2,5

2,9

1,5

2,5

вкладених у його виробництво коштів.

 

 

 

 

 

6

2,5

2,9

1,5

2,5

По-друге, для кожного підприємства

настає момент насичення, тобто така ситуація, коли вкладення додаткових

коштів не дає прибутку. Це можна пояснити тим, що потуж­ ність кожного підприємства (працівники, обладнання тощо) обмежена і є межа коштів, які кожне підприємство в змозі ре­ алізувати. По-третє, видно, що четверте підприємство порів­ няно з першим є потужнішим щодо росту ефективності вироб­ ництва, однак меншим, ніж перше, оскільки межа вкладених коштів для нього становить 3, а для першого підприємства 5. З урахуванням усіх цих факторів навряд чи можна інтуїтивно знайти правильну оптимальну відповідь.

Звернемося до методу динамічного програмування. Чи може він бути застосований для розв'язання цієї задачі? Проаналі­ зуємо наявність у даній задачі відомих нам основних характе­ ристик задач динамічного програмування:

-поділом на етапи може бути дослідження вкладення коштів для кожного окремого підприємства;

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

-для кожного підприємства необхідно розглянути всі варіанти вкладення коштів від 0 до К і вибрати найкращий,

213

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

Отже, наявні всі елементи, притаманні задачі динамічного програмування.

Перейдемо до розв'язування задачі й почнемо із структури даних, де зберігатиметься поточна інформація. Зрозуміло, що такою структурою є таблиця. Треба визначитися стосовно вмісту її рядків і стовпців. Для цього з'ясуємо кілька питань. По-перше, що є об'єктом нашого дослідження? Це окремі під­ приємства. По-друге, які конкретні ситуації треба розглянути стосовно кожного з цих підприємств? Прибуток від вкладання в них інвестиційних коштів. Але оскільки невідомо, яким чи­ ном уся сума має бути розподілена між підприємствами, то тре­ ба передбачити розгляд усіх можливих її значень: 0, 1, 2, ..., К. Отже, розмістимо інформацію в таблиці так: рядки і - суми можливих інвестицій від 0 до К, стовпці j - інформація про підприємства, що складається із максимального прибутку рг,, який дасть дане підприємство при вкладенні в нього інвес­ тиційних коштів у розмірі invj одиниць. Розмір коштів invj - це один із можливих варіантів 0, 1, 2, ..., і (inVj < і), при якому су­ ма доходів підприємства j і доходів усіх попередньо розгляну­ тих підприємств при вкладенні в них коштів у розмірі (і - invj) буде максимальною (мал. 124).

і

Рї

 

Р*

р*

Рі

іпщ

 

т

іпхх^

РГ3

ШРЬ

Prz

ІПУ4

РГ4

 

 

 

 

 

 

 

 

0

0

 

0

 

 

 

 

 

 

1

1

 

0,5

 

 

 

 

 

 

2

2

 

1,0

 

 

 

 

 

 

3

3

 

1,4

 

 

 

 

 

 

4

4

 

2,0

 

 

 

 

 

 

5

5

 

2,5

 

 

 

 

 

 

6

6

 

2,5

 

 

 

 

 

 

Мал. 124

Розв'язуватимемо задачу за залишковим принципом, тобто кожного разу аналізуватимемо поточну ситуацію з думкою, що вже деякі кошти на даний момент інвестовані, і визначатиме­ мо, як треба найкраще розподілити їхній залишок. Наприклад, для першого підприємства цю ситуацію можна тлумачити так: між підприємствами р2, р3, ..., рп кошти вже якимось чином розподілені і нам потрібно визначити найкращий варіант їх вкладення в підприємство pv На наступному кроці виконання методу динамічного програмування розглядатимемо підприєм­ ство р2, вважаючи, що задача розв'язана для решти підпри-

214

ємствр3 , ..., рп. Розмір коштів, які визначатимуться для вкла­ дання у підприємствор2, - це залишок від уже вкладених інвес­ тицій у підприємствар3, ..., рп, що враховує також розраховані інтереси підприємства pv Останнє підприємство рп розглядати­ меться нами як те, з якого починається вкладання коштів, тоб­ то ніякого залишку ще немає і в нашому розпорядженні є всі інвестиційні кошти.

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

Для більшої зрозумілості вищесказаного перейдемо до конк­ ретного прикладу. Підприємства розглядатимемо в тому по­ рядку, в якому вони задані в таблиці (мал. 123).

На першому кроці розв'язання задачі, що відповідає четвер­ тому етапу, розглянемо підприємство pv Оскільки ми домо­ вилися задачу розв'язувати за залишковим принципом і поки що невідомо, яку суму найкраще віддати цьому підприємству, то розглянемо всі можливі випадки інвестування коштів від 0 до К. Ця інформація є у вхідній таблиці (мал. 123) і без змін пе­ реноситься до обчислювальної таблиці в стовпецьрх (мал. 124). Будемо її тлумачити так: якщо залишок коштів для під­ приємства рх становитиме 0, то прибуток буде також 0, якщо 1, то - 0,5, і так далі до залишку 6 одиниць і прибутку 2,5. При цьому матимемо на увазі, що на даному етапі для решти під­ приємств р2, ps, рі відповідно виділяється 6, 5, 4, ..., 1, 0 оди­ ниць коштів.

Тут слід знову нагадати суттєве для більшості задач динаміч­ ного програмування зауваження, про яке згадувалося раніше: задача на всіх етапах розв'язується за залишковим принци­ пом. Тобто на кожному етапі, розглядаючи підприємство р , вважатимемо, що для нього залишилось коштів у розмірі і оди­ ниць, а саме 0,1,2, ... або К.

На третьому етапі (другий ітераційний крок) алгоритму розглянемо підприємство^ за умови, що наступні за порядком задані підприємства отримали певну кількість коштів і для першого підприємства проведено аналіз розподілу решти коштів.

Починаємо заповнення інформації для і = 0. Зрозуміло, що при нульових інвестиціях прибуток також становитиме 0. Роз­ глянемо випадок, коли при розподілі інвестицій черга дійде до другого підприємства і їхній розмір становитиме 1. Пам'ятаю­ чи, що для попереднього підприємства інформація вже існує,

215

цю суму можна розподілити так: другому підприємству віддамо 0 коштів, тоді попередньому дістанеться 1, або другому підпри­ ємству - 1, а попередньому - 0. У першому випадку прибутки будуть такі: при нульових вкладеннях у підприємство р2 при­ буток становитиме 0, а при вкладеннях у розмірі 1 у попереднє підприємство - 0,5 (інформація з попереднього стовпця), що сумарно становитиме прибуток у розмірі 0,5. У другому випад­ ку при вкладенні коштів у розмірі 1 у підприємство р2 одержи­ мо прибуток 0,1 (мал. 123, 2-й стовпець), а нульових коштів у попереднє підприємство - 0. Таким чином, сумарний прибуток у другому випадку становитиме 0,1. Порівнявши результати двох прорахованих варіантів і враховуючи те, що ми розв'я­ зуємо задачу максимізації, виберемо з них більше значення 0,5, яке одержується за умови надання підприємству р2 інвестицій у розмірі 0 одиниць, а попередньому (на даному етапі рх ) - 1. Результат запишемо в таблицю для підприємства р2 і для і = 1 (мал. 125, а). Аналогічно робляться розрахунки для інших зна­ чень г = 2 , 3 , 4 , 5 , 6 . На малюнку 125, б наведено приклад роз­ рахунку значень inv2 ірг2 для підприємства р2 при і = 3.

і

Рі

 

А

 

Р

3

Pi

 

inVj

 

ІЩ

Ргг

inv^

Prs

invt

 

 

РГЛ

РГ4

0

0

0

0

0

 

 

 

 

1

1

0,5

0

0,5

 

 

 

 

2

2

1,0

0

1,0

 

 

 

 

3

3

1,5

3

1,6

 

 

 

 

4

4

2,0

4

2,5

 

 

 

 

5

5

2,5

4

3,0

 

 

 

 

6

6

2,5

4

3,5

 

 

 

 

Мал. 125

Рг

 

А

 

Сума

inv2 рг2

invt

ргг

прибутків

0 1 0 ] 3

1,4

1,4

1 ;0,5|і

2

1,0

1,5

2 11,0

 

1 |0,5

1,5

3 :1,61і

0 і

0

1,6

На третьому ітераційному кроці розглянемо другий етап розв'язування задачі і дослідимо підприємство р3. Поперед­ ньою інформацією для нього є варіанти розподілу різних за значеннями залишкових інвестицій між підприємствами рх і р2. Ця інформація вже прорахована і міститься в другому стовпці таблиці, що обчислюється (мал. 126, а). Не варто наво­ дити всі розрахунки для інвестицій у розмірах 0, 1, 2, ..., 6. Зробимо це лише для і = 5 (мал. 126, б) і прокоментуємо для цієї ситуації вибір інвестицій у підприємство р3 значення 1 як найкраще. Загальний розмір інвестицій, які можуть бути на­ дані підприємству р3, обмежені значенням 5. Цю суму можна повністю віддати підприємствам рх ір2і мати при цьому прибу­ ток у розмірі 3,0. Це зафіксовано в таблиці (мал. 126, а) в ряд­ ку 5 і стовпці, який містить інформацію прор2 . У такому разі

216

підприємству не залишиться ніяких коштів і прибуток стано­ витиме 0. Сумарний прибуток при такому розподілі інвести­ ційних коштів становитиме 3,0 (1-й рядок табл., мал. 126, б). Якщо підприємству р3 виділити з 5 одиниць інвестицій 1 оди­ ницю, то його прибуток становитиме 1,1. У такому разі під­ приємствам рх і р2 залишиться 4 одиниці коштів і їх загальний прибуток становитиме 2,5 (4-й рядок, стовпець для підприєм­ ства р2, табл., мал. 126, а). Тепер визначимо суму прибутків від такого розподілу коштів у 5 одиниць: вона становитиме 3,6 (2-й рядок табл., мал. 126, б). Проаналізувавши всі рядки таб­ лиці (мал. 126, б), можна зробити висновок, що найбільший прибуток буде тоді, коли підприємству р3 буде виділено 1 оди­ ницю коштів із 5 можливих.

і

 

Р,

 

А

А

 

А

inv1

Ргл

inv2

Рг?,

inv3

РГЯ

ши4

РГ4

 

0

0

 

0

0

 

0

0

0

 

 

1

1

 

0,5

0

 

0,5

1

1,1

 

 

2

2

 

1,0

0

 

1,0

1

1,6

 

 

3

3

 

1,4

3

 

1,6

1

2,1

 

 

4

4

 

2,0

4

 

2,5

1

2,7

 

 

5

5

 

2,5

4

 

3,0

1

3,6

 

 

6

6

 

2,5

4

 

3,5

1

4,1

 

 

Мал. 126

 

 

А

 

А

Сума

inv3

Ргя

inv2

Ргг

прибутків

і

0

 

0

1 5

 

3,0

3,0

 

1

 

1,1

4

 

2,5

3,6

 

2

 

1,3

3

 

1,6

2,9

 

3

 

1,4

2

 

1,0

2,4

 

4

 

1,5

1

 

0,5

2,0

 

5

 

1,5

0

 

0

1,5

На останньому, першому етапі немає потреби розглядати всі можливі варіанти інвестування коштів від 0 до К у підприєм­ ство/^. Ми розв'язуємо задачу на кожному етапі за залишковим принципом, тобто ніби рухаємося з кінця до початку, розгляда­ ючи спочатку останнє підприємство, якому залишилися певні кошти, потім передостаннє і насамкінець початкове (у нашому випадку р4), з якого починається розподіл інвестицій. Тому вва­ жатимемо, що у цього підприємства на початку є всі можливі інвестиційні кошти в розмірі К одиниць. А от визначитися, яку частину з цієї суми краще віддати йому, а скільки залишити для інших підприємств, ми й повинні на цьому етапі. Це можна зробити за тією самою схемою, що і на попередніх етапах задачі. Розглянемо всі варіанти розподілу суми К одиниць між під­ приємством/^ і рештою підприємстврг, р2, р3: 0 - 6; 1 - 5; 2 - 4; З - 3; 4 - 2; 5 - 1; 6 - 0. Уся необхідна інформація для визначен­ ня кращого з усіх цих варіантів щодо розміру прибутків міс­ титься в останньому стовпці вхідної таблиці (мал. 123) та в по­ передньому стовпці таблиці, яка обчислюється (мал. 127, а). Розрахунок усіх можливих варіантів розподілу коштів для підприємства р4 представлено в таблиці (мал. 127, б). Кращим

217

варіантом розподілу інвестиційних коштів є такий: підприєм­ ству^ надати 2 одиниці, а решті підприємств - 4. При цьому су­ марний прибуток у розмірі 4,7 одиниць буде найбільшим.

і

 

Р

і

 

Рг

Р3

 

А

 

inVj

Рг,

inv_

zРГ,

inv3

РГЯ

invt

рг*

 

0

0

 

0

0

 

0

0

 

0

 

 

1

1

 

0,5

0

 

0,5

1

 

1,1

 

 

2

2

 

1,0

0

 

1,0

1

 

1,6

 

 

3

3

 

1,4

3

 

1,6

1

 

2,1

 

 

4

4

 

2,0

4

 

2,5

1

 

2,7

 

 

5

5

 

2,5

4

 

3,0

1

 

3,6

 

 

6

6

 

2,5

4

 

3,5

1

 

4,1

2

4,7

а)

Мал. 127

 

Р*

 

А

Сума

inv4

РГ4

inv3

Ргз

прибутків

0

 

0

6

 

4,1

4,1

1

 

1,0

5

 

3,6

4,6

2

 

2,0

4

 

2,7

4,7

3

 

2,5

3

 

2,1

4,6

4

 

2,5

2

 

1,6

4,1

5

 

2,5

1

 

ІД

3,6

6

 

2,5

0

 

0

2,5

 

 

 

 

 

 

 

б)

 

 

 

 

 

 

Отримано розв'язок поставленої задачі: максимальний при­ буток при вкладенні інвестиційних коштів у розмірі 6 одиниць

упідприємстваpv р2, р3, р4 становитиме 4,7 одиниць. Залишилося відкритим запитання: а як ці кошти розподілити

між підприємствами для отримання такого сумарного прибутку? Відповідь міститься безпосередньо у розрахованій таблиці (мал. 127, а). Для останнього розглянутого підприємства р4 відповідь однозначна: йому треба надати інвестиції у розмірі 2 одиниці. При цьому решті підприємствам залишається 4 оди­ ниці. Переходимо до інформації, що міститься в попередньому стовпці матриці (мал. 127, а). У четвертому її рядку міститься інформація про те, що за наявності 4 одиниць інвестицій підприємству ps слід виділити з них 1 одиницю. Тепер у нас зали­ шилося 3 одиниці інвестиційних коштів для розподілу їх двом підприємствам рг і р2. Переходимо до інформації про підприєм­ ство р2 і визначаємося зі стратегією подальших дій щодо цього підприємства. У третьому рядку і стовпці, що стосується різних варіантів розподілу коштів для підприємства р2, розміщена інформація і про те, що за наявності 3 одиниць інвестиційних коштів підприємству р2 треба виділити 3 одиниці, отримавши при цьому прибуток 1,6 одиниць. Таким чином, залишок інвести­ цій на поточний момент становить 0 одиниць. Саме стільки зали­ шається підприємству pv У таблиці (мал. 127, а) півжирним кур­ сивом виділена інформація про розподіл інвестиційних коштів між усіма підприємствами для нашого конкретного прикладу.

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

218

менті таблиці, а розподіл коштів між окремими підприємства­ ми можна визначити із самої таблиці.

Незважаючи на нібито складний алгоритм розв'язання за­ дачі, його програмний код, що супроводжується коментарями, виглядає досить акуратно і зрозуміло. Пояснимо призначення деяких змінних. У двовимірному масиві profit^ міститься вхідна інформація про прибуткову ефективність підприємств. Для розрахунків значень таблиці використовується дво­ вимірний масив ctj типу record з полями invest, де міститься розмір інвестицій, T&prof - розмір прибутків. Змінна max_prof використовується для визначення максимального значення по­ точного прибутку.

for І := 0 to k do {Визначення прибутку для підприємства р, від вкладання /' коштів.}

begin

 

 

с[і, 1].invest := і;

 

 

с[і, 1].prof := profit[i, 1];

 

end;

 

 

for j := 2 to П do

{Розрахунок значень таблиці для підприємств р2, р3, ..., р„.}

for і := 1 to k do

 

 

begin

 

 

max_prof := 0;

{Початкове значення максимуму.}

for І := 0 to І do

{Пошук максимального значення сумарного прибутку між}

 

 

{підприємством ру}

if profit[l, j] + с[і - І, j - 1].prof > max_prof

{і рештою підприємств.}

then begin

 

 

max_prof := profit[l, j] + c[i - 1 , j - 1].prof;

maxjnv := I

 

end;

 

 

c[i, j].invest := maxjnv; c[i, j].prof := max_prof;

{Занесення обчислених}

end;

, {оптимальних значень у результуючу таблицю.}

Виведення розподілу інвестиційних коштів між усіма під­ приємствами може бути таким:

 

{Виведення значення максимального сумарного прибутку.}

writeln(f out, c[k, n].prof:0:2);

і := k; j := n;

{Початок виведення розподілу коштів між підприємствами.}

while j > 0 do

{Поки не розглянуті всі підприємства, вивести}

b e g i n

{розмір інвестицій для ру при залишку;' одиниць,}

write(f_out, j, '-- > ', с[і, j].invest, '; ');

dec(i, c[i, j].invest); {обчислити нове значення залишку інвестиційних коштів,}

dec(j);

{перейти до попереднього підприємства.}

end;

 

Для визначення оцінки ефективності роботи алгоритму роз­ в'язування задачі про розподіл ресурсів між підприємствами, проаналізуємо кількість виконаних дій на кожному етапі. Зага­ лом обчислювалися елементи таблиці розмірністю n*k, для чого

219

було виконано відповідно nk операцій. Для обчислення кожного і-го елемента таблиці аналізуються значення від 0 до і. Оскільки і змінюється від 0 до k, то в середньому таких обчислень буде k/2. Таким чином одержимо загальну кількість виконуваних дій nk2/2 т nk2. Ми вийшли на оцінку ефективності роботи описано­ го алгоритму в такому вигляді: 0(nk2). Це дещо більше, ніж було в двох попередніх задачах, однак значно вигідніше, ніж повний перебір усіх можливих варіантів і визначення кращого з них.

Під час тестування розробленого алгоритму у вигляді про­ грами слід передбачити обробку інформації для невеликих зна­ чень пік (наприклад, п < 10, k < 10) та значно більших (наприк­ лад, п < 100, k < 100). Цікаво також дослідити кількість вико­ нуваних операцій при п < 10, k < 100 та л ^ 100, h < 10. Зро­ зуміло, що вона буде залежати більшою мірою від розміру інвестиційних коштів. Щодо дослідження впливу прибуткової ефективності підприємств на результат розподілу коштів між ними, то можна запропонувати згенерувати такі вхідні:

-усі підприємства мають однакову прибуткову ефективність;

-підприємства утворюють зростаючу послідовність щодо прибуткової ефективності;

-підприємства утворюють спадну послідовність щодо при­ буткової ефективності;

-підприємства суттєво відрізняються один від одного щодо прибуткової ефективності.

До речі, слід зазначити, що при зміні послідовності розгля­ ду досліджуваних підприємств оптимальна відповідь збере­ жеться, а от розподіл інвестицій між ними може виявитися іншим. Варто дослідити це під час тестування.

Задача про рюкзак

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

Нагадаємо умову задачі. Для кожного з п предметів відома вага at і вартість с; (і = 1, 2, ..., п). Задача полягає у заванта­ женні рюкзака таким чином, щоб сумарна вартість завантаже­ них предметів була максимальною, а вага рюкзака при цьому не перевищувала заданого значення К.

Принцип побудови шуканого алгоритму дуже схожий на ал­ горитм розв'язування задачі про розподіл інвестиційних ре-

220

сурсів між підприємствами. У центрі уваги буде так само два фактори: вага предмета і його вартість. Результатом аналізу цих двох факторів є один з двох варіантів: брати чи не брати да­ ний предмет. Усю цю інформацію вноситимемо в таблицю, схо­ жу до наведеної у попередній задачі.

Продемонструємо на конкретному при­

 

 

 

 

 

 

/>,

Pz

Pi

кладі алгоритм визначення найдорожчого

 

і водночас найлегшого набору предметів,

w

9

7

4

2

V

24

11

10

7

сумарна вага яких не перевищить задано­

го значення К. Розглянемо 4 предмети,

 

Мал. 128

 

для кожного з яких відома вартість і вага

 

 

 

 

 

 

 

(мал. 128). Нехай максимальна вага рюкзака може становити 15 одиниць.

Хоча під час виконання алгоритму для одержання результу­ ючої максимальної за вартістю відповіді не має значення, у якому порядку розглядати предмети, мабуть логічніше почати з найважчого. Тому розглядатимемо інформацію про предмети саме в порядку спадання їх ваги.

Розбиття задачі на етапи полягає в дослідженні окремих предметів рх, р2, р3, р4, тому таблиця буде складатися із стовп­ ців, де подана інформація щодо них: брати чи не брати даний предмет (tt) і яка поточна вага при цьому одержиться (и;). На кожному з цих етапів треба розглядати випадок, коли залишок

ваги рюкзака становить і одиниць Саме ця інформація буде

розташована у рядках

таб­

 

Рі

 

Р

2

 

Р

я

 

Рі

 

лиці (мал. 129).

 

 

і

 

 

 

 

 

 

J^

 

Ч

V,

h

 

 

 

JL_

 

Почнемо розгляд розв'я­

 

v l

 

 

U 8

V4

0

0

0

 

 

 

 

 

 

 

 

зування задачі з останнього,

 

 

 

 

 

 

 

 

1

0

0

 

 

 

 

 

 

 

 

четвертого етапу. Як і в за­

 

 

 

 

 

 

 

 

2

0

0

 

 

 

 

 

 

 

 

дачі про розподіл

ресурсів,

 

 

 

 

 

 

 

 

вважатимемо, що це остан­

3

0

0

 

 

 

 

 

 

 

 

ній предмет, який нами роз­

4

0

0

 

 

 

 

 

 

 

 

глядається, а тому для нього

5

0

0

 

 

 

 

 

 

 

 

може залишитися

резерв

6

0

0

 

 

 

 

 

 

 

 

ваги в розмірі 0 до 15. З вхід­

 

 

 

 

 

 

 

 

 

 

 

7

0

0

 

 

 

 

 

 

 

 

ної інформації (мал.

128)

 

 

 

 

 

 

 

 

8

0

0

 

 

 

 

 

 

 

 

відомо, що цей предмет ва­

 

 

 

 

 

 

 

 

9

1

24

 

 

 

 

 

 

 

 

жить 9 одиниць і його вар­

 

 

 

 

 

 

 

 

10

1

24

 

 

 

 

 

 

 

 

тість становить 24. Тому в

 

 

 

 

 

 

 

 

11

1

24

 

 

 

 

 

 

 

 

перший стовпець для пред­

 

 

 

 

 

 

 

 

мета/^, тільки, починаючи з

12

1

24

 

 

 

 

 

 

 

 

і = 9 д о і = 1 5 , можна занести

13

1

24

 

 

 

 

 

 

 

 

інформацію: предмет можна

14

1

24

 

 

 

 

 

 

 

 

взяти {t1 = 1) і його вартість

 

 

 

 

 

 

 

 

 

 

 

15

1

24

 

 

 

 

 

 

 

 

при цьому становитиме 24

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(vl = 24).

 

 

 

 

 

Мал. 129

 

 

 

 

 

221