A*算法原理简析

article/2025/3/3 5:04:51

引言

A算法是一种启发式的搜索算法,它是基于深度优先算法和广度优先算法的一种融合算法,按照一定规则确定如何选取下一个节点。在介绍A算法之前,需要了解一下什么是启发式搜索算法深度优先算法以及广度优先算法

启发式搜索算法

启发式搜索算法指的是,从起点出发,先寻找与起点相邻的栅格,判断它是否是前往终点最好的位置,基于这个栅格再往外向与其相邻的栅格扩展,找到一个当前时刻最好的位置,通过这样一步一步逼近终点,减少了盲目的搜索,提高了搜索的可行性和搜索效率。

深度优先算法

深度优先算法的思想是,搜索算法从起点开始搜索(初始状态下待搜索区域的节点都未被访问),将起点周围所有邻点进行比较,选择其中距离终点最近的节点进行存储,然后再以该邻点为基础对比其周围未被访问的所有邻点,仍然选择距离终点最近的邻点进行存储。

若访问完所有节点仍未到达终点则视为搜索失败,搜索成功所存储的节点连接形成的路径即为起点到终点的路径

广度优先算法

广度优先算法的原理是,从起点出发依次访问与它相连接的邻点,访问完毕后再从这些邻点出发访问邻点的邻点,但是要保证先被访问的邻点的邻点要比后被访问的邻点的邻点先访问,直到图中所有已被访问的节点的邻点都能被访问到。如果此时图中还有未被访问的节点,则需要选取一个未被访问的节点作为起点继续搜索访问,直到图中所有的节点都能被访问到。

A*算法

基于深度优先算法和广度优先算法的优缺点,A*算法基于启发函数构建了代价函数,既考虑了新节点距离起点的代价,又考虑了新节点距离目标点的代价。

地图

我们把要搜寻的区域划分成了正方形的格子。这是寻路的第一步,简化搜索区域,这个方法把我们的搜索区域简化为了 2 维数组。数组的每一项代表一个格子,它的状态就是可走和不可走。蓝色是墙壁,为不可走状态。通过计算出从绿色格子到红色格子需要走过哪些方格,就找到了路径。一旦路径找到了,人物便从一个方格的中心移动到另一个方格的中心,直至到达目的地。

寻路步骤

  1. 先将起点放入开启列表(即OPEN表,存放的是未访问的节点)
  2. 寻找起点周围可以到达的节点,将它们放入开启列表,并将它们的父节点设置为起点
  3. 从开启列表中删除起点,将它放入关闭列表(即CLOSE表,存放的是已经访问过的节点)


图中浅绿色描边的方块表示已经加入 “开启列表” 等待检查。淡蓝色描边的起点表示已经放入 “关闭列表” ,它不需要再执行检查.

  1. 对开启列表中的节点进行路径评分,从而给出一个从小到大的排列。

路径评分需要一个代价函数判断出该节点是否为OPEN表中代价最小的节点。
通常采用如下代价函数评估路径
F = G + H F=G+H F=G+H,其中 G G G为当前节点到起点的路径代价, H H H为当前节点到目标点的预估路径代价, F F F为两者之和


如上图所示,假设横向移动一个格子的耗费为10, 为了便于计算, 沿斜方向移动一个格子耗费是14,绿色起点右边的节点 G = 10 , H = 30 G=10,H=30 G=10H=30,代表从起点到达这个节点的路径代价为 10 10 10,从这个节点到目标点的路径代价为 30 30 30(由于H是预估代价,而不是实际代价,这里可以忽视墙壁的影响)

  1. 将F值最小的节点从OPEN表中删除,并将其添加到CLOSE表中
  2. 通过当前节点搜索当前节点邻近的节点,如果当前节点所扩展的节点不在OPEN表中,则将这些节点添加进OPEN表中
  3. 之后对添加到 OPEN 表中的结点进行排序,按照上述过程选出 F 值最小的结点,选出该结点作为当前结点,并扩展其邻近结点。
  4. 如果所扩展的结点在 OPEN 表中,以当前结点为父结点,重新计算 G 值,并和之前的 G 值进行比较,从而找出最小的 G 值进行更新,并重新计算 F 值,再次进行排列。按照以上步骤循环,直至将目标点添加到 OPEN 表中,此时搜索算法结束。根据父结点一直找到起点,就得到搜索到的最佳路径。

如此,我们再来看下面的例子


