A* 算法详解(超级详细讲解,附有大图)

这篇具有很好参考价值的文章主要介绍了A* 算法详解(超级详细讲解,附有大图)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

引入 

一.基本概念

二.算法原理

①用宽度优先搜索

②狄克斯特拉算法

③A*算法

三.需要注意

四.c++伪代码

最后


引入 

今天想跟大家聊的,是我们经常用到,但是却让大家觉得十分神秘的那个算法:A* 。

A* 算法详解(超级详细讲解,附有大图)

A* 算法详解(超级详细讲解,附有大图)

这是一个远古而又非常经典的游戏——红警和贪玩蓝月

玩的时候,就会发现这里面的兵,你只要指定好地点,他们就会自己朝目的地进发,最终去向你指定的地点。。。(这段是看了别人的文章之后乱编出来的)

很多游戏也是这样,它会将你指定的人物,以一定的路径,到达某地(逐渐抽象)。简单来说,就是寻路

在游戏,乃至生活之中,在很多地方会有寻路的需求。而我们因为各种原因,总会寻求最短的路线,在计算机科学中,这种寻求最短路径的问题统称为最短路径问题。

而A*(star)算法,则是求最短路问题中的一种较好算法。

一.基本概念

本期,我将通过广度优先搜索狄克斯特拉算法来讲A*算法

A* 算法详解(超级详细讲解,附有大图)

广度优先搜索:从起点开始,有由近及远进行广泛搜索。不仅适用于常规路径查找,还适用于程序地图生成、流场寻路、距离映射和其他类型的地图分析。不过,时间复杂度较大,当终点离起点较远时,搜索时间会比较长。

A* 算法详解(超级详细讲解,附有大图)

 狄克斯特拉算法:狄克斯特拉算法让我们考虑需要探索路径的优先级。它不是平等地探索所有可能的路径,而是倾向于探索移动成本较低的路径。不足之处在于将其他的顶点的最短路径也计算出来,而这部分是无用的。

A* 算法详解(超级详细讲解,附有大图)

A*算法 :在狄克斯特拉算法的基础上,选取路径时,会先估算一个值,以此省去一些无用的计算。

二.算法原理

现在,给出一个迷宫,请你求出起点S到终点G的最短路线。

A* 算法详解(超级详细讲解,附有大图)

我们可以把迷宫看作是一个图,其中每个方块都是一个顶点,各顶点间的距离都为1.就像这样:

A* 算法详解(超级详细讲解,附有大图)

那么,我们就可以做了。 

①用宽度优先搜索

A* 算法详解(超级详细讲解,附有大图)

用宽度优先搜索求最短路径的结果会如上图所示,方块中的数字表示从起点到该顶点的距离,蓝色和红色的方块表示搜索过的区域,红色方块同时还表示从S到G的最短路径。很显然,宽度优先搜索是一种盲目的查找,比较暴力。

狄克斯特拉算法

A* 算法详解(超级详细讲解,附有大图)

用狄克斯特拉算法求最短路径的结果会如上图所示,方块中的数字表示从起点到该顶点的距离(权重),蓝色和橙色的方块表示搜索过的区域,橙色方块同时还表示从S到G的最短路径。

A* 算法详解(超级详细讲解,附有大图)  

狄克斯特拉算法只根据起点到候补顶点的距离来决定下一个顶点。因此,它无法发现蓝色箭头所指的这两条路径其实离终点越来越远,同样会继续搜索。

这时候,我们就需要A*算法了。

③A*算法

A* 算法详解(超级详细讲解,附有大图)

而A*算法不仅会考虑从起点到候补顶点的距离, 还会考虑从当前所在顶点到终点的估算距离。此处我们用的是 将顶点到终点的直线距离四舍五入后的值。

注:估算距离是可以自由设定的,并不局限于此处设定的,合理即可。

A* 算法详解(超级详细讲解,附有大图)

 分别计算起点周围每个顶点的权重。计算方法 是“从起点到该顶点的距离”(方块左下)加上 “距离估算值”(方块右下)。

