Sto sviluppando un programma di ricerca del percorso. Si dice teoricamente che A * sia migliore di Dijkstra. In realtà, quest'ultimo è un caso speciale del primo. Tuttavia, quando provo nel mondo reale, comincio a dubitare che A * sia davvero migliore?A * è davvero migliore di Dijkstra nella ricerca di percorsi nel mondo reale?
Ho utilizzato i dati di New York City, da 9th DIMACS Implementation Challenge - Shortest Paths, in cui viene data la latitudine e la longitudine di ciascun nodo.
Quando si applica A *, ho bisogno di calcolare la distanza sferica tra due punti, usando Haversine Formula, che coinvolge sin, cos, arcoseno, radice quadrata. Tutti questi sono molto molto tempo.
Il risultato è,
Utilizzando Dijkstra: 39.953 ms, ampliato 256540 nodi.
Utilizzo A *, 108.475 ms, estensione 255135 nodi.
Notando che in A *, abbiamo espanso meno 1405 nodi. Tuttavia, il tempo per calcolare un'euristica è molto più di quello salvato.
A mio parere, la ragione è che in un grafico reale molto grande, il peso dell'euristica sarà molto piccolo e l'effetto di esso può essere ignorato, mentre il tempo di calcolo è dominante.
'Si dice teoricamente che A * è migliore di Dijkstra' - Citazione, per favore. Inoltre, per "meglio" intendi davvero più veloce, giusto? Intendi più veloce come in Big O più veloce? –
@RobertHarvey, prendi A * e dai il valore euristico come 'h (nodo) = 1 e h (obiettivo) = 0'. A * viene quindi ridotto a dijkstra. Quindi dal momento che A * può emulare dijkstra, è ugualmente potente o migliore. – Shahbaz
Ho implementato A * e Dijkstra per le reti stradali reali in Java (vedi graphhopper). E A * è quasi 2 volte più veloce. Dove come bidirezionale A * a bidir Dijkstra non mi ha dato una tale spinta – Karussell