Lascia che h(x)
sia la tua euristica per il nodo x
e h*(x)
l'euristica perfetta (dove conosci la distanza ESATTA del tuo obiettivo da x
), se 0 < h(x) <= h*(x)
per ogni nodo del grafico quindi l'euristica è ammissibile.
- Se
h(x) = 0
non hai informazioni e A * degenera in
Algoritmo di Dijkstra .
- Se
h(x) = h*(x)
conosci la risposta
e quindi non c'è alcun problema da risolvere.
- Il più vicino
h(x)
è a h*(x)
, il più breve A * impiegherà per trovare il percorso più breve.
- Se
h(x) > h*(x)
, la tua soluzione non è garantita come ottimale (cioè il percorso trovato potrebbe non essere il percorso di costo minore).
Alcune euristiche ben conosciute che soddisfano questi criteri sono Distanza euclidea e Distanza Manhattan .
Se h(x) <= d(x,y) + h(y)
per ogni margine x, y
del grafico, dove d(x,y)
è la distanza effettiva tra i nodi, l'euristica è detta monotona (o coerente) e nessun nodo deve essere elaborato più di una volta .
Detto questo, qualsiasi euristica che non sopravvaluta la distanza andrà bene. Non importa se i tuoi nodi hanno pesi diversi, fa parte di d(x)
(la distanza effettiva del tuo percorso percorso), non h(x)
che è solo una stima approssimativa per favorire alcuni percorsi prima degli altri. Fintanto che h(x)
(ricorda, è solo una stima) è < h*(x)
otterrai il percorso ottimale.
In un caso normale, userei semplicemente lo stesso modo in cui ho ottenuto l'obiettivo di tornare indietro, ma dal momento che una delle strade avrebbe potuto essere a senso unico, potrebbe non essere possibile.
Non importa se hai strade a senso unico. Il tuo grafico può essere diretto e semplicemente non permetti al tuo algoritmo di generare quella rotta. Non è necessario tornare indietro durante l'esecuzione di A *, perché diventerebbe un percorso più lungo che se non avessi intrapreso quel percorso in primo luogo. Se vuoi tornare da GOAL
a NODE
è solo una nuova ricerca nel tuo spazio di ricerca, non un singolo problema.
Per quanto riguarda l'avviso di MSalters, non penso che tu possa ricavare un'euristica in un grafico con solo pesi. Hai bisogno di un problema che soddisfi alcuni criteri che offrono ulteriori informazioni da cui indovinare. Se hai solo pesi, non puoi farlo meglio di Dijkstra's perché ti mancano ulteriori informazioni. Dipende interamente dal dominio del problema, quindi non è possibile fornire una risposta ampia adatta a qualsiasi grafico.