利用跳点搜索算法,优化A*寻路

Unity游戏开发 专栏收录该内容
3 篇文章 0 订阅

在游戏中寻路是无处不在的。最著名的寻找最短路径算法莫过与A*算法,实现方式有很多种,重要的是我们要掌握其原理。

在本教程中,我们将介绍一种相对较新的方法搜索——基于网格的世界的跳点的搜索,可以加速A*寻路算法。效率提升那是大大的。

我假设读者已经明白A*算法的原理。如果你对A星寻路还不是很了解的话,请网上自行另找资料

好的,下面进入正题,开始讲解Jump Point Search!(以下简称JPS)

下面开始讲解原理

常规A*算法,是向相邻的格子中搜索可能的“最近节点”,然后把所有的“最近节点”连接起来,既为最终解。至于说怎样的节点才是“最近节点”,本篇不做介绍,因为我前面已经设定了读者是已经明白A*算法的原理的了。

问题的关键,就在于,我们一定要逐格逐格的去搜索吗?随着格子密集度提升,时间复杂度也将大幅提升。

那么我们如何去优化呢?

很简单,对于大片的可行走区域,他们之间的任何一点都是可联通的,我们可以省去这部分格子的“最近节点”搜索,这将是很大一部分的搜索的运算了。我们只需要找出一些相关的控制点,然后通过控制点之间的连通,省去大部分无谓的“寻找最近节点”的运算。

具体思路如下:

1 生成/摆放好 凸多边形障碍物

2 “扩展”多边形 扩展的大小取决于 寻路者的大小

3 将地图中所有联通点(以扩展后的多边形为主)构成一张”图”

4 将寻路者的起点和目标点作为”临时节点”加入到3)中生成的图里

5 在图中寻路. 寻路后将之前的起点移除.

下面我们举个例子:

1、有如下一张地图,途中黑色填充为不可行走区
jsp2
2、 “扩展”多边形 扩展的大小取决于 寻路者的大小,如图中细线部

jsp2

3、将地图中所有联通点(以扩展后的多边形为主)构成一张”图”
jsp2

4 、将寻路者的起点和目标点作为”临时节点”加入到3)中生成的图里
jsp2

5、基于图中的“控制点” ,在图中寻路.

5.1、寻路第一步,将起始点作为搜索点,在与其相邻的控制点中,找到可能的“最近节点”,如图所示,最粗的两条线的交点,就是我们要找的“最近节点”,因为其深绿色线段+浅绿色线段的长度之和,是最短的。这也是A*寻路的基本思路。
jsp2

5.2、寻路第二步,把上一步寻找到的“最近节点”,作为新的搜索点,然后重复同样的判断,找到新的新的“最近节点”,如图所示,红色的点,就是我们要找的新的“最近节点”
jsp2

5.3、寻路第N步,重复同样的算法,寻找新的可能的“最近节点”,直到找到“终点”。如下图,深绿色的路线,就是我们寻路结果。
jsp2

总结:

