我正在开发一个寻路程序。理论上说A*优于Dijkstra。事实上,后者是前者的特例。但是,当在现实世界中进行测试时,我开始怀疑 A* 真的更好吗?
我使用了纽约市的数据,来自9th DIMACS Implementation Challenge - Shortest Paths,其中给出了每个节点的纬度和经度。
应用 A* 时,我需要使用Haversine Formula计算两点之间的球面距离,其中涉及 sin、cos、arcsin、平方根。所有这些都非常非常耗时。
结果是,
使用 Dijkstra:39.953 毫秒,扩展 256540 个节点。
使用 A*,108.475 毫秒,扩展 255135 个节点。
注意到在 A* 中,我们扩展了更少的 1405 个节点。然而,计算启发式的时间比节省的时间要多得多。
据我了解,原因是在一个非常大的实数图中,启发式的权重会非常小,它的影响可以忽略不计,而计算时间占主导地位。