赞
踩
A* 算法是一种常见的路径查找、图形遍历算法,是在静态网路中求解最短路径的直接搜索方法。最近在学习机器人路径轨迹规划,所以重新学习一下A*算法。
如下图,图片可以划分为二维数组,每一个方格有唯一状态(可走或者不可走),绿色代表起始点,红色代表目标点,蓝色代表墙壁,计算从绿色到红色走过那些方格,就找到一条路径。
要求:从绿到红,不经过墙体,找一条最短路径。
F(n)=G(n)+H(n)
G(n) 从起始点移动到指定方格的移动代价
H(n) 从指定方格移动到终点的估算成本(试探),并不是实际成本,实际成本只有找出路径之后才能确定。
(对于路径搜索问题,代价就是节点间距离,状态就是其节点)
计算指定方格G(n),就要找出其父亲节点G值,然后加上其父亲节点到指定方格的移动代价。
估计H值,方法有曼哈顿、对角、欧氏距离
曼哈顿:计算从当前方格横向或纵向移动待目标点做经过的方格,并忽略其中的障碍物。
对角:再曼哈顿基础上,加上允许节点朝着相邻斜对角节点移动。
欧氏距离:两点间的直线距离
发现如果H(n)恒为零,A*算法退化为迪杰斯特拉算法
在A*算法中,从起始点开始检查相邻的方格,向四周扩散。
小白认为:影响时间复杂度的因素主要有寻找最小值和查找openlist中的元素,如果使用堆排序对F进行排序,查找openlist元素复杂度会大大增加;反之,亦然,因此可建立结构体保存F与其对应节点,并且建立索引数组保存F和对应节点,对结构体进行排序,排序时间复杂度为O(logn),查找节点近似为常数O(1),复杂度可以优化为为O(nlogn)
参考:A* Pathfinding for Beginners - Artificial Intelligence - Tutorials - GameDev.net
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。