B星寻路算法
在此把这个算法称作B* 寻路算法(Branch Star 分支寻路算法,且与A*对应),本算法适用于游戏中怪物的自动寻路,其效率远远超过A*算法,经过测试,效率是普通A*算法的几十上百倍。
通过引入该算法,一定程度上解决了游戏服务器端无法进行常规寻路的效率问题,除非服务器端有独立的AI处理线程,否则在服务器端无法允许可能消耗大量时间的寻路搜索,即使是业界普遍公认的最佳的A*,所以普遍的折中做法是服务器端只做近距离的寻路,或通过导航站点缩短A*的范围。
算法原理
本算法启发于自然界中真实动物的寻路过程,并加以改善以解决各种阻挡问题。
前置定义:
1、探索节点:
为了叙述方便,我们定义在寻路过程中向前探索的节点(地图格子)称为探索节点,起始探索节点即为原点。(探索节点可以对应为A*中的开放节点)
2、自由的探索节点:
探索节点朝着目标前进,如果前方不是阻挡,探索节点可以继续向前进入下一个地图格子,这种探索节点我们称为自由探索节点;
3、绕爬的探索节点:
探索节点朝着目标前进,如果前方是阻挡,探索节点将试图绕过阻挡,绕行中的探索节点我们成为绕爬的探索节点;
算法过程
1、起始,探索节点为自由节点,从原点出发,向目标前进;
2、自由节点前进过程中判断前面是否为障碍,
a、不是障碍,向目标前进一步,仍为自由节点;
b、是障碍,以前方障碍为界,分出左右两个分支,分别试图绕过障碍,这两个分支节点即成为两个绕爬的探索节点;
3、绕爬的探索节点绕过障碍后,又成为自由节点,回到2);
4、探索节点前进后,判断当前地图格子是否为目标格子,如果是则寻路成功,根据寻路过程构造完整路径;
5、寻路过程中,如果探索节点没有了,则寻路结束,表明没有目标格子不可达;
演示如下:
![](https://downs1.dude6.com/uploads/images/2022713/2c516444b5e87435b3f8a219e2eb77d3.gif)
![](https://downs1.dude6.com/uploads/images/2022713/0c37204b8a385e12d5356fe64051d974.gif)
![](https://downs1.dude6.com/uploads/images/2022713/0d6d1774b2ec7aebe668a97642996671.gif)
![](https://downs1.dude6.com/uploads/images/2022713/ee12abb2260fb7ca2e10753396b0fb15.gif)
![](https://downs1.dude6.com/uploads/images/2022713/311cac4018095f4358095dbca5d6a6f1.gif)
B*与A*算法的性能比较
寻路次数比较(5秒钟寻路次数)
![](https://downs1.dude6.com/uploads/images/2022713/5a3efc77914c90166aea55a35f99b687.gif)
B*与A*性能比较实例
1、 无障碍情况
此种情况,根据以上测试数据,B*算法效率是普通A*的44倍(左为A*,右为B*)
![](https://downs1.dude6.com/uploads/images/2022713/555322b4627d9b7ef6ad7738376185e0.gif)
![](https://downs1.dude6.com/uploads/images/2022713/a8a1e4566a3a35b9152821fcb647752c.gif)
2、线形障碍
此种情况,根据以上测试数据,B*算法效率是普通A*的28倍(左为A*,右为B*)
![](https://downs1.dude6.com/uploads/images/2022713/af1af70aa77ef3b05709f8d14c4f8a0a.gif)
![](https://downs1.dude6.com/uploads/images/2022713/5fff38ef0f5fb49d5ad98063f5cbc540.gif)
3、环形障碍
此种情况,根据以上测试数据,B*算法效率是普通A*的132倍(左为A*,右为B*)
![](https://downs1.dude6.com/uploads/images/2022713/876e88a936a7ff5bde969425d4feb8b1.gif)
![](https://downs1.dude6.com/uploads/images/2022713/5897831f7fd71c557e7108f9068a1925.gif)
4、封闭障碍(目标不可达)
此种情况,根据以上测试数据,B*算法效率是普通A*的581倍(左为A*,右为B*)
![](https://downs1.dude6.com/uploads/images/2022713/a9454f06b6695debdd37a6a75be2e9c1.gif)
![](https://downs1.dude6.com/uploads/images/2022713/326feb5c5c3c31b58c8420405c9313d7.gif)