路径的搜索方法、装置、处理器和电子装置与流程

文档序号:14911937发布日期:2018-07-10 23:39阅读:159来源:国知局

本发明涉及数据处理领域,具体而言,涉及一种路径的搜索方法、装置、处理器和电子装置。



背景技术:

寻路方法用途众多,例如在游戏和地图中进行寻路。在游戏中通常会用到寻路A*方法每次从有序队列中取出优先级最高的节点,然后扩展该节点的八个邻居,直到找到目标节点为止。JPS方法每次从有序队列中取出优先级最高的点,然后扩展该点附近的跳点,直到找到目标点为止。

JPS又名跳点搜索方法(Jump Point Search),是基于Grid格子的寻路方法。JPS根据当前节点的方向、并基于跳点的策略来扩展后继节点,遵循确定强迫邻居、跳点的定义,以及确定后继节点的拓展原则,具体流程如下:

一,若当前节点的当前方向是直线方向:(1)如果当前节点的左后方不可走且左方可走(即左方是强迫邻居),则沿当前节点左前方和左方寻找不在关闭节点集合的跳点;(2)如果当前节点的当前方向可走,则沿当前节点的当前方向寻找不在关闭节点集合的跳点;(3)如果当前节点的右后方不可走且右方可走(右方是强迫邻居),则沿当前节点右前方和右方寻找不在关闭节点集合的跳点;

二,若当前节点的当前方向为对角线方向:(1)如果当前节点的当前方向的水平分量可走(例如当前节点的当前为东北方向,则水平分量为东),则沿当前节点的当前方向的水平分量寻找不在关闭节点集合的跳点;(2)如果当前节点的当前方向可走,则沿当前节点的当前方向寻找不在关闭节点集合的跳点;(3)如果当前节点的当前方向的垂直分量可走(例如当前节点的当前为东北方向,则垂直分量为北),则沿当前节点的当前方向的垂直分量寻找不在关闭节点集合的跳点。

A*方法包括如下步骤:

Step 1.将起始点加入开启节点集合;

Step 2.重复以下工作:

当开启节点集合为空,则结束程序,此时没有路径。

寻找开启节点集合中F值最小的节点,设为当前点关闭节点集合,从开启节点集合中移出当前点关闭节点集合;关闭节点集合中加入当前点关闭节点集合;若当前节点为目标节点,则结束程序,此时有路径生成,此时由目标节点开始逐级追溯路径上每一个节点x的上一级父节点parent(x),直至回溯到开始节点,此时回溯的各节点即为路径。

对当前节点的八个方向的每一个相邻节点来说,如果相邻节点不可通过或者已经在关闭节点集合中,略过。如果相邻节点不在开启节点集合中,加入开启节点集合中;如果相邻节点在开启节点集合中,G值判定,若此路径G值比之前路径小,则相邻节点的父节点为当前节点,同时更新G值与F值。反之,则保持原来的节点关系与G值、F值。G值表示从起点到当前点路径耗费;H值表示不考虑不可通过区域,当前点到终点的理论路径耗费,其中,F=G+F。

下面举例说明JPS具体的寻路流程。如图1所示,5*5的网格,黑色代表阻挡区,白色代表无阻挡区,S为起点,E为终点。JPS要寻找从S到E的最短路径,首先初始化将S加入开启节点集合。从开启节点集合取出F值最小的点S,并从开启节点集合删除,加入关闭节点集合,S的当前方向为空,则沿八个方向寻找跳点,在该图中只有下、右、右下三个方向可走,但向下遇到边界,向右遇到阻挡,因此都没有找到跳点,然后沿右下方向寻找跳点,在G点的父节点为S,praent(G)到S为对角线移动,并且G经过垂直方向移动(向下移动)可以到达跳点I,因此G为跳点,将G加入开启节点集合。从开启节点集合取出F值最小的点G,并从开启节点集合删除,加入关闭节点集合,因为G当前方向为对角线方向(从S到G的方向),因此在G点的右、下、右下三个方向寻找跳点,在该图2中只有向下可走,因此向下寻找跳点,找到跳点I,将I加入开启节点集合。从开启节点集合取出F值最小的点I,并从开启节点集合删除,加入关闭节点集合。因为I的当前方向为直线方向(从G到I的方向),在I点时I的左后方不可走且左方可走,因此沿下、左、左下寻找跳点,但向下、左下都遇到边界,只有向左寻找到跳点Q,因此将Q加入开启节点集合。从开启节点集合取出F值最小的点Q,并从开启节点集合删除,加入关闭节点集合,因为Q的当前方向为直线方向,Q的左后方不可走且左方可走,因此沿右、左、左上寻找跳点,但向右、左上都遇到边界,只有向左寻找到跳点E,因此将E加入开启节点集合。从开启节点集合取出F值最小的点E,因为E是目标点,因此寻路结束,路径是S、G、I、Q、E。可。

上述的JPS寻路效率是明显快于A*的方法,原因在于:在从S到A沿垂直方向寻路时,在A点,如果是A*方法,会将F、G、B、H都加入开启节点集合,但是在JPS中这四个点都不会加入开启节点集合。对F、G、H三点而言,因为从S、A、F的路径长度比S、F长,所以从S到F的最短路径不是S、A、F路径,同理S、A、G也不是最短路径,走到A后不会走到F、G,所以F、G不会加入开启节点集合,虽然S、A、H是S到H的最短路径,但因为存在S、G、H的最短路径且不经过A,从S走到A后,下一个走的点不会是H,因此H也不会加入开启节点集合;对B点而言,B不是跳点,也不会加入开启节点集合,直接走到C即可。避免在开启节点集合中加入太多点,从而避免过多的排序是JPS比A*快的原因,实际上在从S到E的寻路过程中,进入开启节点集合的只有S、G、I、Q、E。

由此可见,虽然JPS寻路方法的效率要由于A*方法的效率,然而,这种方法需要逐个寻找跳点,导致寻找路径的效率仍然比较低。

针对上述的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种路径的搜索方法、装置、处理器和电子装置,以至少解决搜索路径的效率比较低的技术问题。

根据本发明实施例的一个方面,提供了一种路径的搜索方法,包括:检测待寻路区域中用于表示路径起点的当前节点以及用于表示路径终点的目标节点;以所述当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合;在所第一方向上查找跳点,得到第二节点集合,其中,目标节点处于所述第一方向,所述多个方向包括所述第一方向;从所述第一节点集合和所述第二节点集合的所有跳点中查找目标跳点,其中,所述当前节点到所述目标跳点之间的第一路径以及所述目标跳点到所述目标节点之间的第二路径的路径组合的路径最短;将路径最短的所述路径组合确定为所述路径起点到所述路径终点的路径。

