Najkrótsza ścieżka na niekierowanym wykresie?

19

Pomyślałem więc, że należy do tego (choć nieco podstawowego) pytania:

Powiedzmy, że mam wykres wielkości 100 węzłów ułożonych we wzór 10x10 (pomyśl szachownica). Wykres jest nieukierowany i nieważony. Poruszanie się po wykresie wymaga przesunięcia o trzy pola do przodu i jedno pole w prawo lub w lewo (podobnie do ruchu rycerza szachowego po planszy).

W przypadku stałego węzła początkowego, jak znaleźć najkrótszą ścieżkę do dowolnego innego węzła na planszy?

Wyobrażałem sobie, że między węzłami, które są wykonalnymi ruchami, będzie tylko krawędź. Biorąc pod uwagę te informacje, chciałbym znaleźć najkrótszą ścieżkę od węzła początkowego do węzła końcowego.

Początkowo myślałem, że każda krawędź jest ważona wagą 1. Jednak wykres nie jest przekierowany, więc Djikstras nie byłby idealnym dopasowaniem. Dlatego postanowiłem to zrobić przy użyciu zmienionej formy głębokiego pierwszego wyszukiwania.

Jednak nie potrafiłem sobie wyobrazić, jak uzyskać najkrótszą ścieżkę za pomocą wyszukiwania.

Inną rzeczą, którą próbowałem, było umieszczenie wykresu w postaci drzewa z węzłem początkowym jako korzeniem, a następnie wybranie najwcześniejszego (najniższego numeru wiersza) wyniku, który dał mi pożądany węzeł końcowy ... działało, ale było niesamowicie nieefektywne, a zatem nie działałby na większym wykresie.

Czy ktoś ma jakieś pomysły, które mogłyby wskazać mi właściwy kierunek?

Dziękuję Ci bardzo.

(Próbowałem wprowadzić wizualizację wykresu, ale nie byłem w stanie tego zrobić z powodu mojej niskiej reputacji)

gfppaste
źródło

Odpowiedzi:

19

Jeśli krawędzie na wykresie reprezentują tylko prawidłowe ruchy między niektórymi pozycjami, użycie Dijkstry działałoby dobrze. Ponieważ wykres jest nieważony, byłoby to przesadą. Proste wyszukiwanie w pierwszej kolejności da optymalną odpowiedź.

Nicholas Mancuso
źródło
ohhhhhh, nawet nie pomyślałem o BFS! dzięki tona!
gfppaste,
Jak to jest przesada? być może wdrożenie jest trochę trudniejsze, nic więcej.
Chciałbym również dodać, że BFS jest bardziej wydajny. BFS ma O(|E|), a Dijkstra's ma O(|E| + |V|log(|V|).
Doug Ramsey,
@ user742 BFS jest szybszy niż Djikstras. Djikstra jest O(mn)podczas gdy BFS jestO(V + E)
CodyBugstein
13

Nicholas udzielił już idealnej odpowiedzi. Pozwól mi jednak zająć się twoją pierwotną próbą użycia wyszukiwania w pierwszej kolejności.

Po pierwsze, albo Dijkstra (która działa dobrze z nieważonymi węzłami, jak zauważył Nicholas Mancuso), albo szerokie wyszukiwanie powoduje wykładnicze marnowanie pamięci. Ich zaletą jest jednak to, że nigdy nie rozszerzają żadnych węzłów, podczas gdy mają gwarancję znalezienia optymalnych rozwiązań. Niestety ich ograniczenie jest dość ważne i nie należy oczekiwać, że skalują się odpowiednio.

remzaxkjaremzax+ja×kremzax=k=1 wtedy masz gwarancję znalezienia optymalnego rozwiązania, używając pamięci liniowej w głębi rozwiązania.

bb-1b

Twoje zdrowie,

Carlos Linares López
źródło