人工智能第一次八数码-Read.DOCVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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表中

文档评论(0)

ailuojue + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档