A*算法优化,JPS算法

https://www.cnblogs.com/KillerAery/archive/2020/06/17/12242445.html#%E5%BC%BA%E8%BF%AB%E9%82%BB%E5%B1%85%EF%BC%88forced-neighbour%EF%BC%89

https://blog.csdn.net/qq_42688495/article/details/116019557

https://blog.csdn.net/tkokof1/article/details/111297299

3篇文档存档。

https://gitee.com/ghowoght/motion-planner/tree/develop/MotionPlanner/map/sampling

一个项目地址

跳点(Jump Point)

跳点:当前点 x 满足以下三个条件之一:

  • 节点 x 是起点/终点。
  • 节点 x 至少有一个强迫邻居。
  • 如果父节点在斜方向(意味着这是斜向搜索),节点x的水平或垂直方向上有满足条件a,b的点。

节点y的水平或垂直方向是斜向向量的拆解,比如向量d=(1,1),那么水平方向则是(1,0),并不会往左搜索,只会看右边,如果向量d=(-1,-1),那么水平方向是(-1,0),只会搜索左边,不看右边,其他同理。

实现原理

JPS 算法和A* 算法非常相似,步骤大概如下:

  1. openlist取一个权值最低的节点,然后开始搜索。(这些和A*是一样的)
  2. 搜索时,先进行 直线搜索(4/8个方向,跳跃搜索),然后再 斜向搜索(4个方向,只搜索一步)。如果期间某个方向搜索到跳点或者碰到障碍(或边界),则当前方向完成搜索,若有搜到跳点就添加进openlist。

跳跃搜索是指沿直线方向一直搜下去(可能会搜到很多格),直到搜到跳点或者障碍(边界)。一开始从起点搜索,会有4个直线方向(上下左右),要是4个斜方向都前进了一步,此时直线方向会有8个。

  1. 若斜方向没完成搜索,则斜方向前进一步,重复上述过程。

因为直线方向是跳跃式搜索,所以总是能完成搜索。

  1. 若所有方向已完成搜索,则认为当前节点搜索完毕,将当前节点移除于openlist,加入closelist。
  2. 重复取openlist权值最低节点搜索,直到openlist为空或者找到终点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值