在我们最初的 9 个方格中,还有 8 个在OPEN表中,起点被放入了CLOSE表中。在这些方格中,起点右边的格子的 F 值 40 最小,设这个格子为A,因此我们选择A作为下一个要处理的方格。A的外框用蓝线打亮。我们将A从OPEN表中删除,将其添加进CLOSE表。A右边上下三个都是墙, 所以忽略它们. 它左边是起点, 已经加入到CLOSE表中了, 也可以忽略. 所以它周围的候选方块就只剩下 4 个,设A下方的方块为B,设A上方的方块为C。B目前的G值是14, 如果通过A到达它的话, G值将会是20, 这比14要大,因此这不是最优的路径。直接从起点沿对角线移动到B比先右移到A再下移到B要好。

我们继续从OPEN表中找出F值最小的方格,B和C的F值都为54,因此我们选择哪一个都是可以的。这里我们选择B,将其边框用蓝线打亮。

B右边以及右上方的都是墙, 所以忽略,而B右下方的方格没有被添加进OPEN表中,因为如果不穿越墙角的话,你不能直接从B移动到那个方格。你需要先往下走,然后再移动到那个方格,这样来绕过墙角。(具体规则看程序是否允许设置这样走),再将新添加的方格的父节点设置成B,除了起点和A之外,B只剩下三个相邻的方格,而B下方的两个方格是新添加进来的,如此还剩下B左方的方格,检查如果用新的路径 (就是经过B的路径) 到达它的话, G值是否会更低一些, 如果新的G值更低, 那就把它的父节点改为目前选中的方格B, 然后重新计算它的 F 值和 G 值 (H 值不需要重新计算, 因为对于每个方块, H 值是不变的). 如果新的 G 值比较高, 就说明经过B再到达它不是一个明智的选择, 因为它需要更远的路

不断重复这个过程,直到把终点也加入到了OPEN表中,就说明路径搜索成功,此时如下图所示

注意,在起点下面 2 格的方格的父亲已经与前面不同了。之前它的 G 值是 28 并且指向它右上方的方格。现在它的 G 值为 20 ,并且指向它正上方的方格。这在寻路过程中的某处发生,使用新路径时 G 值经过检查并且变得更低,因此父节点被重新设置, G 和 F 值被重新计算。

找回路径

我们成功搜索到从起点到终点的最短路径之后就要找回路径,从终点开始,按着箭头向父节点移动,这样就回到了起点,这就是最终的路径。


http://chatgpt.dhexx.cn/article/Opn6dFJy.shtml

相关文章

A*算法原理

A* 算法 概述 虽然掌握了 A* 算法的人认为它容易,但是对于初学者来说, A* 算法还是很复杂的。 搜索区域(The Search Area) 我们假设某人要从 A 点移动到 B 点,但是这两点之间被一堵墙隔开。如图 1 ,绿色是 A ,红色是 B…

A Star算法原理及其实现

A -Star算法 A*(A-Star)算法是一种求解最短路径最有效的直接搜索方法,也是许多其他问题的常用启发式算法。 一、简介 二、寻路方式 三、运行机制 四、常用估价算法 五、示例 一、简介 A*(A-Star)算法是一种求解最短路径最有…

sift算法原理,按步骤记录

sitf算法是一种描述图像特征的,重要的,基础的方法。主要由以下几个步骤构成: 0.尺度空间理论 尺度空间理论认为,人眼在认知画面时,在不同的尺度上使用的是不同特征,例如观察树叶时使用的是小尺度特征&…

DQN算法流程及原理

相关名词解释: Agent:智能体;s—state:状态(放在格子游戏中,就是智能体的位置坐标(x,y))a—action:智能体采取的动作(例如上下左右)r—reward:奖励&#xff…

D*算法原理与程序详解(Python)

提示:前文写了D搜索算法,是一种贪心算法。 文章目录 一、D*算法是什么?二、原理以及代码步骤1.原理分析2.代码解释 总结 一、D*算法是什么? D*算法也是用于机器人路径规划问题的启发式方法,它是一种局部规划方法&…

unityA星寻路算法基础原理

作者: 风不停息丶 文章目录 🧑‍💻A星寻路简介👉代码基础架构👍代码实现格子类寻路管理类效果 结尾总结 🧑‍💻A星寻路简介 A*寻路就是用来计算玩家行进路径的,通过它可以计算出避开…

【YOLO系列】YOLO.v1算法原理详解

YOLO(You Only Look Once)系列算法原理 前言 :详细介绍了yolo系列目标检测算法的原理和发展过程。 系列: 【YOLO系列】YOLO.v1算法原理详解 【YOLO系列】YOLO.v2算法原理详解 【YOLO系列】YOLO.v3算法原理详解 【YOLO系列】YOLO.v4 & YOLO.v5算法原…

A*算法原理与实现

