实验一盲目搜索算法.docx
- 文档编号:419313
- 上传时间:2022-10-10
- 格式:DOCX
- 页数:9
- 大小:95.27KB
实验一盲目搜索算法.docx
《实验一盲目搜索算法.docx》由会员分享,可在线阅读,更多相关《实验一盲目搜索算法.docx(9页珍藏版)》请在冰豆网上搜索。
实验一盲目搜索算法
实验一:
盲目搜索算法
一、实验目的
掌握盲目搜索算法之一的宽度优先搜索求解算法的基本思想。
对于宽度优先搜索算法基本过程,算法分析有一个清晰的思路,了解宽度优先搜索算法在实际生活中的应用。
二、实验环境
PC机一台,VC++
三、实验原理
宽度优先(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。
Dijkstra算法和Prim算法都采用了和宽度优先搜索类似的思想。
其别名又叫BFS属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。
同时,宽度优先搜索算法是的一种策略。
因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名。
其基本思想是:
(1)把起始节点放到OPEN表中(如果该起始节点为一目标节点,则求得一个解答)。
\
(2)如果OPEN是个空表,则没有解,失败退出;否则继续。
、、(3)把第一个节点(节点n)从OPEN表移出,并把它放入CLOSE扩展节点表中。
(4)扩展节点n。
如果没有后继节点,则转向上述第
(2)步。
(5)把n的所有后继节点放到OPEN表的末端,并提供从这些后继节点回到n的指针。
(6)如果n的任一个后继节点是个目标节点,则找到一个解答,成功退出;否则转向第
(2)步。
宽度优先搜索示意图和宽度优先算法流程图如下图1和图2所示:
起始
把S放入OPEN表
OPEN是否
为空表?
►失败
把第一个节点出,并把它放入
n,从OPEN表移
CLOSED表
1
扩展n,把它的后继节点放入OPEN表的末端,提供回到n的指针
是
是否有任何后继节点为目标节点?
成功
图2、宽度优先算法流程图
四、实验数据及步骤
这部分内容是通过一个实例来对宽度优先算法进行一个演示,分析其思想。
问题描述了《迷宫问题》的出路求解办法。
定义一个二维数组:
intmaze[5][5]={
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,
};
它表示一个迷宫,其中的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的项maze[x][y]。
于是起点就是(0,0),终点是(4,4)。
我们大概梳理一遍:
初始条件:
起点Vs为(0,0),终点Vd为(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),染成灰色,加入队列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.此时获得最终答案
我们来看看广度搜索的过程中节点的顺序情况:
1.NodefO^O)
*
2.Node(l.t))
3Node(2.0>
图3迷宫问题的搜索树
图中标号即为我们搜索过程中的顺序,我们观察到,这个搜索顺序是按照上图的层次关系来的,例如节点(0,0)在第1层,节点(1,0)在第2层,节点(2,0)在第3层,节点(2,1)和节点(3,0)在第3层。
我们的搜索顺序就是第一层->第二层->第三层->第N层这样子。
我们假设终点在第N层,因此我们搜索到的路径长度肯定是N,而且这个N定是所求最短的。
层,
M
我们用简单的反证法来证明:
假设终点在第N层上边出现过,例如第MM 所以根据广度优先搜索的话,搜索到终点时,该路径一定是最短的。 五、实验核心代码 /** *广度优先搜索 */ voidcourse(char**maze,inthang,intlie) { inti=1,j=1,n=-1; step*Step;;=i;=j; while(maze[hang][lie]! ='.') { 表示已经走过并通了的路径 \if(maze[i][j+1]! ='1'&&maze[i][j+1]! ='.'&&maze[i][j+1]! ='+'); '、j=j+1; \n++; Step[n].x=i; Step[n].y=j; coutvv"第"vv*v"步: "vv"向右走到: "vv"("vvivv","vvjvv")"vvendl; } elseif(maze[i+1][j]! ='1'&&maze[i+1][j]! ='.'&&maze[i+1][j]! ='+') i=i+1; n++; Step[n].x=i; Step[n].y=j; coutvv"第"vv*v"步: "vv"向下走到: "vv"("vvivv","vvjvv")"vvendl;\ /}\ /elseif(maze[i][j-1]! ='1'&&maze[i][j-1]! ='.'&&maze[i][j-1]! ='+'); j=j-1; n++; Step[n].x=i; Step[n].y=j; coutvv"第"<<*<"步: "<<"向左走到: "<<"("<<)<<","<<」<<")"<<6ndl; } elseif(maze[i-1][j]! ='1'&&maze[i-1][j]! ='.'&&maze[i-1][j]! ='+'); \i=i-1; \n++; Step[n].x=i; \Step[n].y=j; coutvv"第"vv*v"步: "vv"向上走到: "vv"("vvivv","vvjvv")"v } else if(maze[i+1][j+1]! ='1'&&maze[i+1][j+1]! ='.'&&maze[i+1][j+1]! ='+'); j=j+1; i=i+1; n++; Step[n].x=i; Step[n].y=j; coutvv"第"vv*v"步: "VV"向右下走到: "vv"("vvivv","vvjvv")"vvendl;\ } else if(maze[i+1][j-1]! ='1'&&maze[i+1][j-1]! ='.'&&maze[i+1][j-1]! ='+');/j=j+1; i=i-1; n++; Step[n].x=i; Step[n].y=j; coutvv"第"<<*<"步: "<<"向右上走到: "<<"("<<)<<","<<」<<")"<<6ndl; } else if(maze[i-1][j+1]! ='1'&&maze[i-1][j+1]! ='.'&&maze[i-1][j+1]! ='+'); \、j=j-1; \i=i+1; \n++; Step[n].x=i; Step[n].y=j; coutvv"第"vv*v"步: "vv"向左下走到: "vv"("vvivv","vvjvv")"vvendl; } else if(maze[i-1][j-1]! ='1'&&maze[i-1][j-1]! ='.'&&maze[i-1][j-1]! ='+'); j=j-1; i=i-1; n++; Step[n].x=i; Step[n].y=j; /coutvv"第"vv*v"步: "vv"向左上走到: "vv"("vvivv","vvjvv")"vvendl;\ /}\ else; j=Step[n].y; coutvv"此路不通! 返回至上一步: "<<"("<<)<<","<弓<<")"<<6ndl;//输出返回信息 } } if(i==hang&&j==lie) coutvv"成功走到出口! ! ! "<<""<<"共"<<*<"步"; } } \outway(maze,hang,lie,i,j);//输出结果 } 实验结果如下: 旬下走到向下走至! 向右连: 到向右走到 諱: O 向下走到 找到迷宫出路,所走星隼夷如下图所示: 1£11i.£1 1.1B301 1,10101 11 10111,1 丄0901.1 1111111 实验图中点的坐标转化为问题描述中的点: (0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4) (4,4) 六、实验总结 通过本次实验,我掌握了宽度优先搜索算法的思想方法,对于其分析流程有了很清晰的思路,盲目搜索算法中的宽度优先搜索算法应用于实际生活中求解分析问题就有很重要的意义。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 盲目 搜索 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)