您好,欢迎来到暴趣科技网。
搜索
您的当前位置:首页基于A *算法的八数码问题的优化实现

基于A *算法的八数码问题的优化实现

来源:暴趣科技网
维普资讯 http://www.cqvip.com 2008年第1期 文章编号:1006—2475(2008)01-0029-03 计算机与现代化 JISUANJI YU XIANDAIHUA 总第149期 基于A术算法的八数码问题的优化实现 b奎昊,宋杰,李国斌 (安徽大学计算智能与信号处理教育部重点实验室,安徽合肥230039) 摘要:用人工智能领域中经典的A 算法解决了人工智能中常见的八数码问题。本文首先介绍了八数码问题,然后对 A 算法进行了解释。针对八数码问题给出并证明了路径不存在时的条件,并事先作了判定。定义了灵活的估价函数, 分析了估价函数对程序效率的影响,并对Closed表进行了若干优化,提高了搜索效率,取得了较好的效果。 关键词:八数码问题;A 算法;逆序数;估价函数 中图分类号:TP311 文献标识码:A Optimization of Eight Puzzle Problem Based on A Algorithm bin BU Kui—hao,SONG Jie,LI Guo-。(The Key Laboratory of Intelligence Computing and Signal Processing,Ministry of Education, Anhui University,Hefei 230039,China) Abstract:The eight puzzle problem is common in the artiifcial intelligence domain.The article resolves this problem through the classical A algorithm.Firstly,the paper introduces the eight puzzle problem,and then describes the A‘algorithm.Focus on the eight puzzles problem,the article gives the condition when the path does not exist and proves it.The paper defines a flexible eval— uation function,analyzes its influence to the function eficifency and optimized Closed table.All those enhances the search efi— fciency and obtaines the anticipated effect. Key words:eight puzzle problem;A algorithm;permutation number;evaluation function 0 引 言 八数码问题是人工智能领域中的一个经典的问 题,虽然已有不少八数码的算法,但现有的一般搜索 方法在搜索过程中需要回溯,故其实现较为复杂。本 文对此进行改进,采用基于A 算法来实现,并针对 八数码问题进行了优化,取得了较好的结果。 的数码盘的排列(称目标状态),如图1所示。 图1初始状态和目标状态 1 问题描述 所谓八数码问题起源于一种游戏:将分别标有数 字1,2,3,…,8的八块正方形数码牌任意地放在一块 3×3的数码盘上。放牌时要求不能重叠。于是,在3 2 A 算法 由于盲目搜索效率低,耗费过多的计算空间与时 间,因此进行搜索技术一般需要某些有关具体问题领 域的特性的信息,把此种信息叫做启发信息。利用启 发信息的搜索方法叫做启发式搜索方法。启发式搜 索方法有很多,如局部最优搜索法、最好优先搜索法 等等。一个比较灵活(但代价也较大)的利用启发信 息的方法是应用某些准则来重新排列每一步Open ×3的数码盘上出现了一个空格。现在要求按照每 次只能将与空格相邻的数码牌与空格交换的原则,将 任意摆放的数码盘(称初始状态)逐步摆成某种给定 收稿日期:2007-05.31 作者简介:卜奎昊(1983一),男,江苏淮安人,安徽大学硕士研究生,研究方向:嵌人式系统开发;宋杰(1966.),男,副教授,博 士;李国斌,男,硕士。 维普资讯 http://www.cqvip.com

