Асинхронний бектрекінг

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

ABT алгоритм дещо краще виконується ніж DFS, цього можна досягти призначаючи пріоритет (впорядкування) агентів - чим більше обмежень, тим вищий пріоритет. Ця евристика дає непогані результати.

Отже, застосування алгоритму асинхронний бектрекінг (АБТ) потрібно задати пріоритет (впорядкування) агентів. Ми будемо вважати, що порядковий номер агента визначає його важливість - чим менше номер, тим вище пріоритет. Кожне бінарне обмеження відоме обом агентам перевіряється агентом з нижчим пріоритетом. Агенти початково з’єднані ребрами графа, що описують безпосередні обмеження (неможливо мати однаковий колір з обох кінців ребра). Також кожен агент містить множину сусідів, яка спочатку дорівнює його безпосереднім сусідам а пізніше поповнюється іншими. Агенти обмінюються повідомленнями, які бувають трьох типів: - ok? - handle-nogood - handle-new-neighbor.

Всі агенти чекають на повідомлення та опрацьовують їх за порядком надходження. На початку роботи алгоритму агенти отримують випадкове призначення та формують список nogood станів - станів, які суперечать розв’язку. Після цього кожний агент надсилає своїм сусідам, що мають нижчий пріоритет повідомлення ok?(agent, color) - що можна зрозуміти як спробу узгодити кольори початкового призначення.

Коли агент отримує повідомлення ok?(agent, color) від сусіда, він поміщає отриману інформацію в структуру, що називається agent view, після цього він перевіряє чи є його колір узгодженим з поточним agent view, тобто чи немає пари (його колір, отриманий колір) у переліку nogood станів. Якщо колір узгоджений, то агент просто видаляє повідомлення. Якщо колір неузгоджений, агент намагається вибрати інший колір та повідомити своїх низькопріоритетних сусідів про свій вибір. Якщо вибрати узгоджений колір неможливо то агент запускає процедуру відкату (backtracking).

При виконанні backtracking формується новий nogood з поточного agent view (ми використовуємо найпростіший спосіб). В цьому разі nogood складається з агентів, які суперечать вибору кольору поточного агента. Агент, який потрапив у backtracking вибирає найменш пріоритетного з переліку агентів з nogood та надсилає йому відповідне повідомлення.

В результаті розв’язок проблеми передається наверх по пріоритетності, якщо ж ситуація backtracking виникла у першого агента, формується повідмлення про те, що розв’язку не існує.

Theorem (ABT є повним). Алгоритм ABT завжди знаходить розв’язок якщо такий існує або формує повідомлення про те, що розв’язку не існує. (Yokoo et al., 1998).

Приклад

Розглянемо приклад виконання ABT для простого графу з двома кольорами. Виконаємо випадкове призначення (вибрали таке, щоб іллюструвати бетрекінг)

Всі агенти посилають повідомлення ok? своїм сусідам з нижчим пріоритетом. Агент 4 отримує повідомлення від 0, 2, 3. Агент 2 від 1. Намагаючись знайти узгоджений колір агенти 2, 4 змінюють колір на червоний.

Після цього агент 2 надсилає агенту 4 ok? (agent2 red), але 4 агент не може вибрати колір, який би був узгоджений з його сусідами, тому він формує nogood та повідомляє наступному за пріорітетом сусіду - агенту 3, що він не може нічого вдіяти. При цьому він надсилає свій agent view, в якому міститься інформація ((агент2 червоний), (агент0 синій), (агент3 червоний)). Агент 3 додає собі сусідів агентів 2, 0. Агент 3 змінює свій колір на червоний і розсилає ok? (agent3 red).

Однак це не допомагає, тому агент 3 формує свій nogood та викликає бектрекінг для наступного за пріоритетом сусіда (агента 2). Аналогічно nogood доходить до агента 1, і він змінює колір на червоний.

Агент 1 надсилає агенту 2 свій ok? (agent2 red) в результаті чого другий агент змінює свій колір.

Тепер агент 2 розсилає своїм сусідам ok?, внаслідок чого агент 3 змінює свій колір на синій.

Формується повідомлення Розв’язок знайдено.