根据本发明实施例的一个方面,提供了一种路径的搜索装置,包括:检测单元,用于检测待寻路区域中用于表示路径起点的当前节点以及用于表示路径终点的目标节点;第一查找单元,用于以所述当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合;第二查找单元,用于在所第一方向上查找跳点,得到第二节点集合,其中,目标节点处于所述第一方向,所述多个方向包括所述第一方向;第三查找单元,用于从所述第一节点集合和所述第二节点集合的所有跳点中查找目标跳点,其中,所述当前节点到所述目标跳点之间的第一路径以及所述目标跳点到所述目标节点之间的第二路径的路径组合的路径最短;确定单元,用于将路径最短的所述路径组合确定为所述路径起点到所述路径终点的路径。

可选地,所述第一查找单元包括:第三查找模块,用于以所述当前节点为中心,沿多个方向查找每个方向上离所述当前节点最近的跳点,其中,所述跳点包括边界节点和阻挡节点;集合模块,用于将所述每个方向上的所有所述跳点集合确定为所述第一节点集合。

可选地,所述装置还包括:编码单元,用于在以所述当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合之前,对所述待寻路区域内的所有节点进行编码,其中,所述编码的数据位用于表示可行进节点和不可行进节点;第四查找单元,用于利用指令从所述编码中查找所述所有节点中的跳点和阻挡节点。

可选地,所述装置还包括:检测单元,用于在以所述当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合之前,检测所述当前节点所在的当前区域和所述目标节点所在的目标区域是否在同一连通区域;所述第一查找单元包括:第四查找模块,用于在检测出所述当前区域和所述目标区域在所述同一连通区域的情况下,以所述当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合。

可选地,所述装置还包括:第五查找模块,用于在检测所述当前节点所在的当前区域和所述目标节点所在的目标区域是否在同一连通区域之后,在检测出所述当前区域和所述目标区域不在所述同一连通区域的情况下,不再执行以所述当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点。

可选地,所述装置还包括:第五查找单元,用于在检测所述当前节点所在的当前区域和所述目标节点所在的目标区域是否在同一连通区域之前,在所述待寻路区域中查找连通区域,其中,所述连通区域中的每个节点与所述连通区域中的至少一个节点相邻。

根据本发明实施例的一个方面,提供了一种存储介质,所述存储介质包括存储的程序,其中,所述程序运行时执行上述的方法。

根据本发明实施例的一个方面,提供了一种电子装置,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器通过所述计算机程序执行上述的方法。

本实施例存储了多个方向上的节点,在确定了目标节点所在的方向之后,可以根据已经存储的多个方向上的节点来快速确定目标跳点,无需在每一步节点拓展过程中沿各方向寻找跳点,提高了查找节点的速度,从而解决了现有技术中搜索路径的效率比较低的技术问题,达到了提高搜索路径的效率的技术效果。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据现有技术的一种搜索路径的待寻路区域的示意图;

图2是根据本发明实施例的一种搜索路径场景的示意图;

图3是根据本发明实施例的一种硬件环境的示意图;

图4是根据本发明实施例的路径搜索方法的流程图;

图5是根据本发明实施例的预处理搜索方法的示意图;

图6是根据本发明实施例的剪枝搜索方法的示意图;

图7是根据本发明实施例的位运算搜索方法的示意图;

图8是根据本发明实施例的预判连通区域的示意图;

图9是根据本发明实施例的路径搜索装置的示意图;

图10是根据本发明实施例的一种电子装置的示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

名词解释:

开启节点集合,集合内节点有待进一步探索拓展;

关闭节点结合,集合内节点后续不再进行拓展;

邻居,与当前节点相邻的节点;

parent(x)节点x的父节点,即算法寻得的路径中节点parent(x)的下一节点为x;

定义一,强迫邻居(forced neighbour):如果点n是x的邻居,并且点n的邻居有阻挡(不可行走的格子),并且从parent(x)、x、n的路径长度比其他任何从parent(x)到n且不经过x的路径短,其中parent(x)为路径中x的前一个点,则n为x的强迫邻居,x为n的跳点),例如图2中,寻找从S到E的路径时,K为I的强迫邻居(I为K的跳点)。这里不认为从H到K能走,因为对角线有阻挡,如果需要H到K可走,则K为H的强迫邻居(H为K的跳点)。

定义二,跳点(jump point):(1)如果点y是起点或目标点,则y是跳点,例如图2中,S是起点也是跳点,E是目标点也是跳点;(2)如果y有邻居且是强迫邻居则y是跳点,例如I是跳点,请注意此类跳点和强迫邻居是伴生关系,从上文强迫邻居的定义来看n是强迫邻居,x是跳点,二者的关系是伴生的,例如图2中K的邻居只有I是跳点,M虽然也是K的邻居,但M不是跳点,因为K不是M的强迫邻居;(3)如果parent(y)到y是对角线移动,并且y经过水平或垂直方向移动可以到达跳点,则y是跳点,例如图2中G是跳点,因为parent(G)为S,S到G为对角线移动,从G到跳点I为垂直方向移动,I是跳点,所以G也是跳点。

规则一,JPS搜索跳点的过程中,如果水平方向、垂直方向、对角线方向都可以移动,则首先在水平方向和垂直方向搜索跳点,再在对角线方向搜索跳点。

规则二,(1)如果从parent(x)到x是直线移动,n是x的邻居,若有从parent(x)到n的路径不经过x且路径长度小于或等于从parent(x)经过x到n的路径,则走到x后下一个点不会走到n;(2)如果从parent(x)到x是对角线移动,n是x的邻居,若有从parent(x)到n的路径不经过x且路径长度小于从parent(x)经过x到n的路径,则走到x后下一个点不会走到n。

规则三,只有跳点才会加入开启节点集合,因为跳点会改变行走方向,而非跳点不会改变行走方向,最后寻找出来的路径点也只会是跳点集合的子集。

根据本发明实施例,提供了一种路径的搜索方法。该路径的搜索方法可以应用在游戏内搜索游戏角色的行进路径,也可以应用在地图中搜索出发地和目的地之间的路径。图2是根据本发明实施例的路径的搜索方法应用场景的示意图。该场景可以为游戏中的某个画面。例如,在游戏中当玩家点击一个位置作为终点时,需要用本实施例的路径的搜索方法搜索从玩家当前位置到终点的路径。路径由多个节点组成,每两个节点之间不能有障碍,然后玩家按照找出来的路径从起点走到终点。