A* 算法详解(超级详细讲解,附有大图)

选择一个距离最小的顶点,用橙色表示。 

A* 算法详解(超级详细讲解,附有大图)

将选择的顶点设为搜索完毕状态。 

A* 算法详解(超级详细讲解,附有大图)

计算搜索完毕的顶点到下一个顶点的距离。 

A* 算法详解(超级详细讲解,附有大图)

选择距离最短的一个顶点。 

A* 算法详解(超级详细讲解,附有大图)

将选好的顶点设为搜索完毕状态。之后重复上述操作,直到到达终点为止。 

A* 算法详解(超级详细讲解,附有大图)

搜索中…… 

A* 算法详解(超级详细讲解,附有大图)

 搜索完毕。非常容易看出,效率比前两者都高得多。

总的来说,这个搜索就只是增加了一个估算值,并将估算值加入距离而已。其余都与 狄克斯特拉算法 搜索相似。


三.需要注意

如果我们能得到一些启发信息,即各个顶点到终点的大致距离(这个距离不需是准确的值)我们就能使用 A* 算法。当然,有时这类信息是完全无法估算的,这时就不能 使用 A* 算法。

距离估算值越接近当前顶点到终点的实际值,A* 算法的搜索效率也就越高;反过 来,如果距离估算值与实际值相差较大,那么该算法的效率可能会比狄克斯特拉算法的 还要低。如果差距再大一些,甚至可能无法得到正确答案。

不过,当距离估算值小于实际距离时,是一定可以得到正确答案的(只是如果没有 设定合适的距离估算值,效率会变差)。


四.c++伪代码

再看伪代码前,我先定义几个字母。F表示距离与估算值的和,G表示估算值。

把起始格添加到 "开启列表"
do
{ 
        寻找开启列表中F值最低的格子, 我们称它为当前格. 
        把当前格切换到关闭列表里. 
        for(遍历1-n个方向)
        {
            if (它不在开启列表中&&可行) 
            { 
                    把它添加进 "开启列表", 把当前格作为这一格的父节点, 计算这一格的 FG
                if (用 G 值为参考检查新的路径是否更好, 更低的G值意味着更好的路径) 
                { 
                        把这一格的上一步改成当前格, 并且重新计算这一格的 G、F 值. 
                }  
            }
        }
} 
while( 目标格已经在 "开启列表", 这时候路径被找到) 
如果开启列表已经空了, 说明路径不存在.
 
最后从目标格开始, 沿着每一格的父节点移动直到回到起始格, 这就是路径.

很显然,这是狄克斯特拉算法的伪代码,唯一不同的就是G:估算值。

需要注意的是:此处用的是do-while循环。它是 while 循环的变体。在检查while()条件是否为真之前,该循环首先会执行一次do{}之内的语句,然后在while()内检查条件是否为真,如果条件为真的话,就会重复do...while这个循环,直至while()为假。


最后

祝大家元旦快乐,万事如意!

另:本文章同时收录于c++游戏专栏,标志着我开始写游戏制作笔记了!

我正在参加csdn博客之星评选活动,希望大佬点进链接点个五星评价,
https://bbs.csdn.net/topics/611389272?replyId=602251191&utm_medium=notify.im.community_cloud.1654e98c3c60c000.a&username=aliyonghang文章来源地址https://www.toymoban.com/news/detail-402816.html

