一种高效的寻路算法 - 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*) 
       

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

时间: 2024-11-10 07:59:29

一种高效的寻路算法 - B*寻路算法的相关文章

图解NavMesh寻路中的漏斗算法

NavMesh是广泛使用的一种寻路技术,将地图中可走的部分生成连续的多边形/三角形网格,寻路在网格中进行,主要包含两步:1.根据网格的邻接信息构造图,使用A*之类的寻路算法计算出从起点到重点需要走过的多边形/三角形集合:2.使用漏斗算法/拉绳子算法,将多边形列表转换为一条最优的路店.本文主要讲一下对于三角形列表的漏斗算法原理. 诸位读者如果搜索过网络,会发现有一年GDC有人讲了这个算法,也有几篇博客翻译了这个GDC的演讲slides,但多半都是仅仅翻译一遍slides的水平,没有真的把算法说明白

A*算法的寻路中的应用——无阻挡

按照之前转载的文章,自己先实现了下,表示还是很多坑: #include "stdio.h" #include <vector> #include <queue> #include <map> #include <set> using namespace std; int neigor[][2] ={ {-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0} }

如何写一篇论文,&lt;一种低耗能的数据融合隐私保护算法ESPART&gt; (计算机学报2011-5,王安琪)

这是我在研究生阶段花了一个月的时间搞出的一篇论文,纯构思和写论文花了才一个月,发稿加改稿.等发表的时间可远不止,记得2010年11月开始要写了,2010年12月写完,2010年底投的稿,2011年初数次改稿,终于5月份出版. 2010年11月份,导师说关于无线传感器网络有很多可以研究的课题,其中的数据融合隐私保护便是以个方向,让我好好研究.自此我便埋头在论文的工作上了,之前的研究生生活就是在图书馆里泡着,看各种看得懂的看不懂的技术.社会科学书籍,现在回想起来,之前的看书生活对这篇论文的创作也是有

3种高效的Tags标签系统数据库设计方案分享

3种高效的Tags标签系统数据库设计方案分享 需求背景 目前主流的博客系统.CMS都会有一个TAG标签系统,不仅可以让内容链接的结构化增强,而且可以让文章根据Tag来区分.相比传统老式的Keyword模式,这种Tag模式可以单独的设计一个Map的映射表来增加系统的负载和查询的效率. 数据库设计方案1 此方案分为2个表: 1.Tag表2.文章表 Tag表表结构: 代码如下: tagid # tag标签的IDtagname #tag内容num #当前Tag的引用个数 文章表结构: 代码如下: ID

两种高效的并发模式(半同步/半异步和领导者/追随者)

一.并发编程与并发模式 并发编程主要是为了让程序同时执行多个任务,并发编程对计算精密型没有优势,反而由于任务的切换使得效率变低.如果程序是IO精密型的,则由于IO操作远没有CPU的计算速度快,所以让程序阻塞于IO操作将浪费大量的CPU时间.如果程序有多个线程,则当前被IO操作阻塞的线程可主动放弃CPU,将执行权转给其它线程.(*IO精密型和cpu精密型可以参考此文:CPU-bound(计算密集型) 和I/O bound(I/O密集型)) 并发编程主要有多线程和多进程,这里我们先讨论并发模式,并发

一种通用的网页相似度检测算法

如果我们需要在海量的结构未知的网页库中找到和指定的网页相似度比较高的一些网页,我们该怎么办呢?本文提出的"一种通用的网页相似度检测算法"就是专门解决这个问题. 算法如下: 1.提取网页文本.这个提取步骤不要求精确,也没办法精确,因为你面对的是未知结构的网页,所以只需要提取去掉标签之后的文本即可. 2.对提取的文本进行分词.我们使用开源的中文分词组件word分词. 3.为每一个网页建立一个词向量,向量的维度就是两个网页的不重复词的并集,每一个维度的权重就是词频TF,我们这里忽略IDF也不

两种高效的事件处理模式(Proactor和Reactor)

典型的多线程服务器的线程模型 1. 每个请求创建一个线程,使用阻塞式 I/O 操作 这是最简单的线程模型,1个线程处理1个连接的全部生命周期.该模型的优点在于:这个模型足够简单,它可以实现复杂的业务场景,同时,线程个数是可以远大于CPU个数的.然而,线程个数又不是可以无限增大的,为什么呢?因为线程什么时候执行是由操作系统内核调度算法决定的,调度算法并不会考虑某个线程可能只是为了一个连接服务的,时间片到了就执行一下,哪怕这个线程一执行就会不得不继续睡眠.这样来回的唤醒.睡眠线程在次数不多的情况下,

算法学习——分治算法

这是从网上查到的概念资料,先收来~ 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个

分布式一致性算法:Raft 算法

Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比 Paxos 算法更易懂且更容易实现.本文对 raft 论文进行翻译,希望能有助于读者更方便地理解 raft 的思想.如果对 Paxos 算法感兴趣,可以看我的另一篇文章:分布式系列文章--Paxos算法原理与推导 摘要Raft 是用来管理复制日志(replicated log)的一致性协议.它跟 multi-Paxos 作用相同,效率也相当,但是它的组织结构跟 Paxos 不同.这使得 Raft 比 Pax

一步一步写算法(之 算法总结)

原文:一步一步写算法(之 算法总结) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 自10月初编写算法系列的博客以来,陆陆续续以来写了几十篇.按照计划,还有三个部分的内容没有介绍,主要是(Dijkstra算法.二叉平衡树.红黑树).这部分会在后面的博客补充完整.这里主要是做一个总结,有兴趣的朋友可以好好看看,欢迎大家提出宝贵意见. (1) 排序算法 快速排序 合并排序 堆排序 选择排序 基数排序 冒泡排序 插入排序 希尔排序 链表排序