2012A层次搜索算法
- 格式:pdf
- 大小:997.34 KB
- 文档页数:60


11网络通信技术Network Communication Technology电子技术与软件工程Electronic Technology & Software EngineeringA*(A-Star )算法是一种静态路网中求解最短路径的直接搜索方法,因其灵活简便和对完整性及最优性的保证得以在机器人低维路径规划领域中广泛应用。
但同时也存在以下缺陷:一是在大规模环境中应用时,节点网络非常庞大,算法运行时间长;二是扩展节点时占用内存开销较大;三是计算复杂度依赖环境网格分辨率大小。
针对这些缺陷,已有很多学者提出了改进。
本文首先介绍A*算法原理并进行影响因素分析,然后从启发函数、搜索策略、数据存储与查找等方面介绍A*算法的改进方法及研究现状,进而展望了算法未来发展和面临的挑战。
1 A*算法原理A*算法是一种有序搜索算法,相比于Dijkstra 算法,加入了启发函数,使其朝着目标点有方向性的扩展节点,因此算法效率有了较大的提升。
A*算法的特点是,对于遍历的每一个节点,都采用一个评价函数f(n)来计算其通过该节点的代价,在每一次搜索时总是选择当前位置周围通行代价f(n)最小的点来扩展,如此从起始节点不断搜索直到找到目标节点,生成一条通行代价最小的路径。
关于评价函数的计算方式如下式:f(n)=g(n)+h(n) (1)其中,h(n)代表从当前点到目标点的估计代价,同时也是启发函数,g(n)计算方式为从起点到节点n 的实际行走距离。
2 算法分析由原理分析可知,影响A*算法搜索效率的主要因素是:2.1 启发函数的设置一般来说,从当前节点到目标点的启发函数一般小于实际路径代价,这样才可能得到最优解,但同时会增加扩展的节点数,增大算法时间开销。
理想情况是启发函数h(n)恰好等于实际路径代价,这样扩展节点最少,且刚好能找到最优路径。
2.2 访问open表寻找f(n)最小值的时间开销大传统的open 表可能采用Array 、List 、Queue 等结构来存储节点信息,随着搜索深度越深,要查找的节点就越多,每次扩展节点时都需要对open 表排序,查找f 最小值的节点,这会耗费部分时间,所以优化open 表的排序和查找是一个关键的改进方向。
定向搜索在A*算法的循环中,OPEN集合用来保存所有用于寻找路径的被搜索节点。
定向搜索是在A*算法基础上,通过对OPEN集合大小设置约束条件而得到的变体算法。
当集合太大的时候,最不可能出现在最优路径上的节点将会被剔除。
这样做会带来一个缺点:由于必须得保持这样的筛选,所以可选择的数据结构类型会受到限制。
迭代深化(Iterative deepening)迭代深化是一种很多AI算法采用的方法,开始的时候给一个估计值,然后通过迭代使它越来越精确。
这个名字来源于游戏树搜索中对接下来几次操作的提前预判(例如,在象棋游戏中)。
你可以通过向前预判更多的操作来深化游戏树。
一旦当你的结果不发生变化或提高很多,就可以认为你已经得到了一个非常好的结果,即使让它更精确,结果也不会再改善。
在迭代深化A*(IDA*)算法中,“深度”是f 值当前的一个截断值。
当 f 值太大的时候,节点不会被考虑(也就是说,不会被加入到OPEN集中)。
第一次循环时,只需要处理非常少的节点。
随后的每次循环,都会增加访问的节点数。
如果发现路径得到优化,就继续增加当前的截断值,否则结束。
更多细节,参见链接。
我个人并不看好IDA*算法在游戏地图寻路中的应用。
迭代深化的算法往往增加了计算时间,同时降低了内存需求。
然而,在地图寻路的场景中,节点仅仅包含坐标信息,所需要的内存非常小。
所以减少这部分内存开销并不会带来什么优势。
动态加权在动态加权算法中,你假定在搜索开始时快速达到(任意)一个位置更为重要,在搜索结束时到达目标位置更为重要。
f(p) = g(p) + w(p) * h(p)有一个权值(w >= 1 )和该启发式关联。
当不断接近目标位置的时候,权重值也不断降低。
这样降低了启发式函数的重要性,并增加了路径实际代价的相对重要性。
带宽搜索带宽搜索有两个被认为非常有用的特性。
这个算法变体假设h 是一个估计过高的值,但它的估计误差不会超过e。
最短路径问题的优化算法最短路径问题是计算网络中两个节点之间最短路径的一个经典问题。
在许多实际应用中,如导航系统、交通规划和物流管理等领域,寻找最短路径是一个重要的任务。
然而,当网络规模较大时,传统的最短路径算法可能会面临计算时间长、耗费大量内存等问题。
为了解决这些问题,研究人员提出了许多优化算法,以提高最短路径问题的计算效率。
一、Dijkstra算法的优化Dijkstra算法是最短路径问题中最经典的解法之一,但当网络中的节点数量较大时,其计算时间会显著增加。
为了优化Dijkstra算法,研究者提出了以下几种改进方法:1. 堆优化Dijkstra算法中最耗时的操作是从未访问节点中选取最短路径的节点。
传统的实现方式是通过线性搜索来选择下一个节点,时间复杂度为O(N),其中N是节点的数量。
而使用堆数据结构可以将时间复杂度降低到O(lgN),从而提高算法的效率。
2. 双向Dijkstra算法双向Dijkstra算法是通过同时从起点和终点开始搜索,以减少搜索的范围和时间。
在搜索过程中,两个搜索方向逐渐靠近,直到找到最短路径为止。
双向Dijkstra算法相比传统的Dijkstra算法能够减少搜索空间,因此在网络规模较大时可以提供更快的计算速度。
二、A*算法A*算法是一种启发式搜索算法,常用于解决最短路径问题。
与传统的Dijkstra算法不同,A*算法通过引入启发函数来优先搜索距离终点较近的节点。
启发函数的选择对算法的效率有重要影响,一般需要满足启发函数低估距离的性质。
A*算法的时间复杂度取决于启发函数,如果启发函数选择得恰当,可以在大规模网络中快速找到最短路径。
三、Contraction Hierarchies算法Contraction Hierarchies(CH)算法是近年来提出的一种高效解决最短路径问题的方法。
CH算法通过预处理网络,将网络中的节点进行合并,形成层次结构。
在查询最短路径时,只需在层次结构上进行搜索,大大减少了计算复杂度。