Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритми_МетодиОбчислень_Р2.doc
Скачиваний:
20
Добавлен:
19.11.2019
Размер:
2.07 Mб
Скачать

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

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

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

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

Як приклад динамічного програмування розглянемо задачу тріангуляції.

Тріангуляція багатокутника - це набір хорд, що ділять багатокутники на трикутники; сторони цих трикутників є сторонами початкового багатокутника і хорд тріангуляції. На рис. 2.3 показаний приклад тріангуляції семикутника.

Рисунок 2.3 – Приклад тріангуляції семикутника

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

Приклад вагової функції трикутника

,

де - евклідова віддаль між вершинами і .

Розв’язок сформульованої задачі полягає у тому, що вона розбивається на окремі підзадачі і оптимальне рішення початкової задачі вміщує у собі оптимальний розв’язок підзадач.

На основі сформульованого підходу складемо алгоритм розв’язку задачі тріангуляції багатокутника.

Нехай - оптимальна тріангуляція - кутника . Сторона входить в один із трикутників тріангуляції. Допустимо, що це трикутник , де . Тоді вага тріангуляції дорівнює вазі трикутника плюс сума ваг тріангуляцій багатокутників і .

Розглянемо багатокутник, який показаний на рис. 2.3. Допустимо, що . Тоді одержимо дві задачі, які виникають після вибору вершини (рис. 2.4).

Для багатокутника, який показаний на рис. 2.3 вага тріангуляції (рис. 2.4) буде обчислюватись за наступною формулою:

.

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

Формалізуємо процес тріангуляції багатокутника. Нехай - вага оптимальної тріангуляції багатокутника , де . Вага оптимальної тріангуляцій всього багатокутника - . Для двох суміжних вершин вага дорівнює нулю. Крім того , .

Рисунок 2.4 – Дві підзадачі, які виникли після вибору вершини

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

(2.6)

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

Triangulation_Polygon(v)

1 n=length(v)-1

2 for i=1 to n

3 m(і,i)=0

4 end for

5 for l=2 to n

6 for i=1 to n-l+1

7 j=i+l-1

8 m(i,j)=

9 for k=I to j-1

10 q=m(i,k)+m(k+1,j)+

11 if q<m(I,j)

12 then m(I,j)=q

13 s(I,j)=k

14 end if

15 end for

16 end for

17 end for

18 return m, s

У наведеному алгоритмі (рядки 2 – 3) обчислюються величини, ( ), які є мінімальними вартостями тріангуляції. Потім у першій ітерації циклу у рядках 5 – 17 обчислюються величини при при (мінімальні вартості для послідовностей довжиною ). При другому проході цього циклу обчислюються величини при (мінімальні вартості для послідовностей довжиною ) і т. д. На кожному етапі обчислювальні у рядках 10 – 13 величини залежать тільки від уже обчислених і занесених у таблицю значень і .

Алгоритм Triangulation_Polygon(v) визначає вагу оптимальної тріангуляції; час роботи , обсяг пам’яті, що використовується, .