Чому не можна використовувати DFS для пошуку найкоротших шляхів у невагомих графіках?


16

Я розумію, що використання DFS "як є" не знайде найкоротший шлях у невагомому графіку.

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

Чи знаєте ви будь-які зміни, які дозволять DFS знаходити найкоротші шляхи в невагомих графіках? Якщо ні, то про алгоритм це ускладнює?


1
Найпоширеніший алгоритм накладання маршрутів на невагомих графах - A *, з незначною модифікацією, що зв'язки розриваються ближче до кінця. Це дасть алгоритм, подібний до DFS, в тому, що він спробує спершу найбільш прямий маршрут, і лише пустить назовні, якщо потрібно.
BlueRaja - Danny Pflughoeft

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

так, ви можете це зробити. Ось рішення
Anmol Middha

Відповіді:


12

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

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

зустрічний приклад жадного правила
[ джерело ]

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

Однак, незалежно від правила¹, ви можете побудувати графіки, у яких DFS здійснює довгий об’їзд у самому першому вузлі, як і я для жадного правила. Присвоїти ребра і ваги , такі , що правило вибирає для відвідування перший і призначити на вагу більше , ніж один з . Тому правдоподібно, що DFS ніколи не може знайти найкоротші шляхи (загалом графіки).( s , a ) a ( a , b ) ( s , t )(s,t)(s,a)a(a,b)(s,t)

Зауважте, що оскільки ви можете виразити кожен зважений графік (додатне ціле число) як незважений графік - просто замініть ребра вартістю ланцюжком з вузлами - ці ж приклади стосуються DFS на невагомих графах. Тут ситуація насправді ще більш похмура: без ваг, що може використовувати ДФС для визначення наступної дитини, яку відвідує?c - 1cc1


  1. Поки правило є детермінованим. Якщо це не так, воно, очевидно, не завжди може знайти найкоротші шляхи.

Виправте мене, якщо я помиляюся, але чи це означає, що DFS може знайти найкоротший шлях у будь-якому графіку, але це займе експоненційний час?
Anmol Singh Jaggi

@AnmolSinghJaggi №. DFS знаходить лише один шлях.
Рафаель

10

Ширина -перший пошук - це алгоритм, який знайде найкоротші шляхи в невагомому графіку.

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

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


3

Ти можеш!!!

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

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

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


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

1
@ user2407394 Ви реально реалізували цей варіант DFS один раз і правильно запустили його для помірно великого графіка? Я б вагався назвати цю варіацію як DFS. Я б назвав це пошуком, який потребує перших глибин.
Джон Л.

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

@ user2407394 здається, що це спрацює, але як ви перевіряєте, коли зупинитись, оскільки не буде списку "відвіданих", якщо ви відмітите їх усі?
Джо Блек

0

BFS має хорошу властивість, що він перевірятиме всі ребра від кореня та зберігатиме відстань від кореня до інших вузлів як мінімум, але dfs просто переходить на перший сусідній вузол і йде на глибину. МОЖЕТЕ змінити DFS, щоб отримати найкоротший шлях, але ви опинитесь лише в алгоритмі, який має більшу складність у часі, або в кінцевому підсумку робити те саме, що робить BFS


-3

IT можливо знайти шлях між двома вершинами з мінімальною кількістю ребер за допомогою DFS. ми можемо застосувати підхід рівня


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

-3

Ти можеш

просто перейдіть графік у форматі dfs та перевірте

if(distance[dest] > distance[source]+cost[source_to_destination]){
    distance[dest] = distance[source] + cost[source_to_destination]);
}

Ось посилання для повного рішення


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

Це не просто повторення відповіді user2407394 , лише із важко зрозумілим кодом (ви не визначили, що означає будь-яка з цих змінних, і мені це не очевидно) замість пояснення?
Девід Річербі

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