A*算法和Dijkstra

news/2025/2/15 12:40:32/

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


http://www.ppmy.cn/news/1137893.html

相关文章

《视觉 SLAM 十四讲》V2 第 5 讲 相机与图像

文章目录 相机 内参 && 外参5.1.2 畸变模型单目相机的成像过程5.1.3 双目相机模型5.1.4 RGB-D 相机模型 实践5.3.1 OpenCV 基础操作 【Code】OpenCV版本查看 5.3.2 图像去畸变 【Code】5.4.1 双目视觉 视差图 点云 【Code】5.4.2 RGB-D 点云 拼合成 地图【Code】 习题题…

链表去重(pta)

给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后…

RPA自动化全平台文章同步助手

在当今文案自媒体时代,我们通常在各大平台都拥有账号,需要同步发布文章。然而,这个过程常常让人感到非常繁琐,因为我们需要将文章复制粘贴到不同平台上。但是,现在我们可以借助RPA(Robotic Process Automat…

动态内存函数笔试题

题目四&#xff1a; 修改后 #include<string.h> void test() {char* str (char*)malloc(100);strcpy(str, "hello");if (str ! NULL){strcpy(str, "world");printf(str);}free(str);str NULL; } int main() {test();return 0; } 源代码 #inclu…

代码随想录 Day - 59|#647 回文字串|#516 最长回文子序列

清单 ● 647. 回文字串 ● 516. 最长回文子序列 LeetCode #647 回文字串 1. 题目 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中回文子串的数目。 回文字符串是正着读和倒过来读一样的字符串。 子字符串是字符串中的由连续字符组成的一个序列。 具有不同开始位…

typora + picgo + 对象存储 OSS

文章目录 一、安装软件二、使用阿里云 oss 存储图片三、picgo 设置四、typora 设置自动上传 一、安装软件 Typora1.3.8 &#xff08;安装即破解&#xff09; picgo 2.3.0 安装 阿里云盘&#xff08;软件安装包&#xff09;&#xff1a; https://www.aliyundrive.com/s/saQoS…

Python与正则表达式

我们在做机器学习项目的时候&#xff0c;很大部分的精力都在做数据的整理&#xff0c;不管是用爬虫在网上爬取数据还是对已有的数据进行整理&#xff0c;往往需要对一些特定的字符串进行处理&#xff0c;正则表达式则是进行数据处理的利器。 一、什么是正则表达式 正则表达式…

GPT系列论文解读:GPT-2

GPT系列 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一系列基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。以下是GPT系列的主要模型&#xff1a; GPT&#xff1a;GPT-1是于2018年发布的第一个版本&#xff0c;它使用了12个Transformer…