A*算法及其应用

一.引言 图论是计算机科学中的一个重要研究工具,它产生于欧拉(Euler)对图的连通性的研究,但直到本世纪计算机诞生以后才得最迅猛的发展。 图论中的最短路径问题在计算机中有着广泛的应用,例如网络通信中最短路由的选择,人工智能中搜索算法的研究等。 本文对几种常见最短路径的算法进行介绍,尤其是在1968年发展起来的A*算法。 二. 常用算法简介 为叙述的方便,本文中假定所有图均以邻接矩阵表示,并将图论中的常用符号列于下: G---------------------无向图或有向图 A=[aij]----------------图G的邻接矩阵表示 V(G)------------------图G的顶点数 ε(G)-----------------图G的边数。 1. Floyd算法 这是几种最短路径算法中最简单的一种,本文不详细介绍,仅给出算法描述。 算法: For k:=1 to n do For i:=1 to n do For j:=1 to n do If A[i,j]+A[k,j] =0将意味着估价函数是有效的,反之亦然),常量C为从一个结点到相邻结点的权的最大改变。同时我们用一些“容器”来保存估价函数值的子集(这正如o(n)的排序算法的思想),例如,当有10个“容器”时,堆将平均只包含1/10的估价值。因而这将比用堆更为有效。 4. 估价函数(Heuristic Function) 估价函数的正确选取将直接关系到A*算法的成功与否,而函数的确定却与实际情形有着密切的关系。在本文中,仅对网格状地图的估价函数作部分讨论,而在其它情形中,需要作不同的分析,但至少估价函数应为连续函数。 a. Manhattan Distance 这是一种标准的估价函数, h(A) = 10 * (abs(A.x-goal.x) + abs(A.y-goal.y)) b. Diagonal Distance 如果在地图上允许作斜线方向的运动,则Mahattan Distance修正为Diagonal Distance h(A) = max(abs(A.x-goal.x), abs(A.y-goal.y)) 5. 估价函数的判优 一般情形下,我们只需对估价函数的值进行比较而取其大者即可,但在几个结点的估价函数值相同的情形下,我们需要采取一定的策略来决定这几者谁更优,从而避免对多个点的搜索。从而如下代码可实现之: double dx1 = currentX - goalX; double dy1 = currentY - goalY; double dx2 = startX - goalX; double dy2 = startY - goalY; cross = dx1*dy2 - dx2*dy1; if( cross<0 ) cross = -cross; ... add cross*0.001 to the heuristic ... 这段代码计算始点、当前点和终点的矢量积,从而可以判断这三点是否共线(或近似共线),这样不同点间即使有微小的差别也会被放大,从而更利于判断。 6. 改进的A*算法 a. Beam Search 在A*算法中需要保留所有的结点,这将使得时间和空间的消耗都很大,而Beam Search方法对结点数作出限期,当结点数过多时,它会将一些不(大)可能为最优的点排除,从而降低时间和空间的要求,但需要说明的是,由于在排除结点后需对结点排序,当排序的工作量大于排除点后所节省的工作量,则该方法无意义。 b. Iterative deepening 这是一种在人工智能中常使用的方法,它首先产生一近似值,然后对它进行修正而逐步接近最优解。这其实在一种博奕算法的变形。 c. Dynamic weighting 这种算法是基于这样的考虑,即在搜索初期以速度优先,在搜索后期以准确度优先(这可通过对搜索初、后期赋予不同的权值来实现)。即: f(p) = g(p) + w(p) * h(p) d. Bidirectional search 这种算法从起点和终点同时应用A*算法,直到有结点相遇。其缺点在于复杂度太大,一般仅用于复杂的图形。 e. Hierarchical A* 这种算法思想是将搜索过程化,对每个简单过程求解从而得全局较优解。正如当我们到另一城市时,可分解为从家里“搜索”一条路径至车站,再从车站“搜索”一条路径到另一城市,当我们从家里出发时,需要考虑的是怎样尽快地到达车站,而不是怎样尽快地到另一城市。 f. Dynamic A*(D*) 这种算法主要用于人工智能和机器人技术。由于A*算法一开始要求获得全部信息,而这在实际中有时是不可能的,而D*算法就是在假定信息不完整的前提下应用A*算法,但它会随着得到信息的增多而不断改进结果,这就决定了它对空间的要求相当高,因为它需要保留以前的所有获得信息及运算情形。 四. 结论 A*算法作为解决最优路径的一种高效算法,自从1968年诞生以来,得到了广泛的应用,而其的多种改进算法也在许多领域发挥着作用。可以预见,在更优的算法发现以前,A*算法将会得到更广泛的应用,并会由于图论、人工智能、机器人技术、自动控制等多学科的融合而得到更大的发展。 参考文献: [ 1 ] 卢开澄、卢华明,图论及其应用(第二版),北京,清华大学出版社,1982 [ 2 ] Computer Networks(Third Edition),Andrew S. Tanenbaum,Prentice Hall International, Inc.,1998 [ 3 ] Russell & Norvig,AI: A Modern Approach [ 4 ] Ginsberg,Essentials of Artificial Intelligence

你可能感兴趣的:(算法,distance,search,工作,function,网格)