Найкоротший шлях на непрямому графіку?


19

Тому я подумав, що це (хоча і дещо основне) питання належить тут:

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

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

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

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

Однак я не могла протягом життя уявити, як отримати найкоротший шлях за допомогою пошуку.

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

У когось є якісь ідеї, які могли б спрямувати мене в правильному напрямку на цьому?

Велике спасибі.

(Я намагався поставити візуалізацію графіка, але не зміг через низьку репутацію)

Відповіді:


19

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


О, о, чоловік, я навіть не думав про BFS! дякую тонну!
gfppaste

Як це надмірно? Можливо, реалізація трохи складніше нічого іншого.

Я також хотів би додати, що BFS є більш ефективним. BFS має O(|E|), а Dijkstra є O(|E| + |V|log(|V|).
Doug Ramsey

@ user742 BFS швидше, ніж Djikstras. Djikstra є, O(mn)поки BFSO(V + E)
CodyBugstein

13

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

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

гмахкiгмах+i×кгмах=к=1 тоді ви гарантовано знайдете оптимальне рішення при використанні лінійки пам'яті в глибині рішення.

бб-1б

Ура,

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