🗺️ Pathfinding A*
Guarda l'algoritmo A* trovare il percorso più breve su una griglia con f(n)=g(n)+h(n). Disegna muri, trascina partenza e arrivo, cambia euristica e confronta A*, Dijkstra e ricerca Greedy.
Informazioni su Pathfinding A*
A* (pronunciato "A-star") è un algoritmo di ricerca su grafo best-first che trova il percorso più breve tra due punti combinando il costo-finora garantito e ottimale di Dijkstra (g) con una stima euristica della distanza rimanente (h), assegnando a ogni nodo un punteggio di priorità f = g + h. Sviluppato da Hart, Nilsson e Raphael nel 1968, è alla base della navigazione dei personaggi nei videogiochi, della pianificazione del movimento robotico e del calcolo dei percorsi di Google Maps. Quando l'euristica è ammissibile — cioè non sovrastima mai il costo reale — A* è garantito trovare il percorso ottimale.
Questa simulazione permette di scegliere tra A*, Dijkstra (h = 0) e Greedy Best-First (g = 0) su una griglia dove puoi disegnare muri e terreno pesato (costo ×5), trascinare i nodi di partenza e arrivo, selezionare un'euristica (Manhattan, Euclidea o Chebyshev), attivare le mosse diagonali e osservare i nodi espandersi un passo alla volta. Le statistiche in tempo reale mostrano nodi espansi, lunghezza del percorso e costo totale.
Domande frequenti
Cosa significa f = g + h?
In A*, ogni nodo nell'insieme aperto è valutato con f(n) = g(n) + h(n), dove g(n) è il costo esatto del percorso più economico trovato finora dalla partenza al nodo n, e h(n) è la stima euristica del costo da n all'obiettivo. L'algoritmo espande sempre il nodo con f più basso, garantendo che se h è ammissibile, la prima volta che l'obiettivo viene espanso il suo percorso è ottimale.
Cos'è un'euristica ammissibile?
Un'euristica h è ammissibile se non sovrastima mai il costo reale per raggiungere l'obiettivo — formalmente h(n) ≤ h*(n) per ogni n. La distanza Manhattan (somma di passi orizzontali e verticali) è ammissibile su una griglia connessa a 4; la distanza Euclidea è ammissibile per qualsiasi griglia. Un'euristica non ammissibile può rendere A* più veloce ma può restituire un percorso non ottimale.
In cosa A* differisce dall'algoritmo di Dijkstra?
L'algoritmo di Dijkstra imposta h = 0, quindi espande i nodi in ordine del loro costo esatto dalla partenza, irradiandosi ugualmente in tutte le direzioni. A* aggiunge l'euristica per guidare la ricerca verso l'obiettivo, tipicamente espandendo molti meno nodi. Su una griglia aperta senza ostacoli, A* con distanza Manhattan può ridurre le espansioni di nodi del 50–90% rispetto a Dijkstra.
Perché la ricerca Greedy Best-First è più veloce ma non ottimale?
Greedy Best-First imposta g = 0 e usa solo h per classificare i nodi, precipitandosi sempre verso il nodo che sembra più vicino all'obiettivo. Questo è molto veloce in ambienti aperti, ma ignora il costo reale del percorso, quindi può essere attirata attraverso terreno costoso o attorno a ostacoli in un percorso più lungo. Nel caso peggiore trova un percorso arbitrariamente peggiore dell'ottimale.
Quando dovrei usare la distanza Manhattan, Euclidea o Chebyshev?
Usa la distanza Manhattan quando il movimento è limitato a 4 direzioni (su, giù, sinistra, destra), poiché conta esattamente il numero minimo di passi. La distanza Euclidea è appropriata quando le mosse diagonali sono permesse e il costo diagonale è √2. La distanza Chebyshev (massimo tra |Δx|, |Δy|) è la scelta giusta quando tutte le 8 direzioni costano uguale, come è comune in molti giochi strategici.
Cosa sono le celle pesate e come influenzano il pathfinding?
Le celle pesate rappresentano terreno più difficile da attraversare — fango, acqua bassa o una strada dissestata. In questa simulazione una cella pesata costa 5 invece di 1 per essere attraversata, quindi A* spesso aggirerà diverse celle pesate invece di attraversarle. Dijkstra e A* gestiscono entrambi i pesi correttamente; Greedy Best-First ignora i costi e può attraversare terreno costoso in linea retta.
Qual è la complessità temporale di A*?
Nel caso peggiore A* ha complessità temporale e spaziale O(b^d), dove b è il fattore di ramificazione e d è la profondità della soluzione ottimale. Con un'euristica consistente (che soddisfa la disuguaglianza triangolare) ogni nodo è espanso al massimo una volta, dando O(V log V) su un grafo finito con V vertici — lo stesso limite asintotico di Dijkstra con uno heap binario.
Come influenza la ricerca la generazione del labirinto?
Il generatore di labirinti crea un labirinto perfetto usando un algoritmo randomizzato che scava passaggi attraverso una griglia, garantendo esattamente un percorso tra due celle qualsiasi. I labirinti sono particolarmente impegnativi per gli algoritmi di ricerca perché i corridoi stretti eliminano il vantaggio euristico di A* — con un solo percorso valido, tutti gli algoritmi devono esplorare circa gli stessi nodi.
Cosa rappresentano i colori sulla griglia?
Il verde segna il nodo di partenza, il rosso l'obiettivo. Le celle blu formano la frontiera corrente (insieme aperto), il blu scuro segna i nodi visitati (chiusi), e il giallo evidenzia il nodo in fase di espansione. Le celle pesate appaiono marroni. Una volta trovato un percorso, viene tracciato in verde lime dalla partenza all'obiettivo, e puoi leggere il costo esatto nel pannello statistiche.
A* può essere usato in 3D o su grafi non a griglia?
Sì — A* funziona su qualsiasi grafo dove i costi degli archi non sono negativi e si può fornire un'euristica ammissibile. Applicazioni reali includono la pianificazione del movimento di bracci robotici 3D (grafi dello spazio di configurazione), l'instradamento di rete (latenza come costo), e il parsing del linguaggio naturale (reticoli simili a Viterbi). La griglia qui è solo la rappresentazione visivamente più intuitiva dell'algoritmo generale.
Qual è il significato del contatore "nodi espansi"?
Nodi espansi conta quante volte l'algoritmo ha estratto un nodo dalla frontiera e processato i suoi vicini — questa è la misura primaria dell'efficienza di A*. Un conteggio più basso significa che l'euristica sta guidando bene la ricerca. Su una griglia 30×30 (900 celle) una buona euristica può spesso trovare il percorso ottimale espandendo meno di 100 nodi, mentre Dijkstra può espandere ogni cella raggiungibile.
Informazioni su questa simulazione
Questo simulatore visualizza l'algoritmo di ricerca A* mentre trova il percorso più breve su una griglia pesata. Ogni nodo di frontiera porta un punteggio f(n) = g(n) + h(n), dove g è la distanza esatta percorsa dalla partenza e h è una stima euristica della distanza rimanente all'obiettivo; l'algoritmo espande sempre per primo il nodo con f più basso. Passare a Dijkstra nel menu azzera h, mentre Greedy Best-First elimina del tutto g, così puoi osservare lo stesso labirinto risolto in tre modi diversi, nodo per nodo.
🔬 Cosa mostra
La griglia a colori traccia la ricerca dal vivo: le celle blu si trovano nella frontiera aperta, le celle blu scuro sono state completamente espanse (chiuse), e il giallo segna qualsiasi nodo in elaborazione in quell'istante. Una volta raggiunto l'obiettivo, il percorso vincente viene tracciato in verde lime, e la barra laterale riporta quanti nodi sono stati espansi più il costo totale del percorso.
🎮 Come si usa
Scegli Algoritmo ed Euristica dai menu a tendina, poi usa i pulsanti dello strumento Paint per aggiungere Muri, terreno Weight con costo ×5, o trascina i marcatori Move start/Move goal sulla tavola. Consenti mosse diagonali passa tra movimento a 4 e 8 direzioni, Mostra valori g/h/f sovrappone i punteggi grezzi su ogni cella, e Auto-run, Step, Genera labirinto, Cancella muri e Reset controllano la riproduzione e il layout della tavola.
💡 Lo sapevi?
A* fu pubblicato nel 1968 da Peter Hart, Nils Nilsson e Bertram Raphael, e nonostante abbia più di mezzo secolo è ancora la scelta predefinita per il pathfinding nella maggior parte dei videogiochi, degli stack robotici e dei pianificatori di percorso perché non esplora mai più nodi del necessario una volta fornita un'euristica ammissibile.
Domande frequenti
Cosa succede se passo da distanza Manhattan a Euclidea o Chebyshev?
Ogni euristica cambia il modo in cui h(n) stima la distanza dall'obiettivo, il che rimodella la frontiera di ricerca. La distanza Manhattan è esatta per il movimento a 4 direzioni; la distanza Euclidea si adatta al movimento diagonale; la distanza Chebyshev si adatta a griglie dove i passi diagonali costano come quelli ortogonali. Scegliere un'euristica che sottostima la distanza reale mantiene A* ottimale ma può espandere più nodi; sovrastimarla velocizza la ricerca ma può produrre un percorso più lungo.
Perché disegnare una cella Weight cambia il percorso invece di rallentarlo soltanto?
Una cella Weight costa 5 per essere attraversata invece di 1, quindi aumenta g(n) per ogni percorso che la attraversa. Poiché A* e Dijkstra minimizzano sempre il costo totale, prenderanno volentieri un percorso più lungo attorno a celle pesate se è complessivamente più economico — Greedy Best-First, che ignora g del tutto, è l'unica modalità che può attraversare terreno costoso in linea retta.
Cosa traccia realmente la colorazione della frontiera dietro le quinte?
Le celle blu sono nell'insieme aperto — scoperte ma non ancora espanse — e sono memorizzate in uno heap binario minimo ordinato per f, con i pareggi risolti dal valore h più basso. Le celle blu scuro sono chiuse, cioè i loro vicini sono già stati esaminati e il loro gScore è definitivo. Il giallo segna l'unico nodo estratto dallo heap nel passo corrente.
Perché Genera labirinto fa peggiorare così tanto Greedy Best-First?
Il generatore scava un labirinto perfetto con esattamente un percorso tra due celle qualsiasi usando un backtracker ricorsivo randomizzato, quindi non ci sono scorciatoie da sfruttare. Greedy Best-First continua a precipitarsi verso la cella aperta che sembra più vicina all'obiettivo in linea retta, spesso infilandosi in corridoi senza uscita, mentre A* e Dijkstra ritornano metodicamente indietro e provano l'unica altra opzione.
Il costo del movimento diagonale è gestito correttamente?
Sì — quando Consenti mosse diagonali è attivo, i passi diagonali costano √2 invece di 1, corrispondendo alla loro vera lunghezza euclidea, e il simulatore blocca le mosse diagonali che taglierebbero l'angolo tra due muri adiacenti. In questa modalità l'euristica passa anche a una formula di distanza ottile, così resta ammissibile per il movimento a 8 direzioni.
Guarda A* trovare il percorso più breve su una griglia usando f = g + h. Disegna muri, trascina partenza/arrivo, cambia euristica, e confronta A* con Dijkstra e Greedy per vedere come l'euristica cambia i nodi espansi.
3D · Three.js / WebGL renderer · 60 FPS target · runs fully client-side, no install