A星算法

article/2025/10/2 21:43:28

A星算法

1.简述

A星算法就是试图在地图中找到一条最短路径,但不保证一定存在。

  • 任务
    小猫去找青蛙玩(好TM弱智啊~)
  • 条件
    黑色方块无法通行,每走一个格子小猫消耗的体力都为1。

2.如果说你是小猫,你会怎么走?

嗯,毫无疑问
在这里插入图片描述
你肯定这么走。。。很简单的对吧,但是你这么走的时候,真的没经过思考?并非如此吧,你要找最短路径是不是直接连线是最快的?但是连线有障碍物阻挡了,所以逼迫你先往上走出障碍物的区域,然后一路直线当然就是最短路径了。
BUT,你所做的思考,都是建立在你脑海里已经有整张地图的概念上,代码是不知道地图的,它要知道怎么走,就是一步一步的探索,你的行为对于代码来说,那叫-未卜先知!

3.基本概念

要实现A星算法,先要知道一些基本概念

  • open列表
    所谓open列表,我的理解是,知道但是没有走过的路
  • close列表
    已经走过的路
  • F值
    这个叫做和值,指的是走到终点消耗的代价值,这里就是指的是小猫消耗的体力了
    F = G + H,所以要知道F值,需要计算G和H的值
  • G值
    从起点到该点消耗的代价
  • H值
    从该点到终点的预估代价,为何G值不是预估,这里是预估呢?因为G值是从起点到该点,是一段已经走过的路程,代价是准确可知的,H值是到终点,但是这段路还没有走,所以是一段预估的值。

这些概念听起来有辣么一点对角懵逼~,没关系,我们实际演示下

4.手工走起

我们用粉色代表open列表,用绿色代表close列表
首先起点是我们走过的第一个点,将它先加入到close列表中在这里插入图片描述
然后这只猫有四个方向可以选择,分别是上下左右,将这四个方块加入到open表中,表示知道但是还没走过的路,现在是决定怎么走的时候了,于是我们分别求着四个方块的F值。
G值都是很好求的,都是1,从起点走到这里嘛,都只走一步,H值从该点到终点的预估代价,这个可怎么求?
一般来说,这个值就是忽略所有障碍的情况下走出来的值,很明显,在这种只能直行的条件下,H值就是两点之间的横向格子数差加上纵向格子数差了
上格子 H = 横向7 + 纵向2 = 9
下格子 H = 横向7 + 纵向0 = 7
左格子 H = 横向8 + 纵向1 = 9
右格子 H = 横向6 + 纵向1 = 7
加上G值可以求得他们的F值分别为10,8,10,8
将这些数据标注在格子上
上面是F值,下左是G,下右是H
在这里插入图片描述
有了这些数据,小猫就挑一个F值最小的走,这里8是最小,但是有两个,怎么办?无所谓了,随便走一条,但是一般是最后加入open表的那个格子。至于为什么无所谓,可以看完整篇文章反过来想想。
就走右边了,于是将右边的方块加入到close表,已经走过了嘛,记得要将它从open表中剔除
在这里插入图片描述

接着在这个新的格子上,又有4个选择的方向,但是这里要注意了,每次选择新格子加入open列表的时候,要保证3点

  • 这个点不能在close表中
  • 这个点不能在open表中
  • 这个点是合法的,什么叫合法?这里简单的就是可以通行的,不能是障碍物
    在这里插入图片描述

于是又加入了上下右三个点到open列表中,此时open列表已经有6个点了,接着计算这三个点的各项值
在这里插入图片描述
然后在open表中再次寻找F值最低的格子,发现是8,这里有3个,还是随意选一个,选下面的吧,将它从open表中剔除,加入close表中
在这里插入图片描述
紧接着再次寻找新的格子加入open列表中,依旧遵循上面说的3点,发现符合加入的只有右边的格子
在这里插入图片描述
接着还是计算新加入open列表的格子的值
在这里插入图片描述
在open列表中寻找F值最低的格子,发现还是8,有3个,我们选择最新加入的。
在这里插入图片描述
经过这几步之后,你是不是渐渐发现了规律?

5.伪代码

