Cocos2d-x 地图行走的实现2:SPFA算法
2015-05-28 08:58
309 查看
Cocos2d-x 地图行走的实现2:SPFA算法
Siliphen2014-08-12 09:36:331938 次阅读本节实践另一种求最短路径算法:SPFA
1.寻路算法实现上的优化
上一节我们实现的Dijkstra用了一个哈希表来保存搜索到的路径树。如果能用直接的访问的方式,就不要用哈希表,因为直接访问的方式会比哈希表更快。我们修改一下图顶点的数据结构。如下:
上一节我们实现的Dijkstra是按照Dijkstra算法的思想用最简单的方法直接做的。这样做是为了更简单地表达出算法的思想。Dijkstra的算法优化就是在于怎样做”选出拥有最小路径估计的顶点“。关于这个问题的优化,可以搜索下 优先级队列,二项堆,斐波那契堆。
std有一个叫 priority_queue 的容器,就是优先级队列。是用priority_queue还是自己写一个优先级队列来优化,你们自己考虑吧。俗话说,师傅领进门,修行靠个人。(什么堆来堆去的数据结构,哥早已忘得一干二净了 睡觉)
2.SPFA算法介绍
SPFA是 Shortest Path Faster Algorithm 的缩写,中文直译过来就是:最短路径快速算法。作用在稀疏图上通常比Dijkstra更快,是一种高效的求最短路径算法。和Dijkstra一样,也是求某个顶点到其他所有顶点的最短路径的一种算法。用我自己理解的话来说,SPFA是这样:
2.1 SPFA算法需要什么
SPFA需要用到一个先进先出的队列Q。
SPFA需要对图中的所有顶点做一个标示,标示其是否在队列Q中。可以用哈希表做映射,也可以为顶点增加一个字段。后者的实现效率更高。
2.2 SPFA是怎样执行的
2.2.1 SPFA的初始化
SPFA的初始化和Dijkstra类似。
先把所有顶点的路径估计值初始化为代价最大值。比如:0x0FFFFFFF。
所有顶点都标记为不在队列中。
起始顶点放入队列Q中。
起始顶点标记在队列中。
起始顶点的最短路径估计值置为最小值,比如0。
然后下面是一个循环。
2.2.2 SPFA循环
循环结束的条件是队列Q为空。第一次进入循环的时候,只有起始顶点一个元素。
每次循环,弹出队列头部的一个顶点。
对这个顶点的所有出边进行松弛。如果松弛成功,就是出边终点上对应的那个顶点的路径代价值被改变了,且这个被松弛的顶点不在队列Q中,就把这个被松弛的顶点入队Q。注意,这里顶点入队的条件有2:1.松弛成功。2.且不在队列Q中。
当队列Q没有了元素。算法结束。
2.3 SPFA伪代码
3.SPFA算法的实现
Dijkstra不需要关心松弛的结果,所以之前的Dijkstra的Relax函数返回值为void。而SPFA是需要知道松弛是否成功的,它根据此结果决定松弛的顶点是否需要入队。所以,我们实现的SPFA的Relax函数需要返回bool。
以下,是我的SPFA实现代码:
Spfa.h
下图是构造了一个比较大的图,对于一次寻路同时用了Dijkstra和SPFA。图的左下角显示2个算法所用的时间。
对于上图来说,SPFA的执行要快于Dijkstra。当然,是和没有用任何优化的Dijkstra比较的结果。一般来说Dijkstra运行比较稳定,优化后也可以得到不错的性能。而SPFA的优势在于稀疏图,也就是边数较少的图。原因很明显,SPFA不需要像Dijkstra那样去选最小路径代价的顶点出来松弛,它只是从队列里面弹出一个即可。如果边数越少,入队的顶点也就越少。
来源网址:http://blog.csdn.net/stevenkylelee/article/details/38440663
相关文章推荐
- Cocos2d-x 地图行走的实现2:SPFA算法
- Cocos2d-x 地图行走的实现2:SPFA算法
- Cocos2d-x 地图行走的实现2:SPFA算法
- Cocos2D实现RPG游戏人物地图行走的跟随效果
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法
- Cocos2D实现RPG游戏人物地图行走的跟随效果
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2D实现RPG游戏人物地图行走的跟随效果
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 地图行走的实现3:A*算法
- cocos2d-x 如何实现角色在地图中的不同高低台阶行走的路线控制
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 2地图步行实现:SPFA算法
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法
- Cocos2d-x 地图行走的实现3:A*算法
- Cocos2d-x 地图行走的实现1:图论与Dijkstra算法