一种高效的寻路算法 - B*寻路算法

http://qinysong.iteye.com/blog/678941


在此把这个算法称作B* 寻路算法(Branch Star 分支寻路算法,且与A*对应),本算法适用于游戏中怪物的自动寻路,其效率远远超过A*算法,经过测试,效率是普通A*算法的几十上百倍。 

通过引入该算法,一定程度上解决了游戏服务器端无法进行常规寻路的效率问题,除非服务器端有独立的AI处理线程,否则在服务器端无法允许可能消耗大量时间的寻路搜索,即使是业界普遍公认的最佳的A*,所以普遍的折中做法是服务器端只做近距离的寻路,或通过导航站点缩短A*的范围。 

算法原理 
本算法启发于自然界中真实动物的寻路过程,并加以改善以解决各种阻挡问题。 
前置定义: 
1、探索节点: 
为了叙述方便,我们定义在寻路过程中向前探索的节点(地图格子)称为探索节点,起始探索节点即为原点。(探索节点可以对应为A*中的开放节点) 

2、自由的探索节点: 
探索节点朝着目标前进,如果前方不是阻挡,探索节点可以继续向前进入下一个地图格子,这种探索节点我们称为自由探索节点; 

3、绕爬的探索节点: 
探索节点朝着目标前进,如果前方是阻挡,探索节点将试图绕过阻挡,绕行中的探索节点我们成为绕爬的探索节点; 
算法过程 
1、起始,探索节点为自由节点,从原点出发,向目标前进; 
2、自由节点前进过程中判断前面是否为障碍, 
     a、不是障碍,向目标前进一步,仍为自由节点; 
     b、是障碍,以前方障碍为界,分出左右两个分支,分别试图绕过障碍,这两个分支节点即成为两个绕爬的探索节点; 
3、绕爬的探索节点绕过障碍后,又成为自由节点,回到2); 
4、探索节点前进后,判断当前地图格子是否为目标格子,如果是则寻路成功,根据寻路过程构造完整路径; 
5、寻路过程中,如果探索节点没有了,则寻路结束,表明没有目标格子不可达; 


演示如下:  
一种高效的寻路算法 - B*寻路算法_第1张图片     一种高效的寻路算法 - B*寻路算法_第2张图片
一种高效的寻路算法 - B*寻路算法_第3张图片    一种高效的寻路算法 - B*寻路算法_第4张图片
一种高效的寻路算法 - B*寻路算法_第5张图片


B*与A*算法的性能比较 

寻路次数比较(5秒钟寻路次数) 
一种高效的寻路算法 - B*寻路算法_第6张图片

  
B*与A*性能比较实例 
1、 无障碍情况 
此种情况,根据以上测试数据,B*算法效率是普通A*的44倍(左为A*,右为B*) 

一种高效的寻路算法 - B*寻路算法_第7张图片      一种高效的寻路算法 - B*寻路算法_第8张图片
  

2、线形障碍 
此种情况,根据以上测试数据,B*算法效率是普通A*的28倍(左为A*,右为B*) 

一种高效的寻路算法 - B*寻路算法_第9张图片    一种高效的寻路算法 - B*寻路算法_第10张图片

   
3、环形障碍 
此种情况,根据以上测试数据,B*算法效率是普通A*的132倍(左为A*,右为B*) 

一种高效的寻路算法 - B*寻路算法_第11张图片     一种高效的寻路算法 - B*寻路算法_第12张图片 


4、封闭障碍(目标不可达) 
此种情况,根据以上测试数据,B*算法效率是普通A*的581倍(左为A*,右为B*) 
一种高效的寻路算法 - B*寻路算法_第13张图片     一种高效的寻路算法 - B*寻路算法_第14张图片

衍生算法 
通过以上封闭障碍,可以看出,这个方法在判断地图上的两个点是否可达上,也是非常高效的,在不可达情况下,时间复杂度与封闭障碍的周长相当,而不是整个地图的面积。 

评论
74 楼  yiubian 2015-12-21  
写得不错,学习了。
73 楼  cctvwspc 2015-09-10  
要附件啊!
72 楼  zzz郑家兴 2015-04-30  
71 楼  h348592532 2015-03-18  
如果可以斜着走,很明显你这没法可以找到最佳路径,就知道不停的往前冲,说白你这个是可以分支的贪心算法的确还会出各种未知的问题,伦理验证性不强,谁敢用,呵呵



你可能感兴趣的:(游戏服务端代码优化)