Nell'informatica, A* è un algoritmo di ricerca su grafi che individua un percorso da un dato nodo iniziale verso un dato nodo goal (o che passi un test di goal dato). Utilizza una "stima euristica" che classifica ogni nodo attraverso una stima della strada migliore che passa attraverso tale nodo. Visita il nodo in base a tale stima euristica. L'algoritmo A* è anche un esempio di ricerca best-first.
L'algoritmo è stato descritto nel 1968 da Peter Hart, Nils Nilsson, e Bertram Raphael.
Se si effettua una ricerca breadth-first come illustrato dall'algoritmo di Dijkstra, cercheremo ogni punto con un raggio circolare fisso, gradualmente espanderemo questo cerchio per cercare gli incroci più lontani dal nostro punto iniziale. Questa può essere una strategia effettiva se non si conosce dove si trovi la destinazione, come fa la polizia nella ricerca di un criminale nascosto.
Comunque, essa porta ad uno spreco di tempo se si hanno più informazioni. Una strategia migliore consiste nell'esporazione degli incroci posizionati a nord del primo, perché essi saranno i vertici più prossimi a B. Allora, le strade ci autorizzano, ad esplorare gli incroci sempre più vicini all'incrocio goal B. Ci sarà bisognio di qualche backtrack occasionale, ma senza dubbio questa è una strategia migliore. Inoltre, può essere provato che questa strategia troverà la strada migliore possibile, come farebbe la ricerca breadth-first. Questa è l'essenza della ricerca A*.
Comunque, non è garantito che l'esecuzione dell'A* sia migliore rispetto ai semplici algoritmi di ricerca. In un ambiente molto contorto, il solo modo per raggiungere la notra destinazione potrebbe essere quello di dirigerci a sud e in seguito girarci attorno. In questi casi la prova dei nodi più prossimi alla nostra destinazione potrebbe essere uno spreco di tempo.
Se la stima semplicemente ritorna sempre zero, che non sarà mai una sovrastima, allora A* compierà effettivamente l'algoritmo di Dijkstra e troverà ancora una soluzione ottimale, benché non rapidamente. L'euristica migliore possibile, benché non sia di solito pratico calcolarla, è la distanza attuale minima verso meta. Un esempio di euristica pratica ammissibile è la distanza in linea d'aria dalla meta su una mappa.
Può essere verificato che A* non considera più nodi di qualunque altro algoritmo di ricerca ammissibile, a meno che l'algoritmo alternativo non abbia una stima euristica più accurata. In questo senso A* è l'algoritmo computazionalmente più efficiente che garantisce la ricerca del percorso più breve.
L'algoritmo allora rimuove il prossimo nodo dalla coda di priorità (perché avrà valore della funzione euristica più basso). Se la coda è vuota, non ci saranno percorsi dal nodo iniziale al nodo meta e l'algoritmo si arresterà. Se il nodo è il nodo meta, A* ricostruisce e pone in output il percorso ottenuto e si arresta. Questa ricostruzione del percorso a partire dai nodi più vicini significa che non è necessario memorizzare il percorso in ogni nodo.
Se il nodo non è il nodo meta, nuovi nodi saranno creati per tutti nodi vicini ammissibili; il modo di fare questo dipende dal problema. Per ciascuno nodo successivo A* calcola il "costo" di entrata nel nodo e lo salva col nodo. Questo costo è calcolato dalla somma cumulativa dei pesi immagazzinati negli antenati, più il costo dell'operazione per raggiungere questo nuovo nodo.
L'algoritmo gestisce anche una lista di "closed", un elenco di nodi che sono già stati controllati. Se un nuovo nodo generato è già nella lista con un costo uguale o più basso, non ci sarà alcuna futura indagine su tale nodo o col percorso ad esso associato. Se un nodo nella lista di closed è uguale ad uno nuovo, ma è stato immagazzinato con un costo più alto, allora sarà rimosso dalla lista di closed, e il processo continuerà a partire dal nuovo nodo.
Successivamente, una stima della distanza dal nodo nuovo alla meta è aggiunta al costo per formare il suo valore euristico. Tale nodo è aggiunto allora alla coda di priorità "open", a meno che non esista un nodo identico con valore euristico minore o uguale.
L'algoritmo sarà adottato ad ogni nodo vicino, fatto ciò il nodo originale è preso dalla coda di priorità e posto nella lista di "closed". Il prossimo nodo sarà ottenuto dalla lista di open e con esso si ripeterà il processo descitto.
Quando A* ha terminato la sua ricerca, per definizione avrà trovato un percorso il cui costo attuale è più basso del costo stimato per ogni percorso attraverso tutti i nodi in open. Ma essendo tale stima ottimista, A* potrà senza pericoli ignorare tali nodi. In altre parole, A* non trascurerà mai la possibilità di trovare un percorso dal costo minore, e quindi sarà ammissibile.
Supponiamo ora che un'altro algoritmo di ricerca A termini la sua ricerca con un percorso il cui costo non sia minore del costo stimato per qualche nodo appartenente ad open. L'algoritmo A non può eliminare la possibilità, basandosi sulle informazioni euristiche che possiede, che un percorso attraverso tale nodo possa avere un costo inferiore a quanto valutato. Così anche se A potrà considerare meno nodi rispetto ad A*, non potrà essere ammissibile. Quindi, A* considera il numero di nodi più basso di qualunque altro algoritmo di ricerca ammissibile che utilizzi una funzione euristica non più accurata di quella adottata da A*.
Teoria dei grafi | Algoritmi di ottimizzazione
A*-Algorithmus | A* search algorithm | Algoritmo de búsqueda A* | A*-algoritmi | Algorithme A* | A* | A*-algoritme | Algorytm A*