【发布时间】:2018-09-11 03:43:48
【问题描述】:
不确定这里是否适合询问,但是,
我用 Java 编写了一个双向广度优先搜索算法,它同时从图中的起始节点和图中的目标节点进行搜索。在具有 3000000(300 万)个节点的图中,其中所有节点平均与 4 个其他节点连接(通过双向/双向边连接),在普通 CPU 上平均只需 0.5 秒即可找到两者之间的最短路径任意两个随机节点,大约 10 秒是我发现超过 30 次测试运行的最坏情况时间。
假设只需要搜索一条路径(例如,在起点和目的地之间绘制路线时),在这种情况下使用具有良好启发式的 A* 算法有什么优势?是的,找到路径可能会稍微快一些,但 A* 很可能找不到最短路径。
有人可以详细说明为什么 A* 经常被选择而不是双向广度优先搜索,以及它在性能(计算时间、内存使用、找到最佳解决方案的机会等)方面产生了哪些优势?
另外, 祝大家复活节快乐!
【问题讨论】:
-
“但 A* 很可能找不到最短路径” - 如果您的 A* 没有找到最短路径,则您的 A* 算法或您的启发式方法是错误的。如果你没有尝试过,只是认为它不会找到最短路径,那么你对 A* 的理解是错误的。
-
@user2357112 你需要有一个完美的启发式算法才能找到 A* 的最短路径,据我所知,没有完美的启发式算法可以找到任意两点之间的路径图表。
-
@user2357112 让我纠正一下自己:有完美的启发式算法,但有了这些启发式算法,A* 算法的性能几乎与广度优先算法相同。
-
“你需要有一个完美的启发式算法才能找到 A* 的最短路径”——不,你不会。您需要一个admissible 启发式,并且为了有效地实施,您通常需要一个consistent 启发式。
-
如果启发式是可接受的(或在图搜索中是单调的),那么 A* 保证首先找到最佳解决方案。
标签: performance search breadth-first-search a-star