贪婪的最佳优先搜索算法与最佳优先搜索算法有啥不同?
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:
中创建并立即评估每个继任者。
【讨论】:
以上是关于贪婪的最佳优先搜索算法与最佳优先搜索算法有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章
递归/回溯/深度优先搜索/广度优先搜索 /动态规划/二分搜索/贪婪算法