Best-First-Search算法

缩写起来是跟广度优先搜索一样的BFS,实际上不同。此BFS按照类似Dijkstra的流程运行,不同的是它能够评估任意结点到目标点的代价。与选择离初始结点最近的结点不同的是,它选择离目标最近的结点。BFS不能保证找到一条最短路径。然而,它比Dijkstra算法快的多,因为它用了一个启发式函数(heuristic function)快速地导向目标结点。


看看维基百科的解释:Best-First-Search

最佳优先搜索是宽度优先搜索的扩展,基本思想是将节点表按据目标的距离进行排序,再以节点的估计距离为标准选择待扩展的节点。

算法步骤:

1. 用N表示已经排序的初始结点表(从小到大)

2. 如果N为空集,则退出并给出失败信号

3. n取为N的首结点,并在N中删除结点n,放入已访问结点列表

4. 如果n为目标结点,则退出并给出成功信号

5. 否则,将n的后继结点加到N中,记为N’,对N’中的结点按距目标的估计距离排序,并返回第2步

        

在搜索的过程中一般会用到评估函数f(n),表示从初始节点S经过n到达目的节点t的最佳路径代价f*(n)的估计:

从S到n的最佳代价g*(n)的估计g(n),g(n) ≥ g*(n),即局部最小≥ 全局最小

从n到t 的最佳代价h*(n)的估计h(n),若对所有结点n,都有h(n)≤h*(n),则算法A一定能找到一条到达目标结点的最佳路径,此时算法A称为算法A*

f(n) = g(n) + h(n)作为f*(n) = g*(n) + h*(n)的估计,估计值越小的点希望越高,应该优先扩展,所以可以在此处维持一个优先队列



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们有以下带权值的二叉树: ``` 2 / \ 6 4 / \ \ 8 3 5 ``` 在使用best-first-search算法进行搜索时,我们需要根据节点的权值来确定搜索的优先级。假设我们从根节点开始搜索,那么根节点的权值为2,它将会被放入open表中。此时open表中的内容如下: ``` 2 ``` 接下来,我们需要从open表中选取权值最小的节点进行扩展。因此,我们选择根节点进行扩展。根节点有两个子节点,即6和4,它们的权值分别为6和4。我们将这两个子节点按照权值的大小依次放入open表中,此时open表的内容如下: ``` 4, 6 ``` 接下来,我们从open表中选取权值最小的节点进行扩展。因此,我们选择4进行扩展。4只有一个子节点5,它的权值为5,于是我们将5放入open表中。此时open表的内容如下: ``` 5, 6 ``` 接下来,我们从open表中选取权值最小的节点进行扩展。因此,我们选择5进行扩展。5没有子节点,因此它被标记为已经被扩展。此时open表的内容如下: ``` 6 ``` 接下来,我们从open表中选取权值最小的节点进行扩展。因此,我们选择6进行扩展。6有两个子节点,即8和3,它们的权值分别为8和3。我们将这两个子节点按照权值的大小依次放入open表中,此时open表的内容如下: ``` 3, 8 ``` 接下来,我们从open表中选取权值最小的节点进行扩展。因此,我们选择3进行扩展。3没有子节点,因此它被标记为已经被扩展。此时open表的内容如下: ``` 8 ``` 接下来,我们从open表中选取权值最小的节点进行扩展。因此,我们选择8进行扩展。8没有子节点,因此它被标记为已经被扩展。此时open表的内容为空,搜索结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值