金典算法示例.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
金典算法示例要点

? Java中的A*(A star)寻径实现 标签:?javaimport算法nulllistclass 2008-03-04 14:44?9153人阅读?评论(32)?收藏?举报 版权声明:本文为博主原创文章,未经博主允许不得转载。 据我个人所知,目前流行的寻径方法大体有两种,即A* 和Dijkstra(SP算法) Dijkstra算法:? ???? ??? ??? 由Edsger Wybe Dijkstra先生发明(已故) ??? Dijkstra算法是典型的最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是一种逐步有哪些信誉好的足球投注网站算法,通过为每个顶点n保留目前为止所找到的从m到n的最短路径来工作的。 ??? 有哪些信誉好的足球投注网站过程: ?? 假如在第m步有哪些信誉好的足球投注网站到一个最短路径,而该路径上有n个距离源节点最近的节点,则将他们认为是一个节点集合N;在第m+1步,有哪些信誉好的足球投注网站不属于N的距离源节点最近的节点,并有哪些信誉好的足球投注网站到的节点加入到N中;继续有哪些信誉好的足球投注网站,直至到达目的节点,N中的节点集合便是从源节点到目的节点的最短路径。 ??? 算法描述: ??? Dijkstra算法是通过为每个顶点v保留目前为止所找到的从s到v的最短路径来工作的。初始时,源点s的路径长度值被赋为0(d[s]=0), 同时把所有其他顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于V中所有顶点v除s外d[v]= ∞)。当算法结束时,d[v]中储存的便是从s到v的最短路径,或者如果路径不存在的话是无穷大。 Dijstra算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到u的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到v的路径。这条路径的长度是d[u]+w(u,v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行到所有的d[v]都代表从s到v最短路径的花费。这个算法经过组织因而当d[u]达到它最终的值的时候没条边(u,v)都只被拓展一次。算法维护两个顶点集S和Q。集合S保留了我们已知的所有d[v]的值已经是最短路径的值顶点,而集合Q则保留其他所有顶点。集合S 初始状态为空,而后每一步都有一个顶点从Q移动到S。这个被选择的顶点是Q中拥有最小的d[u]值的顶点。当一个顶点u从Q中转移到了S中,算法对每条外接边(u,v)进行拓展。? A*(A Star)算法: ??? ??? A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。 ??? 公式表示为:f(n)=g(n)+h(n), 其中f(n) 是节点n从初始点到目标点的估价函数,g(n) 是在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。 ???? 有哪些信誉好的足球投注网站过程: ????? ???? 创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。遍历当前节点的各个节点,将n节点放入CLOSE中,取n节点的子节点X,-算X的估价值. ??? ??? While(OPEN!=NULL) ??? ??? { ??? ??? 从OPEN表中取估价值f最小的节点n; ??? ??? if(n节点==目标节点) break; ??? ??? else ??? ??? { ??? ??? if(X in OPEN) 比较两个X的估价值f //注意是同一个节点的两个不同路径的估价值 ??? ??? if( X的估价值小于OPEN表的估价值 ) ??? ???    更新OPEN表中的估价值; //取最小路径的估价值 ??? ??? if(X in CLOSE) 比较两个X的估价值 //注意是同一个节点的两个不同路径的估价值 ??? ??? if( X的估价值小于CLOSE表的估价值 ) ??? ???    更新CLOSE表中的估价值; 把X节点放入OPEN //取最小路径的估价值 ??? ??? if(X not in both) ??? ??? 求X的估价值; ??? ???    并将X插入OPEN表中; //还没有排序 ??? ??? } ??? ??? 将n节点插入CLOSE表中; ??? ??? 按照估价值将OPEN表中的节点排序; //实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。 ??? ??? } 就实际应用而言,A*算法和Dijistra算法的最大区别就在于有无估价值,本质上Dijistra算法相当于A*算法中估价值为0的情况。所以此次我选取A*算法进行Java实现。 抛开理论性的数学概

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档