在本实施例中,上述路径的搜索方法可以应用于如图3所示的终端101和服务器102所构成的硬件环境中。如图3所示,终端101通过网络与服务器102进行连接,并将节点数据通过网络存在存储器103上。上述网络包括但不限于:广域网、城域网或局域网,终端101可以是手机终端,也可以是PC终端、笔记本终端或平板电脑终端。本发明实施例的路径的搜索方法可以在终端上执行,也可以在服务器上执行。

图4是根据本发明实施例的游戏中路径的搜索方法的流程图。如图4所示,该游戏中路径的搜索方法包括如下步骤:

步骤S402,检测待寻路区域中用于表示路径起点的当前节点以及用于表示路径终点的目标节点。

待寻路区域在游戏中可以是游戏画面,在导航地图中可以是终端界面上显示的地图上的某个区域。待寻路区域可以采用格子表示,每个格子表示一个节点,起点和终点可以分别占用一个格子,起点占用的格子为当前节点,终点占用的格子为目标节点,该路径的搜索方法就是搜索当前节点到目标节点之间的路径。由格子表示的待寻路区域中,路径的走向包括沿格子的水平方向、垂直方向和对角线方向,即从当前节点到目标节点之间的路径包括水平方向、垂直方向和对角线方向中至少一个方向的路径。

步骤S404,以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合。

可选地,以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合包括:以当前节点为中心,沿多个方向查找每个方向上离当前节点最近的跳点,其中,跳点包括边界节点和阻挡节点;将每个方向上的所有跳点集合确定为第一节点集合。

由于每个格子有垂直和水平方向上的4个方向,以及对角线方向上的4个方向,因此,多个方向可以是4个方向或者8个方向。本实施例采用8个方向为例进行说明。最长路径可以用最多能走的步数来确定,即每个点在八个方向最多能走的步数。这个步数值将影响JPS中节点的拓展顺序和拓展“跨度”,加快寻路效率。由于需要存储八个方向最多能走多少步,如果地图大小是N*N,每个方向最多能走的步数用16位数表示,则需要存储空间N*N*8*16bit,如果N为1024,则大概需要存储空间为16M,小于1024*1024个格子的图可以在1秒内处理完。

其中,步数由跳点、阻挡、边界等决定,如果遇到跳点,则步数为从当前节点走到跳点的步数;否则步数为从当前节点走到阻挡或边界的步数。例如对图5中的N点,向北(上北下南)最多走到节点8,即2步,北向的最长路径为2步;向南最多走到节点4,即4步,南向的最长路径为4步;向西最多走到节点6,即3步,西向的最长路径为3步;向东最多走到节点2(节点2是满足上文定义二第(2)条的跳点),即5步,东向的最长路径为5步;西北最多走到节点7,即2步,西北的最长路径为2步;东北最多走到节点1(节点为1是上文定义二第(3)条定义的跳点),即1步;西南最多走到节点5,即3步,西南的最长路径为3步;东南最多走到节点3(节点3是上文定义二第(3)条定义的跳点),即3步,东南最长路径为3步。存储这8个方向上的最长路径。

步骤S406,在第一方向上查找跳点,得到第二节点集合,其中,目标节点处于所述第一方向,所述多个方向包括所述第一方向。

如图5所示,第一方向可以是从节点N到节点5的方向,即西南方向。在确定第一方向时,可以根据目标节点相对于起始节点的坐标来确认,因为目标节点处于起始节点的西南方向,因此,在西南方向上查找目标跳点。查找到的跳点可以是一个或者多个。在确定第一方向时,如图5所示,节点N的坐标为(4,5),节点T的坐标为(3,3),坐标差为(-1,-2),则确定节点T在坐标系的位置,也就确定了节点T在节点N的西南方向,则在西南方向上查找目标跳点。

根据各方向最长路径的步数,可以快速确定八个方向最远能到达的节点,从而得到第一节点集合为{1,2,3,4,5,6,7,8}。如图5所示,其中,节点1、2、3均为满足定义二的跳点,直接加入开启节点集合,对于节点4、5、6、7、8,首先判断终点T位于以N为中心的南、西南、西、西北、北的哪部分,因为T位于西南方向,只有节点5位于西南方向,因此节点4、6、7、8直接删除,在从N到5的方向上,N可走3步,而N和T的x坐标差绝对值dx为1,y坐标差绝对值dy为2,因此将从节点N到节点5方向上走min(dx,dy)步即节点11,加入开启节点集合。

从开启节点集合取出F值最小节点11,垂直方向找到跳点T,加入开启节点集合,得到第二节点集合{11}。从第一节点集合和第二节点集合中国取出F值最小节点T,为目的点,搜索结束,此时获得的路径为N(4,5)、节点11(3,4)、节点T(3,3)。

步骤S408,从第一节点集合和第二节点集合的所有跳点中查找目标跳点,其中,当前节点到目标跳点之间的第一路径以及目标跳点到目标节点之间的第二路径的路径组合的路径最短。

也就是说,从节点N(4,5)到节点11(3,4)之间的路径,以及节点11(3,4)与节点T(3,3)之间的路径的组合为最短路径。

步骤S410,将路径最短的路径组合确定为路径起点到路径终点的路径。

在图5所示的例子中,起始节点为N(4,5),目标节点为T(3,3),从起始节点到目标节点的路径为,节点N(4,5)到节点11(3,4)再到节点11(3,4)之间的路径。

本实施例存储了多个方向上的节点,在确定了目标节点所在的方向之后,可以根据已经存储的多个方向上的节点来快速确定目标调点,无需在每一步节点拓展过程中沿各方向寻找跳点,提高了查找节点的速度,从而解决了现有技术中搜索路径的效率比较低的技术问题,达到了提高搜索路径的效率的技术效果。

中间跳点在节点拓展过程中具有简单的“承接”作用,不具备拓展价值,将中间跳点放入开启节点集合会增大扩展的次数,因此本实施例可以将中间跳点全部删除(即剪枝),将中间跳点后继跳点中的非中间跳点的父跳点改为中间跳点的父跳点,可以有效避免冗余的节点拓展运算。即,在所第一方向上查找跳点,得到第二节点集合包括:在第一方向上查找中间跳点和中间跳点的下一级跳点;将下一级跳点的父节点设置为当前节点;将父节点为当前节点的所有下一级跳点作为第二节点集合。

