挂马检测
基于Unity的A星寻路算法(绝对简单完整版本)前⾔
在上⼀篇⽂章,介绍了⽹格地图的实现⽅式,基于该⽂章,我们来实现⼀个A星寻路的算法,最终实现的效果为:
项⽬源码已上传Github:
在阅读本篇⽂章,如果你对于⾥⾯提到的⼀些关于⽹格地图的创建⽅式的⼀些地图不了解的话,可以先阅读了解⼀下下⾯的这篇⽂章:⽂章链接:
1、简单做⼀些背景介绍
在介绍A星寻路算法前,先介绍另外⼀种算法:Dijkstra寻路算法,简单的来说是⼀种A星寻路的基础版。Dijkstra作为⼀种⽆启发的寻路算法,通过围绕起始点向四周扩展遍历,⼀直到到⽬标点结束,简单来说就是暴⼒破解,由近到远遍历所有可能,从⽽到⽬标点
很明显,这种寻路⽅式是很的消耗性能的,⾮常的不⾼效,有没有更好的解决⽅式呢
从实际⽣活中出发,如果你要到达某地,却不知道具体的路该怎么办呢,是不是先⼤概确定⽅向,边靠近⽬标点边问路呢
A星寻路算法也是基于这样的思路,通过⼀定的逻辑到可以靠近物体的⽅向,然后⼀步步的⾛进⽬标点,直到到达⽬的地。
⼆、A星寻路算法的基本原理
整个理解过程是⼀个线性结构,只需要⼀步步完整的⾛下去,基本就可以对于A星有⼀个⼤概的了解。
确定直⾓斜⾓权重:
本质上来讲,A星寻路是基于⼀种⽹格的地图来实现的寻路的⽅式,在⽹格中,⼀个点可以到达的位置为周围的⼋个⽅向。⽽由于⽔平与垂直和倾斜的⽅向距离不⼀样,所以我们在寻路时需要设置不同的长度: 通过图⽚可以看出,直线距离与斜线距离是分别等腰直⾓三⾓形直⾓边与斜边。根据勾股定理我们可以得知两者的⽐例关系约为1.41:1,为了⽅便计算,我们就将斜边权重为14,⽽直⾓边权重为10,这样的话,要得到最短的路径,可以按照下⾯的思路去考虑: 遍历移动格⼦可能性:
接下来需要考虑第⼆个问题,在对起始点周围的可移动格⼦遍历完成后,如何到最短路径上的那个格⼦呢,即下⼀步该⾛哪⼀个格⼦,这⾥就是整个A星寻路算法的核⼼:
如图,当我们第⼀步对起始点A周围所有的格⼦遍历后,从A出发有⼋个可以移动的⽅向可以到达下⼀个格⼦。如果你作为⼀个⼈类,当然⼀眼可以看出下⼀步向绿⾊箭头⽅向移动产⽣的路径是最短的。
消声室制作
我们⼈类可以根据经验很快的判断出⽅向,但是机器不能,计算机需要严谨的程序逻辑来实现这样的效果,需要我们赋予他基本的执⾏程序。通过重复的执⾏这样的逻辑,得到最终的效果。因此,接下来,需要思考如何让计算机在⼀系列点位中到⽅向最正确的那个点位
计算某⼀格⼦期望长度:
到⽬前,我们的⽬的就是使计算机可以到到所有可以⾛的格⼦中产⽣路径最短的格⼦。接下来以你的经验来思考,⽐较长短往往是依据什么。嘿嘿,别想歪,确实是数字的⼤⼩。所以我们需要给每⼀个格⼦⼀个数值来作为路径通过该格⼦的代价。
当程序进⾏到现在,要解决的问题是如何求得⼀个数字来代表该格⼦。实现⽅式是通过计算⼀个通过格⼦路径长度的对⽐来到最短的路径。⽽任⼀格⼦记录路径长度标记为All,并可以将其分为两部分:已⾛路径与预估路径(不理解没关系,接着往下看):
如图(灵魂画⼿,顺便加个防伪标志嘿嘿)求从A到B点的路径,当前已经寻路到C点,如何求得经过该点的⼀个期望路径的长度呢:
到达该格⼦已经⾛过的路径长度G:G值的计算是基于递推的思想,根据上⼀个格⼦的G再加上上⼀个格⼦到这个格⼦的距离即可当前格⼦到达终点预估路径长度H:该距离是⼀个估计的距离,⾄于如何估计的,接下来会进⾏介绍
然后就可以求出该点的整个期望路径长度All,对G和H进⾏⼀个简单的加法:
这样我们就可以通过下⼀步所有可能的移动的格⼦中到最短的格⼦ic卡考勤
关于预估路径长度H的计算:
实现对于H的计算的估计有很多,由于本来就是预估,换句话就是不是⼀定准确的结果,所以我们可以通过计算当前节点到⽬标点的直线距离或者⽔平加垂直距离来获得
在本⽂章的后⾯演⽰案例中,是基于⽔平加垂直距离来计算预估路径长度H,即在上⾯的图中,从C到B的预估路径计算⽅式为:
Hcb = ⽔平格⼦差 * 10 + 垂直格⼦差 * 10
上述步骤总结升级:
假设我们⾛到了C点,并且接下来只能从C点向下⼀步移动,可以在下⾯的图中看出接下来格⼦的所有可能性:
下⾯我们来⼿动计算⼀下4号和5号的预估路径长度来帮助你理解这个过程,开始前我们要知道⼀条斜边长14,直边长度为10:
则AC的长度为:
Lac=4*14=56
自动打蜡机4号:
H = Lac + 1 * 14 = 70
G = 2 * 10 + 2 * 10 = 40
All = H + G = 110
5号:
H = Lac + 1 * 10 = 66
G = 2 * 10 + 3 * 10 = 50
All = H + G = 116pe附着力促进剂
电子岗哨经过对⽐,5号格⼦的期望路径长度长于4号,在计算机运⾏程序时,会对1到7号都进⾏这样的计算,然后求得其中的⼀个最⼩值并作为下⼀步的移动⽬标
注意:
如过有两个或者多个相同的最⼩值,会根据程序的写法选择任意⼀个,这不影响整个程序的运⾏思路
进⼀步升级
我们发现,上述步骤是有⼀些问题,因为场景中没有障碍物,所以物体会⼀直⾛直线。但是在实际情况中,假若寻路⾛进了死胡同,最后的C点周围没有可以移动的点位怎么办呢。