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

1.7.1. Експоненційні алгоритми та перебір

Експоненційні алгоритми часто пов’язані з перебором різних варіантів розв’язання.

Наведемо типовий приклад.

Приклад 1.8. Розглянемо задачу про виконуваність булевого виразу, яка формулюється так: для будь-якого булевого виразу від n змінних знайти хоча б один набір значень змінних x1xn, при якому цей вираз приймає значення 1.

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

Можна інтерпретувати цю задачу як задачу пошуку на певному дереві перебору. Кожна вершина цього дерева відповідає певному набору встановлених значень x1 …, xk . Ми можемо встановити змінну xk+1 в 0 або 1, тобто маємо вибір з двох дій. Тоді кожній із цих дій відповідає одна з двох дуг, які йдуть від цієї вершини. Вершина x1 …, xk має двох синів x1 …, xk 0 і x1 …, xk 1.

При n=3 дерево можливостей матиме вигляд, показаний на рис. 1.2. (вершини позначені наборами значень змінних, а дуги – рішеннями, які приймаються на черговому кроці). Вершини, що відповідають розв’язкам задачі для виразу (x1 x2) є x3, зафарбовані.

З рис.1.2 видно, що розв’язування задачі зводиться до перебору листків дерева з метою виявлення, які з них відповідають наборам, що перетворюють заданий булевий вираз на 1. Для виразу (x1 x2) є x3 такими наборами будуть 000, 010, 111.

Якщо n=3, дерево має 23= 8 листів. У загальному ж випадку кількість можливих варіантів дорівнює 2n. Цей вираз експоненційно залежить від n, і перебірний алгоритм має експоненційний характер.

Описана вище схема алгоритму розв’язування цієї задачі має фундаментальний характер. Вона має назву бектрекінгу (інша назва – перебір з поверненням) і використовується для розв’язування найрізноманітніших перебірних задач (задача про вісім ферзів, задача про розфарбовування карти, автоматизація дедуктивних побудов тощо).

Рис. 1.2. Пошук на дереві.

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

Зі зростанням розмірності будь-який поліноміальний алгоритм стає ефективнішим, ніж будь-який експоненційний. Для лінійного алгоритму зростання швидкодії комп’ютера в 10 разів дозволяє за той самий час розв’язати задачу, розмір якої в 10 разів більший. Для експоненційного алгоритму з основою 2 цей самий розмір можна збільшити лише на 3 одиниці.

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

1.7.2. Алгоритм із поверненнями назад

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

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

{ пошук одного вирішення }

procedure backtracking(k: integer); { k – номер ходу }

begin

{ запис варіанту }

if { рішення знайдене } then

{ виведення рішення }

else

{ перебір всіх варіантів }

if { варіант задовольняє умови задачі } then

backtracking(k+1); { рекурсивний виклик }

{ стирання варіанту }

end

begin

backtracking(1);

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]