下面以图6的场景为例对剪枝的同时进行寻路的方法进行说明。起点为S(坐标为(1,1),即S(1,1)),节点1、4、6均为中间跳点:因为节点2、3是满足定义二第(2)条的跳点,所以节点1是为了到达节点2、3的中间跳点,同理节点4、6也为中间跳点。在剪枝中间跳点之前,要将中间跳点的后继节点的父节点调整为该中间跳点的父节点。例如图6中,节点1的后继跳点为节点2、3、4,其中节点4也为中间跳点,删掉中间跳点中的节点1后,节点2、3的父跳点由节点1改为节点S,删除中间跳点中的节点4后,节点4的后继跳点5的父跳点由节点4改为节点S(节点4的父跳点为节点1,但节点1已经被删掉,因此回溯到节点S),删除中间跳点中的节点6后,节点6的后继跳点7的父跳点由节点6改为节点S(节点6的父跳点为节点4,但节点4被删,节点4的父跳点节点1也被删,因此回溯到节点S)。上述过程是简化的逻辑描述,实际运行中的做法是从节点S寻找跳点,首先找到中间跳点节点1,然后在水平方向和垂直方向寻找到跳点节点2、3,将节点2、3的父跳点设为节点S;继续沿对角线方向寻找跳点,走到节点4后,沿水平方向和垂直方向寻找到跳点节点5,将节点5的父跳点设为节点S;继续沿对角线方向寻找跳点,走到节点6后,沿水平方向和垂直方向寻找到跳点7,将跳点7的父跳点设为节点S。因此获得路径S(1,1)、节点7(4,6)。

值得一提的是,由于删除了中间跳点,为了避免获得的节点之间无法通过水平方向、垂直方向或者对角线方向直接可达,因此需要在搜索到完整的路径之后以一定的策略在最后寻得的路径中加入中间拐点,使得每两个相邻的路径节点之间都是垂直、水平、对角线方向可达的。

可选地,从第一节点集合和第二节点集合中查找目标跳点包括:在目标跳点为目标节点的情况下,判断从当前节点到目标节点是否为直线路径可到达;在当前节点与目标节点之间通过直线路径不可到达的情况下,查找拐点,其中,当前节点与拐点之间为直线路径,且拐点与目标节点之间为直线路径;将查找到的拐点作为目标跳点。

假设目前搜索到的路径为起始节点(jp1)、jp2、jp3...jpk..目标节点(jpn),对每两个相邻的跳点jpi、jpi+1,一,如果jpi、jpi+1的x坐标或者y坐标相等,说明这两个跳点在同一个水平方向或垂直方向,可以直线到达,无需在这两个跳点之间加入拐点;二,如果jpi、jpi+1的x坐标和y坐标都不相等,(1)如果x坐标的差dx(即jpi的x坐标减去jpi+1的x坐标)和y坐标的差dy的绝对值相等,说明这两个跳点在对角线方向,也可以直线到达,无需在这两个跳点之间加入拐点;(2)如果x坐标的差dx和y坐标的差dy的绝对值不相等,说明这两个跳点不在对角线方向,并且有可能不能直线到达(因为跳点附近有阻挡),此时jpi、jpi+1之间只需要加入一个从jpi出发离jpi+1最近的对角线上的点即可(jpi、jpi+1不能水平、垂直、对角线到达,说明jpi、jpi+1之间一定存在被剪枝的中间跳点,只需要补上离jpi+1最近的一个中间跳点充当拐点即可,该拐点即为jpi沿对角线方向走min(dx,dy)步到达的点)。

可选地,在当前节点与目标节点之间通过直线路径不可到达的情况下,查找拐点包括:获取目标节点的坐标和当前节点的坐标在横坐标上的第一坐标差和在纵坐标上的第二坐标差;将第一坐标差和第二坐标差为坐标的节点作为拐点。

在图6所示的例子中,因为路径中S(1,1)无法沿垂直方向、水平方向或者对角线方向走到节点7(4,6),需要加入中间拐点,根据上述的拐点添加策略,有dx为3,dy为5,需要从S沿对角线走3步,即节点6(4,4)可作为中间拐点,因此,在图6的示例中,最后构建的完整路径为S(1,1)、节点6(4,4)、节点7(4,6)。

下面通过对比剪枝前后的节点拓展的情况来说明剪枝操作的优化效率:

场景一(无剪枝)如果不对中间跳点进行剪枝,那么从节点S寻路到节点7将经历如下过程:

从节点S搜索跳点,找到跳点节点1,开启节点集合此时只有节点1;

从开启节点集合取出F值最小跳点节点1,并搜索节点1的后继跳点,水平方向和垂直方向找到跳点节点2、3,对角线方向找到跳点节点4,此时开启节点集合有节点2、3、4;

从开启节点集合取出F值最小跳点节点4,并搜索节点4的后继跳点,水平和垂直方向找到跳点节点5,对角线方向找到跳点6,此时开启节点集合有节点2、3、5、6;

从开启节点集合取出F值最小跳点节点6,垂直方向找到跳点7,此时开启节点集合有节点2、3、5、7;

从开启节点集合取出F值最小的跳点节点7,为目的点,搜索结束,因此完整路径为节点S(1,1)、节点1(2,2)、节点4(3,3)、节点6(4,4)、节点7(4,6)。JPS在到达目的节点7之前,需要接连拓展中间跳点1,4,6。

场景二(剪枝中间跳点)在剪枝中间跳点之后,从节点S寻路到节点7的流程得到了明显简化:

从节点S寻找跳点,首先找到中间跳点节点1,然后在水平方向和垂直方向寻找到跳点节点2、3,将节点2、3的父跳点设为节点S;继续沿对角线方向寻找跳点,走到节点4后,沿水平方向和垂直方向寻找到跳点节点5,将节点5的父跳点设为节点S;继续沿对角线方向寻找跳点,走到节点6后,沿水平方向和垂直方向寻找到跳点7,将跳点7的父跳点设为节点S;继续沿对角线方向寻找跳点,遇到阻挡,搜索终止,此时开启节点集合有节点2、3、5、7;

从开启节点集合取出F值最小的跳点节点7,为目的点,搜索结束,此时获得的路径为S(1,1)、节点7(4,6)。不同于无剪枝的JPS需要拓展中间跳点1、4、6,在进行剪枝的方法中,节点1、4、6作为中间跳点均被剪枝,有效避免了冗余的节点拓展,寻路效率得到大大提升。

