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

5.Який учений запропонував алгоритм розв'язку задачі про при­ значення?

6.Якою є мотивація використання операції приведення у задачі про призначення?

7.Обґрунтуйте використання алгоритму побудови максимального паросполучення на приведеній таблиці в задачі про призначення.

8.Які додаткові масиви і як використовуються в алгоритмі розв'я­ зування задачі про призначення?

9.Які вершини в дводольному графі називаються ненасиченими і які - досяжними із ненасичених? Як ця властивість вершин вико­ ристовується під час розв'язування задачі про призначення?

10.Яка операція перетворення таблиці даних задачі про призначен­ ня носить ім'я Егерварі? Як вона використовується під час роз­ в'язування задачі про призначення?

11.Чому алгоритм розв'язування задачі про призначення вважаєть­ ся ітераційним?

12.Як обчислюється результат розв'язування задачі про призна­ чення?

13.Наведіть власний приклад задачі про призначення і продемон­ струйте на ньому всі етапи її розв'язування.

14.Сформулюйте алгоритм розв'язування задачі про призначення в загальному вигляді.

15.Запишіть фрагмент основної частини реалізації алгоритму роз­ в'язання задачі про призначення мовою програмування.

202

0 1 0 1 0 1 0 1 0 1

s t і о і і о і о

