1 引言-第一篇纪念
注册CSDN已经6年了,一直潜水,最近决定对自己过去几年的学习资料加以整理,先挖一个坑,从最基本的优化算法开始,一步步写写各种常用的优化算法吧。
2 广度优先算法思路图解
优化算法千千万万,相信很多同学和我一样,作为新手刚开始接触时大多很懵,不知从何学起从学起,无从下手。因此,经历过这个阶段的我尝试用尽量通俗易懂的描述对相关常用优化算法进行讲解。而所有优化算法中,广度优先搜索算法(Breadth First Search/BFS)是最简单的搜索算法之一,其思路也一点就通,因此,就允许在下从广度优先算法开始,一步步走近优化算法的海洋。
广度优先算法可以理解为暴力的穷举法,即从起点出发,遍历图中的所有节点,直到找到终点。
基本的描述其他博主已经写了很多了,这里直接上图:
2.1全局搜索
![](https://img-blog.csdnimg.cn/47ad5145ce254d0d823c2fd0564a5ac0.png)
如图 1 所示,存在10个节点,其中节点0为起点,节点10为终点,用无箭头直线表示各节点之间的连接关系,从节点0搜寻到达节点10的路径流程如下:
第一步:初始化
将起点(节点0)加入队列,此时队列列表为[0];
![](https://img-blog.csdnimg.cn/08d0027bccf3497fbaaf1e4c67a62313.png)
第二步:搜索第一层
依次搜寻节点0的所有邻接节点,并按顺序加入队列,同时将节点0从队列中删除并将节点0放入已访问列表;
![](https://img-blog.csdnimg.cn/88de99f6a1864732b77e9dddd2d08dbe.png)
图中灰色表示队列,黄色表示已访问列表。即第二步后,已访问列表为[0],队列列表为[1, 4, 2];
第三步:搜索第二层
a) 按顺序从队列中选取第一个节点(即节点1),依次搜寻当前节点的所有邻接节点,可见节点1的邻接节点为节点0和节点3,由于节点0已经在已访问列表,因此略过,从而得到节点1的邻接节点列表为[3]。
b) 将节点3加入队列,同时将节点1从队列中删除,并将节点1加入已访问列表,此时已访问列表为[0,1],队列列表为[4, 2, 3];
c) 以此类推,循环执行行a)b),需要说明的时,节点4的邻接节点也包含节点3,但是节点3已经作为节点1的邻接节点被搜索到了,为避免重复搜索,这 里规定在队列列表和已访问列表中的节点不再被搜索。
![](https://img-blog.csdnimg.cn/57d0b89341ec4f9db92cab752681db9d.png)
完成第一层邻接节点的搜寻后,结果如下:
![](https://img-blog.csdnimg.cn/91334087044045528e9da936b9790c7a.png)
此时已访问列表为[0,1,4,2],队列列表为[3,6,7,5];
第四步:搜索第三层
重复第三步的工作,结果如下:
![](https://img-blog.csdnimg.cn/2addf6628e7e4cbca8e351ed72e21043.png)
此时已访问列表为[0,1,4,2,3,6,7,5],队列列表为[9, 8];
第五步:搜索第四层,找到终点
重复第三步的工作,此时发现终点(节点10)已经在队列中,搜索结束:
此时已访问列表为[0,1,4,2,3,6,7,5,9, 8],队列列表为[10];
![](https://img-blog.csdnimg.cn/3f449a32559d4740a41ca73ec36acba0.png)