需要说明的是,图6所示的在节点S至节点6的方向上利用剪枝来搜索路径的方式,可以应用在图5所示的第一方向上搜索路径中。

可选地,为了进一步提高搜索路径的效率,可以利用位运算的方式查找跳点,即在以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合之前,方法还包括:对待寻路区域中所有节点进行编码,其中,编码的数据位用于表示可行进节点和不可行进节点;利用指令从编码中查找所有节点中的跳点和阻挡节点。

游戏画面或者地图画面由格子组成,即待寻路区域包括多个格子,每个格子表示一个节点。格子可以有障碍物,也可以是无障碍物的。如图7所示为待寻路区域,黑色表示有障碍物,白色表示无障碍物,可以通行。对图中的格子进行编码。假设当前位置为I,当前方向为右,位运算中使用1代表不可走,0代表可走,则I当前行B的八位可以用八个bit:00000100表示,I上一行B-的八位可以用八个bit:00000000表示,I的下一行B+的八位可以用八个bit:00110000表示。在当前行寻找阻挡的位置可以用CPU的指令__builtin_clz(B)(返回前导0的个数),即当前阻挡在第5个位置(从0开始)。寻找当前行的跳点可以用__builtin_clz(((B->>1)&&!B-)||((B+>>1)&&!B+))寻找,例如本例中(B+>>1)&&!B+为:(00110000>>1)&&11001111,即00001000,而(B->>1)&&!B为00000000,所以__builtin_clz(((B->>1)&&!B-)||((B+>>1)&&!B+))为__builtin_clz(00001000)为4,所以跳点为第4个位置M(从0开始)。

也就是说,可以通过编码的方法,找出待寻路区域中存在障碍的节点以及跳点,这样在后续寻找某个方向上的节点时,可以直接获取编码已经寻找到的跳点、障碍和边界等。由于CPU指令运算在进行节点扩展时速度快,从而提高了节点扩展的效率,也就提高了搜索路径的效率。

可选地,在搜索起点到终点之间的路径时,先要判断起点和终点之间是否为可通行的,如果起点和终点之间有阻挡不能通行,则无需搜索路径,避免在起点和终点之间有阻挡不能通行的情况下搜索路径导致的资源浪费。如图8所示,起点S不可到达终点E,然而寻路算法仍然会花费时间去寻找S、E之间的路径,而且失败情况下寻路花费的时间远大于成功情况下寻路花费的时间,因为失败情况下需要遍历所有的路径,才能确定两点不可达。因此为了避免这种情况,在每次寻路之前,判断起点和终点是否可达:如果起点和终点在同一连通区域,则起点和终点可达,否则不可达。只有起点和终点可达,才需要去寻路。

即在以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合之前,方法还包括:检测当前节点所在的当前区域和目标节点所在的目标区域是否在同一连通区域;以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合包括:在检测出当前区域和目标区域在同一连通区域的情况下,以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合。在检测当前节点所在的当前区域和目标节点所在的目标区域是否在同一连通区域之后,方法还包括:在检测出当前区域和目标区域不在同一连通区域的情况下,不再执行以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点。

如图8所示,当前节点S和目标节点E之间被黑色的部分阻挡,在当前节点S和目标节点E之间不存在可通行的路径。本实施例在搜索当前节点S和目标节点E之间的路径之前,就可判断出当前节点S和目标节点E之间不可通行。

即在检测当前节点所在的当前区域和目标节点所在的目标区域是否在同一连通区域之前,方法还包括:待寻路区域中查找连通区域,其中,连通区域中的每个节点与连通区域中的至少一个节点相邻。

首先计算网格的连通区域,采用宽度优先搜索。图8的节点S、1、2的连通区域编号均为1,点3、4、E的连通区域编号均为2,S、E连通区域编号不同,因此S、E不在同一连通区域,不需要寻找路径。具体方法如下:

S1,当前连通区域编号num初始化为0

S2,对网格每个当前节点重复以下工作:

一、num++。

二、如果当前节点是阻挡点,跳过。

三、如果当前节点被访问过,跳过。

四、当前节点的连通区域编号记为num,标记已访问过。

五、宽度优先搜索和当前节点四连通的所有网格点,连通区域编号均记为num,并标记已访问。

以下结合图2对本实施例的路径的搜索方法进行说明。

在该游戏画面中显示了两个玩家,分别是AA和BB。当玩家AA点击其前方BB所在的位置时,AA当前所在的位置为路径起点,BB所在的位置作为AA当前待行进路径的终点。

判断起点和终点是否在同一个连通区域,如果在同一个连通区域,则继续寻找路径。如果不在同一个连通区域,则不再寻找路径。避免计算资源的浪费。

在需要寻找路径的情况下,可以采用格子地图来表示连通区域。该格子地图包括多个依次排列的格子,每个格子表示连通区域内的一个节点。以AA的起点所在的格子为当前节点,AA的终点所在的格子为目标节点,即BB的位置为目标节点。

以AA所在的当前节点为中心,向8个方向上分别查找每个方向上的最长路径的终点对应的跳点。对当前节点存储八个方向最多能走的步数,步数由跳点、阻挡、边界等决定,如果遇到跳点,则步数为从当前节点走到跳点的步数;否则步数为走到阻挡或边界的步数。将跳点添加到开启节点集合中,而阻挡或者边界的节点则需要考虑目标节点是否在该方向上,如果在阻挡或者边界所在的路线上,则将阻挡或者边界上的节点添加到开启节点集合中,如果目标节点不再该方向上,则不会将阻挡或者边界上的节点添加到开启节点集合中。在每个方向上查找跳点时,如果遇到中间跳点,可以将中间跳点的后继跳点中的非中间跳点的父节点改为中间跳点的父节点,即将非中间跳点的父节点改为当前节点。将父节点为当前节点的跳点添加到开启节点集合中,并且从开启节点集合中选出F值最小的节点作为目标节点。

此时,判断从当前节点到目标节点是否可以通过一个方向上的直线路径可达,即通过水平、垂直或者对角线方向可达,如果直线路径不可达,则需要增加拐点,使得从当前节点到拐点,以及从拐点到目标节点之间的路径均为直线路径。在增加拐点时,判断目标节点和当前节点之间的横坐标的坐标差和纵坐标的坐标差,从而确定目标节点在以当前节点为中心的哪个方向上,以便在该方向上查找拐点。拐点的坐标是根据当前节点的坐标和坐标差的绝对值的最小值来确定的。如果横坐标的坐标差小于纵坐标的坐标差,则在当前节点的坐标基础上在横坐标方向上走N(N区横坐标的坐标差的绝对值)个格子所到达的格子就是拐点的位置。将拐点的添加到开启节点集合,并从开启节点集合中取出F值最小的节点,即拐点。从而确定了搜索到的路径为从当前节点到拐点,再从拐点到目标节点。

