У чому різниця між пошуком графіків та деревом?


Відповіді:


176

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

Проблема - це завжди графік

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

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

Різниця між графіком та деревом

Ваш основний алгоритм пошуку графіків виглядає приблизно так, як показано нижче. З початковим вузлом start, спрямованими краями як successorsі goalспецифікацією, яка використовується в умовах циклу. openутримує в пам'яті вузли, які зараз перебувають на розгляді, у відкритому списку . Зверніть увагу, що наведений нижче псевдокод є неправильним у всіх аспектах (2).

Пошук по дереву

open <- []
next <- start

while next is not goal {
    add all successors of next to open
    next <- select one node from open
    remove next from open
}

return next

Залежно від того, як ви реалізуєте select from open, ви отримуєте різні варіанти алгоритмів пошуку, такі як пошук по глибині (DFS) (вибір найновішого елемента), пошук по ширині (BFS) (вибір найстарішого елемента) або пошук рівномірної вартості (вибір елемента з найнижчою вартістю шляху) ), популярний пошук зірок A, вибравши вузол з найнижчою вартістю плюс евристичне значення тощо.

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

Пошук графіків

Як ми побачили, пошук дерев може відвідувати стан кілька разів. І як такий, він буде досліджувати "піддерево", знайдене після цього стану кілька разів, що може бути дорогим. Пошук графіків виправляє це шляхом відстеження всіх відвіданих станів у закритому списку . Якщо нещодавно знайдений наступник nextвже відомий, він не буде вставлений у відкритий список:

open <- []
closed <- []
next <- start

while next is not goal {
    add next to closed
    add all successors of next to open, which are not in closed 
    remove next from open
    next <- select from open
}

return next

Порівняння

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

Оптимальні рішення

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

A *

Також (дуже популярний) алгоритм пошуку по дереву A * забезпечує оптимальне рішення при використанні з допустимою евристикою . Однак алгоритм пошуку графіка A * надає цю гарантію лише тоді, коли він використовується з послідовною (або "монотонною") евристикою (більш сильна умова, ніж допустимість).

(2) Вади псевдокоду

Для простоти представлений код не:

  • обробляти невдалі пошуки, тобто це працює лише в тому випадку, якщо можна знайти рішення

1
Приємна відповідь! Чи можете ви детальніше пояснити, що ви маєте на увазі під проблемою у формі дерева ? Крім того, як ви пропонуєте зберігати шлях, пройдений алгоритмом для досягнення цілі, на відміну від повного обходу?
Брайан

1
Деревоподібна проблема @Brian означає, що графік, який ви шукаєте, є деревом. І на ваше друге запитання: це залежить від проблеми. Однією з можливостей є просто збереження шляху до вузла разом із кожним розширеним вузлом, якщо це можливо.
ziggystar

5
Більш офіційно сказати, що "єдиний стан" можна відвідувати кілька разів за допомогою пошуку по дереву, а НЕ вузла. Оскільки кожен вузол у дереві пошуку відповідає одному шляху вздовж графіка простору станів і відвідується щонайменше один раз при пошуку дерев. (Хоча це не відповідає ітеративному поглибленню пошуку, яке перетинає дерево зі збільшенням обмежень глибини, але в цьому випадку також у кожній ітерації кожен вузол відвідується лише один раз)
Надер Ганбарі,

1
@NaderhadjiGhanbari Чи відповідатиме вершинам основного графіка проблеми, stateчи nodeє він більш адекватним , на відміну від графіка обходу, залежить від контексту. Але використання для вершини графа задачі та для графіка обходу могло б точно покращити чіткість відповіді. Спробую незабаром переписати. Дякую. statenode
ziggystar

TL; DR: пошук графіків використовує закриту структуру даних, тоді як пошук по дереву - ні.
shinzou

7

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

Однак, якщо ви знаєте, що ваш графік має деякі обмеження, наприклад, що це дерево або DAG, ви зазвичай можете знайти якийсь більш ефективний алгоритм пошуку, ніж для необмеженого графіка. Наприклад, мабуть не має сенсу використовувати A * або його неевристичний аналог «алгоритм Дейкстри» на дереві (де в будь-якому випадку є лише один шлях, який ви можете знайти за допомогою DFS або BFS) або на DAG (де оптимальний шлях можна знайти, розглядаючи вершини в порядку, отриманому топологічним сортуванням).