前言 A*算法最初发表于1968年,由Stanford研究院的Peter Hart, Nils Nilsson以及Bertram Raphael发表。它可以被认为是Dijkstra算法的扩展。 由于借助启发函数的引导,A*算法通常拥有更好的性能。 一、 A*吸取了Dijkstra 算法中的cost_so_far,为…

激光SLAM之NDT算法(1)算法原理

/在激光SLAM之NDT算法(2)-建图中我会给出实测可用的建图代码,并予以解释代码结构,这里就先讲讲原理吧!!!/ 无人车激光SLAM系统简单可以分为建图和定位两部分,无人车的定位问题,实际上就是要找出无人车当前在地图的那个位置&#x…

A*算法的原理及应用

A*算法的原理 A* 算法是一种高效的启发式搜索算法,在二维的栅格地图上寻路效果好,它通过估算节点的代价评估函数值并作为节点的综合优先级,当选择下一个需要遍历的节点时,再选取综合优先级最高的节点,逐步地找到最优路…

Bresenham 画圆算法原理

文章目录 前言Bresenham 画圆算法原理两个近似构造判别式圆与网格点的关系关系由来关系含义p i p_i pi​ 递推画圆程序伪码圆与网格点的关系图示前言 首先简要介绍一下生成圆的方法: 直接利用圆的方程生成圆利用圆的对称性生成圆方法一由于会涉及到浮点运算等因素,不采取该方…

Js中读取、移除属性及隐藏组件方法研究

添加、移除组件属性方法: $(".class名").attr("属性名","属性值");//设置指定属性 $(".class名").attr("属性名");//读取指定属性值 or document.getElementById("id值").getAttribute("属性名…

js获取属性值,自定义属性,修改移除属性值

补充&#xff1a;由于不清楚一些属性是内置属性还是自定义属性 所以h5规定 自定义属性使用date-开头作为属性并赋值 案例1: <body><div date-index"1"></div> </body> <script>var div document.querySelector(div);console.log(div…

获取/移除属性值

1.获取属性值&#xff1a; element.属性 获取属性值 element.getAttribute&#xff08;‘属性’&#xff09;&#xff1b; 2.区别&#xff1a; element.属性 获取内置属性值&#xff08;元素本身自带的属性&#xff09; element.getAttribute&#xff08;‘属性’&#xff09;&…

JavaScript移除对象中不必要的属性

Thinking系列&#xff0c;旨在利用10分钟的时间传达一种可落地的编程思想。 业务开发中&#xff0c;我们经常会遇到&#xff1a;基于后端返回接口数据&#xff0c;前端保存到对象 Object 中&#xff0c;前端开发过程中为了一些场景的便利性&#xff0c;需要在该对象中增加相应的…

js移除属性

一、效果 代码 <style>div{width:100px;height: 100px;background-color: red;}.clsP{background-color: #00FF00;}</style><body><input type"button" value"移除属性" id"btn" /><div id"dv" score&q…

合天网安实验室CTF-解密100-Funny Crypto

合天网安实验室CTF-解密100-Funny Crypto 题目描述 tgbnjuy 8ujko9 5rfgy6 相关附件 题目链接 参考解题步骤 字母被围起来的字母图示颜色tgbnjuyh红8ujko9i绿5rfgy6t蓝 提交flag&#xff1a;hit

数字取证之Autopsy ——合天网安实验室学习笔记

实验链接 Autopsy Forensic Browser 是数字取证工具-The Sleuth Kit&#xff08;TSK&#xff09;的图形界面&#xff0c;用于对文件系统和卷进行取证。通过本实验学习文件系统取证的思想与方法&#xff0c;掌握Autopsy的使用。 链接&#xff1a;http://www.hetianlab.com/exp…

【合天网安】CONN.ASP暴库漏洞实验

0x01预备知识 1、概念&#xff1a; 相对路径和绝对路径 绝对路径&#xff1a;例如D&#xff1a;/test/test.mdb 相对路径&#xff1a;例如/test/test.mdb 2、%5C暴库 简单点说&#xff0c;就是在打开页面的时候把网页中的/换成%5C&#xff0c;然后提交就可以得到数据库地址…

【合天网安】FCKeditor 2.4.3文件上传漏洞

【合天网安实验室】FCKeditor 2.4.3文件上传漏洞 编辑器漏洞 常见的文本编辑器有FCKeditor、Ewebeditor、UEditor、KindEditor、XHeditor等&#xff0c;它们包含的功能类似&#xff0c;如图片上传、视频上传、远程下载等。使用这类编辑器减少了程序开发的时间&#xff0c;但也…