发明内容
本发明实施例提供了一种利用二叉堆排序的寻路方法及装置,通过利用二叉堆排序方法对A*寻路算法中开放列表进行排序的方式,能够快速寻找出最小开销值,进而能够快速的得到最小开销路径。
本发明实施例提供的利用二叉堆排序的寻路方法,包括:
开放列表,用于存储地图格子节点,起始点与所述节点组成路径;
S1:将所述开放列表按二叉堆最小堆排列,得到二叉堆列表;
S2:当向所述二叉堆列表添加新节点时,执行步骤S3,当向所述二叉堆列表中取用最小值节点时,执行步骤S4;
S3:对所述二叉堆列表执行堆插入操作;
步骤S3包括:
S31:将所述新节点放置在所述二叉堆列表末端,得到插入堆列表;
S32:将所述插入堆列表进行二叉堆最小堆排列;
S4:删除所述最小值节点并对所述二叉堆列表执行堆重排操作;
步骤S4包括:
S41:删除所述最小值节点;
S42:将所述二叉堆列表末端的节点放置在所述最小值节点的位置,得到删除堆列表;
S43:将所述删除堆列表进行二叉堆最小堆排列。
可选地,
所述步骤S43之后还包括:
S5:将所述二叉堆列表按列表排列,得到新的开放列表;
S6:将所述新的开放列表存储。
可选地,
所述步骤S32包括:
将所述新节点与其父节点比较,确定所述新节点小于所述父节点时,将所述新节点与所述父节点的位置交换。
可选地,
所述步骤S43包括:
自上往下将最小值节点位置的节点与其最小子节点比较,确定所述最小值节点位置的节点大于所述最小子节点时,将所述最小值节点位置的节点与所述最小子节点的位置交换,得到交换二叉堆;
对所述交换二叉堆进行二叉堆最小堆排列。
本发明实施例提供的利用二叉堆排序的寻路装置,包括:
开放列表,用于存储地图格子节点,起始点与所述节点组成路径;
排列模块,与所述判断模块相连,用于将所述开放列表按二叉堆最小堆排列,得到二叉堆列表;
判断模块,与堆插入模块及堆删除模块相连,用于判断二叉堆列表需要进行的是添加新节点操作还是取用最小值点操作,并当为向所述二叉堆列表添加新节点操作时,对所述二叉堆列表执行堆插入操作,当为向所述二叉堆列表中取用最小值节点操作时,删除所述最小值节点并对所述二叉堆列表执行堆重排操作;
所述堆插入模块,用于对所述二叉堆列表执行堆插入操作;
所述堆插入模块包括:
第一放置单元,与所述第一排列单元相连,用于将所述新节点放置在所述二叉堆列表末端,得到插入堆列表;
第一排列单元,用于将所述插入堆列表进行二叉堆最小堆排列;
所述堆删除模块,用于删除所述最小值节点并对所述二叉堆列表执行堆重排操作;
所述堆删除模块包括:
删除单元,与所述第二放置单元相连,用于删除所述最小值节点;
第二放置单元,与所述第二排列单元相连,用于将所述二叉堆列表末端的节点放置在所述最小值节点的位置,得到删除堆列表;
第二排列单元,用于将所述删除堆列表进行二叉堆最小堆排列。
可选地,
所述装置还包括:
列表排列模块,与所述堆插入模块及所述堆删除模块相连,用于将所述二叉堆列表按列表排列,得到新的开放列表;
存储模块,与所述列表排列模块相连,用于将所述新的开放列表存储。
本发明实施例中,首先将所述开放列表按二叉堆最小堆排列,得到二叉堆列表;然后判断二叉堆列表需要进行的是添加新节点操作还是取用最小值点操作,当向所述二叉堆列表添加新节点时,对所述二叉堆列表执行堆插入操作;当向所述二叉堆列表中取用最小值节点时,删除所述最小值节点并对所述二叉堆列表执行堆重排操作;其中对所述二叉堆列表执行堆插入操作包括:先将所述新节点放置在所述二叉堆列表末端,得到插入堆列表;然后将所述插入堆列表进行二叉堆最小堆排列;删除所述最小值节点并对所述二叉堆列表执行堆重排操作步骤包括:首先删除所述最小值节点;接着将所述二叉堆列表末端的节点放置在所述最小值节点的位置,得到删除堆列表;最后将所述删除堆列表进行二叉堆最小堆排列。通过利用二叉堆排序方法对A*寻路算法中开放列表进行排序的方式,本发明利用二叉堆排序的寻路方法及装置能够快速寻找出最小开销值,进而能够快速的得到最小开销路径。
具体实施方式
本发明实施例提供了一种利用二叉堆排序的寻路方法及装置,通过利用二叉堆排序方法对A*寻路算法中开放列表进行排序的方式,能够快速寻找出最小开销值,进而能够快速的得到最小开销路径。
A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。
二叉堆是一种特殊的堆,二叉堆是完全二元树或者是近似完全二元树。二叉堆有两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。
请参阅图1,本发明实施例利用二叉堆排序的寻路方法的第一实施例包括:
开放列表,用于存储地图格子节点,起始点与节点组成路径;
S1:将开放列表按二叉堆最小堆排列,得到二叉堆列表;
开放列表一般表现为,例如10、15、56、32,的形式,通过用二叉堆列表的方式来表现开放列表,可以较为方便地获得最小值节点。
S2:判断对二叉堆列表的操作,当为向二叉堆列表添加新节点时,执行步骤S3,当为向二叉堆列表中取用最小值节点时,执行步骤S4;
得到二叉堆列表之后,判断二叉堆列表需要进行的是添加新节点操作还是取用最小值点操作,当为向二叉堆列表添加新节点操作时,执行步骤S3,当为向二叉堆列表中取用最小值节点操作时,执行步骤S4。
S3:对二叉堆列表执行堆插入操作;
有新节点需要添加到二叉堆列表时,首先可以将新节点放置在二叉堆列表末端,得到插入堆列表后,可以将插入堆列表进行二叉堆最小堆排列。
当新节点为二叉堆列表时,直接将该新节点放置在二叉堆列表中即可。
S4:删除最小值节点并对二叉堆列表执行堆重排操作;
当最小值节点已经被取用,需要将最小值节点删除,具体过程可以包括:首先删除最小值节点;然后将二叉堆列表末端的节点放置在最小值节点的位置,并得到删除堆列表;最后将删除堆列表进行二叉堆最小堆排列,可以得到新的最小值节点。
本发明实施例中,首先将开放列表按二叉堆最小堆排列,得到二叉堆列表;然后判断二叉堆列表需要进行的是添加新节点操作还是取用最小值点操作,当向二叉堆列表添加新节点时,对二叉堆列表执行堆插入操作;当向二叉堆列表中取用最小值节点时,删除最小值节点并对二叉堆列表执行堆重排操作;其中对二叉堆列表执行堆插入操作包括:先将新节点放置在二叉堆列表末端,得到插入堆列表;然后将插入堆列表进行二叉堆最小堆排列;删除最小值节点并对二叉堆列表执行堆重排操作步骤包括:首先删除最小值节点;接着将二叉堆列表末端的节点放置在最小值节点的位置,得到删除堆列表;最后将删除堆列表进行二叉堆最小堆排列。通过利用二叉堆排序方法对A*寻路算法中开放列表进行排序的方式,本发明利用二叉堆排序的寻路方法能够快速寻找出最小开销值,进而能够快速的得到最小开销路径。
上面简单介绍了本发明利用二叉堆排序的寻路方法的第一实施例,下面对本发明利用二叉堆排序的寻路方法的第二实施例进行详细的描述,请参阅图2,本发明实施例中利用二叉堆排序的寻路方法的第二实施例包括:
201:将开放列表按二叉堆最小堆排列,得到二叉堆列表;
开放列表一般表现为,例如10、15、56、32,的形式,通过用二叉堆列表的方式来表现开放列表,可以较为方便地获得最小值节点。
202:判断对二叉堆列表的操作,当为向二叉堆列表添加新节点时,执行步骤203,当为向二叉堆列表中取用最小值节点时,执行步骤204;
得到二叉堆列表之后,判断二叉堆列表需要进行的是添加新节点操作还是取用最小值点操作,当为向二叉堆列表添加新节点操作时,执行步骤203,当为向二叉堆列表中取用最小值节点操作时,执行步骤204。
203:对二叉堆列表执行堆插入操作;
有新节点需要添加到二叉堆列表时,首先可以将新节点放置在二叉堆列表末端,得到插入堆列表后,将新节点与其父节点比较,确定新节点小于父节点时,将新节点与父节点的位置交换。
需要说明的是,当新节点为二叉堆列表时,直接将该新节点放置在二叉堆列表中即可。
下面以一个具体实例来说明步骤S3的执行过程:
请参阅图3,图a为原有二叉堆列表,图b为插入堆列表,图c为新的二叉堆列表。假设将新节点15插入原有二叉堆列表中,操作过程是:先把新节点15放到堆末尾,如图b;然后将新节点15与其父节点40作比较,得到新节点比40要小,交换新节点与父节点的位置,如图c;再将新节点15跟10比较,得到新节点比10要大,符合堆的性质,插入完成。
204:删除最小值节点并对二叉堆列表执行堆重排操作;
当最小值节点已经被取用,需要将最小值节点删除,具体过程可以包括:首先删除最小值节点;然后将二叉堆列表末端的节点放置在最小值节点的位置,并得到删除堆列表;最后自上往下将最小值节点位置的节点与其最小子节点比较,确定最小值节点位置的节点大于最小子节点时,将最小值节点位置的节点与最小子节点的位置交换,得到交换二叉堆;对交换二叉堆进行二叉堆最小堆排列,可以得到新的最小值节点。
下面以一个具体实例来说明步骤S4的执行过程:
请参阅图4,图a为原有二叉堆列表,图b为删除堆列表,图c为删除堆列表,图d为新的二叉堆列表。假设删除最小值节点10,操作过程是:如图b,先把最小值节点10删除;然后将处于原有二叉堆列表末端的节点40放置在最小值节点的位置,如图c;然后将节点40与其最小子节点15作比较,得到最小子节点15比节点40要小,交换最小子节点15比节点40的位置,如图d,符合堆的性质,插入完成。
205:将二叉堆列表排列按列表排列,得到新的开放列表;
将二叉堆列表按列表排列,得到新的开放列表,以便于对节点数据的存储。
206:将新的开放列表存储。
通过利用二叉堆排序方法对A*寻路算法中开放列表进行排序的方式,本发明利用二叉堆排序的寻路方法能够快速寻找出最小开销值,进而能够快速的得到最小开销路径。
上面对本发明利用二叉堆排序的寻路的第二实施例作了详细描述,特别是步骤S3及S4的具体过程,下面介绍本发明利用二叉堆排序的寻路装置实施例,请参阅图5,本发明实施例中利用二叉堆排序的寻路装置实施例包括:
开放列表,用于存储地图格子节点,起始点与节点组成路径;
排列模块501,与判断模块502相连,用于将开放列表按二叉堆最小堆排列,得到二叉堆列表;
判断模块502,与堆插入模块503及堆删除模块504相连,用于判断二叉堆列表需要进行的是添加新节点操作还是取用最小值点操作,并当为向二叉堆列表添加新节点操作时,对二叉堆列表执行堆插入操作,当为向二叉堆列表中取用最小值节点操作时,删除最小值节点并对二叉堆列表执行堆重排操作;
堆插入模块503,用于对二叉堆列表执行堆插入操作;
堆插入模块503包括:
第一放置单元5031,与第一排列单元5032相连,用于将新节点放置在二叉堆列表末端,得到插入堆列表;
第一排列单元5032,用于将插入堆列表进行二叉堆最小堆排列;
堆删除模块,用于删除最小值节点并对二叉堆列表执行堆重排操作;
堆删除模块504包括:
删除单元5041,与第二放置单元5042相连,用于删除最小值节点;
第二放置单元5042,与第二排列单元5043相连,用于将二叉堆列表末端的节点放置在最小值节点的位置,得到删除堆列表;
第二排列单元5043,用于将删除堆列表进行二叉堆最小堆排列。
上述装置还包括:
列表排列模块505,与堆插入模块503及堆删除模块504相连,用于将二叉堆最小堆排列按列表排列,得到新的开放列表;
存储模块506,与列表排列模块505相连,用于将新的开放列表存储。
本发明实施例的装置,排列模块501首先将开放列表按二叉堆最小堆排列,得到二叉堆列表;接着判断模块502判断二叉堆列表需要进行的是添加新节点操作还是取用最小值点操作;然后堆插入模块503对二叉堆列表执行堆插入操作;接着堆删除模块504删除最小值节点并对二叉堆列表执行堆重排操作;然后列表排列模块505,将二叉堆最小堆排列按列表排列,得到新的开放列表;最后存储模块506将新的开放列表存储。上述堆插入模块503对二叉堆列表执行堆插入操作的过程可以包括:第一放置单元5031将新节点放置在二叉堆列表末端,得到插入堆列表;第一排列单元5032将插入堆列表进行二叉堆最小堆排列。上述堆删除模块504删除最小值节点并对二叉堆列表执行堆重排操作的过程可以包括:删除单元5041首先删除最小值节点;然后第二放置单元5042将二叉堆列表末端的节点放置在最小值节点的位置,得到删除堆列表;最后第二排列单元5043将删除堆列表进行二叉堆最小堆排列。
通过利用二叉堆排序方法对A*寻路算法中开放列表进行排序的方式,本发明利用二叉堆排序的寻路装置能够快速寻找出最小开销值,进而能够快速的得到最小开销路径。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件完成,其中的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上对本发明所提供的一种利用二叉堆排序的寻路方法及装置进行了详细介绍,对于本领域的一般技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。