Що стосується спрямованого проти неорієнтованого, то неорієнтований графік є приватним випадком спрямованого, а саме випадок, який слідує правилу «якщо є ребро (посилання, перехід) від u до v, існує також ребро від v до u .

Оновлення : Зверніть увагу: якщо те, що вас цікавить, - це шаблон обходу пошуку, а не структура самого графіку, це не відповідь. Дивіться, наприклад, відповідь @ ziggystar.


Гм, контекст питання для мене не зовсім зрозумілий, але, переглянувши його ще раз, побачивши вашу відповідь @ziggystar, у мене виникає відчуття, що згадка про A * та AI свідчить про те, що ви можете мати рацію, і моя відповідь поза контекстом. Я трактував "пошук дерева" як "пошук дерева". Не "пошук загального графіка з використанням деревоподібної схеми обходу", що означає ваша відповідь.
njlarsson

@njlarsson Я включив у свою відповідь Вашу перефразування. Це добре для уточнення.
ziggystar

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

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

1
Відповідь стосується і алгоритмів пошуку, але це правда, що це не те, про що запитував плакат. Дивіться «Оновлення» у відповіді - у березні 2014 року я зрозумів, що неправильно зрозумів запитання. Моя причина не видалити відповідь полягає в тому, що вона все одно може бути корисною для когось, хто прийшов сюди через пошук.
njlarsson

3

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

Ще один момент, про який слід подумати - це спрямовані властивості графіка, з яким ви маєте справу. У більшості випадків ми маємо справу з деревами, які представляють стосунки батьків та дітей на кожному краю. DAG (спрямований ациклічний графік) також показує подібні характеристики. Але двонаправлені графіки бувають різними. Кожне ребро в двонаправлених графіках представляє двох сусідів. Тож алгоритмічні підходи повинні дещо відрізнятися для цих двох типів графіків.


3
Щоб додати до цього, якщо у вас справді є дерево, вам не потрібно виявляти дублікати в A *. Однак вам все одно знадобиться спосіб вилучити кінцевий шлях, тому у вас все ще може бути закритий список.
Натан С.

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

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

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

1

ГРАФІК ПРОТИ ДЕРЕВА

  • Графіки мають цикли
  • Дерева не мають циклів "Наприклад, уявіть будь-яке дерево у вашій голові, гілки не мають прямих зв'язків з коренем, але гілки мають з'єднання з іншими гілками вгору"

Але у випадку AI Graph-search vs Tree-search

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

Наприклад, розглянемо наступний графік із 3 вершинами AB і C та наступні ребра

AB, BC і CA, ну є цикл від C до A,

І коли DFS, починаючи з A, A генерує новий стан B, B генерує новий стан C, але коли C досліджується, алгоритм намагатиметься генерувати новий стан A, але A вже відвідано, таким чином він буде проігнорований. Класно!

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

Розгляньте це Дерево з 3 вершинами та врахуй наступні ребра

A - B - C кореняться в А, вниз. І припустимо, що ми використовуємо алгоритм DFS

A генерує новий стан B, B генерує два стани A & C, тому що у дерев немає "Позначити відвіданий вузол, якщо він досліджений", отже, можливо, алгоритм DFS буде досліджувати A знову, генеруючи таким чином новий стан B, таким чином ми потрапляємо в нескінченний цикл.

Але ви щось помітили, ми працюємо над ненаправленими краями, тобто існує зв'язок між AB і BA. звичайно, це не цикл, оскільки цикл передбачає, що вершини повинні бути> = 3, і всі вершини відрізняються, крім першого та останнього вузлів.

ST A-> B-> A-> B-> A це не цикл, оскільки він порушує властивість циклічності> = 3. Але насправді A-> B-> C-> A це цикл> = 3 різні вузли Перевірено, перший і останній вузол однакові Перевірено.

Знову розглянемо краї дерева, A-> B-> C-> B-> A, звичайно, це не цикл, тому що є два B, що означає, що не всі вузли відрізняються.

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


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

1

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.