实验一盲目搜索算法Word文档下载推荐.docx
《实验一盲目搜索算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验一盲目搜索算法Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
(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,0,0,0,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<
N,那么我们在搜索的过程中,肯定是先搜索到第M层的,此时搜索到第层的时候发现终点出现过了,那么最短路径应该是M,而不是N了。
所以根据广度优先搜索的话,搜索到终点时,该路径一定是最短的。
五、实验核心代码
/**
*广度优先搜索
*/
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]!
+'
);
'
、j=j+1;
\n++;
Step[n].x=i;
Step[n].y=j;
coutvv"
第"
vv*v"
步:
"
vv"
向右走到:
("
vvivv"
"
vvjvv"
)"
vvendl;
}
elseif(maze[i+1][j]!
maze[i+1][j]!
i=i+1;
n++;
向下走到:
\
/}\
/elseif(maze[i][j-1]!
maze[i][j-1]!
j=j-1;
<
*<
向左走到:
)<
」<
6ndl;
elseif(maze[i-1][j]!
maze[i-1][j]!
\i=i-1;
\Step[n].y=j;
向上走到:
v<
endl;
else
if(maze[i+1][j+1]!
maze[i+1][j+1]!
j=j+1;
VV"
向右下走到:
if(maze[i+1][j-1]!
maze[i+1][j-1]!
/j=j+1;
i=i-1;
向右上走到:
if(maze[i-1][j+1]!
maze[i-1][j+1]!
\、j=j-1;
\i=i+1;
向左下走到:
if(maze[i-1][j-1]!
maze[i-1][j-1]!
/coutvv"
向左上走到:
else;
j=Step[n].y;
此路不通!
返回至上一步:
弓<
//输出返回信息
if(i==hang&
j==lie)
成功走到出口!
!
"
共"
步"
;
\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)
六、实验总结
通过本次实验,我掌握了宽度优先搜索算法的思想方法,对于其分析流程有了很清晰的思路,盲目搜索算法中的宽度优先搜索算法应用于实际生活中求解分析问题就有很重要的意义。