1 1 1 1 0 в 1 1 0 0 1 1 0 1 1 (1 ! 0

 

іооі

оііі

10 1 1 1 0 0

0 1

0 0 0

0 110 1

 

 

10 10 0 1 Сі 1

0

0 1 10 10 0 1

0

0 1 1 1 0 1?

 

10 11

 

0

0

1

0

0 0

 

1

 

1

0

 

 

1

 

ОСНОВИ ДИНАМІЧНОГО ПРОГРАМУВАННЯ

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

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

Чим відрізняються ці види задач? Для пояснення відмінності між методиками розв'язування задач лінійного та динамічного програмування введемо поняття етапу їх виконання.

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

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

203

Ідею розв'язування задач динамічного програмування можна представити так. Спершу розглянемо деяку умовну задачу, про­ цес розв'язку якої можна розбити на етапи і яка на кожному з цих етапів має три варіанти відповідей vv v2, v3. Щоб не загуби­ ти жодного кінцевого розв'язку задачі, необхідно було б на на­ ступному, другому, етапі розв'язати задачу для кожного з цих варіантів відповідей. Якщо цей процес продовжувати далі, то на останньому, n-му, етапі ми будемо мати справу з 3"~J варіантами відповідей. Оскільки розглядається задача оптимізації, яка ви­ магає визначення максимального чи мінімального значення серед усіх 3" ~1 отриманих відповідей, то для скорочення цієї кіль­ кості на кожному етапі варто відкидати ті проміжні варіанти відповідей, які не є оптимальними, а значить, і не приведуть до оптимального кінцевого результату. Цей факт є незаперечним, оскільки задачі динамічного програмування визначені як такі, що розбиваються на окремі залежні одна від одної підзадачі, а звідси випливає, що неоптимальний розв'язок однієї з підзадач у жодному разі не дасть оптимального кінцевого розв'язку.

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

Етап 1

 

 

 

 

»і

 

щ

Щ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

t

т

 

 

 

 

 

Етап 2

 

 

 

 

%

¥л

v3

 

Vi

v2

v

3

 

 

 

 

 

-:k

 

 

Ч

х-

 

•V"

--•»

'

'

Етап З

Щ

»2

v3

 

Щ

 

v2

v3

 

Щ

v2

v3

Мал. 119

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

І ще один підсумок попередніх міркувань: задачі динамічно­ го програмування є задачами оптимізаціиними, оскільки на

204

\

й

 

 

 

 

 

 

 

 

 

 

\

e

 

 

 

 

 

 

 

 

 

 

\

є

 

 

 

 

 

 

 

 

 

 

\ •

1

 

2

 

 

3

 

 

...

 

 

 

 

 

 

 

 

re

 

* \

 

 

 

 

 

 

 

 

 

 

I\

 

 

 

 

 

 

 

 

 

 

«5 \

і

2

, 1 1 1*

 

3

- 2

2

2.

...

v°= опт(и"\і;2 ''"\іС)

 

і

 

v, = опт(і>, ,v, ,v,)

u, = опт(и, ,v2 ,v3)

 

2

і

v2 =

om(v',v2,v3)

 

3

, 2

2

2 .

...

u2*= опт(і>1"~\и2"~1>іС)

 

 

v2

= опт(и, ,v2

,l>3 )

 

3

1

U,2= опт^'.и.'.и,1 )

 

3

, 2

2

2 .

...

v;= oni(v°\v;~\v;1)

 

Щ

ід, = опт(иІ

,v, ,v3)

 

 

 

 

 

 

Мал. 120

 

 

 

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

Після завершення знайомства з даним розділом варто до викладених теоретичних понять повернутися ще раз. Це дасть можливість чіткіше уяснити суть задач динамічного програму­ вання і методики їх розв'язування.

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

Задача про прокладання найвигіднішого шляху між двома пунктами

Почнемо з умови задачі. Залізнична колія, що прокладаєть­ ся між двома населеними пунктами А і В, має пройти через пе­ ресічену місцевість: ліси, болота, річку, пагорби тощо. Відома вартість прокладання дороги через окремі зони, на які можна розбити місцевість між цими населеними пунктами. Необхідно так прокласти дорогу, рухаючись від пункту А до пункту В, щоб сумарні витрати на її спорудження були мінімальними.

Розглянемо конкретний приклад. Прямокутна область між двома пунктами А і В розбита на зони 5-ма рядками і 4-ма стовпцями, у кожній з яких зазначена вартість прокладання залізничної колії (мал. 121, а). Будемо рухатися від лівої нижньої зони до правої верхньої лише вгору і направо. Вислов­ люючись алгоритмічною мовою, вважатимемо, що задана таб­ лиця atj розмірністю n*m (п = 5, m = 4).

Перша ознака задачі динамічного програмування полягає в тому, що загальне розв'язування задачі можна розбити на окремі етапи, на кожному з яких розглядатиметься елемент таблиці а«.

Стартовим буде елемент а5 1 : його значення не змінюється (мал. 121, а). Розглянемо сусідні для нього елементи, у які може

205

виконуватися перехід: а4 1 і а5 2 . Зміна значення елемента а4 1 за­ лежить лише від значення а5 1 , і вартість такого переходу станови­ тиме 3 + 10 = 13. Зміна значення елемента а5 2 залежить також ли­ ше від значення а5 1 , і його значення при переході від а5 1 вправо становитиме 3 + 4 = 7 (мал. 121, б). Для зручності оброблені еле­ менти таблиці виділено сірим кольором. Наступним для розгляду елементом може бути а4 2 . До цього елемента можна перейти вже двома шляхами: або від лівого елемента а4 1 , або від нижнього а5 2 . Вартість першого переходу становитиме 13 + 1 = 14, а другого - 7 + 1 = 8. Зрозуміло, що кращим є другий перехід. Запишемо це нове перераховане значення а4 2 у таблицю (мал. 121, в). Продов­ жуючи за аналогією перерахунок значень елементів таблиці, бу­ демо розглядати ті її елементи, для яких існує перерахований лівий і нижній елементи, а для крайніх елементів - відповідно лівий або нижній. На кожному етапі новим значенням елемента а.- буде менше з двох можливих варіантів. Таким чином дійдемо до останнього елемента а1 4 (мал. 121, и). Отримане значення для нього і буде найменшою вартістю прокладання залізничної колії від населеного пункту А до населеного пункту В. Для нашого прикладу вона становитиме 28.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

8

5

 

5

2

8

5

 

5

2

8

5

 

5

2

8

5

 

5

2

8

5

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

4

6

1

 

1

4

6

1

 

1

4

6

1

 

1

4

6

1

 

1

4

6

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

7

5

6

 

3

7

5

6

 

3

7

5

6

 

16

7

5

6

 

Ні

 

1Г)

5

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

1

5

3

 

13

1

5

3

 

ІЗ

8

5

3

 

13

 

N

5

3

 

13

8

 

і:.

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

4

2

6

 

3

 

Ж

2

6

 

"а*

7

2

6

 

3

7

 

«і

6

 

3

7

9

6

 

а)

 

 

 

 

 

 

 

б)

 

 

 

 

 

 

 

в)

 

 

 

 

 

 

 

г)

 

 

 

 

 

 

 

д)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

5

 

22

21

8

 

5

 

22

21

29

5

 

22

21

29

28

 

5

 

2

 

8

 

5

 

22

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

17

4

 

6

 

1

 

17

19

6

 

1

 

17

19

24

 

1

 

17J19

24

23

 

17

19

24

23

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16

15

IS

6

 

16

15

18

6

 

16

15

18

22

 

16

15

