贪婪的最佳优先搜索算法与最佳优先搜索算法有啥不同?

Posted

技术标签:

【中文标题】贪婪的最佳优先搜索算法与最佳优先搜索算法有啥不同?【英文标题】:Is the greedy best-first search algorithm different from the best-first search algorithm?贪婪的最佳优先搜索算法与最佳优先搜索算法有什么不同? 【发布时间】:2012-01-12 13:02:59 【问题描述】:

贪婪最佳优先搜索算法与最佳优先搜索算法不同吗?

wiki page 有一个单独的段落是关于 Greedy BFS 但有点不清楚。

我的理解是,贪婪 BFS 只是 BFS,其中***算法中的“来自 OPEN 的最佳节点”是一个为节点计算的启发式函数。所以实现这个:

OPEN = [initial state]
CLOSED = []
while OPEN is not empty
do
 1. Remove the best node from OPEN, call it n, add it to CLOSED.
 2. If n is the goal state, backtrace path to n (through recorded parents) and return path.
 3. Create n's successors.
 4. For each successor do:
   a. If it is not in CLOSED: evaluate it, add it to OPEN, and record its parent.
   b. Otherwise: change recorded parent if this new path is better than previous one.
done

“来自 OPEN 的最佳节点”是一个启发式函数,用于估计节点与目标的接近程度,实际上是贪婪 BFS。我说的对吗?

编辑:评论 Anonymouse 的回答:

所以本质上,贪婪的 BFS 不需要“开放列表”,并且应该仅基于当前节点做出决定?这个算法是GBFS吗:

1. Set START as CURRENT node
2. Add CURRENT to Path [and optinally, to CLOSED?]
3. If CURRENT is GOAL, exit
4. Evaluate CURRENT's successors
5. Set BEST successor as CURRENT and go to 2.

【问题讨论】:

【参考方案1】:

“最佳优先”可以允许修改决策,而在贪心算法中,决策应该是最终的,而不是修改。

例如,A*-search 是一种最佳优先搜索,但它不是贪婪的。

但是,请注意,这些术语并不总是与相同的定义一起使用。 “贪婪”通常意味着永远不会修改决策,最终接受次优解决方案以改善运行时间。但是,我敢打赌,您会发现“贪婪”用于“最佳优先+深度优先”组合的情况,例如“尝试扩展最佳下一步直到我们遇到死胡同,然后返回上一步并继续次优”(我称之为“优先深度优先”)。

此外,这取决于您所谈论的抽象级别。 A* 在“构建路径”中并不贪心。在周围保持大量开放路径很好。然而,它在向真正的最短路径“扩展搜索空间”方面是贪婪的。

【讨论】:

【参考方案2】:

BFS 是tree search and graph search algorithms 的一个实例,其中基于评估函数f(n) = g(n) + h(n) 选择一个节点进行扩展,其中g(n) 是从根到n 的路径长度,h(n) 是估计从n 到目标节点的路径长度。在 BFS 算法中,选择具有最低评估(即最低f(n))的节点进行扩展。

Greedy BFS 使用以下评估函数f(n) = h(n),它只是启发式函数h(n),它估计n 与目标的接近程度。因此,贪婪的 BFS 会尝试扩展被认为最接近目标的节点,而不考虑先前收集的知识(即g(n))。

总而言之,这些(相似的)搜索方法之间的主要区别在于评估函数。

附带说明,A* 算法是一种最佳优先搜索算法,其中启发式函数h 是可接受的启发式(即h 总是低估完美启发式函数h*,因为所有n)。 A* 不是贪婪的 BFS 算法,因为它的评估函数是f(n) = g(n) + h(n)

【讨论】:

【参考方案3】:

据我了解,“最佳优先搜索”只是使用启发式评估函数 h(n) 的特定搜索技术的统称。 因此,A* 和贪心的最佳优先搜索算法属于这一类。

【讨论】:

【参考方案4】:

在我问了这个问题十年后,我回到了它,终于明白了***上的那篇文章在说什么。

贪婪 BFS 贪婪地扩展 当前 节点的可能更好的继任者。两种算法之间的区别在于处理后继评估的循环。最佳优先搜索总是通过评估当前节点的后继节点来耗尽它们,然后继续搜索其中最好的节点:

    4. For each successor do:
        a. If it is not in CLOSED: evaluate it, add it to OPEN, and record its parent.
        b. Otherwise: change recorded parent if this new path is better than previous one.

如果贪婪 BFS 发现一个节点的 启发式 比当前节点更好,它不会扩展节点的 所有 继任者。相反,它贪婪地扩展了这个可能更好的节点,使当前节点的一些后继节点未扩展。这意味着当前节点不应从 OPEN 列表中删除,除非其所有后继节点都已被评估。这是伪代码:

OPEN = [initial state]
CLOSED = []
while OPEN is not empty
do
 1. Remove the best node from OPEN, call it n, add it to CLOSED.
 2. If n is the goal state, backtrace path to n (through recorded parents) and return path.
 3. For each successor do:
   a. If it is not in CLOSED: 
       i. Evaluate it, add it to OPEN, and record its parent
       ii. If it has a better heuristic than n: remove n from CLOSED, add n to OPEN 
           (after the current successor) and break from loop 3.
   b. Otherwise: change recorded parent if this new path is better than previous one.
done

我已经从上面的 BFS 代码中删除了步骤3. Create n's successors.,因为可能不会评估 n 的一些后继者,因此创建它们没有用。相反,应该在3. For each successor do: 中创建并立即评估每个继任者。

【讨论】:

以上是关于贪婪的最佳优先搜索算法与最佳优先搜索算法有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章

递归/回溯/深度优先搜索/广度优先搜索 /动态规划/二分搜索/贪婪算法

浅谈A*

GIS算法原理与开发2021-深度优先遍历

数据结构算法设计模式

手撸golang 基本数据结构与算法 图的搜索 深度优先/广度优先

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)