收藏 分享(赏)

实验一、盲目搜索算法.doc

上传人:tangtianxu1 文档编号:2988469 上传时间:2018-10-01 格式:DOC 页数:12 大小:117.34KB
下载 相关 举报
实验一、盲目搜索算法.doc_第1页
第1页 / 共12页
实验一、盲目搜索算法.doc_第2页
第2页 / 共12页
实验一、盲目搜索算法.doc_第3页
第3页 / 共12页
实验一、盲目搜索算法.doc_第4页
第4页 / 共12页
实验一、盲目搜索算法.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、实验一:盲目搜索算法一、实验目的掌握盲目搜索算法之一的宽度优先搜索求解算法的基本思想。对于宽度优先搜索算法基本过程,算法分析有一个清晰的思路,了解宽度优先搜索算法在实际生活中的应用。二、实验环境PC 机一台, VC+6.0 三、实验原理宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra 单源最短路径算法和 Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫 BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。同时,宽度优先搜索算法是连通图的一种遍历策略。因为它的思想是从一个顶点V0 开

2、始,辐射状地优先遍历其周围较广的区域,故得名。 其基本思想是:(1) 把起始节点放到 OPEN 表中(如果该起始节点为一目标节点,则求得一个解答)。(2) 如果 OPEN 是个空表,则没有解,失败退出;否则继续。(3) 把第一个节点(节点 n)从 OPEN 表移出,并把它放入 CLOSED 扩展节点表中。(4) 扩展节点 n。如果没有后继节点,则转向上述第(2)步。(5) 把 n 的所有后继节点放到 OPEN 表的末端,并提供从这些后继节点回到n 的指针。(6) 如果 n 的任一个后继节点是个目标节点,则找到一个解答,成功退出;否则转向第(2)步。宽度优先搜索示意图和宽度优先算法流程图如下图

3、1 和图 2 所示:图 1、宽度优先搜索示意图CSBEDAIFHGJ把 S 放入 OPEN 表Fangru OPEN 是否为空表?把第一个节点 n,从 OPEN 表移出,并把它放入 CLOSED 表扩展 n,把它的后继节点放入 OPEN表的末端,提供回到 n 的指针失败起始 成功是否有任何后继节点为目标节点?是否 是否图 2、宽度优先算法流程图四、实验数据及步骤 这部分内容是通过一个实例来对宽度优先算法进行一个演示,分析其思想。问题描述了迷宫问题的出路求解办法。定义一个二维数组: int maze55 = 0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0,

4、 1, 1, 1, 0,0, 0, 0, 1, 0,; 它表示一个迷宫,其中的 1 表示墙壁,0 表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。题目保证了输入是一定有解的。 下面我们队问题进行求解:对应于题目的输入数组:0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,我们把节点定义为(y,x) ,(y,x) 表示数组 maze 的项 mazexy。于是起点就是(0 ,0),终点是(4, 4)。我们大概梳理一遍:初始条件:起点 Vs 为(0,0),终点 Vd 为

5、(4,4) ,灰色节点集合 Q=,初始化所有节点为白色节点,说明:初始全部都是白色(未访问) ,即将搜索起点(灰色) ,已经被搜索过了(黑色) 。开始我们的宽度搜索。执行步骤:1.起始节点 Vs 变成灰色,加入队列 Q,Q=(0,0)2.取出队列 Q 的头一个节点 Vn,Vn=0,0 ,Q=3.把 Vn=0,0染成黑色,取出 Vn 所有相邻的白色节点 (1,0)4.不包含终点(4,4) ,染成灰色,加入队列 Q,Q=(1 ,0)5.取出队列 Q 的头一个节点 Vn,Vn=1,0 ,Q=6.把 Vn=1,0染成黑色,取出 Vn 所有相邻的白色节点 (2,0)7.不包含终点(4,4) ,染成灰色,