30 计算机与现代化 2008年第1期 表中所有节点的顺序。然后,搜索就可能沿着某个被 性改变,所以移动两次后奇偶性不变。所以,上下左 认为是最有希望的边缘区段向外扩展。应用这种排 序过程,需要估算某些节点“希望”的量度,这种量度 叫做估价函数(evaluation function)。根据估价函数 的不同,人们得出了不同的启发式搜索算法。 A 算法是一种有序搜索算法,其特点在于对评 价函数的定义上。对于一般的有序搜索,总是选择f 右四个操作均不会影响序列逆序数的奇偶性。 据统计,单纯用A’算法要花费几个小时时间才 能判断出不能达到目标状态,这时Closed表长度为 181440。在本方法中,开始时就判断目标状态是否可 达,这样就节约了大量的时间。这是本方法针对八数 码这个具体问题的第一点优化。 3.2估价函数 值最小的节点作为扩展节点。因此,f是根据需要找 到一条最小代价路径的观点来估算节点的,可考虑将 每个节点n的估价函数值分解为两个分量:从起始节 本方法实现的程序中用到的估价函数如下:f( n)=a・h(n)+b・g(n)。其中,h(n)代表搜 索树中节点n的深度,根节点深度是0。启发函数g( n)定义为当前节点与其目标节点相应位置不相同元 素的个数。可根据需要选择相应系数a,b的值,本 点到节点n的最小代价路径的代价与从节点n到目 标节点的最小代价路径的代价之和,也就是说f(n) 是约束通过节点n的一条最小代价路径的代价的一 个估计。再定义一个函数f ,使得在任意一个节点n 上的函数值f (n)就是从节点S到节点n的一条最 佳路径的实际代价加上从节点n到目标节点的一条 程序分别选了a=1,b=1和a=0,b=1两组数据,通 过比较说明了估价函数对效率的影响。 3.3对Open表和Closed表的优化 最佳路径的代价之和,即: f’(n)=g (n)+h (n) 本算法在插入节点到Open表时是按照估价函 数从小到大有序插入的,这样做就不必在每次查找当 前状态下估价函数最优的节点时重排Open表。只 要取Open表中的第一个元素即可(这第一个元素代 表的节点就是所要查找的估价函数值最优的节点)。 这样也节约了大量的时间。这是本算法的第二点优 化。 评价函数f是f 的一个估计,这个估计可由下式 给出: f(n):g(n)+h(n) 其中g是g 的估计,h是h 的估计。g (n)的 估计g(n)就是搜索树中从初始节点到当前节点n 的这段路径的代价,这一代价可以由从初始节点到当 前节点n寻找路径时,把遇到的各段路径的代价加起 来给出o h (n) 的估计h(n)依赖于有关问题的领 域的启发信息,于是被称作启发函数。在启发函数 中,应用的启发信息(问题知识)越多,扩展的节点就 越少,这样就能更快地搜索到目标节点¨ 。 按照A 算法,在算法实现中需要判断某后继节 点是否在Closed表中,而Closed表较长,因此许多情 况下查找Closed表都要花费很长时间,本算法通过 减小Closed表的长度对此进行了优化。因为任何一 个状态与目标状态对应位置不同元素的个数只可能 是0、2、3、4、5、6、7、8、9个,如果相应位置不同元素个 数为0个,则这种情况下已经成功到达目标状态,此 时只要通过父节点向前搜索即可找到从初始节点到 3 问题的分析与解决 3.1关于解的存在性的结论 目标节点的路径。因此可把Closed表分解为一个含 空格不计,则九宫图的某状态为数1到8的一个 排列,记为n0nln2n3n4n5n6n7。两个状态之间是否可 8个元素的一维数组Closed[8],在将某状态节点插 入到Closed表时,假设该节点与目标节点相应位置 达可以通过计算两者的逆序数来判断,若两者逆序数 的奇偶性相同则可达,否则不可达。也即对于任一个 目标状态节点,只有(1/2)×9 1:181440个状态可 达该节点。 简单证明一下: 不同元素个数为i,将该节点插入到相应的Closed[i一 2]表中,这样Closed[i]表中分别链接了与目标节点 相应位置不同元素的个数为(i+2)个(i=0,1,2, 3,4,5,6,7)的状态节点,这样在判断某状态节点是否 在Closed表中时只要根据它与目标节点相应位置不 left和right操作,不会影响状态的逆序值,因为 它不会改变这个排列。 up和down操作是使某个位置的数字左或右移 两位。由于数字序列的每一次移动会使逆序值奇偶 同元素的个数查找相应的Closed[i]表即可。这是本 算法的又一优化 J。 4 程序数据结构与程序实现 维普资讯 http://www.cqvip.com 2008年第1期l、_奎昊等:基于A 算法的八数码问题的优化实现 31 4.1程序数据结构 继节点是否在Open表、相应的Closed[i]表中,如果 typedef struct SNineGrid//定义包含状态、估价值、指向后 在则不处理该节点,否则把该后继节点按估价函数值 继节点指针等的结构体 插入到有序Open表中,并维持Open表的有序性。  {(3)从Open表中删除节点P并把它插入到相应 int S[3][3];//存放节点棚应的存放值 的Closed[i]表以待将来找路径时用。 int weight;//存放节点的估价值 (4)转(1)循环执行。 SNineGrid parent;//它的父类节点,即产生该节点的节 4.3程序界面 点,可用于同溯找路径 SNineGrid next;//下一个节点,用于链接链表 程序界面如图2所示 。 }SNineGfid, CPtrList; class CNineGrid { public: SNineGrid StateStart;//初始状态节点 SNineGrid StateAim://目标状态节点 SNineGrid StateCur://当前状态节点 CPtrList Open://Open表 CPtrList Closed[8];//将Closed表分解为一个一维数组, 减小了查找长度 CPtrList RouteList;//保存结果 public: int depth;//搜索深度 inline int CalDiferenee();//当前节点与目标节点相应位 置不同元素的个数 图2程序运行界面 bool Successor();//产生后继节点 4.4改进后的性能与改进前性能的比较 void FindRoute();//找出路径 在这里设计了三个有代表性的初始状态,如图3 void InsertList(CPtrList List,CPtrList node);//把节点插 所示。 入链表 void DeleteNode(CPtrList List,CPtrList node);//把节点 从链表删除 田园豳 圈 }; 4.2程序执行步骤 图3实验的初始状态和目标状态 1.首先判断初始状态和目标状态对应排列逆序 在本方法实现的程序中,对于不同的估价函数, 数的奇偶性是否相同,如果两者逆序数的奇偶性不相 将初始状态1、初始状态2、初始状态3输入得到一些 同,则查找不到路径,程序结束,否则程序向下执行第 参数性能如表1所示(设:f是估价函数,h是搜索深 2步。 度,g是初始状态与目标状态中对应位置不同元素个 2.置Open表、Closed[i]表为空,把初始状态节 数)。 点捅人到Open表中。 表1不同估价函数所消耗资源比较 3.循环执行以下几步: 估价函数 f=g f=g+h (1)检查Open表是否为空,如果为空,则查找失 初始状态 初始 初始 初始 初始 初始 初始 败,即没有从初试状态到目标状态的路径,否则找到 状态1 状态2 状态3 状态1 状态2 状态3 路径长 估价函数最优的节点P.产生P的后继节点,并判断 度(步) 28 ‘80 无路径 16 20 无路径 该后继节点是否就是目标节点。如果该后继节点是 搜索时 目标节点则成功找到路径,通过父辈节点找到从初试 <1 1 <1 <1 5 <1 间(s) 状态到目标状态的路径。 通过实验,可知对于估价函数f=g,可很快得 (2)如果该后继节点不是目标节点,则判断该后 到从初始状态到目标状态的路径,但(下转第35页) 维普资讯 http://www.cqvip.com

