A星寻路算法详解

A星寻路算法

前言

A星寻路算法是静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法,它可以应对包括复杂地形,各种尺度的障碍物以及不同地形的路径规划问题。掌握A星寻路算法能够提高路径规划效率,应对各种复杂情况,并在实际应用中发挥重要作用。

算法原理

A星算法的核心公式为:F = G + H。算法正是利用这个公式的值来计算最佳路径。

其中 F 表示当前点的总估价,G 表示从起始点,沿着产生的路径,移动到指定网格的实际代价,H 表示从当前网格点到终点的预计代价。公式中的 G 是确定的,而 H 是不确定的。

启发函数

H 代价的大小取决于计算 H 代价的函数,又被称为启发函数(Heuristic Function)。常用的启发函数包括曼哈顿距离欧几里得距离

曼哈顿距离

曼哈顿距离,是指在一个坐标系中,从一个点到另一个点沿着网格线(水平或垂直)的距离。曼哈顿距离只允许朝上下左右四个方向移动。示意图如下:

a-star-2.png

图中从 A 点 运动到 B 点有三条路径,三条路径计算出来的总路径都是相等的,这个长度就是曼哈顿距离,可以用如下公式表示曼哈顿距离:

D = |x1 - x2| + |y1 - y2|
欧几里得距离

欧几里得距离,是指在n维空间中,两点之间的直线距离。它是由古希腊数学家欧几里得所提出的。在二维空间中,欧几里得距离可以通过勾股定理得到,即两点之间的距离等于它们在 x 轴上的距离的平方加上它们在 y 轴上的距离的平方,再取平方根。下图为一个二维空间中 A 点到 B 点的欧几里得距离示意图:

a-star-3.png

距离计算公式为:

D = \sqrt{(x1 - x2)^2 + (y1 - y2)^2}

算法原理

A星算法的实现步骤如下:

  • 初始化: 设置起点和终点,定义两个队列 openListcloseListopenList 中存储待探索网格点,closeList 中存储已经探索过的网格点。初始化起点的G值和H值为 0,并将起点加入到 openList 中,如果有障碍物网格点,需要将障碍物网格点加入 closeList 中。

  • 进入循环: 重复下面的步骤直到找到终点或 openList 为空。

    • 选择估值最小单元格: 从 openList 中找到F估值最小的网格 (F = G + H) 作为当前节点,并将其移出 openList,加入到 closeList 中。

    • 找到当前网格周围的节点: 根据当前网格点,找到其相邻的所有可行节点(不包括障碍物点),计算它们的 G 值 、H 值和 F 值,对每个相邻节点进行以下操作:

      • a. 如果节点不可达或已在 closedList 中,则忽略该节点。
      • b. 如果节点不在 openList 中,则将其加入 openList,并计算该节点的 G 值、H 值和设置父节点。
      • c. 如果节点已在 openList 中,并且经过当前节点到达该节点的 G 值更小,则更新该节点的 G 值和父节点指针。
    • 判断终点: 每次加入节点到 openList 时,都需要判断该节点是否为终点,如果是,则说明已经找到了最短路径。

    • 循环结束: 当 openList 为空时,表示没有找到终点,搜索结束。

    • 构建最短路径: 从终点开始按照父节点指针逆向回溯,直至回溯到起点,即可得到最短路径。

举个例子

假设我们有如下一个网格地图,其中黑色方格表示障碍物,白色方格为可通行区域,绿色方格为起点,红色方格为终点。

a-star-5.jpg

我们规定,从起点出发,可以沿着网格线或者网格的对角线方向移动,每次沿着网格线朝上、下、左、右方向运动一格,距离记为10,朝着网格对角线方向运动一格,距离记为 2 \sqrt{2} 2 ×10≈14(这里为了简化计算过程,舍弃小数点,进行取整)。

第一步:

openList 中取出一个网格(就是开始节点,因为此时 openList 中只有一个开始节点),计算其周围相邻的8个网格的 G 值、H 值和 F 值,这 8 个网格的父节点指向起始节点。其中,起点上下左右四个网格的 G 值为 10,对角线四个网格的 G 值为 14,8 个网格的 F 值采用曼哈顿方法进行计算,也就是待计算网格到终点的水平距离*10 + 待计算网格到终点的垂直距离*10,将已经探索过的起点加入 closeList 中,将起点周围 8 个节点都加到 openList 中。计算结果如下图所示:

a-star-6.jpg

需要注意的是,在计算 H 值的时候,如果遇到障碍物,H 值不需要考虑障碍物的影响。

第二步:

openList 中的节点按照 F 值的大小进行排序,并从排序后的 openList 中选取 F 值最小的一个网格,作为下一个要探索的点,此时 F = 44 的网格点(记为F44)被选中。以 F44 为中心,找到其周围的 8 个网格点,其中右边的三个网格点属于障碍物节点,已经存在于 closeList 中,直接跳过,左上方的网格点是起点,也在 closeList 中,跳过,F44上方和左边两个点在 openList 中,根据上一节介绍的A星算法的原理,需要判断经过当前节点的路径所得到的 G 值是否更小,如果更小则更新它们的 G 值、F 值还有父节点,否则保持不变。计算的方法就是取它父节点的 G 值,然后根据它相对父节点是水平垂直方向还是对角线方向,分别增加 1014