18

22

 

16

15

18

22

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

13

8

 

13

3

 

13

8

 

13

16

 

13

8

 

13

16

 

13

8

 

13

16

 

13

8

 

13

16

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

7

 

9

 

3

 

7

 

9

15

 

3

 

7

 

9

15

 

3

 

7

 

9

15

 

3

 

7

 

9

15

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

є)

 

 

 

 

 

 

 

є)

 

 

 

 

 

 

 

ж)

 

 

 

 

 

з)

 

 

 

 

 

 

 

и)

 

 

 

 

 

 

Мал. 121

Найчастіше в подібних задачах цікавить не лише кінцевий результат, а й шлях його отримання. Чи можна визначити послідовність переходів по таблиці, яка приводить до отриман­ ня нашої оптимальної відповіді? А саме як треба прокласти оп­ тимальну за вартістю залізничну колію? Для цього необхідно відновити рух по таблиці у зворотному порядку. Нагадаємо, яким чином ми потрапили в клітинку таблиці а1 4 і отримали її

206

нове значення 28 (мал. 121, и). Цей перехід було виконано з од­ ного із сусідніх елементів (лівого або нижнього), що мав менше значення. Тому і зворотний шлях треба спрямувати на цей еле­ мент. Для нашого прикладу а1 3 = 29, а2 4 = 23, тому переходимо до елемента а2 4 . Для нього сусідніми, з яких ми могли зробити перехід, є а2 3 = 24, а3 4 = 22. Вибираємо перехід до елемента а3 4 . Усі наступні кроки показано на малюнку 121, и і виділено кур­ сивом.

Чи завжди отримається однозначна відповідь? Стосовно ре­ зультуючого оптимального значення для елемента апт відпо­ відь буде завжди одна. А от стосовно визначення шляху, що приводить до отримання цієї відповіді, далеко не завжди. У наведеному вище прикладі під час вибору найменшого еле­ мента між at • + at, _ 1 та аі • + а1,+ х жодного разу не траплялася ситуація, коли ці значення однакові. А якщо трапиться, то отримується розгалуження у визначенні оптимального шляху: їх уже буде два. У разі повторення подібної ситуації - чотири, а далі - вісім і т. д. Для визначення хоча б одного зі шляхів можна застосувати наведені вище міркування, але якщо задача вимагає визначення всіх можливих шляхів, то необхідно орга­ нізувати рекурсивний алгоритм.

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

По-перше, задача була розбита на окремі етапи, яким відповідали зміни значень елементів заданої таблиці.

По-друге, один і той самий алгоритм пошуку оптимального (у нашому випадку мінімального) значення тіп(аі,, + at • _х, at • + at.) був застосований до всіх елементів таблиці.

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

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

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

207

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

for і := П - 1 down to 1 do

{Перерахунок значень крайнього лівого стовпця.}

Іпс(а[і, 1],а[і + 1,1]);

 

 

for j := 2 to m do

{Перерахунок значень крайнього нижнього рядка.}

inc(a[n,j],a[n,j- 1]);

 

 

for і := n - 1 downto 1 do

 

{Перерахунок решти елементів таблиці}

for j := 2 to m do

 

{і збільшення їх значень}

inc(a[i, j], min(a[i + 1, j], а[і, j - 1]));

{на тіп(аи + au_v а.ц + a,+1J).}

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

writeln(f_OUt, а [ 1 , т ] ) ;

{Виведення результуючого значення.}

і := 1; j := m;

{Ініціалізація визначення самого шляху.}

while not((i = n) and (j = 1)) do {Поки поточний елемент таблиці не є нижнім лівим,}

begin

 

write(f_Out, ' ( ' , і, ',', j, '); ');

{виведення індексів поточного елемента,}

if а[І + 1, j] < а[І, j - 1 ]

{перехід до меншого з двох сусідів:}

then ІПС(І)