在确定拐点和目标节点之后,玩家AA从当前节点出发,走到拐点的位置后,再从拐点的位置走到图2中玩家BB所在位置,从而完成了玩家AA从起点到终点的寻路和行走。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

根据本发明实施例,还提供了一种用于实施上述路径的搜索方法的路径的搜索装置,如图9所示,该装置包括:

检测单元90,用于检测待寻路区域中用于表示路径起点的当前节点以及用于表示路径终点的目标节点。

待寻路区域在游戏中可以是游戏画面,在导航地图中可以是终端界面上显示的地图上的某个区域。待寻路区域可以采用格子表示,每个格子表示一个节点,起点和终点可以分别占用一个格子,起点占用的格子为当前节点,终点占用的格子为目标节点,该路径的搜索方法就是搜索当前节点到目标节点之间的路径。由格子表示的待寻路区域中,路径的走向包括沿格子的水平方向、垂直方向和对角线方向,即从当前节点到目标节点之间的路径包括水平方向、垂直方向和对角线方向中至少一个方向的路径。

第一查找单元92,用于以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合。

第一查找单元92包括:第三查找模块,用于以当前节点为中心,沿多个方向查找每个方向上离当前节点最近的跳点,其中,跳点包括边界节点和阻挡节点;集合模块,用于将每个方向上的所有跳点集合确定为第一节点集合。

由于每个格子有垂直和水平方向上的4个方向,以及对角线方向上的4个方向,因此,多个方向可以是4个方向或者8个方向。本实施例采用8个方向为例进行说明。最长路径可以用最多能走的步数来确定,即每个点在八个方向最多能走的步数。这个步数值将影响JPS中节点的拓展顺序和拓展“跨度”,加快寻路效率。由于需要存储八个方向最多能走多少步,如果地图大小是N*N,每个方向最多能走的步数用16位数表示,则需要存储空间N*N*8*16bit,如果N为1024,则大概需要存储空间为16M,小于1024*1024个格子的图可以在1秒内处理完。

其中,步数由跳点、阻挡、边界等决定,如果遇到跳点,则步数为从当前节点走到跳点的步数;否则步数为从当前节点走到阻挡或边界的步数。例如对图5中的N点,向北(上北下南)最多走到节点8,即2步,北向的最长路径为2步;向南最多走到节点4,即4步,南向的最长路径为4步;向西最多走到节点6,即3步,西向的最长路径为3步;向东最多走到节点2(节点2是满足上文定义二第(2)条的跳点),即5步,东向的最长路径为5步;西北最多走到节点7,即2步,西北的最长路径为2步;东北最多走到节点1(节点为1是上文定义二第(3)条定义的跳点),即1步;西南最多走到节点5,即3步,西南的最长路径为3步;东南最多走到节点3(节点3是上文定义二第(3)条定义的跳点),即3步,东南最长路径为3步。存储这8个方向上的最长路径。

第二查找单元94,用于在所第一方向上查找跳点,得到第二节点集合,其中,目标节点处于第一方向,多个方向包括第一方向。

如图5所示,第一方向可以是从节点N到节点5的方向,即西南方向。在确定第一方向时,可以根据目标节点相对于起始节点的坐标来确认,因为目标节点处于起始节点的西南方向,因此,在西南方向上查找目标跳点。查找到的跳点可以是一个或者多个。在确定第一方向时,如图5所示,节点N的坐标为(4,5),节点T的坐标为(3,3),坐标差为(-1,-2),则确定节点T在坐标系的位置,也就确定了节点T在节点N的西南方向,则在西南方向上查找目标跳点。

根据各方向最长路径的步数,可以快速确定八个方向最远能到达的节点,从而得到第一节点集合为{1,2,3,4,5,6,7,8}。如图5所示,其中,节点1、2、3均为满足定义二的跳点,直接加入开启节点集合,对于节点4、5、6、7、8,首先判断终点T位于以N为中心的南、西南、西、西北、北的哪部分,因为T位于西南方向,只有节点5位于西南方向,因此节点4、6、7、8直接删除,在从N到5的方向上,N可走3步,而N和T的x坐标差绝对值dx为1,y坐标差绝对值dy为2,因此将从节点N到节点5方向上走min(dx,dy)步即节点11,加入开启节点集合。

从开启节点集合取出F值最小节点11,垂直方向找到跳点T,加入开启节点集合,得到第二节点集合{11}。从第一节点集合和第二节点集合中国取出F值最小节点T,为目的点,搜索结束,此时获得的路径为N(4,5)、节点11(3,4)、节点T(3,3)。

第三查找单元96,用于从第一节点集合和第二节点集合的所有跳点中查找目标跳点,其中,当前节点到目标跳点之间的第一路径以及目标跳点到目标节点之间的第二路径的路径组合的路径最短。

也就是说,从节点N(4,5)到节点11(3,4)之间的路径,以及节点11(3,4)与节点T(3,3)之间的路径的组合为最短路径。

确定单元98,用于将路径最短的路径组合确定为路径起点到路径终点的路径。

在图5所示的例子中,起始节点为N(4,5),目标节点为T(3,3),从起始节点到目标节点的路径为,节点N(4,5)到节点11(3,4)再到节点11(3,4)之间的路径。

本实施例存储了多个方向上的节点,在确定了目标节点所在的方向之后,可以根据已经存储的多个方向上的节点来快速确定目标调点,无需在每一步节点拓展过程中沿各方向寻找跳点,提高了查找节点的速度,从而解决了现有技术中搜索路径的效率比较低的技术问题,达到了提高搜索路径的效率的技术效果。

中间跳点在节点拓展过程中具有简单的“承接”作用,不具备拓展价值,将中间跳点放入开启节点集合会增大扩展的次数,因此本实施例可以将中间跳点全部删除(即剪枝),将中间跳点后继跳点中的非中间跳点的父跳点改为中间跳点的父跳点,可以有效避免冗余的节点拓展运算。可选地,第二查找单元包括:第一查找模块,用于在第一方向上查找中间跳点和中间跳点的下一级跳点;设置模块,用于将下一级跳点的父节点设置为当前节点;第一确定模块,用于将父节点为当前节点的所有下一级跳点作为第二节点集合。

