Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
algoritmy_i_struktury_dannykh_gagarina.doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
146 Мб
Скачать
☆

Глава 11

Евристичні алгоритми

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

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

11.1.

Хвильовий алгоритм

Хвильовий алгоритм, або алгоритм Лі, спочатку іс ¬ користувався для пошуку шляху в лабіринті або в ігрових завданнях. В даний час алгоритм Лі (хвильовий) є основним у мікроелектроніці для трасування (з'єднання) елементів інтегральних схем. Особливість алгоритму полягає в наступному:

• в лабіринті (на підкладці) обираються дві точки А (початкова) і В (кінцева). З початкової точки в чотирьох напрямках виходить хвиля (рис. 11.1). Цифрами позначається номер фронту хвилі або її шляхові координати;

• шляхові координати визначають крок поширення хвилі. Кожен елемент першого фронту хвилі є джерелом вторинної хвилі (рис. 11.2).

Елементи другого фронту генерують третій фронт і т.д. Від заборонених елементів хвиля не розповсюджується. Процес продол ¬ жається до тих пір, поки не буде досягнутий кінцевий елемент.

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

вгору, вниз, вліво, вправо.

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

При побудові траєкторії використовуються два принципи:

• рух здійснюється строго по заданих пріоритетам;

• при побудові траси, тобто траєкторії руху, значення колійних координат повинні зменшуватися.

Приклад 1. Нехай заданий лабіринт, де заборонені елементи заштриховані. Знайти шлях між елементами Н і К.


На першому етапі від початкового елемента траси виходить хвиля, яка зупиняється, досягнувши кінцевого елемента (рис. 11.3). Хвиля поширюється по чотирьох напрямах: вгору, вниз, впра ¬ во і вліво. Перший фронт хвилі являє собою чотири одиниці. Наступний фронт являють собою поширення хвилі на од ¬ ну клітку від елементів попереднього фронту в сторони від початкового елемента. При поширенні хвилі елементам надають значення номери фронту (2, 3, 4 і т.д.). Якщо елемент заборонений, то

Рис. 11.3. Поширення хвилі (а) і побудова траси (6)

до нього це не відноситься - хвиля поширюється тільки по неза-сваріння елементам сітки. Також хвиля не розповсюджується за межі координатної сітки.

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

Приклад 2. Нехай заданий лабіринт, де заборонені елементи заштриховані. Знайти шлях між елементами А і В хвильовим алгоритмом (рис. 11.4).

На першому етапі від елемента А поширюється хвиля до тих пір, поки вона не досягне кінцевого елемента В. На другому етапі вибираються пріоритети руху від кінцевої точки В до початкової А. Пріоритети вибираються виходячи з взаємного розта ¬ вання початкового і кінцевого елемента. Припустимо, що обрані парадоксальні (логічно невірні) пріоритети: вгору, вправо, вниз, вліво. У цьому випадку траса все одно буде побудована, але за більшу кількість кроків (порівнянь).

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

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

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

Виходячи зі значень ибирають напрямки променів (рис. 11.5).

Рис. 11.5. Варіанти поширення променів

Приклад 1. Здійснити трасування елементів А і В, распо ¬ лежання на підкладці інтегральної схеми (рис. 11.6).

В даному випадку . Значить .

Кожен з двох променів, що виходять з одного елемента, рухає ¬ ся по заданому пріоритетному напрямку (рис. 11.5). Якщо промінь зустрічає а шляхи заборонений елемент, то його обхід здійснюється по другому пріоритетному напрямку. Якщо обидва напрямки

рис. 11.6

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

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

Приклад 2. Здійснити трасування елементів А і В, располежання на підкладці інтегральної схеми (рис. 11.7).

В даному випадку Ха - Хb = 2-7 = -5, Уа - Yb = 7 - 2 = 5. Значить . Виходячи зі значень визначаються напрямки руху променів (рис. 11.5).

З початкової та кінцевої точок виходять одночасно по чотири промені (рис. п.8). Промені рухаються строго по заданих напрямах і «загасають», якщо досягли краю координатної сітки або зустріли заборонений елемент.

Рис. 11.8. Напрямки руху променів з точок А і В

Приклад 1. Здійснити трасування (з'єднання) елементів інтегральної схеми чотирипромінні алгоритмом (рис. 11.9).

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

Приклад 2. Здійснити трасування елементів чотирипромінні алгоритмом (рис. 11.10). У даному прикладі трасу провести не можна.

11.4. Маршрутный алгоритм

Маршрутный алгоритм получил свое название, потому что осуществляет одновременно и формирование фронта, и проклады­вание трассы. Источником волны на каждом шаге является конечный элемент участка трассы, проложенной на предыдущих шагах.

В маршрутном алгоритме рассматриваются восьмиэлементная окрестность исходного элемента (рис. 11.11).

В ід кожного елемента оточення оцінюється відстань d до кінцевого елементу В:

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

Приклад 1. Здійснити трасування елементів маршрутним алгоритмом (рис. 11.12).

Визначимо відстані елементів околиці точки А до точки В:

М инимальным является расстояние d4 = Vs. Далее считаем расстоя­ния от точки В до точек окрестности найденной точки:

Мінімальна відстань . Проводимо обчислення далі:

Отримали маршрут (А -4-7 - В).

11.5. Геометрична модель задачі про лабіринт

Приклад 1. У лабіринті з довільними перешкодами знайти найкоротший шлях між заданими точками S і Т (рис. 11.13).

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

різних багатокутників. Для вирішення цього завдання потрібно побудувати мережу (ламану), а також з'єднати точки s і t з прострілював з них вершинами, якщо ці точки не є вершинами многокутників.

Формування мережі, тобто матриці відстаней С розміром (n - загальне число вершин всіх багатокутників плюс два для обліку старту і фінішу) являє собою потрійний цикл: зовнішній по i - перебір вершин, звідки стріляють; середній по j (j від i + 1 до n, щоб не повторюватися) - це перебір вершин, куди стріляють; та внутрішній по k - це перевірка, не перетинає чи k-я сторона якого-небудь багатокутника відрізок з'єднання (рис. 11.14).

Остання умова перевіряється за стандартними формулами аналі ¬ тичної геометрії: записується рівняння прямої, що проходить через (i, j), і рівняння прямої, проходить через кінці відрізка k. Вирішенням системи з цих двох рівнянь знаходиться точка перетину і встановлюється, чи лежить точка перетину всередині рассматриваемих відрізків (рис. 11.15). Якщо так, то , кінець циклу по k; якщо немає перетину по закінченні цикла по k, то обчислюється евклідова відстань .

Нехай між вершинами i і j не проходить ніякої стіни, a j з i не прострілюється. Щоб подолати ці труднощі, потрібно ввести характеристику i кута перешкоди gi, присвоївши gi = 0, якщо «увігнутий» кут, або gi = 1, якщо «опуклий» кут. Так, для кута з вершиною i gi = 1, а для кута з вершиною j gi = 0.

Якщо крайні вершини Xi иа Xi + 3 (Xi, Xi + 1, Xi +2, Xi +3 - последоватільні вершини багатокутника) лежать по одну сторону від прямої, що проходить через сусідні вершини інакше

Якщо при підстановці в це рівняння точок і в лівій частині виходять числа з однаковим знаком, то , інакше

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

Тепер можна впоратися з вищевикладеної проблемою. З вершини г не прострілюється ніяка вершина j, захищена кутом з вершиною i. Щоб виключити з розгляду Загороджені вершини, потрібно відступити від вершини г по сторонам кута на величину е, свідомо меншу, ніж довжина сторони, побудувавши таким чином точки . Після цього потрібно ввести бінарну величину В, вважаючи В = 1, якщо відрізки перетинаються, і В = 0, якщо відрізки не перетинаються (мал. 11.16).

Ясно, що вершина j не прострілюється у випадках 2 і 3 (при непарному В + д). Тепер можна побудувати мережу.

Після того як мережа побудована, можна приступати до знаходження найкоротших шляхів, скориставшись будь-яким з розглянутих вище алгоритмів (в залежності від поставленої задачі) - рис. 11.17.

11.6.

Алгоритми складання розкладу

Припустимо, що є п однакових процесорів, позначених незалежних завдань J1, J2, ..., Jm, які потрібно виконати. Процесори можуть працювати одновременно, і будь-яке завдання можна виконувати на будь-якому процесорі. Якщо завдання завантажене в процесор, воно залишається там до кінця обробки. Час обробки завдання Jj відомо і одно Організовать обробку завдань таким чином, щоб виконання всього набору завдань було завершено якомога швидше.

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

Приклад. Нехай є три процесори і шість завдань, час виконання кожного з яких

Розглянемо розклад У начальний момент часу Т = О процесор починає обробку завдання J2, процесор Р2 - завдання J5, а процесор Рз-завдання . Процессор Рз закінчує виконання завдання J \ в момент часу Т = 2 і починає обробляти завдання J4, поки процесори Pi і Р2 все ще працюють над своїми початковими завданнями. При Т = 3 процесор Рз знову закінчує завдання J4 і починає обробляти завдання Jq, яке завершується в момент Т = 4. Тоді він починає виконувати останнє завдання J3. Процесори Pi і Р2 закінчують завдання при Т = 5, але, так як список L порожнім, вони зупиняючись ¬ ються. Процесор Рз завершує виконання завдання J3 при Т = 12 (рис. 11.18). Розглянуте розклад проілюстровано часів ¬ ної діаграмою, відомої як схема (діаграма) Ганта. Очевидно, що розклад не оптимально. Можна підібрати оптимальне расписание , яке дозволяє завершити всі завдання за мінімальний час Т * = 8 одиниць (рис. 11.19).

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

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

11.7. Завдання упаковки

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

Нехай дано безліч предметів: два з них мають розмір 3 і три - розмір 2. Яке потрібна мінімальна кількість ящиків розміру 4, щоб помістити в них всі предмети? Відповідь показаний на рис. 11.20, де заштриховані ділянки позначають порожні місця в ящиках.

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

Рис. 11.20. Мінімальне число ящиків розміру 4, необхідну для розміщення предметів розмірами 2, 2, 2, 3, 3

Алгоритм 1 (перше-ліпше розміщення для заданого спис ¬ ка). Нехай L - деякий порядок предметів. Перший предмет з L кладемо в ящик . Другий предмет із L кладемо в , якщо він туди поміщається. В іншому випадку кладемо його в наступний ящик В2. Взагалі, черговий предмет з L кладемо в ящик Bi, куди цей пред ¬ мет поміститься, причому індекс i найменший серед всіх можливих. Якщо предмет не поміщається ні в один з до частково заповнених ящиків, кладемо його в ящик . Цей основний крок повторюється, поки список L не буде вичерпано.

Алгоритм 2 (перше-ліпше розміщення з убуванням). Цей алгоритм відрізняється від алгоритму 1 тим, що список L впорядкований від великих предметів до менших.

Алгоритм 3 (найкраще розміщення для заданого списку). Нехай L - заданий список завдань. Основний крок той же, що і в алгоритмі 1, але черговий предмет кладеться в той ящик, де залишається найменше невикористане простір. Таким чином, якщо черговий предмет має, наприклад, розмір 3 і є чотири частково заповнених ящика розміру 6, в яких залишилося 2, 3, 4 і 5 одиниць незаповненого простору, тоді предмет кладеться в другій ящик, і той стає повністю заповненим.

Алгоритм 4 (краще розміщення з убуванням). Цей алгоритм такий же, як і алгоритм 3, але список L впорядкований від великих предметів до менших.

Для завдання упаковки було знайдено кілька хороших верхніх оцінок. Одна з кращих, що належить Грехему, виглядає таким ¬ щим чином. Нехай No - мінімальне число необхідних ящиків, отримане за допомогою точного алгоритму. Якщо позначає

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

Таким чином, алгоритм 2 дає рішення, яке не може бути гірше оптимального більш ніж на 23%. Це гарантована оцінка; для будь-якої конкретної задачі помилка може бути набагато менше.

Завдання упаковки (і взагалі деякі евристичні алгоритми) дивно оманливі. Наприклад, якщо потрібно упакувати в ящики розміру 1000 предмети розмірами

L = (760, 395, 395, 379, 379, 241, 200, 105, 105, 40),

то евристичний алгоритм 2 зажадає для цього ящики. Легко перевірити, що це насправді оптимальне рішення. Але якщо зменшити розміри кожного предмета на 1, що призводить до списку

L '= (759, 394, 394, 378, 378, 240, 199, 104, 104, 39),

то евристичний алгоритм 2 вже дасть ящики. Це очевидно не оптимальне і абсолютно несподіване рішення.

Звернемо увагу на іншу аномалію. Застосовуючи еврістіче ¬ ський алгоритм 1, упакуємо L = (7, 9, 7, 1, б, 2, 4, 3) в ящики розміру 13. Знаходимо, що Nai = 3, як показано на рис. 11.21; очевидно, що цей результат оптимальний.

Приберемо зі списку предмет розміру 1, що призводить до списку L '= (7, 9, 7, 6, 2, 4, 3). Здавалося б повинен вийти результат не гірше попереднього. Однак неважко переконатися, що рішення погіршується. Це рішення показано на рис. 11.22.

На рис. 11.22 заштриховані ділянки показують неиспольз ¬ ванні обсяги тари

11.8.

Задача про джип

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

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

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

Для к = 1 відповідь, очевидно, дорівнює 500 км, як показано на рис. 11.23. Можна заправити машину в точці В і перетнути залишилися 500 км пустелі. Ясно, що це найбільш віддалена точка, стартуючи з якої можна подолати пустелю, маючи в точності 500 л пального.

Рис. 11.23. Схема шляху через пустелю

Спочатку була поставлена ​​приватна мета: яку відстань можна

проїхати на заданій кількості палива?

Припустимо, що до = 2, тобто є два повних бака (1000 л). Будемо розглядати цей випадок, спираючись на результат для до = 1. Дана ситуація ілюструється на рис. 11.23. Яке максимальне значення x1, таке, що, відправляючись з 1000 л пального з точки 500 - , можна перевезти досить пального в точку, щоб завершити поїздку, як у випадку к = 1?

Один із способів визначення прийнятного значення полягає в наступному. Заправляємося в точці 500 - їдемо кілометрів до В і переливаємо в сховищі все пальне, окрім літрів, які будуть потрібні для повернення в точку 500 - У цій точці бак стає порожнім. Тепер наповнюємо другий бак, проїжджаємо кілометрів до В, забираємо в У пальне, залишене там, і з В їдемо в С з повним баком. Загальне пройдена відстань складається з трьох відрізків по xi кілометрів і одного відрізка НД довжиною 500 км. Тоді знаходимо з рівняння

3 + 500 = 1000.

Звідси знаходимо рішення: = 500/3. Таким чином, два бака (1000 л) дозволяють проїхати

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

Розглянемо к = 3. З якої точки можна виїхати з 1500 л палива так, що машина зможе доставити 1000 л в точку 500 - ? Повертаючись до мал. 11.23, знайдемо найбільше значення х2, таке,

що, виїжджаючи з 1500 л палива з точки 500 - x1 - хг, можна було доставити 1000 л в точку 500 - x1. При цьому виїжджаємо з точки 500 – x1 - Х2, доїжджаємо до 500 - x1, переливаємо все пальне, крім Х2 л, і повертаємося в точку 500 - x1 - Х2 з порожнім баком. Повторивши цю процедуру, витратимо 4x2 л на проїзд і залишимо 1000 - 4x2 л в точці 500 - X Тепер в точці 500 - x1 - Х2 залишилося рівно 500 л. Заправляємося останніми 500 л і їдемо в точку 500 - x1, витративши на це Х2 л.

Якщо знаходимося в точці 500 - x1, то на проїзд буде витрачено 5x2 л палива. Тут залишено в цілому 1500 - 5x2 л. Це кількість повинна дорівнювати 1000 л, тобто Х2 = 500f5. З цього укладаємо, що 1500 літрів дозволяють проїхати

Потрібно знайти найменше значення п, при якому Dn> 1000. Простие обчислення показують, що для п = 7 маємо D7 = 997,5 км, тобто сім баків, або 3500 л, палива дадуть можливість проїхати 977,5 км. Повний восьмий бак - це було б уже більше, ніж нам зажадає ¬ ся, щоб перевезти 3500 л з точки А в точку, віддалену на 22,5 км (1000 - 977,5) від А. При цьому для доставки 3500 л палива до позначці

км достатньо 337,5 л. Таким чином, для того щоб перетнути на машині пустелю з А в С, потрібно 3837,5 л пального.

Тепер алгоритм транспортування пального може бути представ ¬ лен наступним чином. Стартуємо з А, маючи 3837,5 л. Тут якраз достатньо палива, щоб поступово перевезти 3500 л до позначки

км, де опинимося з порожнім баком і запасом пального на сім повних заправок. Цього палива достатньо, щоб перевезти 3000 л до точки, віддаленої на 22,5 + 500/13 км від А, де бак машини буде знову порожній. Наступні перевезення приведуть нас до точки,. Відстою щей на 22,5 + 500/13 + 500/11 км від A, з порожнім баком машини і 2500 л на складі.

Продовжуючи таким чином, ми просуваємося вперед завдяки аналізом, проведеним методом відпрацювання назад. Незабаром ми опинимося біля позначки 500 (1 – 1/3) км з 1000л палива. Потім перевеземо 500 л в B, заллємо їх в бак машини і доїдемо без зупинки до С. Рис. 11.24 ілюструє цей процес.

Виникає питання, чи можна проїхати 1000 км, витративши менше ніж 3837,5 л пального. Виявляється, що можна. Для цього можна висловити наступний, досить правдоподібний аргумент. Очевидно, діючи найкращим чином для до = 1, при к = 2 використовуємо план для до = 1 і потім вводимо в дію другий бак пального для того, щоб опинитися якнайдалі від В. Вихідна передумова для до баків полягає в тому, щоб визначити , як діяти найкращим чином у випадку з А: - 1 баками, і відсуватися якнайдалі назад за допомогою до-го бака.

11.9. Задача про кодовий замок

Нехай кодовий замок складається з набору N перемикачтелей, кожен з яких може бути в положенні «вкл» або «викл». Замок відкривається тільки при одному наборі положень перемикачів, з яких не менше [N/2] (ціла частина від N/2), наприклад, знаходяться в положенні «вкл». Припустимо, що запобуту комбінація, але необхідно відімкнути замок. Припустимо також, що можна перепробувати всі комбінації, що для замка з N перемикачами приведе до перебору 2Л можливих комбінацій. Непогані будуть шанси вирішити задачу повним перебором всіх комбінацій, якщо, скажімо, N <10. А якщо значно біль

ше 10? Тут і стане в нагоді використання умови [N/2], которої дозволить багато комбінації не переглядати. Важливо лише так побудувати алгоритм перебору комбінацій, щоб не пропив ¬ стіть потрібну і не набирати ту, яка свідомо до успіху не приведе.

Промоделіруем кожну можливу комбінацію вектором з N нулів і одиниць. На г-м місці буде 1, якщо i-й перемикач знаходиться в положенні «вкл» і 0, якщо г-й перемикач - в положенні «викл». Безліч всіх можливих N-векторів добре моделюється за допомогою структури, яка називається бінарне (або двійкове) дерево.

Кожна вершина к-го рівня цього дерева буде відповідати певному набору перших k компонент N-вектора. Дві гілки, що йдуть вниз з вершини цього рівня, відповідають двом можливим значенням (k + 1)-ї компоненти в iV-векторі. Якщо кількість перемикачів в замку дорівнює N, то в дереві перегляду буде N рівнів. На рис. 11.25 конструкція бінарного дерева зображена для N =4.

Умова, що полягає в тому, що число перемикачів у податку «вкл» повинно бути не менше [N/2], дозволяє не рассма­

чати ті частини дерева, які не можуть привести до правильної комбінації. Наприклад, розглянемо вершину 00 на рис. 11.25. Так як права гілка ТОВ не може призвести до допустимої комбінації, немає необхідності її формувати. Якщо якісь вершини, сліду ¬ ющие за розглянутій вершиною, не задовольняють обмеженню задачі, то ці вершини не треба розглядати. В даному випадку вер ¬ шини, находящіеся.внутрі пунктирних ліній, не потрібно досліджувати і навіть формувати.

Тепер, скориставшись цією моделлю двійкового дерева, можна викласти процедуру відходу назад для утворення тільки тих комбі-націй, в яких принаймні [N/2] перемикачів знаходяться в положенні «вкл». Алгоритм зводиться до перегляду дерева в опреде-ленному порядку. Рухаємося вниз по дереву від кореня, дотримуючись лівої гілки, до тих пір, поки це можливо. Досягнувши кінцевої вершини, аналізуємо відповідну комбінацію. Якщо вона не підходить, піднімаємося на один рівень і перевіряємо, чи можна СПУ-стіться вниз по іншій гілці.

Алгоритм закінчує роботу, коли не залишається не переглянуто гілок.

Цей приклад ілюструє основні властивості, загальні для всіх алгоритмів з відходом назад. Якщо можна сформулювати завдання так, що всі можливі рішення можуть бути утворені построе ¬ ням Af-векторів, то її можна вирішити за допомогою процедури з відходом.

Контрольні питання

Яка теоретична складність алгоритмів, розглянутих в даній роботі?

Назвіть особливості роботи хвильового і променевих алгоритмів?

Назвіть особливості роботи маршрутного алгоритму?

За якою формулою здійснюється обчислення відстані між двома точками?

Як впливає вибір пріоритетів на довжину траси?

У чому полягають принципи складання оптимального розкладу роботи паралельних процесорів?

Вкажіть основні особливості задачі упаковки?

Наведіть принципи вирішення задачі про джипі?

Як побудувати дерево рішень в задачі про кодовому замку?

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