`
qinysong
  • 浏览: 190864 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

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

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

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

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


演示如下: 
    
   



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

寻路次数比较(5秒钟寻路次数) 


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

     
 

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

   

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

      


4、封闭障碍(目标不可达)
此种情况,根据以上测试数据,B*算法效率是普通A*的581倍(左为A*,右为B*)
    

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

 

分享到:
评论
79 楼 nfsfairytale 2019-05-21  
求附件求附件
78 楼 wafer1021 2018-10-18  
想在服务端运用这种
77 楼 zhezhelin 2018-04-29  
最新代码有吗
76 楼 zyh2018 2017-11-18  
你好!很开心看到你写的B*算法,但是C++版本的代码看起来很吃力,原谅我C++学的不好,请问楼主有没有C或者matlab版本的代码,或者有详细的伪代码流程也可以,能不能发给我一份呢?如果可以,不胜感激,邮箱1982435427@qq.com
75 楼 asuralove 2017-07-07  
学习了~~~~
74 楼 yiubian 2015-12-21  
写得不错,学习了。
73 楼 cctvwspc 2015-09-10  
要附件啊!
72 楼 zzz郑家兴 2015-04-30  
71 楼 h348592532 2015-03-18  
如果可以斜着走,很明显你这没法可以找到最佳路径,就知道不停的往前冲,说白你这个是可以分支的贪心算法的确还会出各种未知的问题,伦理验证性不强,谁敢用,呵呵
70 楼 余庆楚 2015-03-16  
非常的厉害,想了解具体的实现
69 楼 adomi 2015-01-29  
附件在哪里啊啊 我靠
68 楼 AirTayork 2014-06-10  
可以试试,但是似乎无法保证最短路径
67 楼 simbi 2014-05-26  
看起来不错
66 楼 stongan 2014-03-31  
感谢楼主。。。。。
65 楼 cpjsjxy 2014-03-20  
附件呢?111
64 楼 pu_user 2014-03-12  
看看到底什么东东
63 楼 a1991221 2014-01-14  
附件在哪里啊啊 我靠
62 楼 bugsou 2014-01-10  
搞下来看看-。-
61 楼 Tree168 2013-11-09  
附件是在评论后才显示的吗?
60 楼 ligyu110 2013-09-27  
wulanchun 写道
where is "附件"

同求

相关推荐

    寻路算法 - A*算法(简易函数接口)

    最新在研究寻路算法,在此要感谢大佬的技术支持 https://bbs.egret.com/thread-2524-1-1.html 我研究大佬的代码后,取出了A* 的计算函数。 我在大佬的帖子里,看到有高人提出:分帧计算的概念 下一篇博,会根据...

    A*走路 自动寻路A*算法 易语言源码优化版

    A*走路 自动寻路A*算法 易语言源码优化版 A*走路 自动寻路A*算法 易语言源码优化版 A*走路 自动寻路A*算法 易语言源码优化版

    VB A星寻路算法 VB A*寻路算法

    VB 中的A星寻路算法 用了折半快速插入有序队列可以很快的添加结点数据 数组是以距离从大到小的一个有序队列 每次取数组中最后的数据,可以快速删除 例如:redim preserve A(ubound(A)-1)

    A*寻路算法 源码

    没积分了,下不了资源,只求一分,A*寻路算法 源码 c#

    unityAStar寻路 A星 A*寻路算法Demo

    基于Unity5.4.4版本,随机障碍物,动态实现寻路,UnityA星寻路完整Demo

    3dA*自动寻路算法

    3dA*自动寻路算法 这个就放着,,以后用的着自己下,没别的用途

    A*自动寻路算法实现(java)

    下载本程序仅可演示A*自动寻路算法实现(java),该程序是基于我写的网络版贪吃蛇基础上编写的(网络版贪吃蛇...wasd键控制太阳的方向,鼠标左击目的地,会根据A*自动寻路算法计算出一条最优路线,太阳按最优路线移动。

    A星寻路算法(A*)

    寻路,经典A星算法(A*): 1。采用静态内存方案,寻路过程不会出现动态内存分配,杜绝内存泄漏的可能 2。CloseList采用直接寻址方式实现 3。OpenList采用优化过的遍历查找插入算法,实现简单高效。如果哪位有二叉堆...

    【转】A*寻路 -- 弗洛伊德(Floyd)算法

    NULL 博文链接:https://gcc2ge.iteye.com/blog/2274048

    b* 寻路算法

    b 星 b start b* 寻路 算法

    软件价值3-A*算法寻路

    A*寻路算法

    六边形A*寻路算法源码(As3版本)

    六边形A*寻路算法源码(As3版本)在六边形战棋类游戏中可以使用

    自动寻路算法(A*算法)分享

    NULL 博文链接:https://871656094.iteye.com/blog/2355341

    B*寻路算法 C Sharp实现

    高效的B*算法,比A*算法高5-500倍,为RPG游戏实现寻路提供了又一个最优化的解决方案。

    A星和B星寻路算法

    用XNA4.0平台上写得A*和B*算法,其中B*算法有BUG的!由于时间关系没修复,但解决一般简单的路径是没问题的。只提供参考了解B*算法用。具体思路解释看代码注释。(ctrl + a进行A星算法,ctrl + b进行B星算法)

    A星寻路算法(A*)Flex 实现

    A星(A*)寻路算法Flex实现,源码是Flex开发的工程文件,可运行,可演示,仅供学习交流。

    Erlang B星寻路算法源代码 B*寻路算法源代码

    Erlang B星寻路算法源代码 B*寻路算法源代码, 由C++改写而来。效率是A星算法的几十倍到上百倍。做为服务端怪物寻路的最佳选择。

    论文研究-基于A*的矢量寻路算法 .pdf

    基于A*的矢量寻路算法,谌显,杨克俭,最短路径搜索是路径分析中的热点问题,也是物流运输系统中的关键技术之一。A*算法是一种经典的最短路径搜索算法。本文在分析和研�

    寻路算法,A*算法实例代码,JAVA

    一个生成r行c列地图、随机起始点终点、障碍,及地图显示路径的简单例子。 算法学习总结: 1.初始化开列表,关列表; 2.起点计算周围节点f值(g+h);周围节点放入开列表,起点加入关列表; 3.从开列表取f值最小值作为...

Global site tag (gtag.js) - Google Analytics