A *(A星)寻路算法是什么样的算法范式/算法设计范式?



我不确定A*(A星(寻路算法是什么样的设计范式。根据Anany Levitin的《算法设计与分析导论》一书的主题,我认为设计范式是一种贪婪的技术,因为这种算法是Dijktra算法和贪婪最佳优先的结合,这是贪婪的技术。但我不确定这是否是一个很好的推理。

编辑:根据Emma的评论,她给了我一个维基百科的链接,上面写着" Dijkstra和A *是动态编程的特殊情况。A* 本身是分支和绑定泛化的特例。 但是在另一个维基百科链接中说:"Dijkstra算法和相关的A *搜索算法是可验证的最优贪婪算法,用于图形搜索和最短路径查找。

你有一个很好的问题!

贪婪是被困住了!!

我想这取决于,我同意问题评论中的"这是一点苹果和橙子"。

您的特定问题的答案可能在这里或这里。

根据一些维基百科页面,它被认为是贪婪或动态编程(DP(。

然而,templatetypedef在评论中也有一个很好的观点:"我会认为它是贪婪的,因为它在每个点上都做出了局部最优的决定。

<小时 />

贪婪

Dijkstra的算法和相关的A*搜索算法是 用于图形搜索和最短的可验证的最佳贪婪算法 寻路。

<小时 />

动态编程

A* 与贪婪的最佳优先搜索算法的不同之处在于 它考虑了已经行驶的成本/距离 g(n(。

Dijkstra算法的一些常见变体可以看作是 A* 的特殊情况,其中所有节点的启发式 h(n( = 0;在 反过来,Dijkstra 和 A* 都是动态规划的特例。 A* 本身是分支和边界泛化的特例。

参考

  • A* 搜索算法

  • 算法范式

我认为 A* 的主要范式是穷举搜索(或分支和绑定 (b&b(,很多人认为穷举搜索和 b&b是两种不同的范式,但我认为 b&b 只是实现和改进穷举搜索的一种技术(,像其他穷举搜索一样,A* 将探索整个解决方案空间(排除确定比最优解决方案最差的解决方案(。贪婪只是一种附加技术,用于在最有希望的方向上导航搜索。

它不贪婪。

根据维基百科的说法,贪婪算法"是遵循在每个阶段做出局部最优选择的问题解决启发式的任何算法",这不适用于 A*(恕我直言,在该维基百科页面的示例部分中列出 A* 是错误的(。

为什么?

我对上述定义的理解是,"在每个阶段做出局部最优选择"意味着我们忽略了该状态下可能的其他选择——在贪婪的策略中,我们永远不会重新考虑以前做出的选择。

对于A*来说并非如此,如果该阶段的先前选择看起来不再"最有希望",那么A*最终将探索在任何阶段做出的所有选择。的确,A* 将以局部最优选择开始其详尽的探索。

我的论证基于直接、直观的映射,即定义中的"阶段"和"选择"这两个词映射到 A* 算法中的"图节点"和"图边"。但是,如果你想将"阶段"映射到"探索的子图",那么A*确实有资格成为贪婪 - 但是通过这种非直观的映射,即使是广度优先也会变得贪婪。

最新更新