
О.О.П / ооп / 4_кол / К курсовой / Методи побудови алгоритмів та їх аналіз. Караванова Т.П. / 202_251
.PDFПерейдемо до реалізації основної частини алгоритму тексту програми мовою програмування 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
сурсів між підприємствами. У центрі уваги буде так само два фактори: вага предмета і його вартість. Результатом аналізу цих двох факторів є один з двох варіантів: брати чи не брати да ний предмет. Усю цю інформацію вноситимемо в таблицю, схо жу до наведеної у попередній задачі.
Продемонструємо на конкретному при |
|
|
|
|
|
|
|
/>, |
P» |
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