2 广度优先遍历搜索(BFS)
- 2.1算法介绍
- 2.2实验代码
- 2.3实验结果
- 2.4实验总结
2.1算法介绍
广度优先搜索算法(英语:Breadth-First-Search,缩写为BFS),是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。BFS是一种盲目搜索法,目的是系统地展开并检查图中的所有节点,以找寻结果。
BFS会先访问根节点的所有邻居节点,然后再依次访问邻居节点的邻居节点,直到所有节点都访问完毕。在具体的实现中,使用open和closed两个表,open是一个队列,每次对open进行一次出队操作(并放入closed中),并将其邻居节点进行入队操作。直到队列为空时即完成了所有节点的遍历。closed表在遍历树时其实没有用,因为子节点只能从父节点到达。但在进行图的遍历时,一个节点可能会由多个节点到达,所以此时为了防止重复遍历应该每次都检查下一个节点是否已经在closed中了。
依然使用上面的这个例子,如果使用BFS进行遍历,那么节点的访问顺序是“1-2-7-8-3-6-9-12-4-5-10-11”。可以看出来BFS进行遍历时是一层一层的搜索的。
在应用BFS算法进行八数码问题搜索时需要open和closed两个表。首先将初始状态加入open队列,然后进行出队操作并放入closed中,对出队的状态进行扩展(所谓扩展也就是找出其上下左右移动后的状态),将扩展出的状态加入队列,然后继续循环出队-扩展-入队的操作,直到找到解为止。
上图这个例子中,红圈里的数字是遍历顺序。当找到解时一直往前找父节点即可找出求解的移动路线。
2.2实验完整源代码
下载链接:https://download.csdn.net/download/DeepLearning_/87280758
2.3实验结果
仍然用相同的例子,用BFS进行搜索。
将找出的解从初始状态一步一步输出到解状态。
从结果中可以看出总共进行了27次遍历,并在第4层时找到了解状态。
下面我们来看一看BFS的所有27次遍历,以此来更深入的理解BFS的原理。稍微对代码进行改动,使其输出遍历次数和当前层数。由于结果太长,为了方便展示,下面将以树的形式展示。
上面输出的解就是按照红色路线标注找到的,从遍历次数可以看出是一层一层的找。
2.4实验总结
下面我们来看一看BFS的所有27次遍历,以此来更深入的理解BFS的原理。稍微对代码进行改动,使其输出遍历次数和当前层数。由于结果太长,为了方便展示,下面将以树的形式展示。
上面输出的解就是按照红色路线标注找到的,从遍历次数可以看出是一层一层的找。
2.4实验总结
由于BFS是一层一层找的,所以一定能找到解,并且是最优解。虽然能找到最优解,但它的盲目性依然是一个很大的缺点。从上面的遍历树状图中,每一层都比上一层元素更多,且是近似于指数型的增长。也就是说,深度每增加一,这一层的搜索速度就要增加很多。