Cocos2d-x 地图行走的实现3:A* 算法
2015-05-28 09:00
381 查看
Cocos2d-x 地图行走的实现3:A* 算法
Siliphen2014-08-14 14:06:203815 次阅读如果读者忘记了之前我们的Dijkstra的实现,请顺藤摸瓜翻到第一节文章回顾一下。为什么要这样做呢?因为本节要讲的A*算法其实是Dijkstra的一种改进,只有理解了Dijkstra才能更好地理解A*。
本节,我们先修改一下之前的Dijkstra的实现,让它变得更像A*的结构。然后,我们再把Dijkstra改成A*。
1.回顾和修改一下之前的Dijkstra的实现
回顾一下之前Dijkstra的实现。Dijkstra需要从一个表Q中选出一个路径代价最小的顶点。之前我们的实现是,一开始就把所有的顶点都放入这个表Q中。仔细想下就会发现,那些被初始化为路径代价最大值0x0FFFFFFF的顶点是不可能会被选中的,对于这些顶点不需要遍历。从表中取出的路径代价最小的顶点,取出一个就表示从起点找到了到这个顶点的最短路径,这些顶点不需要再放回列表中。
我们可以对Dijkstra做这样一个小小的优化,虽然还是O(N^2),时间复杂度没有改变:
一开始只把起始顶点放入表中。
如果松弛成功,就把边终点指向的顶点放入表中。
这样做的话,Relax就要返回结果了。
实现代码如下:
24000 |
2.A*算法
Dijkstra比BFS聪明,A*则比Dijkstra更聪明,运行更快。A*通过一个叫“启发式函数”的东东来改进扩展规则,它会尽量避免扩展其他无用的顶点,它的目标就是朝着目的地直奔而去的。这样说,好像A*长了眼睛一样能看到当前位置距离目标点还有多远。A*和上面的Dijkstra最大的区别就是有“眼睛”:启发式函数。
启发式函数会告诉A*应该优先扩展哪个顶点。启发式函数是怎么回事呢?公式表示是:F = G + H。简单地说,就是:当前顶点的路径代价(G) + 当前顶点距离目标顶点估计花费的代价(F)
之前对Dijkstra做修改优化,就是为了让它更加像A*算法。这里,把Dijkstra的启发式数据从选拥有最小路径代价的顶点改成选拥有最小的F(启发式函数的值)的顶点就变成了A*。估价函数H怎么设计呢?这里取顶点到目标顶点的距离即可。
我们需要对上面的Dijkstra和数据结构做如下改造:
1. 顶点类的寻路数据结构体增加一个Heuristic字段。该字段用于A*算法,保存启发式函数计算出来的值。如下所示:
3.每次循环都判断下,找出来的最小F值的顶点是不是目标顶点。如果是目标顶点,说明找到了路径,算法结束。
用在这里的A*伪代码如下:
Dijkstra 是一样的。所以,在选顶点方面,优化Dijkstra的方案也是优化A*的方案。
Dijkstra 基于实际的路径代价进行扩展,一定能找到最优解。A*则是基于某种估计,如果你让估价函数H估计得太离谱,A* 就不一定能找到最优解了。估价值 <= 实际值A*才能找到最优解。
下面是我实现的A*算法。
AStar.h
AStar类的使用,如下:
经过测试。我们的A*能找到最短路径。并且执行速度比Dijkstra和Spfa都快。
4.简要总结Djikstra,SPFA,A*算法
Dijsktra : 选出一个具有最小路径代价的顶点,松弛其所有的边。
SPFA : 用一个队列存放顶点,从队列中取出队头顶点,松弛其所有边,如果松弛成功,边上顶点入队。
A* : 是Djikstra的改进版。选出具有启发式函数值最小的顶点,松弛其所有的边。
5.本文源代码工程:
Test.zip
来源网址:http://blog.csdn.net/stevenkylelee/article/details/38456419
相关文章推荐
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 地图行走的实现2:SPFA算法
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法
- Cocos2d-x 地图行走的实现2:SPFA算法
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法
- Cocos2d-x 地图行走的实现3:A*算法
- 【Cocos2d-x】地图滚动算法的实现
- Cocos2d-x 地图行走的实现2:SPFA算法
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法
- cocos2d实现2D地图A*广度路径算法
- Cocos2d-x 地图行走的实现2:SPFA算法
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法