基于二叉堆节点排序的A星寻路方法及系统技术方案

技术编号:10877885 阅读:368 留言:0更新日期:2015-01-08 00:14
本发明专利技术公开了一种基于二叉堆节点排序的A星寻路方法及系统,首先进行初始化;然后判断OPEN表中的结点n是否为目标解A,如果不是,则将结点n的所有后继结点展开形成直接关联子结点,把已经判断的结点n放入CLOSE表,计算结点n的每一个后继结点的估价值,并将OPEN表按估价值进行堆排序,将估价值最小的结点放在OPEN表的表头,重复循环直到完成所有结点排序。本发明专利技术在普通A星算法中引入堆排序,以此大幅提高A星算法执行效率。克服了传统A星算法需要频繁维护OPEN和CLOSE表,并且每次都需要对OPEN表中的节点进行排序所造成的计算时间长的缺点,以及无法满足游戏实时性要求较高的特点。

【技术实现步骤摘要】
基于二叉堆节点排序的A星寻路方法及系统
本专利技术涉及一种游戏
,特别涉及一种基于二叉堆节点排序的A星寻路方法及系统。
技术介绍
游戏在业界被称为第九艺术,成功的游戏更会受到全球玩家推崇。随着移动互联网技术的应用以及和中国移动网络3G、4G增值等业务迅速发展,手机游戏已经展露锋芒。在游戏软件中,人工智能是一个重要而又复杂的模块,而寻路算法是人工智能运用于电子游戏中的最基本问题之一。物体按照某种指定目的地的方式移动其就要求程序必须能够找到一条从起点到目标点的最佳路径,这条路径应该是绕过障碍物并且到达目的地的最短的路径,完成这个任务最常用的算法就是A星算法。A星作为一种高性价比的寻路算法一直被游戏行业所广泛使用,很多客户端游戏和大型网页游戏中的寻路算法都基于A星算法如:英雄联盟,魔兽世界,梦幻飞仙等。但是由于手机游戏运行软件条件和硬件不佳等原因,传统的A星算法也急需改进,以此提高寻路效率。传统A星算法需要频繁维护OPEN和CLOSE表,并且每次都需要对OPEN表中的节点进行排序,而采用冒泡排序的A星算法的平均时间复杂为0(η~2),执行的效率相当的缓慢,特别是当地图更大时,反复搜索这么大的列表会严重拖慢整个过程。这显然无法满足游戏实时性要求较高的特点。
技术实现思路
有鉴于此,本专利技术所要解决的技术问题是提供一种基于二叉堆节点排序的A星寻路方法及系统。 本专利技术的目的之一是提出一种基于二叉堆节点排序的A星寻路方法;本专利技术的目的之二是提出一种基于二叉堆节点排序的A星寻路系统。 本专利技术的目的之一是通过以下技术方案来实现的: 本专利技术提供的基于二叉堆节点排序的A星寻路方法,包括以下步骤: S1:初始化OPEN表、CLOSE表和目标点A,将起始结点S放入OPEN表,CLOSE表置空; S2:判断OPEN表是否为空,如果否,则从OPEN表的表头取一个结点η ;如果是,则结束算法过程; S3:判断结点η是否为目标解Α,如果是,则输出结点η ;如果否,则转入步骤S4 ;所述目标解是最终要寻找的目标点A ; S4:将结点η的所有后继结点展开形成直接关联子结点,判断子结点是否在CLOSE表中,如果否,则将子结点放入OPEN表; S5:把已经判断的结点η放入CLOSE表,同时采用以下公式计算结点η的每一个后继结点的估价值Γ (η); f' (n) = g' (n) +h' (η); 其中,f' (η)是估价函数,g' (η)是起始结点到结点η的最短路径值,h' (η)是结点η到目标的最短路经的启发值; S6:将OPEN表按估价值f' (X)进行堆排序,将估价值Γ (X)最小的结点放在OPEN表的表头,返回步骤S2重复循环。 进一步,所述OPEN表,用于存储欲遍历的下个节点; 所述CLOSE表,用于存储已经找到的路径。 进一步,所述堆排序采用二叉堆进行排序; 所述二叉堆是通过以下方式进行的: 首先获取OPEN表中节点的估价值f' (X),将估价值Γ (X)最小的节点放置在堆顶端; 然后从剩余的节点中选择出估价值最小和次小的节点作为上一个节点的两个子节点; 最后分别重复为两个子节点选择出估价值最小和次小的节点作为上一个节点的两个子节点;直到将所有OPEN表中节点排列完成。 进一步,所述堆排序采用二叉堆进行排序;所述二叉堆是通过以下方式进行的: 首先获取OPEN表中节点的估价值f' (X),将估价值Γ (X)最小的节点存储在一维数组的第一个元素存储地址中;然后将剩余的节点中的估价值f, (x)最小的节点存储在一维数组的第二个元素存储地址中,最后直到完成OPEN表中所有节点的排序。 本专利技术的目的之二是通过以下技术方案来实现的: 本专利技术提供的基于二叉堆节点排序的A星寻路系统,包括初始化模块、OPEN表判断模块、结点判断模块、关联子结点模块、结点估价值计算模块、堆排序模块; 所述初始化模块,用于初始化OPEN表、CLOSE表和目标点A,将起始结点S放入OPEN表,CLOSE表置空; 所述OPEN表判断模块,用于判断OPEN表是否为空,如果否,则从OPEN表的表头取一个结点η;如果是,则结束算法过程; 所述结点判断模块,用于判断结点η是否为目标解Α,如果是,则输出结点η ;如果否,则转入步骤S4 ;所述目标解是最终要寻找的目标点Α,即从起点找到一条路径到达目标占. 所述关联子结点模块,用于将结点η的所有后继结点展开形成直接关联子结点,判断子结点是否在CLOSE表中,如果否,则将子结点放入OPEN表; 所述结点估价值计算模块,用于把已经判断的结点η放入CLOSE表,同时采用以下公式计算结点η的每一个后继结点的估价值f' (η); f' (n) = g' (n) +h' (η); 其中,f' (η)是估价函数,g' (η)是起始结点到结点η的最短路径值,h' (η)是结点η到目标的最短路经的启发值; 所述堆排序模块,用于将OPEN表按估价值f' (x)进行堆排序,将估价值f' (X)最小的结点放在OPEN表的表头。 进一步,所述OPEN表,用于存储欲遍历的下个节点; 所述CLOSE表,用于存储已经找到的路径。 进一步,所述堆排序模块中的堆排序采用二叉堆进行排序; 所述二叉堆是通过以下方式进行的: 首先获取OPEN表中节点的估价值f' (X),将估价值Γ (X)最小的节点放置在堆顶端; 然后从剩余的节点中选择出估价值最小和次小的节点作为上一个节点的两个子节点; 最后分别重复为两个子节点选择出估价值最小和次小的节点作为上一个节点的两个子节点;直到将所有OPEN表中节点排列完成。 进一步,所述堆排序模块中的堆排序采用二叉堆进行排序;所述二叉堆是通过以下方式进行的: 首先获取OPEN表中节点的估价值f' (X),将估价值Γ (X)最小的节点存储在一维数组的第一个元素存储地址中;然后将剩余的节点中的估价值f, (x)最小的节点存储在一维数组的第二个元素存储地址中,最后直到完成OPEN表中所有节点的排序 本专利技术的有益效果在于:本专利技术在普通A星算法中引入堆排序,以此大幅提高A星算法执行效率。克服了传统A星算法需要频繁维护OPEN和CLOSE表,并且每次都需要对OPEN表中的节点进行排序所造成的计算时间长的缺点,以及无法满足游戏实时性要求较高的特点。 【附图说明】 为了使本专利技术的目的、技术方案和优点更加清楚,下面将结合附图对本专利技术作进一步的详细描述,其中: 图1为本专利技术实施例提供的基于二叉堆节点排序的A星寻路方法流程图; 图2为本专利技术实施例提供的基于二叉堆节点排序的A星寻路系统图。 【具体实施方式】 以下将参照附图,对本专利技术的优选实施例进行详细的描述。应当理解,优选实施例仅为了说明本专利技术,而不是为了限制本专利技术的保护范围。 实施例1 图1为本专利技术实施例提供的基于二叉堆节点排序的A星寻路方法流程图,如图所示:本专利技术提供的基于二叉堆节点排序的A星寻路方法,包括以下步骤: S1:初始化OPEN表、CLOSE表和目标点A,将起始结点S放入OPEN表,CLOSE表置空; S2:判断OPEN表是否为空,如果否,则从OPEN表的表本文档来自技高网...