{НИЖНЬОГО

else dec(j);

{або лівого.}

end;

 

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

У зв'язку з тим, що задача про прокладання найвигіднішого шляху може мати неоднозначну відповідь, то тестування алгоритму повинно це передбачати. Слід підібрати тести, які дають однозначну відповідь, і такі, які мають кілька варіантів оптимальних шляхів. Наприклад, тест, що містить усі одна­ кові значення, буде мати розгалуження на кожному елементі. При можливості слід модифікувати фрагмент виведення ре­ зультуючого шляху для випадку визначення всіх можливих варіантів. Для тестування алгоритму щодо ефективності його роботи варто згенерувати тести великої розмірності, наприклад для п < 100, т < 100.

208

Задача про найбільшу спільну підпослідовність

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

Спочатку введемо деякі поняття. Підпослідовністю заданої послідовності av a2,..., an називається така послідовність елемен­ тів a , a , ..., a., для індексів яких виконується умова 1 ^ і, < L <

< ... < ік^ п. Розглянемо конкретний приклад. Нехай послідов­ ність виглядає так: 1, 2, 3, 4, 5, 6. Послідовність 1, 3, 5, 6 є під­ послідовністю заданої послідовності.

Наша задача формулюється так: нехай задано дві послідов­ ності at(i= 1, 2, ..., n)ibj(j = 1, 2, ..., тгі). Визначити найбільшу спільну підпослідовність двох заданих послідовностей.

Розглянемо конкретний приклад: at => 1, 2, 3, 2, 4, 1, 2 і bj => 2, 4, 3, 1, 2, 1. Найбільша спільна підпослідовність виділена в обох послідовностях півжирним шрифтом і є такою: 2, 3, 2, 1.

При визначенні наведеної підпослідовності ми брали пер­ ший елемент із першої послідовності й шукали його перше входження в другу підпослідовність. Однак детальніший ана­ ліз підказує, що така підпослідовність не одна. Для наведеного прикладу є ще одна правильна відповідь: 2, 4, 1, 2.

Перейдемо до розробки алгоритму розв'язування сформульо­ ваної задачі. Оскільки нас цікавитиме збігання значень еле­ ментів першої і другої послідовності, то варто розглянути всі можливі їх пари (at, &.) (і = 1, 2, ..., n; j = 1, 2, ..., m). Для цього створимо таблицю с«, кількість рядків якої відповідає елемен­ там першої послідовності, а стовпців - другої. При кожному порівнянні елементів послідовностей at та fe будемо фіксувати збіг їхніх значень, визначаючи порядковий номер цього збігу як значення відповідного елемента таблиці су . Перейдемо до аналізу двох можливих ситуацій: збігу і незбігу значень at та Ь„

Розглянемо елементи ak і bv Нехай уже відома довжина найбільшої спільної підпослідовності для av а2 , ..., ak_x і bv b2,

..., bt_v що записана в елементі таблиці ck_1 t_v Якщо ak = bt, то значення ck_x Ь1 збільшується на 1. Коли ak ^ bt, то необхідно розглянути дві ситуації:

-до попередніх послідовностей av a2, ..., ІЇк_х і bv b2, ..., Ь Ь 1 додаємо елемент ak і обчислюємо ck ;_j;

-до попередніх послідовностей av a2, ..., ak_x і bv b2, ..., Ь ь 1 додаємо елемент bt і обчислюємо ch_x v

Логічно, що для продовження розв'язування задачі й вико­ нання наступного етапу задачі з попередньо обчислених двох значень треба взяти найбільше.

Таким чином, формулу для обчислення значення найбільшої спільної підпослідовності можна представити у такому вигляді:

209

СІ.І = max(cl_lj,cihl),at^bj.

Можна запропонувати ще один хід міркувань. Нехай розгля-

нуті послідовності av а2,

a k - i i b v b2>

•••> Vi> a v a2>

**-i

Ь„Ь 2->

1} ^ 1 » ^ 2 * .,ahib1,

b2,

'1-Х

Відповідні значення їх

найбільших спільних підпослідовностей розміщені в елемен­

тах ck_1 Ь 1 , ck_1 у ckl_1. Якщо ak ^ Ьг, то нічого не зміниться і дов­ жина найбільшої спільної підпослідовності залишиться такою,

як і була. Оскільки на поточний момент уже відомі три варіанти довжин найбільшої підпослідовності cA_jЬ 1 , С/^хі, Ck,i-v т0 логіч­ но з них вибрати найбільше значення max(ck^ll_1, ck_lt, ckЬ1), яке використовуватиметься на наступних етапах. Якщо ak = bt, то зрозуміло, що поточна довжина найбільшої спільної під­ послідовності збільшиться на 1. Тобто у разі виконання умови

ak = bt значення max(ck^1 ь 1 , ck_lt, ckl_1) треба збільшити на 1. Формула для обчислення найдовшої спільної підпослідовності

виглядатиме так:

~max{Ci_lhl, с^., с.h l ) + l, а, = &,; max(ct_hj_v с^у, cihl),at*br