2008年第1期 吴良清等:基于Web Services的商务智能研究 35 坌析以 o M [2]郑4- ̄,炜fE,韩20毅06,(宋26绍):成52.‘商业智能门户应用策略研究[J]l中心(W e、…bu三D :DI)注册并发布。 ¨ ”,企业用户借助WSDL麓 曲服务鎏 描 [3]OI71 k ̄IP]) .王卫所需访问的分析服务,利用SOAP协议向注册中心发 网络 研究[J]平, 莩: 基于w。b s。n,i。 。 的商务智能 九 .计算机系统应用,2006(7):16.19. 4结束语 夏 .的研究及发展趋势 模地应用了商务智能…。里 ”。~,2006年中国BI软件市场规模 、 行 妻 [8] 霎 n monH : at w h术、构架和应。 。(s。。 川‘。 d Edi . 将超过16亿元人民币,成为了中国软件市场的一大 ti。 )『M1.J。h wil。 &So s,I 。.,№ Y。rk,1996. 亮点。全球BI市场,新许可证的销售收入超过了23 [9]巩曙平.商业智能软件IT产业突起的黑马[J].中国科 (上接第31页) 路径长度可能较长,而对于估价函数f=g+h,虽 5 结束语 然要花费较多的时问 但可得到较短的从初始状态到 本算法主要是用A 算法来求八数码问题的解, 目标状态的路径。在实际中可根据需要选择合适的 并针对八数码这个具体问题进行了优化,对没有路径 估价函数。 的情况事先作了判断,并改进了Open表和Closed表, 将初始状态1、初始状态2、初始状态3输入到改 通过大量的实验证明,本算法提高了程序执行的效 进前算法和改进后算法实现的的程序中得到的性能 率。此外,本程序还设计了灵活的估价函数,通过分 参数如表2所示(此时取估价函数f=g+h)。 析不同估价函数对程序效率的影响,为实际中估价函 表2算法改进前后消耗资源比较 数的选择提供了参考依据。 改进前 改进后 初始状态 初始 初始 初始 初始 初始 初始 参考文献: 状态1 状态2 状态3 状态1 状态2 状态3 [1]蔡自兴,徐光佑.人工智能及其应用[M].北京:清华大 路径长 16 20 无路径 16 20 无路径 学出版社,2004. 度(步) [2] 马少平,朱小燕.人工智能[M].北京:清华大学出版 搜索时 间(.8) <1 8 281O7 <1 5 <1 社.2004. [3]尼尔逊N J.人工智能原理[M].北京:科学出版社, 其中,对于初始状态3,在这种情况下找不到从 1983. 初始节点到目标节点的路径,假如不用事先判断而用 [4] Nimvan Ansafi,Eduwin Hou.用于最优化的计算智能 改进Open表和Closed表的方法来查找路径,需要 [M].李军,边肇祺译.北京:清华大学出社,1999. 9757s能得到找不到路径的结论,这也大大优于算法 [5]霍顿.Visual C++2005入门经典[M].李颂华,康会光 改进前的需要28107s时的效率,这也证明了本方法 译.北京:清华大学出社,2007. 的优越性。 [6]求是科技,王正军.Visual C++6.0程序设计从入门到 精通[M].北京:人民邮电出版社,2006. 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoquwan.com 版权所有 湘ICP备2024080961号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务