2014-05-25 72 views
0

我知道这个问题已被问到,但它没有回答我的具体问题。 我明白Dijkstra算法和A *算法是如何工作的,而A *是Dijkstra的一般情况。为什么A *比Dijkstra更快

A *通常认为A *会更快找到解决方案,因为您使用启发式方法可以加快过程/减少有效的分支因子。

但我记得,为了使A *返回最优结果,您必须搜索所有成本低于目标成本的节点。这确保了最优性,并且据说不可能有更快的算法,因为A *查看等节点< =每个算法至少需要的目标成本。

但是迪杰斯特拉呢?它也仅支付节点< =目标成本,因为它在每一步都扩展了最小可能路径。

如果您为了确保最优性而扩展其他节点,A *启发式优点是什么? 另外两种算法似乎有运行时的n log n个复杂

希望有人能清楚这件事:)

+0

如果我没有表达错误,我相信。英语不是我的母语。 A *是Dijkstra的推广,这是一个更好的术语吗? – Nocta

+0

对不起,你似乎是对的。这个有点违反直觉的术语似乎很普遍。 –

回答

3

Dijkstra的算法不使用启发式功能扩展节点的前沿,它只寻找使到达与已经访问的节点直接连接的未访问节点的成本最小的路径,它将最终找到最短路径,但将不得不探索所有不直接连接到接收器的节点。 A *借助良好的启发式功能(必须是可接受的启发式:永远不会超过达到目标的成本)可以立即达到接收器始终扩展边界中的正确节点。因此,如果g(n)=cost to reach node nh(n)=an admissible heuristic function我们得到f(n)=g(n)+h(n)评估函数由A *使用。相反,Dijkstra只知道它的边界并且忽略启发式信息,因此当启发式弱时它和A *一样好。

+0

我想我现在想到了我的错误。我认为A *必须寻找每个节点的成本低于目标节点,这会使启发式的无用功能成为可能。我想我混淆了“实际成本”和“成本+启发成本”。假设f(n)= g(n)+ h(n)其中h(n)是(可允许的)启发式函数,g(n)是节点n的实际成本。那么A *必须展开f(n) Nocta

+0

并非全部。为什么都是?假设如你所说,启发式最初很大程度上取决于到目标的真实距离,但也有一步一步推测,我猜d(n,n')是n的后继者,而g(n' )= g(n)+ d(n,n'),那么d(n',goal)和h(n')之间的差距很快就会变小,如果我不走最短路径,我会开始扩展边界中的另一个节点,但是我认为这只是好的和坏的启发式函数之间的区别。 – Emisilve86

+0

那么如果你没有看到f(n)小于目标实际成本的所有节点,那么你可能会错过比你找到的更好的解决方案。还是我误解了? – Nocta

相关问题