Один момент залишився поза увагою: як обчислити значен­ ня елементів першого рядка і першого стовпця таблиці сі;, як­ що для них невідомі значення попереднього рядка і поперед­ нього стовпця? Виконаємо штучне введення нульового рядка і нульового стовпця, елементами яких будуть значення 0. Це дасть можливість не порушити надалі визначення найбільшого

із значень ск__17 ck_lt, chl_v

Але найкраще суть алгоритму видно на нашому прикладі. Згідно з описаним вище алгоритмом і поетапним його виконан­ ням, таблиця для послідовностей а г = > 1 , 2 , 3 , 2 , 4 , 1, 2 і Ь; => 2, 4, 3, 1, 2, 1 зображена на малюнку 122, а. Наприклад, значен­

ня елемента с, п = 3, оскільки а. = Ь~ = 2, а с%. = 2. Значення еле-

'4,5

 

 

мента с4 6 = 3, оскільки а4 ^ Ьв 4 = 2, Ь6 = 1), а с4 5 = 3, с3

6

= 2 і

тах{сі5', с3 6) = 3.

 

 

Результат виконання алгоритму містить елемент с 7 6

,

і він

дорівнює 4. Це збігається з попереднім візуальним результа­ том, наведеним на початку розгляду цього прикладу. Одне запитання залишилося невирішеним: яка саме підпослідовність є найбільшою спільною для двох заданих послідовностей? Чи можна відповідь отримати із таблиці, наведеної на малюнку 122, а? Так, можна. Проаналізуємо, як рухалися таблицею, розв'язуючи задачу. До елемента таблиці сц переходили з по­ переднього діагонального елемента, коли елементи аі і Ь. рівні.

210

У протилежному випадку елемент с. визначався так: якщо ct_ij ^ Сц~і> то перехід відбувався від більшого з них, якщо ct_ij- % _ j, то треба визначитися, з верхнього чи лівого сусід­ нього елемента відбуватиметься перехід. Останній перехід за­ лежить від умови, яку вибрано під час виконання алгоритму (див. коментарі до тексту програми, що наведена нижче). Отри­ ману найбільшу спільну підпослідовність треба записати у зво­ ротному порядку.

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

У таблицях на малюнку 122 шлях визначення найбільшої спільної під послідовності виділено курсивом, а ті елементи, що їй належать, - ще й півжирним шрифтом. Причому за умови ct_Vj= ciyj-i перехід з верхнього сусіднього елемента продемонстро­ ваний на малюнку 122, а, з лівого сусіднього - на малюнку 122, б.

 

Ь!

2

4

3

1

2

1

 

 

 

Ьі

2

4

3

1

2

1

 

 

 

 

 

 

 

 

 

 

 

0

0

0

0

0

0

0

а і

0

0

0

0

0

0

 

0

 

 

at

 

 

 

 

 

 

 

 

 

 

 

1

0

0

0

0

1

1

1

1

0

0

0

0

1

1

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

0

/

1

1

1

2

 

2

 

 

2

0

1

1

1

1

2

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

0

1

1

-

2

2

 

2

 

 

3

0

1

1

2

2

2

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

0

1

1

2

2

.'і

 

3

 

 

2

0

'

1

2

2

3

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

0

1

2

2

2

:>> 3

 

 

4

0

1

| 2

2

2

3

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

1

2

2

3

3

 

4

 

 

1

0

1

2

2

••<

3

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

0

1

2

2

3

4

 

4

 

 

2

0

1

2

2

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а) Відповідь: 2, 3, 2, 1.

 

 

 

 

б) Відповідь: 2, 4, 1, 3.

 

 

 

 

 

 

 

 

 

 

Мал. 122

 

 

 

 

 

 

 

Визначимо причетність задачі про найбільшу спільну підпослідовність до динамічного програмування. Розбиття про­ цесу розв'язування задачі на етапи полягає у застосуванні од­ ного і того самого алгоритму до всіх елементів таблиці, що роз­ глядають усі можливі пари елементів заданих масивів аі і &.. Запис отриманих результатів на кожному етапі виконується безпосередньо в таблицю, тобто її вміст щоразу змінюється і ви­ користовується для виконання наступних етапів. Це свідчить про залежність підзадач розв'язуваної загальної задачі. На кожному етапі з усіх варіантів відповідей обирається опти­ мальний, що приводить до кінцевого оптимального результату. Тому можна стверджувати, що розглянута задача розв'язана методом динамічного програмування.

211

Соседние файлы в папке Методи побудови алгоритмів та їх аналіз