【技术保护点】
基于二叉堆节点排序的A星寻路方法,其特征在于:包括以下步骤:S1:初始化OPEN表、CLOSE表和目标点A,将起始结点S放入OPEN表,CLOSE表置空;S2:判断OPEN表是否为空,如果否,则从OPEN表的表头取一个结点n;如果是,则结束算法过程;S3:判断结点n是否为目标解A,如果是,则结束算法,如果否,则转入步骤S4;所述目标解是最终要寻找的目标点A;S4:将结点n的所有后继结点展开形成直接关联子结点,判断子结点是否在CLOSE表中,如果否,则将子结点放入OPEN表;S5:把已经判断的结点n放入CLOSE表,同时采用以下公式计算结点n的每一个后继结点的估价值f′(n);f′(n)=g′(n)+h′(n);其中,f′(n)是估价函数,g′(n)是起始结点到结点n的最短路径值,h′(n)是结点n到目标的最短路经的启发值;S6:将OPEN表按估价值f′(x)进行堆排序,将估价值f′(x)最小的结点放在OPEN表的表头,返回步骤S2重复循环。

【技术特征摘要】
1.基于二叉堆节点排序的A星寻路方法,其特征在于:包括以下步骤: 51:初始化OPEN表、CLOSE表和目标点A,将起始结点S放入OPEN表,CLOSE表置空; 52:判断OPEN表是否为空,如果否,则从OPEN表的表头取一个结点η ;如果是,则结束算法过程; 53:判断结点η是否为目标解Α,如果是,则结束算法,如果否,则转入步骤S4 ;所述目标解是最终要寻找的目标点A ; 54:将结点η的所有后继结点展开形成直接关联子结点,判断子结点是否在CLOSE表中,如果否,则将子结点放入OPEN表; 55:把已经判断的结点η放入CLOSE表,同时采用以下公式计算结点η的每一个后继结点的估价值f' (η); f' (n) = g' (rO+h' (η); 其中,Γ (η)是估价函数,g' (η)是起始结点到结点η的最短路径值,h' (η)是结点η到目标的最短路经的启发值; 56:将OPEN表按估价值f, (x)进行堆排序,将估价值Γ (x)最小的结点放在OPEN表的表头,返回步骤S2重复循环。2.根据权利要求1所述的基于二叉堆节点排序的A星寻路方法,其特征在于:所述OPEN表,用于存储欲遍历的下个节点;所述CLOSE表,用于存储已经找到的路径。3.根据权利要求1所述的基于二叉堆节点排序的A星寻路方法,其特征在于:所述堆排序采用二叉堆进行排序; 所述二叉堆是通过以下方式进行的: 首先获取OPEN表中节点的估价值f, (X),将估价值f, (X)最小的节点放置在堆顶端; 然后从剩余的节点中选择出估价值最小和次小的节点作为上一个节点的两个子节占.最后分别重复为两个子节点选择出估价值最小和次小的节点作为上一个节点的两个子节点;直到将所有OPEN表中节点排列完成。4.根据权利要求1所述的基于二叉堆节点排序的A星寻路方法,其特征在于:所述堆排序采用二叉堆进行排序;所述二叉堆是通过以下方式进行的: 首先获取OPEN表中节点的估价值Γ (X),将估价值Γ (X)最小的节点存储在一维数组的第一个元素存储地址中;然后将剩余的节点中的估价值f, (x)最小的节点存储在一维数组的第二个元素存储地址中,最后直到完成OPEN表中所有节点的排序。5.基于二叉堆节点排序的A星寻路系统,其特征在于:包括初始化模块、OPEN表判断模块、结点判断模块、关联子结点模块、结点估价值计算模块、...

【专利技术属性】
技术研发人员:熊仕勇林金朝周敏潘豪田航李沁翰唐浩张喜平聂婧谭世雨李杨
申请(专利权)人:重庆邮电大学
类型:发明
国别省市:重庆;85

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1