Яка різниця між пошуком графіків та версіями дерев щодо DFS, A * пошуку у штучному інтелекті ?
Яка різниця між пошуком графіків та версіями дерев щодо DFS, A * пошуку у штучному інтелекті ?
Відповіді:
Судячи з існуючих відповідей, здається, у цій концепції багато плутанини.
Різниця між пошуком дерев та пошуком графіків не пов’язана з тим, чи є графік проблеми деревом чи загальним графіком. Завжди передбачається, що ви маєте справу із загальним графіком. Відмінність полягає в шаблоні обходу, який використовується для пошуку по графіку, який може бути у формі графа або дерева.
Якщо ви маєте справу з деревоподібною проблемою , обидва варіанти алгоритму призводять до рівноцінних результатів. Тож ви можете вибрати простіший варіант пошуку по дереву.
Ваш основний алгоритм пошуку графіків виглядає приблизно так, як показано нижче. З початковим вузлом 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 * надає цю гарантію лише тоді, коли він використовується з послідовною (або "монотонною") евристикою (більш сильна умова, ніж допустимість).
Для простоти представлений код не:
state
чи node
є він більш адекватним , на відміну від графіка обходу, залежить від контексту. Але використання для вершини графа задачі та для графіка обходу могло б точно покращити чіткість відповіді. Спробую незабаром переписати. Дякую. state
node
Дерево - це окремий випадок графіка, тому все, що працює для загальних графіків, працює для дерев. Дерево - це графік, де між кожною парою вузлів є точно один шлях. Це означає, що він не містить ніяких циклів, як зазначено в попередній відповіді, але спрямований графік без циклів (DAG, спрямований ациклічний графік) не обов'язково є деревом.
Однак, якщо ви знаєте, що ваш графік має деякі обмеження, наприклад, що це дерево або DAG, ви зазвичай можете знайти якийсь більш ефективний алгоритм пошуку, ніж для необмеженого графіка. Наприклад, мабуть не має сенсу використовувати A * або його неевристичний аналог «алгоритм Дейкстри» на дереві (де в будь-якому випадку є лише один шлях, який ви можете знайти за допомогою DFS або BFS) або на DAG (де оптимальний шлях можна знайти, розглядаючи вершини в порядку, отриманому топологічним сортуванням).
Що стосується спрямованого проти неорієнтованого, то неорієнтований графік є приватним випадком спрямованого, а саме випадок, який слідує правилу «якщо є ребро (посилання, перехід) від u до v, існує також ребро від v до u .
Оновлення : Зверніть увагу: якщо те, що вас цікавить, - це шаблон обходу пошуку, а не структура самого графіку, це не відповідь. Дивіться, наприклад, відповідь @ ziggystar.
Єдина різниця між графіком і деревом - це цикл . Графік може містити цикли, дерево не може. Отже, коли ви збираєтеся реалізувати алгоритм пошуку на дереві, вам не потрібно враховувати існування циклів, але при роботі з довільним графіком вам потрібно буде їх розглянути. Якщо ви не обробляєте цикли, алгоритм може врешті-решт потрапити в нескінченний цикл або нескінченну рекурсію.
Ще один момент, про який слід подумати - це спрямовані властивості графіка, з яким ви маєте справу. У більшості випадків ми маємо справу з деревами, які представляють стосунки батьків та дітей на кожному краю. DAG (спрямований ациклічний графік) також показує подібні характеристики. Але двонаправлені графіки бувають різними. Кожне ребро в двонаправлених графіках представляє двох сусідів. Тож алгоритмічні підходи повинні дещо відрізнятися для цих двох типів графіків.
ГРАФІК ПРОТИ ДЕРЕВА
Але у випадку 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, що означає, що не всі вузли відрізняються.
Нарешті, ви можете реалізувати алгоритм пошуку по дереву, щоб запобігти вивченню того самого вузла двічі. Але це має наслідки.
Простими словами, дерево не містить циклів і де як може графік. Отже, коли ми робимо пошук, нам слід уникати циклів у графіках, щоб ми не потрапляли в нескінченні цикли.
Іншим аспектом є те, що дерево, як правило, має якусь топологічну сортування або таку властивість, як двійкове дерево пошуку, що робить пошук таким швидким і простим у порівнянні з графіками.