- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
人工智能第一次实验 八数码
06计算机B NO.3
题目:比较采用分别采用P(n)和W(n)作为启发函数的算法A*解决8数码问题的性能,包括:运行时间、产生的结点数、搜索树的平均分枝因子。(150分)
关于A*算法的一些概念知识点
A*算法
A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。
公式表示为: f(n)=g(n)+h(n),
其中f(n) 是节点n从初始点到目标点的估价函数,
g(n) 是在状态空间中从初始节点到n节点的实际代价,
h(n)是从n到目标节点最佳路径的估计代价。
保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:
估价值h(n)= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。估价值与实际值越接近,估价函数取得就越好。
在这个实验中p(n)是每个数码与其目标位置之间距离的总和,W(n)是不在位的数码个数。我们发现,采用P(n)比采用W(n)的平均分支因子要小。测试结果表明,P(n)的启发强度比W(n)要好,也就是说用“距离和”比用“不在位和”作为启发函数更加有效。由此可见,尽管都是启发式搜索,但是如果启发函数的启发能力不够强大,那么效果并不能够得到显著的改善。
A*算法的启发函数可以改写为然后通过w的大小来控制启发分量的大小,w是一个正数,很大的w值会过分强调启发分量,而过小的w值则突出宽度优先的特征。实验证明,使w值随搜索树中结点深度成反比变化可提高搜索效率,也就是说在深度浅的地方搜索主要依赖于启发分量,而在较深的地方,搜索应该逐渐变为宽度优先,以保证最终找到到达目标的某一条路径。
运行时间的计算
我们在程序中使用了GetTickCount函数
函数功能:GetTickCount返回(retrieve)从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD。
产生节点数(扩展节点数)与所需步数的计算:
生成节点:在求解问题过程中总共生成的节点数目,从一个侧面反映了算法的时间和空间复杂度。
扩展结点:在求解问题的过程中所选择来进行扩展的结点数目,从一个侧面反映了算法的启发能力的优劣性。
所求解的步数:最终求解到的问题的解,可以用来判断算法的有效性。
关于平均分支因子
平均分枝因子是搜索效率的一个有效度量。平均分支因子定义如下:
假设搜索找到了一个长为d的路径,生成了N个结点,那么B就是有下列属性的树上的每个结点的后继个数: ①树中每个非树叶结点都有B个后继;②树中的树叶结点的深度均为d;③树中的结点总数是N。
设平均分枝因子共扩展了d层结点,共搜索了N个结点,则
式中:B为平均分支因子。
可以通过数学转换和近似得到 的求解公式。B越小,说明效果越好。实验表明,B是一个稳定的常数,基本不随问题规模变化。
5. A*算法的流程如下:
① OPEN:=(s),f(s):=g(s)+h(s);
② LOOP:IF OPEN=( )THEN EXIT(FAIL);
③ n:=FIRST(OPEN);
④ IF GOAL(n)THEN EXIT(SUCCESS);
⑤ REMOVE(n,OPEN),ADD(n,CLOSED);
⑥ EXPAND(n)→{mi},计算f(n,mi)=g(n,mi)+h(mi);g(n,mi)是从s通过n到mi的耗散值,f(n,mi)是从s通过n、mi到目标结点耗散值的估计。
·ADD(mj,OPEN),标记mi到n的指针。
·IF f(n,mk)f(mk)THEN f(mk):=f(n,mk),标记mk到n的指针;比较f(n,mk)和f(mk),f(mk)是扩展n之前计算的耗散值。
·IF f(n,m1)f(m1)THEN f(m1):=f(n,m1),标记m1到n的指针,ADD(m1,OPEN);当f(n,m1)f(m1)时,把m1重放回OPEN中,不必考虑修改到其子结点的指针。
⑦ OPEN中的结点按f值从小到大排序;
⑧ GO LOOP;
关于程序的一些实现
八数码的存储:
用二维数组detail[3][3],来存储八个数码,用一个结构Map存储每次状态:
typedef struct maps
{
int detail[3][3];
int gx; // 实际已经花费
int fx; // 预计花费(fx)= 实际已经花费(gx)+ 预计剩余花费(hx)
int parent; // 记录父节点在hash表中的位置
int myindex; // 记录自己节点在hash表中
您可能关注的文档
最近下载
- 传热学(全套714页课件课件).pptx VIP
- 统编版(2024)一年级下册语文4 小公鸡和小鸭子课件.pptx VIP
- 课-铜版纸彩印市场哲学数学原理完全配图手册缠中说禅.pdf VIP
- CQCIO_001—2019软件及信息化工程造价规范(V5.0) 2019 28页.pdf VIP
- 互联网技术全国通信专业技术人员职业水平考试大纲PPT.docx VIP
- (完整版)小学一年级语文教学经验交流.pptx VIP
- (完整版)小学一年级语文教学经验交流.pptx VIP
- 插画人物头像课件.pptx
- 20210820-申万宏源-申万行业分类标准2021版说明.pdf VIP
- 2025年最新全国通信专业技术人员职业水平考试试题和答案.docx VIP
文档评论(0)