




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深入A*算法 -浅析A*算法在搜索最短路径中的应用Sunway目 录1A*算法的程序编写原理2用A*算法实现最短路径的搜索在这里我将对A*算法的实际应用进行一定的探讨,并且举一个有关A*算法在最短路径搜索的例子。值得注意的是这里并不对A*的基本的概念作介绍,如果你还对A*算法不清楚的话,请看姊妹篇初识A*算法。这里所举的例子是参考AMIT主页中的一个源程序,你可以在AMIT的站点上下载也可以在我的站点上下载。你使用这个源程序时,应该遵守一定的公约。1、A*算法的程序编写原理我在初识A*算法中说过,A*算法是最好优先算法的一种。只是有一些约束条件而已。我们先来看看最好优先算法是如何编写的吧。如图有如下的状态空间:(起始位置是A,目标位置是P,字母后的数字表示节点的估价值)。如图有如下的状态空间:(起始位置是A,目标位置是P,字母后的数字表示节点的估价值)图1 状态空间图搜索过程中设置两个表:OPEN和CLOSED。OPEN表保存了所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。算法中有一步是根据估价函数重排OPEN表。这样循环中的每一步只考虑OPEN表中状态最好的节点。具体搜索过程如下:1)初始状态:OPEN=A5;CLOSED=;2)估算A5,取得搜有子节点,并放入OPEN表中;OPEN=B4, C4, D6;CLOSED=A53)估算B4,取得搜有子节点,并放入OPEN表中;OPEN=C4, E5, F5, D6;CLOSED=B4, A54)估算C4;取得搜有子节点,并放入OPEN表中;OPEN=H3, G4, E5, F5, D6 CLOSED=C4, B4, A55)估算H3,取得搜有子节点,并放入OPEN表中;OPEN=O2, P3, G4, E5, F5, D6;CLOSED=H3C4, B4, A56)估算O2,取得搜有子节点,并放入OPEN表中;OPEN=P3, G4, E5, F5, D6;CLOSED=O2, H3, C4, B4, A57)估算P3,已得到解;看了具体的过程,再看看伪程序吧。算法的伪程序如下:Best_First_Search()Open = 起始节点;Closed = ;while ( Open表非空 )从Open中取得一个节点X, 并从OPEN表中删除.if (X是目标节点)求得路径PATH;返回路径PATH;for (每一个X的子节点Y)if( Y不在OPEN表和CLOSE表中 )求Y的估价值;并将Y插入OPEN表中;/还没有排序else if( Y在OPEN表中 )if( Y的估价值小于OPEN表的估价值 )更新OPEN表中的估价值;else/Y在CLOSE表中if( Y的估价值小于CLOSE表的估价值 )更新CLOSE表中的估价值;从CLOSE表中移出节点, 并放入OPEN表中;将X节点插入CLOSE表中;按照估价值将OPEN表中的节点排序;/end for/end while/end func啊!伪程序出来了,写一个源程序应该不是问题了,依葫芦画瓢就可以。A*算法的程序与此是一样的,只要注意估价函数中的g(n)的h(n)约束条件就可以了。不清楚的可以看看初识A*算法。好了,我们可以进入另一个重要的话题,用A*算法实现最短路径的搜索。在此之前你最好认真的理解前面的算法。不清楚可以找我。2、用A*算法实现最短路径的搜索在游戏设计中,经常要涉及到最短路径的搜索,现在一个比较好的方法就是用A*算法进行设计。他的好处我们就不用管了,反正就是好!注意下面所说的都是以ClassAstar这个程序为蓝本,你可以在这里下载这个程序。这个程序是一个完整的工程。里面带了一个EXE文件。可以先看看。先复习一下,A*算法的核心是估价函数f(n),它包括g(n)和h(n)两部分。g(n)是已经走过的代价,h(n)是n到目标的估计代价。在这个例子中g(n)表示在状态空间从起始节点到n节点的 深度,h(n)表示n节点所在地图的位置到目标位置的直线距离。啊!一个是状态空间,一个是实际的地图,不要搞错了。再详细点说,有一个物体A,在地图上的坐标是(xa,ya),A所要到达的目标b的坐标是(xb,yb)。则开始搜索时,设置一个起始节点1,生成八个子节点2 - 9 因为有八个方向。如图:图2 节点图先看搜索主函数:void AstarPathfinder:FindPath(int sx, int sy, int dx, int dy)NODE *Node, *BestNode;int TileNumDest;/得到目标位置,作判断用TileNumDest = TileNum(sx, sy);/生成Open和Closed表OPEN=( NODE* )calloc(1,sizeof( NODE );CLOSED=( NODE* )calloc(1,sizeof( NODE );/生成起始节点,并放入Open表中Node=( NODE* )calloc(1,sizeof( NODE );Node-g = 0;/这是计算h值Node-h = (dx-sx)*(dx-sx) + (dy-sy)*(dy-sy);/ should really use sqrt()./这是计算f值,即估价值Node-f = Node-g+Node-h;Node-NodeNum = TileNum(dx, dy);Node-x = dx;Node-y = dy;OPEN-NextNode=Node;/ make Open List point to first nodefor (;)/从Open表中取得一个估价值最好的节点BestNode=ReturnBestNode();/如果该节点是目标节点就退出if (BestNode-NodeNum = TileNumDest)/ if weve found the end, break and finishbreak;/否则生成子节点GenerateSuccessors(BestNode,sx,sy);PATH = BestNode;再看看生成子节点函数 GenerateSuccessors:void AstarPathfinder:GenerateSuccessors(NODE *BestNode, int dx, int dy)int x, y;/依次生成八个方向的子节点,简单!/ Upper-Leftif ( FreeTile(x=BestNode-x-TILESIZE, y=BestNode-y-TILESIZE) )GenerateSucc(BestNode,x,y,dx,dy);/ Upperif ( FreeTile(x=BestNode-x, y=BestNode-y-TILESIZE) )GenerateSucc(BestNode,x,y,dx,dy);/ Upper-Rightif ( FreeTile(x=BestNode-x+TILESIZE, y=BestNode-y-TILESIZE) )GenerateSucc(BestNode,x,y,dx,dy);/ Rightif ( FreeTile(x=BestNode-x+TILESIZE, y=BestNode-y) )GenerateSucc(BestNode,x,y,dx,dy);/ Lower-Rightif ( FreeTile(x=BestNode-x+TILESIZE, y=BestNode-y+TILESIZE) )GenerateSucc(BestNode,x,y,dx,dy);/ Lowerif ( FreeTile(x=BestNode-x, y=BestNode-y+TILESIZE) )GenerateSucc(BestNode,x,y,dx,dy);/ Lower-Leftif ( FreeTile(x=BestNode-x-TILESIZE, y=BestNode-y+TILESIZE) )GenerateSucc(BestNode,x,y,dx,dy);/ Leftif ( FreeTile(x=BestNode-x-TILESIZE, y=BestNode-y) )GenerateSucc(BestNode,x,y,dx,dy);看看最重要的函数GenerateSucc:void AstarPathfinder:GenerateSucc(NODE *BestNode,int x, int y, int dx, int dy)int g, TileNumS, c = 0;NODE *Old, *Successor;/计算子节点的 g 值g = BestNode-g+1;/ g(Successor)=g(BestNode)+cost of getting from BestNode to SuccessorTileNumS = TileNum(x,y);/ identification purposes/子节点再Open表中吗?if ( (Old=CheckOPEN(TileNumS) != NULL )/ if equal to NULL then not in OPEN list, / else it returns the Node in Old/若在for( c = 0; c Childc = NULL )/ Add Old to the list of BestNodes Children / (or Successors).break;BestNode-Childc = Old;/比较Open表中的估价值和当前的估价值(只要比较g值就可以了)if ( g g )/ if our new g value is Parent = BestNode;Old-g = g;Old-f = g + Old-h;else/在Closed表中吗?if ( (Old=CheckCLOSED(TileNumS) != NULL )/ if equal to NULL then not in OPEN list / else it returns the Node in Old/若在for( c = 0; cChildc = NULL )/ Add Old to the list of BestNodes/ Children (or Successors). break;BestNode-Childc = Old;/比较Closed表中的估价值和当前的估价值(只要比较g值就可以了)if ( g g )/ if our new g value is Parent = BestNode;Old-g = g;Old-f = g + Old-h;/再依次更新Old的所有子节点的估价值PropagateDown(Old);/ Since we changed the g value of Old, we need / to propagate this new value downwards, i.e. / do a Depth-First traversal of the tree!else/不在Open表中也不在Close表中/生成新的节点Successor = ( NODE* )calloc(1,sizeof( NODE );Successor-Parent = BestNode;Successor-g = g;Successor-h = (x-dx)*(x-dx) + (y-dy)*(y-dy);/ should do sqrt(), but since we dont reallySuccessor-f = g+Successor-h;/ care about the distance but just which branchlooks Successor-x = x;/ better this should suffice. Anyayz its faster.Successor-y = y;Successor-NodeNum = TileNumS;/再插入Open表中,同时排序。Insert(Successor);/ Insert Successor on OPEN list wrt ffor( c =0; c Childc = NULL )/ Add Old to the list of BestNodesChildren (or Successors).break;BestNode-Childc = Successor;哈哈。A*算法我懂了。当然,我希望你有这样的感觉。不过我还要再说几句。仔细看看这个程序,你会发现,这个程序和我前面说的伪程序有一些不同,在Ge
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025江苏省退役军人事务厅直属优抚医院招聘12人考前自测高频考点模拟试题附答案详解
- 安全培训教学壁纸课件
- 2025年闭式塔项目合作计划书
- 2025湖南新宁县事业单位和县属国有企业人才引进降低开考比例岗位考前自测高频考点模拟试题及答案详解(易错题)
- 2025福建泉州发展集团有限公司(第一批)人才引进招聘25人模拟试卷及一套完整答案详解
- 客户信息采集及管理工具
- 小区农业设施共享管理协议
- 2025年安徽交控集团所属安徽交控石油有限公司招聘16人模拟试卷及答案详解(名师系列)
- 2025广东韶关市翁源县人民法院招聘劳动合同制书记员1人模拟试卷及答案详解(新)
- 医学研究成果安全保障承诺书(3篇)
- 2025年湖北省公务员公开遴选笔试试题及答案(综合类)
- 二年级美术上册教案-《5. 千姿百态的桥》教学设计人美版
- 厨房设备维护课件
- 营养科工作流程与管理规范
- 压铸模具基础知识培训课件
- 自动化技术职业生涯规划
- 江西省气象局系统公开招聘笔试模拟试题及参考答案详解1套
- 入店服务35课件
- 120救护车仪器设备理论考核试题(含答案)
- 胸痛教学查房课件
- 开贷款中介公司策划方案
评论
0/150
提交评论