人工智能中的图搜索策略与重排九宫问题
2005-04-15 19:14
633 查看
人工智能实验报告
实验一 图搜索策略
一.实验目的
1.加深对各种图搜索策略概念的理解
2.进一步了解启发式搜索
3.比较分析各种搜索策略的异同
二.实验内容和步骤
以重排九宫问题为例演示各种搜索策略(包括广度优先搜索、深度优先搜索、有界深度优先搜索、最好优先搜索和局部择优搜索等搜索策略)的搜索过程,要求程序具有一定普适性,重点是要把算法描述清楚。
四.重排九宫问题的定义
在一个3×3的方格棋盘上放置8个标有1、2、3、4、5、6、7、8数字的将牌,留下一个空格(用0表示)。
规定与空上下左右相邻的将牌可以移入空格。问题要求寻找一条从某初始状态S0到目标状态Sg的将牌移动
路线。
五.我对问题的描述
1.结点状态
我采用了一个10元数组A=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)来描述九宫图的每一个状态。将九宫图的九个格子依次编号为1、2、3、4、5、6、7、8、9。数组中的a0代表空格位于九宫图的那个格子,a1-a9九个元素代表了九个格子上分别是什么将牌。例如,数组(5,2,8,3,1,0,4,7,6,5)就代表了如下的状态:
2 8 3
1 4
7 6 5
这种表示法与书上略有差别,我个人认为这样做在编程上会带来方便。
2.发生器函数
我定义的发生器函数由以下的四种操作组成:
(1)将当前状态的空格上移
(2)将当前状态的空格下移
(3)将当前状态的空格左移
(4)将当前状态的空格右移
以上的发生器函数,我在程序中(java)分别采用了4个类方法来实现。一个结点最多能够扩展出4个结点,而扩展出的结点也不一定就会被采用,这与具体情况有关。
通过定义结点状态和发生器函数,就解决了重排九宫问题的隐式图的生成问题。接下来就是搜索了。
六.图的搜索策略
经过我的分析,重排九宫问题中可采用的搜速策略共有:1.广度优先搜索、2.深度优先搜索、2.有界深度优先搜索、4.最好优先搜索、5.局部择优搜索,一共五种。其中,广度优先搜索法是可采纳的,有界深度优先搜索法是不完备的,最好优先和局部择优搜索法是启发式搜索法。
各种搜索策略的搜索法:
1.广度优先搜索
步1 把初始结点S0放入OPEN表中
步2 若OPEN表为空,则搜索失败,问题无解
步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
步4 若目标结点Sg=N,则搜索成功,问题有解
步5 若N无子结点,则转步2
步6 扩展结点N,将其所有子结点配上指向N的放回指针,依次放入OPEN表的尾部,转步2
1.深度优先搜索
步1 把初始结点S0放入OPEN表中
步2 若OPEN表为空,则搜索失败,问题无解
步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
步4 若目标结点Sg=N,则搜索成功,问题有解
步5 若N无子结点,则转步2
步6 扩展结点N,将其所有子结点配上指向N的放回指针,依次放入OPEN表的首部,转步2
3.有界深度优先搜索
步1 把初始结点S0放入OPEN表中,置S0的深度d(S0)=0
步2 若OPEN表为空,则搜索失败,问题无解
步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
步4 若目标结点Sg=N,则搜索成功,问题有解
步5 若N的深度d(N)==dm(深度限制值),则转步2
步6 若N无子结点,则转步2
步7 扩展结点N,将其所有子结点Ni配上指向N的放回指针,并置d(Ni)=d(N)+1,再依次放入OPEN表的尾部,转步2
4.最好优先搜索
步1 把初始结点S0放入OPEN表中
步2 若OPEN表为空,则搜索失败,问题无解
步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
步4 若目标结点Sg=N,则搜索成功,问题有解
步5 若N无子结点,则转步2
步6 扩展结点N,将其所有子结点配上指向N的放回指针,并计算f(Ni),依次放入OPEN表中,然后对OPEN表重新排序(小的在前),转步2
5.局部择优搜索法
步1 把初始结点S0放入OPEN表中
步2 若OPEN表为空,则搜索失败,问题无解
步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
步4 若目标结点Sg=N,则搜索成功,问题有解
步5 若N无子结点,则转步2
步6 扩展结点N,将其所有子结点配上指向N的放回指针,并计算f(Ni)。对生成的结点按f(Ni)排序(小的在前),然后将排序后的结点依次放入OPEN表的尾部(f(Ni)小的先放入),转步2
启发式搜索法使用的估计函数
在启发式搜索中,我采用的估计函数是f(n)=d(n)+h(n),d(n)是结点的深度,h(n)由以下计算得到:
h(n)=p(n)+3s(n).
其中p(n)的定义是,它是n格局中每个将牌离家的最短距离之和。
s(n)是这样来计算的:沿着周围那些非中心方格上依顺时针方向检查n格局中的每一个将牌,如果其后紧跟着的将牌正好是目标格局中该将牌的后继者,则该将牌得0分,否则得2分;在正中方格上有将牌得1分,否则得0分。所有将牌得分之和即为s(n)。
七.各种搜索策略之间得比较
广度优先搜索和深度优先搜索都是效率比较低下的搜索法,两者都能找到解,是完备的,而广度优先搜索法能找到最优解。有界深度优先搜索是对深度优先搜索法的一种改进,但是它可能找不到解。最好优先法和局部择优法都是启发式搜索,搜索效率很高,能很快的找到解,但是找到的不一定是最优解。
八.源程序说明
源程序采用Java语言在Eclips环境下编写。
在整个程序中,我分别定义和实现了四个类:
1.“表”类:这个类从Vector类继承而来,实现了表的所有功能,用它可以创建“OPEN表”和“CLOSE表”对象来实现OPEN表和CLOSE表的功能。
2.“九宫图结点”类:这个类代表了九宫图的状态结点,具有状态数据和发生器函数,通过这个类即可生成状态空间图。
3.“九宫图”类:这个类九宫重排这个问题,具有“OPEN表”、“CLOSE表”、“开始状态”、“目标状态”等属性,并在这个类中实现前面所说的所有的五个搜索法。使用这个类就可以完成对九宫重排问题的搜索求解。
4.“程序界面”类:这个类实现了Applet的图形化程序界面,采用了动画技术,并且可以方便的设置各种搜索参数,使用方便。
源程序的所有源代码都在压缩包中可以找到,源代码书写清晰,在适当的地方都加上了注释,可以方便的阅读和理解。
九.实验总结和思考
个人认为自己做的还不错,五种搜索法全部都实现了,程序运行的效果也相当良好,使用也很方便。实践中能够更深刻的理解课本上的知识,通过这次实验我对基本的图搜索策略算是“吃透”了。
整个程序大约有3000行左右代码,工程之庞大(对于我来说),要在6个课时内完成,简直是不可能完成的任务,让人吐血。但我还是顶住了压力,连续奋战了三个日日夜夜,终于把它搞定了。这得益于我对编程得狂热追求、平时编程序比较多以及对Java语言的掌握。
应当说,这个实验在各方面都使我获益匪浅,而不光是在人工智能这个课程上。
十.关于我
西北工业大学计算机学院 11424班 陈凯 学号 022301
联系方式 rockcarry@163.com
http://rockcarry.home.sunbo.net
附:一组实验结果
以下的数据均是由本程序生成的:
系统被初始化!
你选择了预设的开始状态
系统被初始化!
你选择了搜索方法:广度优先搜索法
自动搜索开始
搜索正在进行,请耐心等待...
搜索完成!
九宫图搜索
开始结点:
2 8 3
1 6 4
7 0 5
目标结点:
1 2 3
8 0 4
7 6 5
搜索已经完成
找到了最优解
解路径:
2 8 3
1 6 4
7 0 5
2 8 3
1 0 4
7 6 5
2 0 3
1 8 4
7 6 5 0 2 3
1 8 4
7 6 5
1 2 3
0 8 4
7 6 5
1 2 3
8 0 4
7 6 5
操作序列:
空格上移
空格上移
空格左移
空格下移
空格右移
搜索过程中总共生成了2735个结点
其中考察了35个结点
解路径的长度为6个结点
搜索效率为:0.0967741935483871
系统被初始化!
你选择了随机生成的开始状态
系统被初始化!
你选择了搜索方法:有界深度优先搜索法
你把有界深度优先搜索的有界深度设置为了:10
自动搜索开始
搜索正在进行,请耐心等待...
搜索完成!
九宫图搜索
开始结点:
2 8 3
1 6 4
7 0 5
目标结点:
1 2 3
8 0 4
7 6 5
搜索已经完成
找到了解
解路径:
2 8 3
1 6 4
7 0 5
2 8 3
1 0 4
7 6 5
2 0 3
1 8 4
7 6 5
0 2 3
1 8 4
7 6 5
1 2 3
0 8 4
7 6 5
1 2 3
8 0 4
7 6 5
操作序列:
空格上移
空格上移
空格左移
空格下移
空格右移
搜索过程中总共生成了1490个结点
其中考察了490个结点
解路径的长度为6个结点
搜索效率为:0.012219959266802444
系统被初始化!
你选择了搜索方法:最好优先搜索法
自动搜索开始
搜索正在进行,请耐心等待...
搜索完成!
九宫图搜索
开始结点:
2 8 3
1 6 4
7 0 5
目标结点:
1 2 3
8 0 4
7 6 5
搜索已经完成
找到了解
解路径:
2 8 3
1 6 4
7 0 5
2 8 3
1 0 4
7 6 5
2 0 3
1 8 4
7 6 5
0 2 3
1 8 4
7 6 5
1 2 3
0 8 4
7 6 5
1 2 3
8 0 4
7 6 5
操作序列:
空格上移
空格上移
空格左移
空格下移
空格右移
搜索过程中总共生成了66个结点
其中考察了6个结点
解路径的长度为6个结点
搜索效率为:0.5
系统被初始化!
你选择了搜索方法:局部择优搜索法
自动搜索开始
搜索正在进行,请耐心等待...
搜索完成!
九宫图搜索
开始结点:
2 8 3
1 6 4
7 0 5
目标结点:
1 2 3
8 0 4
7 6 5
搜索已经完成
找到了解
解路径:
2 8 3
1 6 4
7 0 5
2 8 3
1 0 4
7 6 5
2 0 3
1 8 4
7 6 5
0 2 3
1 8 4
7 6 5
1 2 3
0 8 4
7 6 5
1 2 3
8 0 4
7 6 5
操作序列:
空格上移
空格上移
空格左移
空格下移
空格右移
搜索过程中总共生成了2734个结点
其中考察了34个结点
解路径的长度为6个结点
搜索效率为:0.09836065573770492
实验一 图搜索策略
一.实验目的
1.加深对各种图搜索策略概念的理解
2.进一步了解启发式搜索
3.比较分析各种搜索策略的异同
二.实验内容和步骤
以重排九宫问题为例演示各种搜索策略(包括广度优先搜索、深度优先搜索、有界深度优先搜索、最好优先搜索和局部择优搜索等搜索策略)的搜索过程,要求程序具有一定普适性,重点是要把算法描述清楚。
四.重排九宫问题的定义
在一个3×3的方格棋盘上放置8个标有1、2、3、4、5、6、7、8数字的将牌,留下一个空格(用0表示)。
规定与空上下左右相邻的将牌可以移入空格。问题要求寻找一条从某初始状态S0到目标状态Sg的将牌移动
路线。
五.我对问题的描述
1.结点状态
我采用了一个10元数组A=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)来描述九宫图的每一个状态。将九宫图的九个格子依次编号为1、2、3、4、5、6、7、8、9。数组中的a0代表空格位于九宫图的那个格子,a1-a9九个元素代表了九个格子上分别是什么将牌。例如,数组(5,2,8,3,1,0,4,7,6,5)就代表了如下的状态:
2 8 3
1 4
7 6 5
这种表示法与书上略有差别,我个人认为这样做在编程上会带来方便。
2.发生器函数
我定义的发生器函数由以下的四种操作组成:
(1)将当前状态的空格上移
(2)将当前状态的空格下移
(3)将当前状态的空格左移
(4)将当前状态的空格右移
以上的发生器函数,我在程序中(java)分别采用了4个类方法来实现。一个结点最多能够扩展出4个结点,而扩展出的结点也不一定就会被采用,这与具体情况有关。
通过定义结点状态和发生器函数,就解决了重排九宫问题的隐式图的生成问题。接下来就是搜索了。
六.图的搜索策略
经过我的分析,重排九宫问题中可采用的搜速策略共有:1.广度优先搜索、2.深度优先搜索、2.有界深度优先搜索、4.最好优先搜索、5.局部择优搜索,一共五种。其中,广度优先搜索法是可采纳的,有界深度优先搜索法是不完备的,最好优先和局部择优搜索法是启发式搜索法。
各种搜索策略的搜索法:
1.广度优先搜索
步1 把初始结点S0放入OPEN表中
步2 若OPEN表为空,则搜索失败,问题无解
步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
步4 若目标结点Sg=N,则搜索成功,问题有解
步5 若N无子结点,则转步2
步6 扩展结点N,将其所有子结点配上指向N的放回指针,依次放入OPEN表的尾部,转步2
1.深度优先搜索
步1 把初始结点S0放入OPEN表中
步2 若OPEN表为空,则搜索失败,问题无解
步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
步4 若目标结点Sg=N,则搜索成功,问题有解
步5 若N无子结点,则转步2
步6 扩展结点N,将其所有子结点配上指向N的放回指针,依次放入OPEN表的首部,转步2
3.有界深度优先搜索
步1 把初始结点S0放入OPEN表中,置S0的深度d(S0)=0
步2 若OPEN表为空,则搜索失败,问题无解
步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
步4 若目标结点Sg=N,则搜索成功,问题有解
步5 若N的深度d(N)==dm(深度限制值),则转步2
步6 若N无子结点,则转步2
步7 扩展结点N,将其所有子结点Ni配上指向N的放回指针,并置d(Ni)=d(N)+1,再依次放入OPEN表的尾部,转步2
4.最好优先搜索
步1 把初始结点S0放入OPEN表中
步2 若OPEN表为空,则搜索失败,问题无解
步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
步4 若目标结点Sg=N,则搜索成功,问题有解
步5 若N无子结点,则转步2
步6 扩展结点N,将其所有子结点配上指向N的放回指针,并计算f(Ni),依次放入OPEN表中,然后对OPEN表重新排序(小的在前),转步2
5.局部择优搜索法
步1 把初始结点S0放入OPEN表中
步2 若OPEN表为空,则搜索失败,问题无解
步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
步4 若目标结点Sg=N,则搜索成功,问题有解
步5 若N无子结点,则转步2
步6 扩展结点N,将其所有子结点配上指向N的放回指针,并计算f(Ni)。对生成的结点按f(Ni)排序(小的在前),然后将排序后的结点依次放入OPEN表的尾部(f(Ni)小的先放入),转步2
启发式搜索法使用的估计函数
在启发式搜索中,我采用的估计函数是f(n)=d(n)+h(n),d(n)是结点的深度,h(n)由以下计算得到:
h(n)=p(n)+3s(n).
其中p(n)的定义是,它是n格局中每个将牌离家的最短距离之和。
s(n)是这样来计算的:沿着周围那些非中心方格上依顺时针方向检查n格局中的每一个将牌,如果其后紧跟着的将牌正好是目标格局中该将牌的后继者,则该将牌得0分,否则得2分;在正中方格上有将牌得1分,否则得0分。所有将牌得分之和即为s(n)。
七.各种搜索策略之间得比较
广度优先搜索和深度优先搜索都是效率比较低下的搜索法,两者都能找到解,是完备的,而广度优先搜索法能找到最优解。有界深度优先搜索是对深度优先搜索法的一种改进,但是它可能找不到解。最好优先法和局部择优法都是启发式搜索,搜索效率很高,能很快的找到解,但是找到的不一定是最优解。
八.源程序说明
源程序采用Java语言在Eclips环境下编写。
在整个程序中,我分别定义和实现了四个类:
1.“表”类:这个类从Vector类继承而来,实现了表的所有功能,用它可以创建“OPEN表”和“CLOSE表”对象来实现OPEN表和CLOSE表的功能。
2.“九宫图结点”类:这个类代表了九宫图的状态结点,具有状态数据和发生器函数,通过这个类即可生成状态空间图。
3.“九宫图”类:这个类九宫重排这个问题,具有“OPEN表”、“CLOSE表”、“开始状态”、“目标状态”等属性,并在这个类中实现前面所说的所有的五个搜索法。使用这个类就可以完成对九宫重排问题的搜索求解。
4.“程序界面”类:这个类实现了Applet的图形化程序界面,采用了动画技术,并且可以方便的设置各种搜索参数,使用方便。
源程序的所有源代码都在压缩包中可以找到,源代码书写清晰,在适当的地方都加上了注释,可以方便的阅读和理解。
九.实验总结和思考
个人认为自己做的还不错,五种搜索法全部都实现了,程序运行的效果也相当良好,使用也很方便。实践中能够更深刻的理解课本上的知识,通过这次实验我对基本的图搜索策略算是“吃透”了。
整个程序大约有3000行左右代码,工程之庞大(对于我来说),要在6个课时内完成,简直是不可能完成的任务,让人吐血。但我还是顶住了压力,连续奋战了三个日日夜夜,终于把它搞定了。这得益于我对编程得狂热追求、平时编程序比较多以及对Java语言的掌握。
应当说,这个实验在各方面都使我获益匪浅,而不光是在人工智能这个课程上。
十.关于我
西北工业大学计算机学院 11424班 陈凯 学号 022301
联系方式 rockcarry@163.com
http://rockcarry.home.sunbo.net
附:一组实验结果
以下的数据均是由本程序生成的:
系统被初始化!
你选择了预设的开始状态
系统被初始化!
你选择了搜索方法:广度优先搜索法
自动搜索开始
搜索正在进行,请耐心等待...
搜索完成!
九宫图搜索
开始结点:
2 8 3
1 6 4
7 0 5
目标结点:
1 2 3
8 0 4
7 6 5
搜索已经完成
找到了最优解
解路径:
2 8 3
1 6 4
7 0 5
2 8 3
1 0 4
7 6 5
2 0 3
1 8 4
7 6 5 0 2 3
1 8 4
7 6 5
1 2 3
0 8 4
7 6 5
1 2 3
8 0 4
7 6 5
操作序列:
空格上移
空格上移
空格左移
空格下移
空格右移
搜索过程中总共生成了2735个结点
其中考察了35个结点
解路径的长度为6个结点
搜索效率为:0.0967741935483871
系统被初始化!
你选择了随机生成的开始状态
系统被初始化!
你选择了搜索方法:有界深度优先搜索法
你把有界深度优先搜索的有界深度设置为了:10
自动搜索开始
搜索正在进行,请耐心等待...
搜索完成!
九宫图搜索
开始结点:
2 8 3
1 6 4
7 0 5
目标结点:
1 2 3
8 0 4
7 6 5
搜索已经完成
找到了解
解路径:
2 8 3
1 6 4
7 0 5
2 8 3
1 0 4
7 6 5
2 0 3
1 8 4
7 6 5
0 2 3
1 8 4
7 6 5
1 2 3
0 8 4
7 6 5
1 2 3
8 0 4
7 6 5
操作序列:
空格上移
空格上移
空格左移
空格下移
空格右移
搜索过程中总共生成了1490个结点
其中考察了490个结点
解路径的长度为6个结点
搜索效率为:0.012219959266802444
系统被初始化!
你选择了搜索方法:最好优先搜索法
自动搜索开始
搜索正在进行,请耐心等待...
搜索完成!
九宫图搜索
开始结点:
2 8 3
1 6 4
7 0 5
目标结点:
1 2 3
8 0 4
7 6 5
搜索已经完成
找到了解
解路径:
2 8 3
1 6 4
7 0 5
2 8 3
1 0 4
7 6 5
2 0 3
1 8 4
7 6 5
0 2 3
1 8 4
7 6 5
1 2 3
0 8 4
7 6 5
1 2 3
8 0 4
7 6 5
操作序列:
空格上移
空格上移
空格左移
空格下移
空格右移
搜索过程中总共生成了66个结点
其中考察了6个结点
解路径的长度为6个结点
搜索效率为:0.5
系统被初始化!
你选择了搜索方法:局部择优搜索法
自动搜索开始
搜索正在进行,请耐心等待...
搜索完成!
九宫图搜索
开始结点:
2 8 3
1 6 4
7 0 5
目标结点:
1 2 3
8 0 4
7 6 5
搜索已经完成
找到了解
解路径:
2 8 3
1 6 4
7 0 5
2 8 3
1 0 4
7 6 5
2 0 3
1 8 4
7 6 5
0 2 3
1 8 4
7 6 5
1 2 3
0 8 4
7 6 5
1 2 3
8 0 4
7 6 5
操作序列:
空格上移
空格上移
空格左移
空格下移
空格右移
搜索过程中总共生成了2734个结点
其中考察了34个结点
解路径的长度为6个结点
搜索效率为:0.09836065573770492
相关文章推荐
- 人工智能(三)上——通过搜索进行问题求解(有信息搜索策略)
- C++基于人工智能搜索策略解决农夫过河问题示例
- 【浅析华容道之二】华容道问题搜索求解策略
- N皇后问题:基于局部搜索策略的高效算法
- 人工智能 一种现代方法 第3章 用搜索树对问题求解
- 人工智能之搜索策略-A*算法进阶
- 人工智能搜索策略(上)
- 人工智能搜索策略(上)
- 人工智能:复杂问题求解的结构和策略
- 人工智能——状态空间的搜索策略
- AI:人工智能搜索策略
- 【计算机算法分析】递归与分治策略——二分搜索与集合划分问题
- 免费教材丨第52期:人工智能(复杂问题求解的结构和策略)、人工智能哲学
- 图的广度优先查找(BFS: Breadth -First Search) (1)问题分析 BFS的策略是尽可能广泛地搜索图。它首先访问所有和初始顶点邻接的顶点,然后访问距离它两条边的所有未
- 人工智能中的常用搜索策略
- 人工智能中的常用搜索策略
- 人工智能之搜索策略-A*算法入门
- 人工智能3:通过搜索进行问题求解
- 人工智能中的常用搜索策略
- [转载] 人类智能PK人工智能——04 问题求解与搜索