下面以图6的场景为例对剪枝的同时进行寻路的方法进行说明。起点为S(坐标为(1,1),即S(1,1)),节点1、4、6均为中间跳点:因为节点2、3是满足定义二第(2)条的跳点,所以节点1是为了到达节点2、3的中间跳点,同理节点4、6也为中间跳点。在剪枝中间跳点之前,要将中间跳点的后继节点的父节点调整为该中间跳点的父节点。例如图6中,节点1的后继跳点为节点2、3、4,其中节点4也为中间跳点,删掉中间跳点中的节点1后,节点2、3的父跳点由节点1改为节点S,删除中间跳点中的节点4后,节点4的后继跳点5的父跳点由节点4改为节点S(节点4的父跳点为节点1,但节点1已经被删掉,因此回溯到节点S),删除中间跳点中的节点6后,节点6的后继跳点7的父跳点由节点6改为节点S(节点6的父跳点为节点4,但节点4被删,节点4的父跳点节点1也被删,因此回溯到节点S)。上述过程是简化的逻辑描述,实际运行中的做法是从节点S寻找跳点,首先找到中间跳点节点1,然后在水平方向和垂直方向寻找到跳点节点2、3,将节点2、3的父跳点设为节点S;继续沿对角线方向寻找跳点,走到节点4后,沿水平方向和垂直方向寻找到跳点节点5,将节点5的父跳点设为节点S;继续沿对角线方向寻找跳点,走到节点6后,沿水平方向和垂直方向寻找到跳点7,将跳点7的父跳点设为节点S。因此获得路径S(1,1)、节点7(4,6)。

可选地,第三查找单元包括:判断模块,用于在目标跳点为目标节点的情况下,判断从当前节点到目标节点是否为直线路径可到达;第二查找模块,用于在当前节点与目标节点之间通过直线路径不可到达的情况下,查找拐点,其中,当前节点与拐点之间为直线路径,且拐点与目标节点之间为直线路径;第二确定模块,用于将查找到的拐点作为目标跳点。

假设目前搜索到的路径为起始节点(jp1)、jp2、jp3...jpk..目标节点(jpn),对每两个相邻的跳点jpi、jpi+1,一,如果jpi、jpi+1的x坐标或者y坐标相等,说明这两个跳点在同一个水平方向或垂直方向,可以直线到达,无需在这两个跳点之间加入拐点;二,如果jpi、jpi+1的x坐标和y坐标都不相等,(1)如果x坐标的差dx(即jpi的x坐标减去jpi+1的x坐标)和y坐标的差dy的绝对值相等,说明这两个跳点在对角线方向,也可以直线到达,无需在这两个跳点之间加入拐点;(2)如果x坐标的差dx和y坐标的差dy的绝对值不相等,说明这两个跳点不在对角线方向,并且有可能不能直线到达(因为跳点附近有阻挡),此时jpi、jpi+1之间只需要加入一个从jpi出发离jpi+1最近的对角线上的点即可(jpi、jpi+1不能水平、垂直、对角线到达,说明jpi、jpi+1之间一定存在被剪枝的中间跳点,只需要补上离jpi+1最近的一个中间跳点充当拐点即可,该拐点即为jpi沿对角线方向走min(dx,dy)步到达的点)。

可选地,第二查找模块包括:获取子模块,用于获取目标节点的坐标和当前节点的坐标在横坐标上的第一坐标差和在纵坐标上的第二坐标差;确定子模块,用于将第一坐标差和第二坐标差为坐标的节点作为拐点。

在图6所示的例子中,因为路径中S(1,1)无法沿垂直方向、水平方向或者对角线方向走到节点7(4,6),需要加入中间拐点,根据上述的拐点添加策略,有dx为3,dy为5,需要从S沿对角线走3步,即节点6(4,4)可作为中间拐点,因此,在图6的示例中,最后构建的完整路径为S(1,1)、节点6(4,4)、节点7(4,6)。

可选地,装置还包括:编码单元,用于在以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合之前,对待寻路区域内的所有节点进行编码,其中,编码的数据位用于表示可行进节点和不可行进节点;第四查找单元,用于利用指令从编码中查找所有节点中的跳点和阻挡节点。

游戏画面或者地图画面由格子组成,即待寻路区域包括多个格子,每个格子表示一个节点。格子可以有障碍物,也可以是无障碍物的。如图7所示为待寻路区域,黑色表示有障碍物,白色表示无障碍物,可以通行。对图中的格子进行编码。假设当前位置为I,当前方向为右,位运算中使用1代表不可走,0代表可走,则I当前行B的八位可以用八个bit:00000100表示,I上一行B-的八位可以用八个bit:00000000表示,I的下一行B+的八位可以用八个bit:00110000表示。在当前行寻找阻挡的位置可以用CPU的指令__builtin_clz(B)(返回前导0的个数),即当前阻挡在第5个位置(从0开始)。寻找当前行的跳点可以用__builtin_clz(((B->>1)&&!B-)||((B+>>1)&&!B+))寻找,例如本例中(B+>>1)&&!B+为:(00110000>>1)&&11001111,即00001000,而(B->>1)&&!B为00000000,所以__builtin_clz(((B->>1)&&!B-)||((B+>>1)&&!B+))为__builtin_clz(00001000)为4,所以跳点为第4个位置M(从0开始)。

可选地,装置还包括:检测单元,用于在以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合之前,检测当前节点所在的当前区域和目标节点所在的目标区域是否在同一连通区域;第一查找单元包括:第四查找模块,用于在检测出当前区域和目标区域在同一连通区域的情况下,以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合。

可选地,装置还包括:第五查找模块,用于在检测当前节点所在的当前区域和目标节点所在的目标区域是否在同一连通区域之后,在检测出当前区域和目标区域不在同一连通区域的情况下,不再执行以当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点。

在搜索起点到终点之间的路径时,先要判断起点和终点之间是否为可通行的,如果起点和终点之间有阻挡不能通行,则无需搜索路径,避免在起点和终点之间有阻挡不能通行的情况下搜索路径导致的资源浪费。如图8所示,起点S不可到达终点E,然而寻路算法仍然会花费时间去寻找S、E之间的路径,而且失败情况下寻路花费的时间远大于成功情况下寻路花费的时间,因为失败情况下需要遍历所有的路径,才能确定两点不可达。因此为了避免这种情况,在每次寻路之前,判断起点和终点是否可达:如果起点和终点在同一连通区域,则起点和终点可达,否则不可达。只有起点和终点可达,才需要去寻路。

