A*算法
https://www.redblobgames.com/pathfinding/a-star/introduction.html这是个宝藏网页,https://www.redblobgames.com/pathfinding/a-star/introduction.html,里边的图可以一步一步演示!
A*算法
个人理解F=G+H,F是总距离,G是已经走过的距离,F是暂未走过的距离,通过不断探索领进路径直至所有路径都到达终点,然后反向去确定最短路!
A*算法是静态路网中寻找最短路的最有效算法!
G是确定的,H是不确定的
H取决去启发式函数,常用的启发式函数有欧几里得距离函数和曼哈顿距离函数
Dijkstra算法
Dijkstra
Dijkstra,个人理解相当于在一个已知权边图的问题中,添加一个列表记录路径和总行驶距离,在距离中每次都按照最小的进行选择,结合图中距离选择下一个节点,进行记录,直至所有节点都选择完成,从而实现最短路的选择。
Dijkstra算法讲解视频
比较
Dijkstra算法和A算法都是最短路径问题的常用算法,下面就对这两种算法的特点进行一下比较:
Dijkstra算法计算源点到其他所有点的最短路径长度,A关注点到点的最短路径(包括具体路径)。
Dijkstra算法建立在较为抽象的图论层面,A算法可以更轻松地用在诸如游戏地图寻路中。
Dijkstra算法的实质是广度优先搜索,是一种发散式的搜索,所以空间复杂度和时间复杂度都比较高。对路径上的当前点,A算法不但记录其到源点的代价,还计算当前点到目标点的期望代价,是一种启发式算法,也可以认为是一种深度优先的算法。
由第一点,当目标点很多时,A*算法会带入大量重复数据和复杂的估价函数,所以如果不要求获得具体路径而只比较路径长度时,Dijkstra算法会成为更好的选择。
动图查看原文
原文链接:https://blog.csdn.net/hopeping128/article/details/78960326
浅谈迪杰斯特拉(Dijkstra)算法和A*算法原理及实现
Dijkstra
是一种广度优先搜索算法,是经典的最短路径算法之一。它也是一种贪婪算法,其搜索方式是以起始点为中心,向外逐层扩展,在每一步都是寻求最优解,直到扩展到目标点。
A*算法
是一种深度优先和广度优先的启发式搜索算法,是以Digistra算法为基础,加入启发函数,是一种经典的启发式搜索算法,也是目前较为常用的一种路径规划算法。由于启发函数的加入,相比于Dijistra算法,减少了扩展点的数量,节省了大量搜索时间。但是随着搜索范围、搜索栅格数量的增加,其规划效率也会明显降低,所以A*算法的启发式函数的选择至关重要,启发函数越接近实际值,搜索速度越快。
代价函数F由从初始节点到节点的实际代价G,和从起始节点到目标节点的估计代价H。
启发因子的构建影响着算法的整体效率以及最终是否能够搜索到最优路径,是该算法的关键。
启发因子越小,算法扩展的节点越多,准确性会有所提高;越大,则效率会提高。
常用距离:曼哈顿距离、欧几里得距离。
A算法是一种启发式的搜索算法,它是基于深度优先算法(Depth First Search, DFS)和广度优先算法(Breadth First Search, BFS)的一种融合算法,按照一定原则确定如何选取下一个结点。
启发式搜索算法指的是,从起点出发,先寻找起点相邻的栅格,判断它是否是最好的位置,基于这个最好的栅格再往外向其相邻的栅格扩展,找到一个此时最好的位置,通过这样一步一步逼近目标点,减少盲目的搜索,提高了可行性和搜索效率。
深度优先搜索算法的思想是,搜索算法从起点开始进行搜索(初始状态下待搜索区域内所有结点均未被访问),与周围所有邻点进行比较,选择其中距离终点最近的点进行存储,然后再以该邻点为基础对比其周围未被访问的所有邻点,仍然选择距离终点最近的邻点存储。若访问结点到达终点或访问完所有结点仍未到达终点,则视为搜索失败。成功搜索所存储的结点连接而成的路径即为起点到终点的路径。
广度优先搜索的原理是,从初始点出发依次访问与它相连接的邻点,访问完毕后再从这些邻点出发访问邻点的邻点,但是要保证先被访问的邻点的邻点要比后被访问的邻点的邻点先访问,直至图中所有已被访问的结点的邻点都被访问到。如果此时图中尚有未被访问的结点,则需要选取一个尚未被访问的结点作为个新的初始点,继续搜索访问,直到图中所有的结点都被访问一遍为止。
因此深度优先算法与广度优先搜索算法从过程上存在较大差异。深度优先算法优先选择离目标点最近的结点,而广度优先搜索算法优先选择离初始点最近的点。基于深度优先算法,能以最快的速度找到一条连接初始点到目标点的路径,但不能保证路径的最优性(例如以路径最短为标准);广度优先搜索算法则必然能找到最短的路径,但由于需要遍历所有的结点,其计算复杂程度更大。基于这两种算法的优缺点,A算法基于启发函数构建了代价函数,既考虑了新结点距离初始点的代价,又考虑了新结点与目标点距离的代价。https://blog.csdn.net/weixin_42301220/article/details/125140910