人工智能大作业八数码问题Word文档格式.docx

上传人:b****5 文档编号:17237454 上传时间:2022-11-29 格式:DOCX 页数:11 大小:274.46KB
下载 相关 举报
人工智能大作业八数码问题Word文档格式.docx_第1页
第1页 / 共11页
人工智能大作业八数码问题Word文档格式.docx_第2页
第2页 / 共11页
人工智能大作业八数码问题Word文档格式.docx_第3页
第3页 / 共11页
人工智能大作业八数码问题Word文档格式.docx_第4页
第4页 / 共11页
人工智能大作业八数码问题Word文档格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

人工智能大作业八数码问题Word文档格式.docx

《人工智能大作业八数码问题Word文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能大作业八数码问题Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。

人工智能大作业八数码问题Word文档格式.docx

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.

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

当前位置:首页 > 高中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1