贪婪最佳优先搜索算法与最佳优先搜索算法有区别吗?
维基百科页面有一个关于贪婪BFS的单独段落,但有点不清楚。
我的理解是,贪婪BFS只是BFS,其中维基百科算法中的“OPEN列表中最佳节点”是为节点计算的启发式函数。 所以实现这个:
OPEN = [初始状态]CLOSED = []while OPEN 不为空do 1. 从OPEN中移除最佳节点,称之为n,并将其添加到CLOSED。 2. 如果n是目标状态,回溯到n的路径(通过记录的父节点)并返回路径。 3. 创建n的后继节点。 4. 对于每个后继节点,执行以下操作: a. 如果它不在CLOSED中:评估它,将其添加到OPEN,并记录其父节点。 b. 否则:如果这个新路径比之前的路径更好,则更改记录的父节点。done
其中“OPEN列表中最佳节点”是一个启发式函数,用于估计节点与目标的接近程度,实际上就是贪婪BFS。 我对吗?
编辑:对@人名 的回答的评论:
所以本质上,贪婪BFS不需要“OPEN列表”,而应该只基于当前节点来做出决策? 这个算法是GBFS吗:
1. 将START设置为CURRENT节点2. 将CURRENT添加到Path [以及可选地,添加到CLOSED?]3. 如果CURRENT是GOAL,则退出4. 评估CURRENT的后继节点5. 将BEST后继节点设置为CURRENT并转到2。
回答:
在我提出这个问题十年后,我回过头来看它,终于明白了维基百科上的那篇文章在说什么。
贪婪BFS贪婪地扩展当前节点可能更好的后继节点。 这两种算法的区别在于处理后继节点评估的循环。 最佳优先搜索总是通过评估当前节点的所有后继节点,并继续选择其中最佳的一个:
4. 对于每个后继节点,执行以下操作: a. 如果它不在CLOSED中:评估它,将其添加到OPEN,并记录其父节点。 b. 否则:如果这个新路径比之前的路径更好,则更改记录的父节点。
如果贪婪BFS找到一个比当前节点具有更好启发式的后继节点,它不会扩展节点的所有后继节点。 相反,它贪婪地扩展这个可能更好的节点,留下一些当前节点未扩展的后继节点。 这意味着除非评估了节点的所有后继节点,否则不应从OPEN列表中删除该节点。 这是伪代码:
OPEN = [初始状态]CLOSED = []while OPEN 不为空do 1. 从OPEN中移除最佳节点,称之为n,并将其添加到CLOSED。 2. 如果n是目标状态,回溯到n的路径(通过记录的父节点)并返回路径。 3. 对于每个后继节点,执行以下操作: a. 如果它不在CLOSED中: i. 评估它,将其添加到OPEN,并记录其父节点 ii. 如果它具有比n更好的启发式:从CLOSED中删除n,将n添加到OPEN (在当前后继节点之后)并从循环3中断。 b. 否则:如果这个新路径比之前的路径更好,则更改记录的父节点。done
我从上面的BFS代码中删除了步骤3. 创建n的后继节点。
,因为可能不会评估n的某些后继节点,因此创建它们没有用处。 相反,应在3. 对于每个后继节点,执行以下操作:
中立即创建并评估每个后继节点。