我们先看 F44 正上方的点,此时父节点为 F44,G 值为 14,方向是垂直方向,所以再加上 10,得到新的 G 值为 14 + 10 = 24,大于原来的 G 值 10,因此不做更新。

F44 左边的点,其到 F44 的方向是水平方向的,因此新的 G 值为父节点的 G 值加上 10,为 14 + 10 = 24,同样大于原来的 G 值 10,因此也不做更新。

F44 正下方和左下方的点,不在 openList 中,因此,需要将它们加入到 openList 中,并更新它们的 G 值、F 值和父节点。

计算结束后,将 F44 加入 closeList 中。

计算结果如下图所示:

a-star-7.jpg

第三步

openList(图中黄色网格区域) 中选取 F 值最小的网格点,作为当前要探索的点,此时 openList 中 F 值最小值为 50,但是找到了两个 F = 50 的网格点,这时要如何处理呢?

对算法而言,无论先选择哪个网格点先进行探索,最终的结果都是一样的,这里我们先选取起始点右边的 F=50 网格点进行探索。

以 F=50 的网格点为中心,找到其周围的 8 个网格点,其中右边三个网格点是障碍物,已经在 closeList 中,忽略,F50 正下方的点是我们之前已经探索过的点,忽略,F50 左边的点起点,也忽略,剩余的三个网格点都在 openList 中,根据上面介绍的方法,判断他们的 G 值是否更小,如果更小则更新它们的 G 值、F 值和父节点,否则保持不变。

已经探索过的网格点标记为蓝色,计算结果如下图所示:

a-star-8.jpg

第四步

从 openList 中选取 F 值最小的网格点进行探索,此时发现还是 F = 50 为最小值。以 F = 50 的网格点为中心,找到其周围的 8 个网格点,按照上面的方法对网格点进行更新,需要注意的是,此时 F50 正下方的网格点的 G 值为其父节点的 G 值,加上其到 F50 的距离,G = 10 + 10 = 20,小于之前的 G 值 28,因此需要更新 G 值、F 值和父节点。

计算结果如下图所示:

a-star-9.jpg

第五步

从 openList 中选取 F 值为 64 的网格进行探索,这时候找到了三个网格点 F 值都为 64,随机选取右上角 F=64 的网格点进行探索。被探索过的网格点加入 closeList 中。

计算结果为下图所示:

a-star-10.jpg

第六步

经过上一步操作后,openList 中 F 值最小还是为 64,随机选取左下方 F = 64 的网格点进行探索。被探索过的网格点加入 closeList 中。

计算结果为下图所示:

a-star-11.jpg

第七步

此时 openList 中F值最小还是为 64,选取下方 F = 64 的网格点继续进行探索。被探索过的网格点加入 closeList 中。

计算结果为下图所示:

a-star-12.jpg

第八步

探索 F= 70 的网格点,被探索过的网格点加入 closeList 中。结果为下图所示:

a-star-13.jpg

第九步

探索第二个 F = 70 的网格点,被探索过的网格点加入 closeList 中。结果如下图所示:

a-star-14.jpg

第十步

探索第三个 F = 70 的网格点,被探索过的网格点加入 closeList 中。结果如下图所示:

a-star-15.jpg

第十一步

选取起点右上方 F= 78的网格点进行探索,被探索过的网格点加入 closeList 中。结果如下图所示:

a-star-16.jpg

第十二步

选取 F = 72 的网格点进行探索,被探索过的网格点加入 closeList 中。结果如下图所示:

a-star-17.jpg

第十三步

选取 F = 66 的网格点进行探索,此时与 F66 相邻的 8 个网格中包含终点,因此到此整个 A星算法的探索过程结束。我们再从终点开始,根据记录的父节点的指针,找到A星算法的最佳路劲。结果如下图所示:

a-star-18.jpg

算法总结

A星算法是一种启发式搜索算法,它通过在地图上找到一条从起点到终点的路径来解决一些问题。该算法通过启发式函数来评估每个节点,并选择具有最低 F 值的节点作为下一个要探索的节点。最终,该算法会找到一条最优的路径。

针对A星算法,我开发了一个便于演示A星算法过程的网站,点击这里可以看到演示效果,项目的源码在这里。

更多精彩文章,欢迎关注我的公众号:前端架构师笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/406846.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型参数高效微调

参数高效微调目的 PEFT技术旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。这样一来,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务&#xff0…

域名 SSL 证书信息解析 API 数据接口

