我知道这个问题已被提出,但它没有回答我的具体问题。 我理解Dijkstra算法和A *算法是如何工作的,A *是Dijkstra的一般情况。
通常说A *找到解决方案的速度更快,因为你使用启发式加速过程/减少有效分支因子,这种方法更有意义。
但是我记得,要使A *返回最佳结果,您必须搜索成本低于目标成本的所有节点。这确保了最优性,并且据说不可能有更快的算法,因为A *查看每个算法至少必须达到的节点< =目标成本。
但是Dijkstra怎么样?它也只消耗节点< =目标成本,因为它在每个步骤中扩展了最小可能路径。
如果您必须扩展其他节点以确保最佳性,那么A *启发式的优势是什么? 此外,两种算法似乎都具有n log n
的运行时复杂性希望有人可以解决这个问题:)
答案 0 :(得分:3)
Dijkstra'算法不使用启发式函数来扩展边界中的节点,它只查找最小化到达直接连接到已访问节点的未访问节点的成本的路径,它将找到最短路径最后,但必须探索不直接连接到接收器的所有节点。 A *在良好的启发式功能的帮助下(必须是一个可接受的启发式:永远不会过高估计达到目标的成本)可以立即到达接收器总是扩展边界中的右边节点。因此,如果g(n)=cost to reach node n
和h(n)=an admissible heuristic function
得到f(n)=g(n)+h(n)
A *使用的评估函数。相反,Dijkstra只知道它的边界并且错过了启发式信息,因此当启发式弱的时候,它与A *一样有效。