版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
最短路径算法介绍据Drew所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探路,交通路线导航,人工智能,游戏设计等等。美国火星探测器核心的寻路算法就是采用的D*(DStar)算法。最短路经计算分静态最短路计算和动态最短路计算。静态路径最短路径算法是外界环境不变,计算最短路径。主要有Dijkstra算法,A*(AStar)算法。动态路径最短路是外界环境不断发生变化,即不能计算预测的情况下计算最短路。如在游戏中敌人或障碍物不断移动的情况下。典型的有D*算法。5SSSS*tstsu■■■■■■■■■■■tstsu■■■■■■■■■■■WWWJWJWJWJWWTTFVtVtttttttttffi!TFVtVtttttttttffVTHHEfEIEIEIHx*oK»>
sis1划曾划4a*a*a♦‘■aII I二aiaiai二二二,l^il-■s^■l-■8^■l-■5gTTTTTTTTTTW,f■I』♦』*♦♦**一■■sssst^s«MLMl Sts*ssfsfnsnf$$$sm»v«#4444可尊#咨7779kIki—iii.5SSSS*tstsu■■■■■■■■■■■tstsu■■■■■■■■■■■WWWJWJWJWJWWTTFVtVtttttttttffi!TFVtVtttttttttffVTHHEfEIEIEIHx*oK»>
sis1划曾划4a*a*a♦‘■aII I二aiaiai二二二,l^il-■s^■l-■8^■l-■5gTTTTTTTTTTW,f■I』♦』*♦♦**一■■sssst^s«MLMl Sts*ssfsfnsnf$$$sm»v«#4444可尊#咨7779kIki—iii.»»»»»»■■J>«*H-FMVw'»4::::::8♦*************♦,rvssssaUsss»$s»“ssrM.WMM*-■«•»V9V9V9V,!Lssv-9V9*!***•vsvsf!£*-=♦♦*•■••,•♦•*♦**iIFVKEEt,n—■I£>*>»>»>»>«>»>»>»>»>«*5#sss£s^v**sssss»*♦♦_JI-Ml--IIII-11ililililililf1■»»♦•总■IMI♦♦■■■■■■♦厦^s^suff^strnnfisft3fiVKS4444ml£££vmf11&EC■■«■<*.1'-»♦_52*^ssIts**[r ■■■♦•»ss^♦»■+・*•■客Hurs♦,■•I —■&,♦•中3S»«*«!!*»!—dmUmvs!****!vss*»#»*»*!***»*»!vss*»#»*»*!***»*»!vss*»#»*»!»*$»*»!ssstes********♦•♦♦sss^sff—————————————————————jS.Ji•••一If仲忡协1f1f1f・fiF,»一V曾»»»»»■■■»MAMM.f.ssst$*frsusffm,«砌■(■^■^◎♦♦♦♦■•♦♦♦♦一■■♦■■♦»»«—„w*HwwwwsfHllnVVVVw»«s^—,,,rtR*DQn4-,ii1心o-oopg¥♦♦昼群。,。串##目好us3叩-♦9«卬时伸。9«建虾中仲口3口口甲一wp/bf球里*中姿WI5寻讨讨『讨彳一■Lia&,ffl$,具肪看#«#*藩藩茹_E£^:.:::SK£&_-ss_一■■«*ftss■瞿“一vv!!!!!5£W£W£W£W£FFV*V^s^smtffffffam割割聊mmms&si一*»*»»>»»»*»:_vvvivvivvvvi岬ittf-lT-Bsur-BZH#ssssffs^T这是Drew程序实现的10000个节点的随机路网三条互不相交最短路北太长椿桥明光桥I外桥三元东桥I季杳桥朝阳门桥E便门桥会城门桥,云桥万泉庄财—慈斯桥志新桥I海桥东忘门桥国贸桥木樨地桥新兴桥是和宣b街桥器营桥’滔香园桥万泉河桥——^-n—长虹桥北太长椿桥明光桥I外桥三元东桥I季杳桥朝阳门桥E便门桥会城门桥,云桥万泉庄财—慈斯桥志新桥I海桥东忘门桥国贸桥木樨地桥新兴桥是和宣b街桥器营桥’滔香园桥万泉河桥——^-n—长虹桥,一餐桥W农点桥系学知桥曲辰桥健翔桥5696潭桥门桥白石新桥北展桥屯园桥MrijJi〜 JL忌'hW11!园桥XJt&TrrA交慧桥 T四直门桥真实路网计算K条路径示例:节点5696到节点3006,三条最快速路,可以看出路径基本上走环线或主干路。黑线为第一条,兰线为第二条,红线为第三条。约束条件系数为1.2。共享部分路段。显示计算部分完全由Drew自己开发的程序完成。参见K条路算法测试程序Dijkstra算法求最短路径:Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN,CLOSE表方式,Drew为了和下面要介绍的A*算法和D*算法表述一致,这里均采用OPEN,CLOSE表的方式。
大概过程:创建两个表,OPEN,CLOSEoOPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。访问路网中里起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查。从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。遍历考察这个点的子节点。求出这些子节点距起始点的距离值,放子节点到OPEN表中。重复2,3,步。直到OPEN表为空,或找到目标点。irrrrm■*Mb-4-—■■*ib-4-—•FI二二fT二TT土T・二T■isirrrrm■*Mb-4-—■■*ib-4-—•FI二二fT二TT土T・二T■is这是在drew程序中4000个节点的随机路网上Dijkstra算法搜索最短路的演示,黑色圆圈表
示经过遍历计算过的点由图中可以看到Dijkstra算法从起始点开始向周围层层计算扩展,在计
算大量节点后,到达目标点。所以速度慢效率低。提高Dijkstra搜索速度的方法很多,据Drew所知,常用的有数据结构采用Binaryheap的方法,和用Dijkstra从起始点和终点同时搜索的方法。推荐网页:.en/assist/js04/71S045/71S04505/7js045050a.htm简明扼要介绍Dijkstra算法,有图解显示和源码下载。A*(AStar)算法:启发式(heuristic)算法A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。公式表示为:f(n)=g(n)+h(n),其中f(n)是节点n从初始点到目标点的估价函数,g(n)是在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:估价值h(n)<=n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。如果估价值>实际值,搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。估价值与实际值越接近,估价函数取得就越好。例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijstra算法的毫无无方向的向四周搜索。conditionsofheuristicOptimistic(mustbelessthanorequaltotherealcost)Asclosetotherealcostaspossible主要搜索过程:创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。遍历当前节点的各个节点,将n节点放入CLOSE中,取n节点的子节点X,->算X的估价值->While(OPEN!=NULL){从OPEN表中取估价值f最小的节点n;if(n节点==目标节点)break;else{if(XinOPEN)比较两个X的估价值f//注意是同一个节点的两个不同路径的估价值if(X的估价值小于OPEN表的估价值)更新OPEN表中的估价值;〃取最小路径的估价值if(XinCLOSE)比较两个X的估价值〃注意是同一个节点的两个不同路径的估价值if(X的估价值小于CLOSE表的估价值)更新CLOSE表中的估价值;把X节点放入OPEN〃取最小路径的估价值if(Xnotinboth)求X的估价值;并将X插入OPEN表中;〃还没有排序}将n节点插入CLOSE表中;按照估价值将OPEN表中的节点排序;〃实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。}
上图是和上面Dijkstra算法使用同一个路网,相同的起点终点,用A*算法的情况,计算的点数从起始点逐渐向目标点方向扩展,计算的节点数量明显比Dijkstra少得多,效率很高,且能得到最优解。A*算法和Dijistra算法的区别在于有无估价值,Dijistra算法相当于A*算法中估价值为0的情况。推荐文章链接:Amit斯坦福大学一个博士的游戏网站,上面有关于A*算法介绍和不少有价值的链接 /~amitp/GameProgramming/Sunway写的两篇很好的介绍启发式和A*算法的中文文章并有A*源码下载:初识入*算法http://creativeso什./AStart1.htm深入入*算法http://creativeso什./AStart2.htm需要注意的是Sunway上面文章''深入A*算法”中引用了一个A*的游戏程序进行讲解,并有这个源码的下载,不过它有一个不小的Bug,就是新的子节点放入OPEN表中进行了排序,而当子节点在Open表和Closed表中时,重新计算估价值后,没有重新的对Open表中的节点排序,这个问题会导致计算有时得不到最优解,另外在路网权重悬殊很大时,搜索范围不但超过Dijkstra,甚至搜索全部路网,使效率大大降低。Drew对这个问题进行了如下修正,当子节点在Open表和Closed表中时,重新计算估价值后,删除OPEN表中的老的节点,将有新估价值的节点插入OPEN表中,重新排序,经测试效果良好,修改的代码如下,红色部分为Drew添加的代码.添加进程序的相应部分即可。在函数GenerateSucc()中g=BestNode->g+1;/*g(Successor)=g(BestNode)+costofgettingfromBestNodetoSuccessor*/TileNumS=TileNum((int)x,(int)y);/*identificationpurposes*/if((Old=CheckOPEN(TileNumS))!=NULL){for(c=0;c<8;c++)if(BestNode->Child[c]==NULL)/*AddOldtothelistofBestNode'sChildren(orSuccessors).*/break;BestNode->Child[c]=Old;if(g<Old->g){Old->Parent=BestNode;Old->g=g;Old->f=g+Old->h;//Drew在该处添加如下红色代码//ImplementbyDrewNODE*q,*p=OPEN->NextNode,*temp=OPEN->NextNode;while(p!=NULL&&p->NodeNum!=Old->NodeNum)q=p;p=p->NextNode;}if(p->NodeNum==Old->NodeNum){if(p==OPEN->NextNode){temp=temp->NextNode;OPEN->NextNode=temp;}elseq->NextNode=p->NextNode;}Insert(Old);//InsertSuccessoronOPENlistwrtf}另一种A*(AStar)算法:这种算法可以不直接用估价值,直接用Dijkstra算法程序实现A*算法,Drew对它进行了测试,达到和A*完全一样的计算效果,且非常简单。以邻接矩阵为例,更改原来邻接矩阵i行j列元素Dij为Dij+Djq-Diq;起始点到目标点的方向i->j,终点q.Dij为(i到j路段的权重或距离)其中:Djq,Diq的作用相当于估价值Djq=(j到q的直线距离);Diq=(i到q的直线距离)原理:i到q方向符合Dij+Djq>Diq,取Dij+Djq-Diq小,如果是相反方向Dij+Djq-Diq会很大。因此达到向目标方向寻路的作用。动态路网,最短路径算法D*A*在静态路网中非常有效(veryefficientforstaticworlds),但不适于在动态路网,环境如权重等不断变化的动态环境下。D*是动态A*(D-Star,DynamicAStar)卡内及梅隆机器人中心的Stentz在1994和1995年两篇文章提出,主要用于机器人探路。是火星探测器采用的寻路算法。OptimalandEfficientPathPlanningforPartially-KnownEnvironmentsTheFocussedD*AlgorithmforReal-TimeReplanning主要方法(这些完全是Drew在读了上述资料和编制程序中的个人理解,不能保证完全正确,仅供参考):先用Dijstra算法从目标节点G向起始节点搜索。储存路网中目标点到各个节点的最短路和该位置到目标点的实际值h,k(k为所有变化h之中最小的值,当前为k=h。每个节点包含上一节点到目标点的最短路信息1(2),2(5),5(4),4(7)。贝U1到4的最短路为1-2-5-4。原OPEN和CLOSE中节点信息保存。机器人沿最短路开始移动,在移动的下一节点没有变化时,无需计算,利用上一步Dijstra计算出的最短路信息从出发点向后追述即可,当在Y点探测到下一节点X状态发生改变,如堵塞。机器人首先调整自己在当前位置Y到目标点G的实际值h(Y),h(Y)=X到Y的新权值c(X,Y)+X的原实际值h(X).X为下一节点(到目标点方向Y->X->G),Y是当前点。k值取h值变化前后的最小。用A*或其它算法计算,这里假设用A*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年三支一扶试题及答案
- 经编机操作工岗位决策力考核试卷含答案
- 跨境电子商务师基础评估知识考核试卷含答案
- 水下钻井设备操作工岗前知识技能考核试卷含答案
- 2025年职业技能鉴定题库及答案解析
- 2025年中储粮集团内蒙古分公司招聘(65人)笔试历年参考题库附带答案
- 2025年中级统计师《统计工作实务》真题试卷精讲版(含答案解析版)
- 2025年中学教师资格考试《综合素质》教育案例试题与答案解析
- 2025年中医药文化暨知识竞赛题库及答案
- 2025年专技人员公需科目培训考试试题及答案(四)
- SEMI S2 半导体制造设备安全指南培训课件
- 电网红外测温课件
- 2025中国建筑股份有限公司岗位招聘1人(审计部)笔试历年常考点试题专练附带答案详解2套试卷
- 不稳定新心绞痛护理查房
- T∕SMA 0081-2025 船舶油水计量系统测试方法
- 中国阿尔茨海默病痴呆诊疗指南(2025年版)
- 风光互补路灯系统课件
- 2025广东广州市越秀区人民街道办事处招聘辅助人员1人备考题库带答案详解
- 砍伐树木劳工合同范本
- 检验科自身免疫疾病实验室检测规范
- 【初中历史】秦统一中国 课件++2025-2026学年统编版七年级历史上学期
评论
0/150
提交评论