可选地,装置还包括:第五查找单元,用于在检测当前节点所在的当前区域和目标节点所在的目标区域是否在同一连通区域之前,在待寻路区域中查找连通区域,其中,连通区域中的每个节点与连通区域中的至少一个节点相邻。

如图8所示,当前节点S和目标节点E之间被黑色的部分阻挡,在当前节点S和目标节点E之间不存在可通行的路径。本实施例在搜索当前节点S和目标节点E之间的路径之前,就可判断出当前节点S和目标节点E之间不可通行。

根据本发明实施例,还提供了一种用于实施上述路径的搜索方法的电子装置,如图10所示,该电子装置包括:

1)处理器

2)存储器

可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例在此不再赘述。

可选地,在本实施例中,上述电子装置可以位于计算机网络的多个网络设备中的至少一个网络设备。

可选地,图10是根据本发明实施例的一种电子装置的结构框图。如图10所示,该电子装置可以包括:一个或多个(图中仅示出一个)处理器1001、至少一个通信总线1002、用户接口1003、至少一个传输装置1004和存储器1005。其中,通信总线1002用于实现这些组件之间的连接通信。其中,用户接口1003可以包括显示器1006和键盘1007。传输装置1004可选的可以包括标准的有线接口和无线接口。

其中,存储器1005可用于存储软件程序以及模块,如本发明实施例中的路径的搜索方法对应的程序指令/模块,处理器1001通过运行存储在存储器1005内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的路径的搜索方法。存储器1005可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器1005可进一步包括相对于处理器1001远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

上述的传输装置1004用于经由一个网络接收或者发送数据。上述的网络具体实例可包括有线网络及无线网络。在一个实例中,传输装置1004包括一个网络适配器(Network Interface Controller,NIC),其可通过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,传输装置1004为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。

其中,存储器1005用于存储跳点、拐点、第一节点集合和第二节点集合等。

在本实施例中,处理器1001可以通过传输装置调用存储器1005存储的信息及应用程序,以执行下述步骤:

可选的,上述处理器1001还可以执行如下步骤的程序代码:检测待寻路区域中用于表示路径起点的当前节点以及用于表示路径终点的目标节点;以所述当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合;在所第一方向上查找跳点,得到第二节点集合,其中,目标节点处于所述第一方向,所述多个方向包括所述第一方向;从所述第一节点集合和所述第二节点集合中查找目标跳点,其中,所述当前节点到所述目标跳点之间的第一路径以及所述目标跳点到所述目标节点之间的第二路径的路径组合的路径最短;将路径最短的所述路径组合确定为所述路径起点到所述路径终点的路径。

可选的,上述处理器1001还可以执行如下步骤的程序代码:在所述第一方向上查找中间跳点和所述中间跳点的下一级跳点;将所述下一级跳点的父节点设置为所述当前节点;将父节点为所述当前节点的所有所述下一级跳点作为所述第二节点集合。

可选的,上述处理器1001还可以执行如下步骤的程序代码:在所述目标跳点为所述目标节点的情况下,判断从所述当前节点到所述目标节点是否为直线路径可到达;在所述当前节点与所述目标节点之间通过直线路径不可到达的情况下,查找拐点,其中,所述当前节点与所述拐点之间为直线路径,且所述拐点与所述目标节点之间为直线路径;将查找到的拐点作为所述目标跳点。

可选的,上述处理器1001还可以执行如下步骤的程序代码:获取所述目标节点的坐标和所述当前节点的坐标在横坐标上的第一坐标差和在纵坐标上的第二坐标差;将所述第一坐标差和所述第二坐标差为坐标的节点作为所述拐点。

可选的,上述处理器1001还可以执行如下步骤的程序代码:以所述当前节点为中心,沿多个方向查找每个方向上离所述当前节点最近的跳点,其中,所述跳点包括边界节点和阻挡节点;将所述每个方向上的所有所述跳点集合确定为所述第一节点集合。

可选的,上述处理器1001还可以执行如下步骤的程序代码:对所述待寻路区域内的所有节点进行编码,其中,所述编码的数据位用于表示可行进节点和不可行进节点;利用指令从所述编码中查找所述所有节点中的跳点和阻挡节点。

可选的,上述处理器1001还可以执行如下步骤的程序代码:检测所述当前节点所在的当前区域和所述目标节点所在的目标区域是否在同一连通区域;在检测出所述当前区域和所述目标区域在所述同一连通区域的情况下,以所述当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合。

可选的,上述处理器1001还可以执行如下步骤的程序代码:在检测出所述当前区域和所述目标区域不在所述同一连通区域的情况下,不再执行以所述当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点。

可选的,上述处理器1001还可以执行如下步骤的程序代码:在所述待寻路区域中查找连通区域,其中,所述连通区域中的每个节点与所述连通区域中的至少一个节点相邻。

本领域普通技术人员可以理解,图10所示的结构仅为示意,电子装置也可以是智能手机(如Android手机、iOS手机等)、平板电脑、掌声电脑以及移动互联网设备(Mobile Internet Devices,MID)、PAD等终端设备。图10其并不对上述电子装置的结构造成限定。例如,电子装置10还可包括比图10中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图10所示不同的配置。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(Read-Only Memory,ROM)、随机存取器(Random Access Memory,RAM)、磁盘或光盘等。

本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的程序代码:

可选地,在本实施例中,上述存储介质可以位于网络中的多个网络设备中的至少一个网络设备。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:

S1,检测待寻路区域中用于表示路径起点的当前节点以及用于表示路径终点的目标节点;

S2,以所述当前节点为中心,沿多个方向查找每个方向上最长路径的终点对应的跳点,得到第一节点集合;

S3,在所第一方向上查找跳点,得到第二节点集合,其中,目标节点处于所述第一方向,所述多个方向包括所述第一方向;

S4,从所述第一节点集合和所述第二节点集合中查找目标跳点,其中,所述当前节点到所述目标跳点之间的第一路径以及所述目标跳点到所述目标节点之间的第二路径的路径组合的路径最短;

S5,将路径最短的所述路径组合确定为所述路径起点到所述路径终点的路径。

可选地,存储介质还被设置为存储用于执行上述实施例的方法中所包括的步骤的程序代码,本实施例中对此不再赘述。

可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例在此不再赘述。

上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1