6、加入队列 Q,Q=(2 ,0)8.取出队列 Q 的头一个节点 Vn,Vn=2,0 ,Q=9.把 Vn=2,0染成黑色,取出 Vn 所有相邻的白色节点 (2,1), (3,0)10.不包含终点(4,4) ,染成灰色,加入队列 Q,Q=(2 ,1), (3,0)11.取出队列 Q 的头一个节点 Vn,Vn=2,1 ,Q=(3,0)12. 把 Vn=2,1染成黑色,取出 Vn 所有相邻的白色节点 (2,2)13.不包含终点(4,4) ,染成灰色,加入队列 Q,Q=(3 ,0), (2,2)14.持续下去,知道 Vn 的所有相邻的白色节点中包含了 (4,4)15.此时获得最终答案我们来看看广度搜索的过

7、程中节点的顺序情况:图 3 迷宫问题的搜索树图中标号即为我们搜索过程中的顺序,我们观察到,这个搜索顺序是按照上图的层次关系来的,例如节点(0,0)在第 1 层,节点(1,0)在第 2 层,节点(2,0)在第 3 层,节点(2, 1)和节点(3,0)在第 3 层。我们的搜索顺序就是第一层-第二层- 第三层- 第 N 层这样子。我们假设终点在第 N 层,因此我们搜索到的路径长度肯定是 N,而且这个N 一定是所求最短的。我们用简单的反证法来证明:假设终点在第 N 层上边出现过,例如第 M层,MN,那么我们在搜索的过程中,肯定是先搜索到第 M 层的,此时搜索到第 M 层的时候发现终点出现过了,那么最短

8、路径应该是 M,而不是 N 了。所以根据广度优先搜索的话,搜索到终点时,该路径一定是最短的。五、实验核心代码/* 广度优先搜索*/void course(char *maze,int hang,int lie)int i=1,j=1,n=-1;step *Step; /定义一个存储行走路线的栈Step=new step hang*lie; if(maze11=1)cout“此路无法行走!“endlendl;getchar();exit(0);elsen+;mazeij=.;/.表示入口Stepn.x=i; /记录入口的坐标Stepn.y=j;while(mazehanglie!=.) /1表示

9、走不通,+表示已经走过但不通又回来的路径, .表示已经走过并通了的路径if(mazeij+1!=1j=j+1;n+;Stepn.x=i;Stepn.y=j;cout“第“n“步: “向右走到: “(“i“,“j“)“endl;else if(mazei+1j!=1i=i+1;n+;Stepn.x=i;Stepn.y=j;cout“第“n“步: “向下走到: “(“i“,“j“)“endl;else if(mazeij-1!=1j=j-1;n+;Stepn.x=i;Stepn.y=j;cout“第“n“步: “向左走到: “(“i“,“j“)“endl;else if(mazei-1j!=1i=

10、i-1;n+;Stepn.x=i;Stepn.y=j;cout“第“n“步: “向上走到: “(“i“,“j“)“endl;else if(mazei+1j+1!=1j=j+1;i=i+1;n+;Stepn.x=i;Stepn.y=j;cout“第“n“步: “向右下走到: “(“i“,“j“)“endl;else if(mazei+1j-1!=1j=j+1;i=i-1;n+;Stepn.x=i;Stepn.y=j;cout“第“n“步: “向右上走到: “(“i“,“j“)“endl;else if(mazei-1j+1!=1j=j-1;i=i+1;n+;Stepn.x=i;Stepn.y=

11、j;cout“第“n“步: “向左下走到: “(“i“,“j“)“endl;else if(mazei-1j-1!=1j=j-1;i=i-1;n+;Stepn.x=i;Stepn.y=j;cout“第“n“步: “向左上走到: “(“i“,“j“)“endl;else /返回上一步if(i=1elsemazeij=+; /将走不通的点置为+n-;i=Stepn.x; j=Stepn.y; cout“此路不通!返回至上一步: “(“i“,“j“)“endl; /输出返回信息 if(i=hangoutway(maze,hang,lie,i,j);/输出结果实验结果如下:实验图中点的坐标转化为问题描述中的点:(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)(4, 4)六、实验总结通过本次实验,我掌握了宽度优先搜索算法的思想方法,对于其分析流程有了很清晰的思路,盲目搜索算法中的宽度优先搜索算法应用于实际生活中求解分析问题就有很重要的意义。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报