你的问题很好!
我猜这可能取决于问题评论中"那有点类似苹果和橘子"的说法,我同意。
根据一些维基百科页面,它被认为是贪心算法或动态规划(DP)。
然而,templatetypedef 在评论中也提出了一个好观点:"考虑到每个点都做出了局部最优决策,我会将其归为贪心算法"。
Dijkstra算法和相关的A*搜索算法是用于图搜索和最短路径查找的可验证最优贪心算法。
把已经走过的距离 g(n) 考虑进去,这就是A*算法和贪婪最佳优先搜索算法的区别。
一些Dijkstra算法的常见变体可以看作是A*的特例,其中所有节点的启发式函数 h(n) = 0;而 Dijkstra和 A*都是动态规划的特例。A*本身是分支限界法的一种特殊情况。
我认为A*算法的主要范式是穷举搜索(或者分支定界(b&b),许多人认为穷举搜索和b&b是两种不同的范式,但我认为b&b只是一种实现和改进穷举搜索的技术),像其他穷举搜索一样,A*将探索整个解空间(排除比最优解差的解)。贪婪法只是一种额外的技术,用于在最有前途的方向上导航搜索。
这不是贪心算法。
根据维基百科,贪心算法“是指在对问题进行求解时,在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法”。但这种算法不适用于A*算法(在我看来,在那个维基百科页面的示例部分列出A*是错误的)。
为什么?
我理解上述定义的含义是,“在每个阶段做出本地最优选择”意味着我们忽略了该状态下可能存在的其他选择 - 在贪心策略中,我们永远不会重新考虑之前做出的选择。
但对于A*算法来说并非如此。如果先前在该阶段做出的选择不再看起来“最有前途”,A*将最终探索所有已做出的选择。当然,A*将从本地最优选择开始其详尽的探索。
我的论证基于直观的映射,即定义中的“阶段”和“选择”映射到A*算法中的“图节点”和“图边”。但是,如果您想将“阶段”映射到“子图探索”,那么A*确实符合贪心算法的条件 - 但是对于这种非直观的映射,即使广度优先搜索也会变得贪心。