概念
- node:节点,格子
- cost:代价
- F:预计的总路径的代价
- G:从起点到点前节点的代价
- H:从当前节点到终点的估计代价
- heuristic:估价函数,估算的到H
- open list:待考察表
- closed list:已考察表
- parent node:父节点,node需要有父节点属性,表示从那个节点走到这个节点
寻路逻辑
1.添加起始节点到待考察表(open list)
2.主循环
a.如果openlist里有节点,找到open list 里拿出最小代价节点,设为当前节点。如果openlist里没有节点了,查找失败。
b.如果当前节点为终点,已经找到路径,跳到第4步
c.考察每个相邻节点(一般可以斜着走时有8个,不斜着走时4个,当然也可以自己定义):(1)如果不能通过,或者已经在已考察表,跳过,继续下一节点
(2)计算它的代价。
(2.5)如果这个节点在openlist里。如果现在的g比较小,重置当前节点为它的父节点,更新这个节点的g,然后跳过下面。如果现在的g没有比较小,直接跳过下面,继续下个节点。
(3)把当前节点定义为这个节点的父节点添加到待考察表
(4)添加当前节点到已考察表
3.更新待考察表,重复第二步。
4.你已经到达终点,创建路径列表并添加终点节点
5.添加终点节点的父节点到路径列表
6.重复添加父节点直到起始节点。路径列表就由一组节点构成了最佳路径
常用估价函数
寻路性能优化
在节点上加一个状态变量,状态有normal,open,close 三种。
这样在判断节点是不是在openlist 或者closelist里时不用每次从列表中搜索,可以减少很多时间。
路径优化 佛洛依德路径平滑算法(floyd)
常见的a*算法的结果是一串用来表示所经过的路径点坐标。但是这样的路径通常是有“锯齿”的,并不符合现实中的智能表现。
因此,需要进一步的进行平滑处理,比如 佛洛依德算法~
算法原理很简单,分为两步:
1.去掉相邻的共线的点
2.去掉多余的拐弯的点
第一步实现起来很简单,只需要遍历一下,计算两个向量的方向是否相同。
第二步的实现稍微麻烦一点,遍历所有的点,去掉两个可以直接通过的点之间的点。
其实是很经典的画直线算法,找两个点作为端点画一条线,这条先经过的网格如果都是可同行的,那么我们就认为在路径中这两个点中间的那些点是多余的。
其实第二步就可以完成优化,但是计算量比较大。所以先通过第一步来减少一部分计算量。
网友评论