深度优先搜索,广度优先搜索,爬山搜索,束搜索算法学习笔记


问题如下图所示,S为起点,要到达点G。
在这里插入图片描述
搜索不是关于地图的,而是关于选择的

大英博物馆搜索

找到所有的结果。须遵循的原则:搜索不能原地打转,也就是说,从S去了A后就布恩那个在从A回到S,不允许有路径绕回原来到过的地方。
在这里插入图片描述

深度优先搜索(Depth first)

先将树的一支走完,如果走完后仍无法完成任务,进入了死胡同,就回到上次进行选择的位置,此为回溯(Backtracking),然后选择另外一个分支。
此算法生成路径速度较快,但是路径一般极长。
在这里插入图片描述

深度优先搜索算法

  1. 初始化队列(QUEUE)
    (S)
  2. 拓展队列中的第一条路径,检验任务是否完成
    将(S)拓展为(S A),(S B)
  3. 入队:将被拓展的路径删除,然后将拓展的路径添加到队列的头部
    (S A),(S B)
  4. 回到第二步

在这里插入图片描述

广度优先搜索(Breadth first)

一层一层地搜索,每次搜索完成后就横向检查是否已经完成了任务。
此方法生成的路径有可能速度极慢,但是最后生成的路径长度会较短。

广度优先搜索算法

  1. 初始化队列(QUEUE)
  2. 拓展队列中的第一条路径,检验任务是否完成
  3. 入队:将被拓展的路径删除,然后将拓展的路径添加到队列的尾部
  4. 回到第二步

在这里插入图片描述

拓展列表改进算法

广度优先搜索算法中重读考虑了大量已经拓展过的节点,因此速度极慢,此为广度优先搜索算法的改进算法。
我们需要一个位置列表,存放之前已经拓展福哦的所有路径末端的节点。如果待拓展路径末端的节点是原来已拓展路径末端的节点,就不再进行拓展。

  1. 初始化队列(QUEUE)
  2. 检验待拓展路径的末端节点,如果该节点已经在已拓展路径的末端存在过,就不进行重复拓展,否则拓展队列中的第一条路径。检验任务是否完成
  3. 入队:将被拓展的路径删除,然后将拓展的路径添加到队列的尾部
  4. 回到第二步

爬山算法

深度优先搜索算法的改进版,与深度优先搜索算法根据字母表顺序选择节点不同的是爬山算法根据哪个节点离目标更近(直线距离)选择。

  1. 初始化队列(QUEUE)
  2. 拓展队列中的第一条路径,检验任务是否完成
  3. 入队:将被拓展的路径删除,检验路径末端节点距离目标的距离,将距目标最近的路径添加到队列的头部
  4. 回到第二步

在这里插入图片描述
缺陷:

  • 局部最大值
  • 电线杆问题:在平坦的地方,各个方向的梯度都是0
  • 山脊问题:无论东南西北都是在向下
    在这里插入图片描述

束搜索(Beam search)

广度优先搜索算法的改进版,将每一层中考虑的路径数限制在一个较小的固定数字上。
假设此时束宽为2,此时的问题解法变为

  1. 初始化队列(QUEUE)
  2. 拓展队列中的第一条路径,检验任务是否完成
  3. 入队:保持W(束宽)最佳,将被拓展的(S)删除,然后将(S A),(S B)添加到队列的尾部
  4. 回到第二步

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44547562/article/details/104311820