贪婪最佳优先搜索算法与最佳优先搜索算法有区别吗?

贪婪最佳优先搜索算法与最佳优先搜索算法有区别吗?

维基百科页面有一个关于贪婪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. 对于每个后继节点,执行以下操作:中立即创建并评估每个后继节点。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注