看到这里,我想大家一定都懂了,也肯定明白了,为什么利用JPS算法能够大大提高A*寻路的效率。因为它省去了一些无谓的判断节点。当然它是需要在寻路之前,开销一些空间和时间去进行地图的预处理。不过这点开销,在后面寻路算法中又大大地赚了回来。

  • 1
    点赞
  • 0
    评论
  • 9
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
各种数学算法的MATLAB实现 第4章: 插值 函数名 功能 Language 求已知数据点的拉格朗日插值多项式 Atken 求已知数据点的艾特肯插值多项式 Newton 求已知数据点的均差形式的牛顿插值多项式 Newtonforward 求已知数据点的前向牛顿差分插值多项式 Newtonback 求已知数据点的后向牛顿差分插值多项式 Gauss 求已知数据点的高斯插值多项式 Hermite 求已知数据点的埃尔米特插值多项式 SubHermite 求已知数据点的分段三次埃尔米特插值多项式及其插值点处的值 SecSample 求已知数据点的二次样条插值多项式及其插值点处的值 ThrSample1 求已知数据点的第一类三次样条插值多项式及其插值点处的值 ThrSample2 求已知数据点的第二类三次样条插值多项式及其插值点处的值 ThrSample3 求已知数据点的第三类三次样条插值多项式及其插值点处的值 BSample 求已知数据点的第一类B样条的插值 DCS 用倒差商算法求已知数据点的有理分式形式的插值分式 Neville 用Neville算法求已知数据点的有理分式形式的插值分式 FCZ 用倒差商算法求已知数据点的有理分式形式的插值分式 DL 用双线性插值求已知点的插值 DTL 用二元三点拉格朗日插值求已知点的插值 DH 用分片双三次埃尔米特插值求插值点的z坐标 第5章: 函数逼近 Chebyshev 用切比雪夫多项式逼近已知函数 Legendre 用勒让德多项式逼近已知函数 Pade 用帕德形式的有理分式逼近已知函数 lmz 用列梅兹算法确定函数的最佳一致逼近多项式 ZJPF 求已知函数的最佳平方逼近多项式 FZZ 用傅立叶级数逼近已知的连续周期函数 DFF 离散周期数据点的傅立叶逼近 SmartBJ 用自适应分段线性法逼近已知函数 SmartBJ 用自适应样条逼近(第一类)已知函数 multifit 离散试验数据点的多项式曲线拟合 LZXEC 离散试验数据点的线性最小二乘拟合 ZJZXEC 离散试验数据点的正交多项式最小二乘拟合 第6章: 矩阵特征值计算 Chapoly 通过求矩阵特征多项式的根来求其特征值 pmethod 幂法求矩阵的主特征值及主特征向量 rpmethod 瑞利商加速幂法求对称矩阵的主特征值及主特征向量 spmethod 收缩法求矩阵全部特征值 ipmethod 收缩法求矩阵全部特征值 dimethod 位移逆幂法求矩阵离某个常数最近的特征值及其对应的特征向量 qrtz QR基本算法求矩阵全部特征值 hessqrtz 海森伯格QR算法求矩阵全部特征值 rqrtz 瑞利商位移QR算法求矩阵全部特征值 第7章: 数值微分 MidPoint 中点公式求取导数 ThreePoint 三点法求函数的导数 FivePoint 五点法求函数的导数 DiffBSample 三次样条法求函数的导数 SmartDF 自适应法求函数的导数 CISimpson 辛普森数值微分法法求函数的导数 Richason 理查森外推算法求函数的导数 ThreePoint2 三点法求函数的二阶导数 FourPoint2 四点法求函数的二阶导数 FivePoint2 五点法求函数的二阶导数 Diff2BSample 三次样条法求函数的二阶导数 第8章: 数值积分 CombineTraprl 复合梯形公式求积分 IntSimpson 用辛普森系列公式求积分 NewtonCotes 用牛顿-科茨系列公式求积分 IntGauss 用高斯公式求积分 IntGaussLada 用高斯拉道公式求积分 IntGaussLobato 用高斯—洛巴托公式求积分 IntSample 用三次样条插值求积分 IntPWC 用抛物插值求积分 IntGaussLager 用高斯-拉盖尔公式求积分 IntGaussHermite 用高斯-埃尔米特公式求积分 IntQBXF1 求第一类切比雪夫积分 IntQBXF2 求第二类切比雪夫积分 DblTraprl 用梯形公式求重积分 DblSimpson 用辛普森公式求重积分 IntDBGauss 用高斯公式求重积分 第9章: 方程求根 BenvliMAX 贝努利法求按模最大实根 BenvliMIN 贝努利法求按模最小实根 HalfInterval 用二分法求方程的一个根 hj 用黄金分割法求方程的一个根 StablePoint 用不动点迭代法求方程的一个根 AtkenStablePoint 用艾肯特加速的不动点迭代法求方程的一个根 StevenStablePoint 用史蒂芬森加速的不动点迭代法求方程的一个根 Secant 用一般弦截法求方程的一个根 SinleSecant 用单点弦截法求方程的一个根 DblSec
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值