Strona główna Algorytmy i Struktury Danych Wyszukiwanie ścieżki — A*, Dijkstra, BFS

🗺️ Wyszukiwanie ścieżki — A*, Dijkstra, BFS

Rysuj ściany, generuj labirynty i patrz, jak A*, Dijkstra, Greedy Best-First i BFS przeszukują siatkę. Porównuj algorytmy krok po kroku.

Algorytmy i Struktury Danych3DŁatwy60 FPS
pathfinding ↗ Otwórz osobno
Interfejs samej symulacji jest w języku angielskim.

O tej symulacji

Ta symulacja wizualizuje, jak pięć algorytmów przeszukiwania grafów znajduje trasę na siatce komórek. A* porządkuje komórki według f(n) = g(n) + h(n), gdzie g to rzeczywisty koszt od startu, a h to heurystyczne oszacowanie odległości do celu. Dijkstra ustawia h na zero, Greedy Best-First korzysta wyłącznie z h, a BFS rozszerza zwykłą kolejkę warstwa po warstwie.

🔬 Co pokazuje

Każdy algorytm stosuje inną strategię: BFS eksploruje warstwa po warstwie, Dijkstra według skumulowanego kosztu, Greedy według szacowanej odległości, a A* według kosztu plus oszacowania. Eksplorowane komórki są wizualizowane na bieżąco.

🎮 Jak korzystać

Rysuj ściany myszą. Umieść punkty startu i końca. Wybierz algorytm i kliknij Uruchom. Porównaj eksplorowany obszar (efektywność) i jakość ścieżki (optymalność).

💡 Czy wiesz, że?

A* wynaleźli Peter Hart, Nils Nilsson i Bertram Raphael w 1968 roku w Stanford Research Institute. Jest szeroko stosowany w grach wideo, nawigacji GPS i planowaniu ścieżek robotów.

Najczęściej zadawane pytania

Co dokładnie pokazuje ta symulacja wyszukiwania ścieżki?

Traktuje siatkę jako graf i animuje, jak wybrany algorytm przeszukuje przestrzeń od komórki startowej do komórki końcowej, kolorując zbiór otwarty, odwiedzone (zamknięte) komórki i ostateczną najkrótszą ścieżkę. Liczniki na żywo pokazują liczbę odwiedzonych komórek i długość wynikowej ścieżki, dzięki czemu można porównać efektywność z optymalnością.

Jak działa tutaj algorytm A*?

A* utrzymuje kolejkę priorytetową uporządkowaną według f(n) = g(n) + h(n). Wartość g to liczba kroków od startu, a h szacuje pozostałą odległość do celu. W każdym kroku rozwija komórkę o najniższym f, co kieruje przeszukiwanie w stronę celu, jednocześnie gwarantując najkrótszą ścieżkę, gdy heurystyka nigdy nie przeszacowuje.

Jaka jest różnica między A* Manhattan a A* euklidesowym?

Oba używają tego samego wzoru f = g + h, ale innej heurystyki. Odległość Manhattan sumuje różnice poziome i pionowe (|dr| + |dc|), co dokładnie pasuje do siatki z ruchem w 4 kierunkach. Odległość euklidesowa wykorzystuje przeciwprostokątną linię prostą, która bardziej niedoszacowuje na siatce bez ruchu po przekątnej, więc może eksplorować nieco więcej komórek.

Czym Dijkstra, Greedy i BFS różnią się od A*?

Dijkstra to A* z h ustawionym na zero, więc przeszukuje wyłącznie na podstawie skumulowanego kosztu i rozszerza się równomiernie we wszystkich kierunkach. Greedy Best-First używa f = h, pędząc w stronę celu wyłącznie na podstawie oszacowania, co jest szybkie, ale ściany mogą zwieść go na dłuższą trasę. BFS używa zwykłej kolejki FIFO zamiast kolejki priorytetowej.

Który algorytm daje najkrótszą ścieżkę?

A* (z dopuszczalną heurystyką), Dijkstra i BFS zawsze zwracają gwarantowaną najkrótszą ścieżkę na tej jednorodnej siatce kosztów, ponieważ każdy krok kosztuje jeden. Greedy Best-First nie gwarantuje optymalności; często szybko znajduje trasę, ale może obrać dłuższy objazd wokół przeszkód, ponieważ ignoruje już poniesiony koszt.

Co robią tryby rysowania i suwak prędkości?

Etykiety Ściana, Start, Koniec i Gumka określają, co robi kliknięcie lub przeciąganie po siatce. Ściana blokuje komórki, Start i Koniec przenoszą zielony i czerwony punkt końcowy, a Gumka usuwa ściany. Suwak prędkości wybiera, ile kroków przeszukiwania wykonuje się na klatkę animacji, od jednego kroku do stu, pozwalając oglądać powoli lub rozwiązać natychmiast.

Dlaczego komórki są kolorowane jako otwarte, zamknięte i ścieżka?

Niebieskie półprzezroczyste komórki to zbiór otwarty wciąż oczekujący na eksplorację, ciemnoniebieskie komórki to zbiór zamknięty już odwiedzony, a żółty oznacza zrekonstruowaną najkrótszą ścieżkę. Porównanie rozmiaru obszaru zamkniętego między algorytmami pokazuje ich efektywność: A* zwykle odwiedza znacznie mniej komórek niż Dijkstra, aby osiągnąć ten sam cel.

Jak generowany jest labirynt?

Przycisk Generuj labirynt wypełnia siatkę ścianami, a następnie uruchamia rekurencyjny algorytm cofania. Zaczynając od komórki w rogu, wykuwa przejścia po dwie komórki naraz w losowo przetasowanej kolejności, burząc ścianę między połączonymi komórkami. Wynikiem jest idealny labirynt z dokładnie jedną ścieżką między dowolnymi dwiema otwartymi komórkami.

Czy ścieżka jest rekonstruowana dokładnie?

Tak. Za każdym razem, gdy komórka jest osiągana po raz pierwszy, algorytm zapisuje, z jakiego sąsiada przyszedł, w mapie poprzedników. Gdy komórka końcowa zostaje zdjęta z kolejki, trasa jest odtwarzana przez podążanie tymi powiązaniami wstecz od celu do startu, a następnie odwracana, aby dać ścieżkę w przód podświetloną na żółto.

Gdzie te algorytmy są wykorzystywane w prawdziwym świecie?

A* i Dijkstra stanowią podstawę planerów tras GPS i map, ruchu postaci niesterowanych w grach wideo oraz nawigacji robotów magazynowych i dostawczych. Te same idee przeszukiwania grafów rozciągają się na trasowanie sieci, rozwiązywanie łamigłówek i logistykę. A* został po raz pierwszy opracowany w 1968 roku w Stanford Research Institute dla robota Shakey.

Podobne symulacje