将起点加入close表
while(结束条件)
{
获取close表的最后一个节点S
获取S点周围所有符合加入条件(条件就是指上文所说的那3点)的点,加入open列表
计算open列表F值最低的格子T
T从open表中删除加入close表
}
再次循环的时候,是不是第一步获取的节点S就是最后加入的T了,如此就可以跟随着这个T,一步步的扩展路径了结束条件:如果有这条路径存在,则是当青蛙所在的节点被加入到close后,寻路就结束了。
或者不存在这条路径,那么就是open列表中不再有节点的时候。
open列表实际上是一步步往外扩展的格子,当这个列表没有节点的时候并且终点还没有在close列表中,
那么说明所有能扩展到的格子已经都被走过了,仍然没有走到终点,此时便是没有这条路了

6.注意项

A星得到的结果是一条路径,这条路径最终是反推回去的,所以在写Node的数据结构时候,要记录这个节点是从哪个节点走过来的,也就是他的父节点,如此在最终才能反推回去。
A星不是沿着一条路走到黑的,你会发现它是不停地计算open表中最小F值的格子,当最小F值超过10的时候,你发现它又开始从F为10的格子上开始探索,实际上是几条不同的路径轮询的探索,最终走向终点,这也是为为何在open列表F值最低同时存在多个的时候,随便选择的原因,因为一旦探索的格子F值超过了这个最低值,它又会回到这个最低F值的格子上开始探索

7.关于死胡同

在我刚开始学习A星的时候,我总是会觉得,如果碰到死胡同,寻路仿佛就要终止,其实不然,A星是一个不同的搜索最小值过程的算法,除非open列表不存在,否则open列表中一定有一个是最小值的格子,只要存在这个格子,那么寻路就能继续下去,而对于最终的路径,我们是通过回溯的方式来获取,所以对于寻路,并不是说close表里的格子就都是路径了,想明白这回事,对A星就有比较明确的认识了

转载自https://www.jianshu.com/p/65282bd32391


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

相关文章

A星算法说明

A*算法说明 文章目录 前言原理说明如何构造 h ( n ) h(n) h(n)一、欧氏距离二、曼哈顿距离三、其他 关于 g ( n ) g(n) g(n)路况设置如何实现 完整的流程搜索过程图示允许斜走,使用优先队列禁止斜走,使用优先队列允许斜走,使用普通队列禁止斜…

A星算法优化(一)启发函数

基于Python语言对A星算法进行优化:(视频中会拿python与matlab作对比) 源码地址:https://github.com/Grizi-ju/ros_program/blob/main/path_planning/Astar.py B站详解视频:https://www.bilibili.com/video/BV1FL4y1M7PM?spm_id_from333.999…

猴子都能看懂的A星算法原理

文章目录 A星算法基本原理什么是寻路算法算法的思路 算法实现脚本1————cconst.cs脚本2————AStar.cs Unity演示演示样例一演示样例二演示样例三演示样例四 俗话说,好记性不如烂笔头,对于有了解过寻路算法的同学,对于A星算法应该不陌生…

A星寻路算法详解(C++实现 完整代码+图片演示 )

文章目录 三种寻路算法 A星寻路算法A星寻路算法思想A星寻路准备A星寻路过程(图例)A星寻路代码(完整) 三种寻路算法 深度寻路算法:不一定能找到最佳路径,但是寻路快速,只能走直线。广度寻路算法…

A星(A*、A Star)路径规划算法详解(附MATLAB代码)

首先看看运行效果,分别有三种模式,代码运行前需要通过鼠标点击设置起点和终点。 第一种模式直接输出最短路径 第二种模式输出最短路径的生成过程 第三种模式输出最短路径的生成过程和详细探索的过程 代码获取 gitee链接:https://gitee.c…

什么是脏读?不可重复读?幻读?如何解决?

什么是脏读?不可重复读?幻读?如何解决? 朋友最近面试美团,被面试官问到数据库的幻读问题,自己正好最近复习到这,做个笔记整理一下数据库的三大特征以及隔离级别。 一.先来回顾一下什么是事务&…

MySQL理论:脏读、不可重复读、幻读

🏆今日学习目标: 🍀MySQL理论:脏读、不可重复读、幻读 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区&#xf…

