【发布时间】:2013-04-07 20:53:45
【问题描述】:
我正在开发一个寻路程序。理论上说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 个节点。但是,计算启发式的时间远比节省的时间多。
据我了解,原因是在一个非常大的实数图中,启发式的权重会非常小,其影响可以忽略不计,而计算时间占主导地位。
【问题讨论】:
-
It is said theoretically that A* is better than Dijkstra-- 请引用。另外,“更好”是指更快,对吧?你的意思是比 Big O 更快吗? -
@RobertHarvey,取 A* 并给出启发式为
h(node) = 1 and h(goal) = 0。然后将 A* 简化为 dijkstra。因此,由于 A* 可以模拟 dijkstra,因此它要么同样强大,要么更好。 -
我已经在 Java 中为现实世界的道路网络实现了 A* 和 Dijkstra(参见 graphhopper)。 A* 快了近 2 倍。双向 A* 到 bidir Dijkstra 并没有给我带来如此大的提升
-
算法的性能很大程度上取决于它的实现
-
@HanXu A* “仅”比普通的 Dijkstra 好,前提是只需要检查一小部分节点。这就是启发式的全部目的。但是您的数字表明,您使用两种算法检查的节点数量大致相同。这对我来说听起来很假。