域名 SSL 证书信息解析 API 数据接口 网络工具,提供域名 SSL 证书信息解析,多信息查询,毫秒级响应。 1. 产品功能 提供域名 SSL 证书信息解析;最完整 SSL 属性信息解析;支持多种元素信息抽取,包括主题的可…

【Java程序设计】【C00278】基于Springboot的数码论坛管理系统(有论文)

基于Springboot的数码论坛管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的数码论坛系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块:在系统首页可以查看首页、…

Linux:Jenkins:GitLab+Maven+Jenkins的部署

1.环境 我这里准备了三台centos7 1.用于部署gitlab 运行内存:6G 名字:Jenkins-GitLab 192.168.6.1 2.用于部署jenkins 运行内存:2G 名字:Jenkins-server 192.168.6.2 3.用于打包测试…

全面解析企业财务报表系列之五:阅读财报结构、顺序、模块与不同侧重

全面解析企业财务报表系列之五:阅读财报结构、顺序、模块与不同侧重 一、明确本次报表分析的目的二、确定报表分析的重点项目三、重点分析项目之间的联系四、资产负债表的阅读五、利润表的阅读六、现金流量表的阅读七、综合分析 一、明确本次报表分析的目的 报表的…

VBA即用型代码手册:立即保护所有工作表Code及插入多工作表Code

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率,而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想,积木编程最重要的是积木如何搭建…

【C语言】指针变量未初始化

我们知道:全局变量未赋初值,编译器会直接赋值为0;局部变量如果未赋初值,则会维持上一状态保存在该地址上的值,这个值是随机的。把这个值赋值给局部变量是没有意义的。 但是指针变量是如何解决不赋初值? 指…

探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,并且坚持默默的做事。 探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换 文章目录 一、案例…

力扣 187. 重复的DNA序列

1.题目 DNA序列 由一系列核苷酸组成,缩写为 A, C, G 和 T.。 例如,"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时,识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不止一…

如何连接ACL认证的Redis

点击上方蓝字关注我 应用程序连接开启了ACL认证的Redis时与原先的方式有差别,本文介绍几种连接开启ACL认证的Redis的Redis的方法。 对于RedisACL认证相关内容,可以参考历史文章: Redis权限管理体系(一):客户端名及用户…

Python之numpy

目录 安装 ndarray 说明文档 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 安装 pip3 install --user numpy scipy matplotlib ndarray NumP提供了 N 维数组…

国家之间的竞争绝不仅仅是几个AI软件的竞争

国家之间的竞争应该不仅仅是几个AI软件的竞争,而更多地是人机环境系统生态的竞争。在这种观点下,国家之间的竞争被视为一个更为复杂和综合的竞争过程,涉及到人类、技术系统以及周围环境的综合作用。 在人机环境系统生态的竞争中,人…

Stable Diffusion 3正式发布,旨在巩固其在AI图像领域相对于Sora和Gemini的领先地位

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Selenium浏览器自动化测试框架详解

selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google C…

冯诺依曼体系结构 计算机组成的金字塔

01 冯诺依曼体系结构:计算机组成的金字塔 学习计算机组成原理,到底是在学些什么呢?这个事儿,一两句话还真说不清楚。不过没关系,我们先从“装电脑”这个看起来没有什么技术含量的事情说起,来弄清楚计算机到…

使用向量数据库pinecone构建应用01:相似语义检索 Semantic Search

Building Applications with Vector Databases 下面是DeepLearning.AI上面这门课的学习笔记:https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement…

【深度学习笔记】3_4 逻辑回归之softmax-regression

3.4 softmax回归 Softmax回归(Softmax Regression),也称为多类逻辑回归(Multinomial Logistic Regression),是一种用于多分类问题的分类算法。虽然名字里面带回归,实际上是分类。 前几节介绍的…

Tomcat信创平替之TongWEB(东方通),安装步骤

我的系统: 银河麒麟桌面系统V10(SP1) 开局先吐槽一下(当然国产也是需要大量时间与金钱的投入),感觉国产软件进入死循环:国家推动国产→国产收费→还要钱?→用国外开源→国产无发普及→靠国家推动 正题: 1.先进入东方通申请使用 2.客服会发送一个TongWEB包与license.dat给你…

c语言的数据结构:找环状链表入口处

一起<(&#xffe3;︶&#xffe3;)↗[GO!] 1.如何判断一个链表是否有环 思路:设定两个快慢指针fast和slow,fast每次走两个结点,slow每次走一个节点 如果fast指针遇到了Null,那么这个链表没有环,如果fast和slow可以相遇,则代表这个链表有环 代码如下 N:fast先进环,slow后…

LeetCode 热题 100 | 二叉树(二)

目录 1 543. 二叉树的直径 2 102. 二叉树的层序遍历 3 108. 将有序数组转换为二叉搜索树 菜鸟做题&#xff0c;语言是 C 1 543. 二叉树的直径 这道题和 124. 二叉树中的最大路径和 太像了 题眼&#xff1a;二叉树的 直径 是指树中任意两个节点之间 最长路径的长度 。…