到了这里,关于A* 算法详解(超级详细讲解,附有大图)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中GPT(超级简单)接口详细讲解(含代码)

    名字:阿玥的小东东 学习语言:python、C/C++ 博客主页:阿玥的小东东的博客_CSDN博客-pythonc++高级知识,过年必备,C/C++知识讲解领域博主 目录 GPT的简单介绍 GPT简单接口代码示例

    2024年02月07日
    浏览(28)
  • 在pycharm中使用Git上传代码到Gitee/GitHub(适合新手小白的超级详细步骤讲解)

    因为Gitee和GitHub使用方法差不多,所以本文以将代码上传到Gitee为例,GitHub操作类似。 pycharm:File - Settings - Plugins - 搜索Gitee/GitHub 进行插件的安装 安装好之后该插件会有一个蓝色小箭头表示安装成功。 这个注册非常简单,按照步骤完成注册即可。 点击工具栏中的VCS - Share p

    2024年02月08日
    浏览(44)
  • 【C++】多态(举例+详解,超级详细)

          本篇文章会对C++中的多态进行详解。希望本篇文章会对你有所帮助。 文章目录 一、多态的定义及实现 1、1 多态的概念 1、2 多态的构成条件 1、2、1 虚函数 1、2、2 虚函数的重写 1、2、3 析构函数构成重写特例原因 1、3 多态的实例练习 1、3、1 例1 1、3、2 例2  1、3、3

    2024年02月16日
    浏览(28)
  • C语言之宏详解(超级详细!)

    目录 一、用宏前须知-#define相关知识         大致结构:          对预定义符号的补充: 二、用#define定义宏         什么是宏?         #define的替换规则: 三、常用的宏定义 1、宏定义常量 2、定义一个宏语句 3、宏定义函数         宏与函数的对比:

    2024年02月08日
    浏览(30)
  • Windows API编程01-详解第一个程序(超级详细)

    联系WeChat:i-xiaodi,交流,付费课程学习 简单介绍Windows API: Windows API(Application Programming Interface)是Microsoft Windows平台的应用程序编程接口,其主要目的是让应用程序开发人员可以调用操作系统提供的一组例程功能,而无须考虑其底层的源代码实现及内部工作机制。API函数是

    2024年01月21日
    浏览(28)
  • c++排序算法——冒泡排序(不会的一定要看,超级详细)

    今天,我们来学习一种排序算法—— 冒泡排序 。 首先,先问三个问题: 想象一下,如果字典不是按照字母顺序排列,查找一个单词,你得查到什么时候?这就是为什么人们引入了分类的概念,因为其 极大地帮助我们快速搜索物品 。 或者说,排序是一种常用的整理信息的方

    2024年02月16日
    浏览(32)
  • 超级详细Git操作 之git log 命令的参数详解

    git log 命令主要用于查看Git版本演变历史(也就是提交历史),同时根据追加的参数和选项不同,也会有不同的展示效果。 但默认 git log 命令显示出的x效果实在太丑,不好好打扮一下根本没法见人,打扮好了用 alias 命令拍个照片,就正式出道了! 1、 git log 命令说明 git log

    2024年02月02日
    浏览(34)
  • 第十八章 SPFA算法以及负环问题(利用dijkstra推导出该算法,超级详细!!)

    我们回顾一下之前的dijkstra算法的证明过程。如果大家没看过之前的dijkstra算法的简易证明的话,作者在这里建议先去看一下。 传送门: 第十六章 Dijkstra算法的讲解以及证明(与众不同的通俗证明) 那么假设你已经看过这篇文章,我们发现,我们将每次松弛操作后的最小距离

    2024年02月02日
    浏览(43)
  • C语言测试题(附有详细解析)

    1.运行结果是啥? fib函数每递归一次cnt就+1 fib就是把大于等于1的数拆成两个数之和,也就说只要fib的变量不是0或1,他就要拆一次,挨着数出来就行了 结果是67 2.这个代码的运行结果是? x后置++,第一次先打印1 然后x变成了2进入判断语句进行判断,判断的时候用的是2 后置

    2024年01月22日
    浏览(33)
  • 超级详细的Oracle安装图文详解!手把手教会您从下载到安装!

    原文首发:SQL数据库运维 正文 测试环境概述 服务器端 操作系统:Windows Server 2008 企业版 64位 Oracle软件:Oracle 11g 64位 客户端 操作系统: Windows 7 64位 图形界面工具:PL/SQL Developer14.0.5 64位 Oracle客户端:Oracle Win64_11gR2_client 第一步:下载服务端Oracle 11g安装包。 下载地址: 链接

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包