人工智能大作业八数码问题文档格式.docx
- 文档编号:19316973
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:11
- 大小:274.46KB
人工智能大作业八数码问题文档格式.docx
《人工智能大作业八数码问题文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能大作业八数码问题文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
A*算法
本组成员:
本人分工:
主要负责进行问题分析,提出解决方案,进行系统设计,算法上具体负责主函数的编写。
1引言
八数码问题是人工智能的一个经典的问题。
文中通过设计一个基于A*算法的状态空间搜索程序,对于给定的初始状态,采用h(n)=p(n)表示以每一个将牌与目标位置之间距离的总和作为启发函数的度量,并用可视化编程语言VC++来实现该问题。
2算法原理与系统设计
1)A*算法思想
A*算法是对A算法的估价函数f(n)=g(n)+h(n)加上某些限制后得到的一种启发式搜索算法。
A*算法对A算法中的g(n)和h(n)分别提出如下限制:
第一,g(n)是对最小代价g*(n)的估计,且g(n)>
0;
第二,h(n)是最小代价h*(n)的下界,即对任意节点n均有h(n)≤h*(n)。
即满足上述两条限制的A算法称为A*算法。
2)估价函数
用来估算节点希望程度的量度,叫估价函数f(x),f(x)=g(x)+h(x)。
g(x)为从初始节点到当前节点已经付出的代价,h(x)为从当前节点到目标节点的最优路径的估计代价。
本算法中令g(x)为当前节点的深度depth,h(x)为当前节点每个数字位与目标节点数字位间距离和dist,进一步考虑当前结点与目标结点的距离信息,令启发函数h(n)为当前8个数字位与目标结点对应数字位距离和(不考虑中间路径),满足h(n)<
=h*(n),且对于目标节点有h(t)=0,对于结点m和n(n是m的子结点)有h(m)–h(n)<
=1满足单调限制条件。
3)open和closed表的数据结构表示
对open表的操作,每次需要得到所有待扩展结点中f值最小的那个结点。
closed表存储已扩展的结点间的扩展关系,主要用于输出路径。
closed表中任意一个结点都存储有它的前驱结点的信息,考虑closed表中任意一个结点,如果它是初始结点,它没有前驱结点,如果不是根结点,扩展该结点时它的前驱结点已经记录。
从而在closed表中形成扩展关系的树状结构。
因为只需要前驱点的下标位置,可以用数组实现。
每个结点记录8数码格局和它的前驱结点的下标。
4)问题分析
首先,八数码问题包括一个初始状态(src)和目标状态(dest),所谓解八数码
问题就是在两个状态间寻找一系列可过渡状态。
这个状态是否存在就是我们要解决的第一个问题。
解决八数码问题,主要面临的问题有:
Q1)开始状态S到目标状态D是否可解;
Q2)扩展节点的选择;
Q3)扩展待扩展节点,该节点是否已扩展过;
Q4)判断是否已达目标节点D;
问题Q1)通过逆序数的奇数偶数来判断。
因为在空白移动过程中,数码的逆序数不改变。
左右移动,数码序列不变。
上下移动,数码序列中某个数字则移动了两位。
问题的实质就是:
如果是N*N的数码盘的话,左右移动,数码序列不变;
上下移动则数码序列变动N-1位。
若N为奇数则在变动过程中其逆序数不会改变。
而八数码问题为3*3矩阵,3为奇数,故逆序数不作改变。
故可通过判断当前状态S的逆序数以及目标状态SD的数字序列的逆序数的奇偶性是否相同来判断该问题是否可解。
问题Q2)扩展节点的选择通过getmin函数,根据估价函数f来获得代价最小的节点。
问题Q3)扩展节点即为上下左右四个方向移动空格到没有扩展过的节点中去,要判断是否扩展过,只要跟之前的状态做比较即可。
问题Q4)是否达到目标节点,将当前节点和目标节点进行比较。
算法的功能:
产生8数码问题的解(由初始状态到达目标状态的过程)
输入:
初始状态,目标状态
输出:
从初始状态到目标状态的一系列过程
算法描述:
Begin:
读入初始状态和目标状态,并计算初始状态评价函数值f;
根据初始状态和目标状态,判断问题是否可解;
If(问题可解)
把初始状态假如open表中;
While(未找到解&
&
状态表非空)
①在open表中找到评价值最小的节点,作为当前结点;
②判断当前结点状态和目标状态是否一致,若一致,跳出循环;
否则跳转到③;
③对当前结点,分别按照上、下、左、右方向移动空格位置来扩展新的状态结点,并计算新扩展结点的评价值f并记录其父节点;
④对于新扩展的状态结点,判断其是否重复,若不重复,把其加入到open表中;
⑤把当前结点从open表中移除;
Endwhile
Endif
输出结果;
End
算法流程如下:
3系统实现
5、main函数,主程序运行步骤为:
(1)先读入八数码初始状态src,以及目标状态dest。
通过open表的push_back()函数,把初始状态src存入open中。
(2)A*算法搜索开始,设置while循环,直到找到目标状态或者open表为空或者无解的情况下结束。
(3)不同的八数码初始状态和目标状态不一定有解,所以要根据两种状态下的奇偶性是否一致来判断(详见实验思想的问题分析)。
(4)若奇偶性一致,则继续搜索。
如果测试到open表为空,没有找到目标状态,则表示无解,判断open表是否为空,函数如下:
(5)open非空,搜索未结束,则寻找open表中最小估价值节点进行扩展。
设置inttemp,du,dd,dr,dl;
Nodenu,nd,nr,nl;
temp为临时变量,d*为向上下左右移动后的距离dist,n*为向上下左右移动后的八数码状态节点,扩展节点就是通过空格的上下左右移动来获得子节点。
其中,扩展节点之前得先判断节点是否可扩展,即是否未扩展过,不存在于open,close表中。
Distance函数是用来计算当前状态到目标状态的距离,即坐标差绝对值之和。
(6)最后,如果发现扩展的节点与目标节点一样,则表示找到最优解使得估价函数值最小,将搜索步骤打印出来。
4实验或测试结果
1.无解的情况
2、有解的情况
5结论
通过本次实验,我更加深入的了解了A*算法、启发函数以及搜索方法。
启发式搜索有很多种方法,比如:
局部择优搜索法,最好优先搜索法等等,其中也包括了A*算法,这些算法都使用了启发函数,但在具体的选取最佳搜索节点时的策略不同。
A*是众多搜索方法中综合效果最好的。
使用A*算法,也要懂得构建估价函数,不同的估计函数对实验结果影响很大。
比如该实验,对于f(n)的考虑最简单的便是比较每个状态与目标状态相比错位的牌数。
这个启发意味着如果其他条件相同,那么错位的牌数最少的状态可能最接近目标状态。
然而这个启发没有使用从棋盘格局中可以得到的所有信息,因为它没有把牌必要的移动距离纳入考虑。
一个“更好一点”的启发是对错位的牌必须要移动的距离求和,为了达到这个目的,每张牌必须要移动的每个方格算为一个距离单位。
这两种启发都存在一种不足,就是没有认识到点到牌的难度。
也就是说,如果两张牌是彼此相邻的,而且目标是要求互相颠倒它们的位置,那么要把它们放到适当的位置需要远不止两次的移动,因为各张牌必须相互绕来绕去。
这个实验中,我采取的是把距离加上深度,来作为估价函数值。
除此之外,还有很多细节都可以影响实验,这里就不一一列举了。
参考文献
[1]ArtificialIntelligence——AModernApproach.StuartRussell,PeterNorvig.人民邮电出版社,2004
[2]ArtificialIntelligence,RobCallan.电子工业出版社,2004
[3]林尧瑞,马少平.人工智能导论[M].北京:
清华大学出版社,1989.
[4]马少平,朱小燕,人工智能[M].北京:
清华大学出版社,2004.
[5]尼尔逊NJ.人工智能原理[M].北京:
科学出版社,1983.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 作业 数码 问题