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

[url]http://qinysong.iteye.com/blog/678941?page=1#comments[/url]

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

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

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

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

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


演示如下:


[img]http://dl.iteye.com/upload/attachment/419738/be463121-9a3e-3506-a405-34888bfd7258.gif[/img]

[img]http://dl.iteye.com/upload/attachment/419740/d454d0f5-8d68-3589-8ba9-17cafd6b08a7.gif[/img]

[img]http://dl.iteye.com/upload/attachment/419742/c184cb84-6cbb-3507-9f83-8d9b1544751a.gif[/img]

[img]http://dl.iteye.com/upload/attachment/419744/8f447b01-5c01-3acc-80b2-ac1725839ef3.gif[/img]

[img]http://dl.iteye.com/upload/attachment/419746/0effb0a0-4383-3013-9fee-f54a2789cc70.gif[/img]


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

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


[img]http://dl.iteye.com/upload/attachment/419748/f63d2683-836f-3374-a39c-9db7bd7f6248.gif[/img]



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



[img]http://dl.iteye.com/upload/attachment/419750/30f8514c-e0c5-3d60-ba8d-7c6378b4670e.gif[/img]

[img]http://dl.iteye.com/upload/attachment/419752/7e8b2ca8-752a-313c-9a26-2e7c3d8044e3.gif[/img]


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




[img]http://dl.iteye.com/upload/attachment/419754/7e4245a9-e01a-3064-b363-898541e39cf4.gif[/img]

[img]http://dl.iteye.com/upload/attachment/419756/17777f97-1b4d-3788-bd77-811c9fceb89c.gif[/img]


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


[img]http://dl.iteye.com/upload/attachment/419758/e8761ac5-76b0-3041-9a72-495d2eda1e20.gif[/img]

[img]http://dl.iteye.com/upload/attachment/419760/453c90f0-e3ad-3cbb-b7cc-73d9fb177f5c.gif[/img]


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


[img]http://dl.iteye.com/upload/attachment/419762/4c1ca15c-c424-305c-a7a6-4bb11cd4c54b.gif[/img]

[img]http://dl.iteye.com/upload/attachment/419764/988673f0-d7c8-31f2-bfa8-8f748ba0550c.gif[/img]


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值