数据库事务隔离级别(脏读、幻读、不可重复读)

一、脏读、幻读和不可重复读 一、脏读、不可重复读、幻读 1、脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了…

快速理解脏读,不可重复读,幻读

介绍 要聊事务,不可避免的要提到数据库事务的四大特性:ACID atomicconsistenceisolationdurability 先放一个表格,看看4个隔离级别会出现的各种问题,网上的解释一大堆。看完后还是一脸懵逼,感觉懂了,又好…

MySQL之脏写、脏读、不可重复读、幻读

脏写和脏读都是在多个事务同时修改或读取同一行数据的情况下产生的问题。比如现在有事务1和事务2同时对一行数据进行修改,事务1将值改成1,而事务2将值改成了2,这时的值应该是2,但是就在这时,事务1发生了回滚&#xff0…

数据库必备知识:脏读和幻读的定义及应对策略

随着数据库应用的广泛使用,数据库并发性和一致性的问题成为了引起重视的问题之一。其中,脏读(Dirty Read)和幻读(Phantom Read)是常见的并发访问问题,本文将对脏读、幻读进行详细介绍&#xff0…

Seata AT模式怎样防止脏写和脏读

前言 Seata AT 模式是一种非侵入式的分布式事务解决方案,Seata 在内部做了对数据库操作的代理层,我们使用 Seata AT 模式时,实际上用的是 Seata 自带的数据源代理 DataSourceProxy,Seata 在这层代理中加入了很多逻辑,…

mysql 脏数据是什么_什么是脏读?

什么是脏读? 脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的,值得注意的是&…

[Database] 脏读、幻读这些都是什么?事务隔离级别又是什么?MySQL数据库的事务隔离级别都有哪些?

文章目录 前言事务隔离级别三种数据不一致问题1. 脏读2. 不可重复读3. 幻读不可重复读 vs 幻读 四种事务隔离级别1. READ UNCOMMITTED2. READ COMMITTED3. REPEATABLE READ4. SERIALIZABLE 不同事务隔离级别会面临的问题不同隔离事务级别的使用率排名 实战查看事务隔离级别更改…

Mysql-详解脏读、不可重复读、幻读

Mysql的事务隔离级别 Mysql有四种事务隔离级别,这四种隔离级别代表当存在多个事务并发冲突时,可能出现的脏读、不可重复读、幻读的问题。 脏读 大家看一下,我们有两个事务,一个是 Transaction A,一个是 Transaction B…

MySQL的事务,脏读,不可重复读,幻读

一、什么是事务 在MySQL中,事务是一种机制、一个操作序列,是访问和更新数据库的程序执行单元。事务中包含一个或多个数据库操作命令,会把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行&#…

脏读、幻读、不可重复读,傻傻分不清楚

脏读 (针对未提交数据) 脏读又称无效数据读出(读出了脏数据)。一个事务读取另外一个事务还没有提交的数据叫脏读。 例如:事务T1修改了某个表中的一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改…

【MySQL理论】脏读、不可重复读、幻读

文章目录 1. 脏读(dirty read)脏读是指事务读取到其他事务未提交的数据 2. 不可重复读(non-repeatable read)不可重复读是指在同一次事务中前后查询不一致的问题 3. 幻读(phantom read)幻读是一次事务中前后数据量发生变化,用户产生不可预料的问题 4. 不可重复读和幻…

脏读、不可重复读、幻读、丢失更新

根儿上来说,为什么需要事务和锁? 如果所有的操作都是依次进行的,或者说mysql的server是单线程的,就不会有并发问题,也就不需要事务和锁了。然而事实上,是多客户端,多线程的,所有必须…

一文搞懂MySQL脏读,幻读和不可重复读

目录 MySQL 中事务的隔离 1.READ UNCOMMITTED2.READ COMMITTED3.REPEATABLE READ4.SERIALIZABLE前置知识 1.事务相关的常用命令2.MySQL 8 之前查询事务的隔离级别3.MySQL 8 之后查询事务的隔离级别4.查看连接的客户端详情5.查询连接客户端的数量6.设置客户端的事务隔离级别7.新…