Best-First Search 算法研究

Best-First Search 算法研究

Best-First Search(最佳优先搜索)算法是一种启发式搜索算法,用于在图或树的搜索空间中找到最佳解决方案。它通过评估每个搜索节点的启发式估计值来决定搜索的方向,以期望更快地接近最优解

下面是 Best-First Search 算法的详细步骤:

  1. 初始化一个优先级队列(通常使用最小堆)和一个已访问节点的集合
  2. 将起始节点放入优先级队列中,并将其标记为已访问
  3. 当优先级队列不为空时,执行以下步骤:
    • 从优先级队列中选择具有最小启发式估计值的节点
    • 如果该节点是目标节点,则找到了最优解决方案,可以终止搜索
    • 否则,扩展该节点,生成其所有相邻节点,并计算它们的启发式估计值
    • 对于每个相邻节点,如果它未被访问过,则将其添加到优先级队列中,并将其标记为已访问
  4. 如果优先级队列为空而且没有找到目标节点,则表示搜索失败,没有可行的解决方案

Best-First Search 算法的伪代码如下

// Pseudocode for Best First Search
Best-First-Search(Graph g, Node start)
    1) Create an empty PriorityQueue
       PriorityQueue pq;
    2) Insert "start" in pq.
       pq.insert(start)
    3) Until PriorityQueue is empty
          u = PriorityQueue.DeleteMin
          If u is the goal
             Exit
          Else
             Foreach neighbor v of u
                If v "Unvisited"
                    Mark v "Visited"                    
                    pq.insert(v)
             Mark u "Examined"                    
End procedure

Best-First Search 算法的关键是启发式函数(heuristic function),它用于评估搜索节点的优先级。启发式函数根据问题的特定信息,例如估计的代价、距离或其他相关因素,为每个节点分配一个估计值。该估计值指导搜索算法选择具有最佳可能性的节点

Best-First Search 算法的优点是可以在较短时间内找到一个相对好的解决方案,特别适用于问题空间庞大且搜索方向有明确指导的情况。然而,它并不能保证找到全局最优解,因为它更关注当前搜索节点的启发式估计值而不是全局问题的性质

Best-First 算法是一种贪心算法,一般通过定义一个启发式函数来引导着向离目标更近的方向前进,常见的启发式函数为欧氏距离(Euclidean Distance)或者曼哈顿距离(Manhattan Distance)

举个例子来说明,如下图,知道每个城市间的距离以及所有城市到 Bucharest 的直线距离

在这里插入图片描述

上图左侧可以看作带权值的无向图,而右侧的直线距离则可以当做启发函数

以 Bucharest 为终点,Arad为起点

初始状态

在这里插入图片描述

扩展 Arad 后,从 Arad 出发,可以到的三个城市为Zerind(374),Sibiu(253)和Timisoara(329),括号中为启发函数(直线距离)的值,选择最小值对应的城市,即下一个遍历的城市为Sibiu

在这里插入图片描述

扩展 Sibiu 后,从 Sibiu 出发,可以到的城市有四个,同理选择启发函数值最小的城市Fagaras(178)作为下一个遍历的城市

在这里插入图片描述

从Fagaras出发,有两个可以到达的城市,终点Bucharest(0)已经找到了

在这里插入图片描述

Best-First Search 算法不能保证得到全局最优解的原因在于其贪心性质。该算法在每一步选择下一个节点时,仅仅考虑当前节点的局部最优选择,而不考虑全局的最优选择

具体来说,Best-First Search 算法根据某种启发式函数对节点进行评估和排序,然后选择评估值最小(或最大)的节点作为下一个探索的节点。这种局部最优的选择可能会导致算法陷入局部最优解,而无法找到全局最优解

另外,Best-First Search 算法还存在以下一些限制和局限性:

  1. 依赖于启发式函数:算法的效果高度依赖于所选择的启发式函数,不同的启发式函数可能导致不同的结果
  2. 受限于搜索空间:Best-First Search 算法仅搜索从起始节点到目标节点的路径,而无法保证搜索到其他潜在的更优解
  3. 缺乏回溯能力:Best-First Search 算法在选择下一个节点后无法回溯到之前的节点,因此可能会错过某些更优的路径

