`

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*) 
     

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

分享到:
评论

相关推荐

    b* 寻路算法

    b 星 b start b* 寻路 算法

    B*寻路算法 C Sharp实现

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

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

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

    迭代练习-寻路算法

    c++ 寻路 最小距离c++

    A星和B星寻路算法

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

    深入理解js A*寻路算法原理与具体实现过程

    本文实例讲述了js A*寻路算法原理与具体实现过程。分享给大家供大家参考,具体如下: 这两天研究了下 A* 寻路算法, 主要学习了这篇文章, 但这篇翻译得不是很好, 我花了很久才看明白文章中的各种指代. 特写此篇博客...

    AStar:A *寻路算法的实现

    Java中A *寻路算法的实现。 在GUI应用程序中显示。 程序显示从点A到点B的最短路径,绕过任何不可遍历的(黑色)空间。 还显示通过算法观察到的在网格上任何空间到B点的启发式距离。 用法 ###编译并运行: 编译...

    A星寻路算法&B星寻路算法 c++实现 MFC

    代码中实现了3种寻路算法AStar,AStar_Direct,BStar() 在VS2019环境下运行,建议以release方式运行,DEBUG没有调会崩溃

    B星算法C++版.rar

    b星寻路算法,里面也有a星的算法,找了很久才找到的,有DEMO演示,供大家学习使用。b星寻路算法,里面也有a星的算法,找了很久才找到的,有DEMO演示,供大家学习使用。

    C#实现的b-star寻路算法

    c#实现的b-star算法, 讲解和详情见博客: https://blog.csdn.net/Koweico/article/details/107114537

    A星寻路算法

    在游戏中,有一个很常见地需求,就是要让一个角色从A点走向B点,我们期望是让角色走最少的路。... 是的,我们需要有一个算法来解决这个问题,算法的目标就是计算出两点之间的最短路径,而且要能避开障碍物。

    游戏引擎UNITY_A*算法(完整好用)

    A *寻路项目,导入资源,可以在unity内实现寻找A点和B点之间的最佳路径。 内涵 A Pathfinding Project Pro v3.7.unitypackage astarpathfindingproject_master_free_4_2_15_671e80cf.unitypackage 欢迎下载使用

    一个算法寻路游戏小案例

    一个算法寻路游戏小案例,实现的简单A*算法寻路Demo。A*寻路一般可用于游戏当中计算人物走动的线路。Demo测试方法是,迷宫中黑点是障碍物,绿点是可以走过的点,红点是起始点,然后点击任意绿点会生成一个灰色点,...

    As3 A星寻路算法

    As3的A星算法代码,包括了一个演示。分享是一种美德

    在Unity中实现Astar寻路算法

    本文将介绍寻路算法中的A*算法,并在unity中用C#脚本来实现寻路功能。 问题描述 现在有两个点:起点A,和终点B,允许向周围的八个方向移动,如图所示。需要找到从起点A到终点B效率最高的路径。 当不存在任何障碍物...

    pathfindingvisualizer:寻路算法的可视化

    寻路可视化器 寻路算法的可视化 按b添加一个起始节点 按n添加结束节点 使用左键和右键单击绘制/移除障碍 按空格开始深度优先搜索图

    JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】

    在这些游戏中,通过鼠标指定行走目的地,人物或者NPC就会自动行走到目标地点,这就是通过路径搜索或者称为寻路算法来实现的。通俗地说,就是在一张地图中,如何让主角自动行走到指定的地点,如图6-21所示,假设主角...

    leetcode前两百-awsome-algorithms-Go:在Golang中学习算法的精选资源列表

    leetcode前两百很棒的算法去 在 Golang 中学习算法的精选资源列表。 如果你想贡献,请阅读 ...寻路算法。 图片- 纯 Go 中图像处理算法的集合。 埃沃利- 遗传算法和粒子群优化库。 去集群- 去实现 k-modes 和 k-prototyp

    精华游戏算法整理(经典)

    在A*寻路算法中,我们通过从点A开始,检查相邻方格的方式,向外扩展直到找到目标。 我们做如下操作开始搜索: 1,从点A开始,并且把它作为待处理点存入一个“开启列表”。开启列表就像一张购物清单。尽管现在...

Global site tag (gtag.js) - Google Analytics