因此,尽管 Best-First Search 算法可以高效地在大规模图中找到较好的局部解,但不能保证得到全局最优解。对于需要确保全局最优解的问题,可以考虑其他更复杂的搜索算法,如 A* 算法或 Dijkstra算法,这些算法结合了启发式函数和全局路径权重的考虑,能够更有效地搜索全局最优解

可以看到当存在障碍物时 Best-First Search 算法搜索到的并不是最短路径

在这里插入图片描述

而用 A* 算法则可以快速搜索到可行的最短路径

在这里插入图片描述

参考

[AI]贪婪最佳优先搜索 Greedy Best-First Search

最短路搜索-从Dijkstra到Best-First再到A-Star

Best First Search (Informed Search)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 贪心最佳优先搜索(Greedy Best-First Search)是一种启发式搜索算法,它通过在每个搜索步骤中优先考虑最有可能导致解决方案的节点,来寻找最优解。与广度优先搜索不同,贪心最佳优先搜索使用一个评估函数来衡量搜索状态的好坏,然后按照评估函数的值来选择下一个要扩展的节点。贪心最佳优先搜索通常用于解决状态空间较大,但具有良好的启发信息的问题。 ### 回答2: 贪婪最优先搜索(GBFS)是一种启发式搜索算法,其基本思想是根据一定的启发函数,尽可能快地向目标状态方向搜索。它的搜索过程类似于最优先搜索,但是它不使用精确的代价函数,而是使用启发函数来估计从当前状态到目标状态的代价。 GBFS通过选择启发函数中具有最小估计代价的节点来扩展搜索树,因此它可能会快速地向目标状态移动。然而,由于它只考虑了估计代价,而没有考虑实际代价,因此它有可能陷入死胡同或者过早的终止搜索。 与最优先搜索类似,GBFS也具有一个开放列表,其中包含了待搜索的节点。通过比较启发函数的值,GBFS选择启发值最小的节点进行扩展。当搜索到达目标状态时,GBFS停止搜索。 与其他搜索算法相比,GBFS具有以下优缺点: 优点: 1. 它可以快速地向目标状态移动。 2. 它在内存和计算资源上比A*搜索更加高效。 缺点: 1. 它可能陷入局部最优解并忽略其他有可能更优的解。 2. 它无法保证找到最优解。 3. 它存在一个问题,即当启发函数不准确时,可能会浪费大量的时间和计算资源搜索不必要的节点。 总的来说,GBFS对于大多数问题而言是一个高效的搜索算法,但是它的表现取决于使用的启发函数的准确性。 ### 回答3: 贪婪最佳优先搜索(Greedy Best-First Search)是一种启发式搜索算法,它选取可行节点中最有希望的节点作为下一个扩展节点。在贪婪最佳优先搜索中,每个节点都被赋予一个估价函数的值,估价函数用于估计从当前节点到目标节点的最小代价或距离,该算法通常用于解决单目标问题,如路径规划或机器人导航。 贪婪最佳优先搜索过程中,节点状态用一个优先队列来维护。节点的优先级由估价函数的值决定,即节点的估价函数值越小,则节点的优先级越高,队列中位置越靠前。这种贪心策略导致该算法的效率很高,但是不能保证它能找到全局最优解,它只能找到靠近目标的局部最优解。 贪婪最佳优先搜索的优点是速度快,但是它有缺陷。该算法只能找到越来越接近终点的节点,但是它不能保证一些没有被考虑的位于路径上的节点,这些节点可能会导致更短或更优的路径。因此,该算法只适用于简单问题,但是在复杂问题上找到最优解的准确性不可靠。 在实际问题中,我们通常使用A*算法代替贪婪最佳优先搜索。A*算法既具备贪婪最佳优先搜索的速度和效率,又能优化贪婪算法的不足之处,它能确保找到最优解,并取得了广泛的应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prejudices

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值