A-Star(A*)算法

article/2025/10/2 20:34:45

在这里插入图片描述
【由于专栏后几篇限制vip观看,我又把完整算法在公众号“武汉AI算法研习”进行了发布,可以查看全专栏文章。】

A-Star(A*)算法作为Dijkstra算法的扩展,在寻路和图的遍历过程中具有一定的高效性。

【适用范围】静态图搜索

【算法流程】A-Star算法中采用的估价函数如下,其中*h(i)的引入可以防止搜索过程中过渡跑偏到很多非常遥远的路径,但是这个h(i)*是未知的,计算中采用一个可以估计的值进行表达,一般用简单的曼哈顿距离
f ( i ) = g ( i ) + h ( i ) ; 当 前 节 点 的 价 值 估 值 f ( i ) = 起 始 点 到 该 节 点 的 距 离 g ( i ) + 当 前 节 点 距 离 终 点 的 距 离 h ( i ) ( 启 发 函 数 ) f(i) = g(i) + h(i);\\ 当前节点的价值估值f(i)=起始点到该节点的距离 g(i)+当前节点距离终点的距离h(i)(启发函数) f(i)=g(i)+h(i)f(i)=g(i)+h(i)()
【搜索开始】如图方形格,绿色表示起点,红色表终点,其中蓝色为障碍物。路径必须以绿色格为起点绕过蓝色障碍物抵达红色格子。现有格子水平方向移动一格开销为10,沿对角线移动一格开销等于14。我们将路径规划过程中待检测的节点存放于Open List中,而已检测过的格子则存放于Close List中。

在这里插入图片描述

【第一步:以起点开始搜索周围8个格子】起点周围8个点是可能会经过的,所以把他们加入Open list中,同时指定其父节点为起始节点(32)。以起点格子右边方格为例,其距离起点距离为G=10,启发函数值采用曼哈顿距离则H=30,则价值函数F=G+H=40,以此类推得到其周围8个格子的价值函数,选取最小价值函数(33号节点)作为下一个目标。
O p e n l i s t = 21 ( 父 节 点 = 32 , f 值 = 74 ) , 22 ( 父 节 点 = 32 , f 值 = 60 ) , 23 ( 父 节 点 = 32 , f 值 = 54 ) , 31 ( 父 节 点 = 32 , f 值 = 60 ) , 33 ( 父 节 点 = 32 , f 值 = 40 ) , 41 ( 父 节 点 = 32 , f 值 = 74 ) , 42 ( 父 节 点 = 32 , f 值 = 60 ) , 43 ( 父 节 点 = 32 , f 值 = 54 ) C l o s t l i s t = 32 Open \ list={21(父节点=32,f值=74), \\ 22(父节点=32,f值=60),23(父节点=32,f值=54),\\31(父节点=32,f值=60),33(父节点=32,f值=40),\\41(父节点=32,f值=74),42(父节点=32,f值=60),43(父节点=32,f值=54)}\\ Clost \ list ={32} Open list=21(=32,f=74),22(=32,f=60),23(=32,f=54),31(=32,f=60),33(=32,f=40),41(=32,f=74),42(=32,f=60),43(=32,f=54)Clost list=32
在这里插入图片描述

【第二步:以33号节点】对33号节点周围的8个节点进行判断,若是不可通过或是已经存在Clost list节点则忽略不考虑,若当前处理节点的相邻格子已经在Open List中,则检查这条路径是否更优,即计算经由当前处理节点到达那个方格是否具有更小的 G值。如果没有,不做任何操作。相反,如果G值更小,则把那个方格的父节点设为当前处理节点 ( 我们选中的方格 ) ,然后重新计算那个方格的 F 值和 G 值。

33号节点此时需要检查的点为23号、22号、42号和43号节点。23号节点目前G值14,如果经33号抵达则G值为20,因此不做更新;22号节点也无需更新,42号节点也无需更新,43号节点也无需更新。因此遍历Open list节点取f值最小的为43号节点,则加入Clost list中
O p e n l i s t = 21 ( 父 节 点 = 32 , f 值 = 74 ) , 22 ( 父 节 点 = 32 , f 值 = 60 ) , 23 ( 父 节 点 = 32 , f 值 = 54 ) , 31 ( 父 节 点 = 32 , f 值 = 60 ) , 41 ( 父 节 点 = 32 , f 值 = 74 ) , 42 ( 父 节 点 = 32 , f 值 = 60 ) , 43 ( 父 节 点 = 32 , f 值 = 54 ) C l o s t l i s t = 32 , 33 Open \ list={21(父节点=32,f值=74),22(父节点=32,f值=60),23(父节点=32,f值=54),\\31(父节点=32,f值=60),\\41(父节点=32,f值=74),42(父节点=32,f值=60),43(父节点=32,f值=54)}\\ Clost \ list ={32,33} Open list=21(=32,f=74),22(=32,f=60),23(=32,f=54),31(=32,f=60),41(=32,f=74),42(=32,f=60),43(=32,f=54)Clost list=3233
在这里插入图片描述

【第三步:以43号节点】以43号节点为中心,加入其周边可选节点并计算相应的G值和H值。则选择其中价值最小的节点为42号节点。
O p e n l i s t = 21 ( 父 节 点 = 32 , f 值 = 74 ) , 22 ( 父 节 点 = 32 , f 值 = 60 ) , 23 ( 父 节 点 = 32 , f 值 = 54 ) , 31 ( 父 节 点 = 32 , f 值 = 60 ) , 41 ( 父 节 点 = 32 , f 值 = 74 ) , 42 ( 父 节 点 = 32 , f 值 = 60 ) 52 ( 父 节 点 = 43 , f 值 = 88 ) , 53 ( 父 节 点 = 43 , f 值 = 74 ) C l o s t l i s t = 32 , 33 , 43 Open \ list={21(父节点=32,f值=74),22(父节点=32,f值=60),23(父节点=32,f值=54),\\31(父节点=32,f值=60),\\41(父节点=32,f值=74),42(父节点=32,f值=60)\\ 52(父节点=43,f值=88),53(父节点=43,f值=74)} \\ Clost \ list ={32,33,43} Open list=21(=32,f=74),22(=32,f=60),23(=32,f=54),31(=32,f=60),41(=32,f=74),42(=32,f=60)52(=43,f=88),53(=43,f=74)Clost list=323343
在这里插入图片描述

【不断重复以上操作,直到把终点加入到Open list中】最终沿着父节点从终点开始回溯到起点即时最短距离路径。

在这里插入图片描述

在这里插入图片描述

总结:A-Star最短路径距离算法通过引入启发式函数,每一步计算抵达起点和终点的估计距离从而可以更快、更省的得到最短路径,但是A-Star算法一般只能用于静态图中,对于动态图没次图形变换都需要用A-Star进行计算,计算开销很大。


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

相关文章

A星算法代码

A星算法代码python3实现 前言一、A*? A星1.一个搜索算法2.结果展示 二、使用环境1.python 3.x2.一些解释说明 一些话 前言 产生本文的缘由 学校计科课程要求的小作业, 在csdn上看了好多, 记录一下自己的学习 以下是本篇文章正文内容 一、A*? A星 1.一…

A星算法(基于matlab)

概述 基于上一篇文章提到的DFS算法和BFS算法 A星算法属于图这种数据结构的搜索算法,对比于树的遍历搜索,需要考虑到的问题是:同一个节点的重复访问,所以需要对于已经访问过的节点进行标记。 曼哈顿距离: 在几何度量空…

【A星算法】--第四篇(A星算法)

本篇主要介绍A星算法的过程: * 把起始节点加进openList * while openList 不为空 { * 当前节点 openList 中成本最低的节点 * if(当前节点 目标节点){ * 路径完成 …

A星算法详解(个人认为最详细,最通俗易懂的一个版本)

A* 寻路算法 原文地址: http://www.gamedev.net/reference/articles/article2003.asp 概述 虽然掌握了 A* 算法的人认为它容易,但是对于初学者来说, A* 算法还是很复杂的。 搜索区域(The Search Area) 我们假设某人要从 A 点移动到 B 点&…

A星算法理解

A星算法理解 1.选择A星算法的原因 为了进行路径规划算法是不可回避的:启发式搜索算法是比较常规的一类算法就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无谓的搜索路…

A星(A*, A Star)算法详解

MulinB按:经典的智能寻路算法,一个老外写的很透彻很清晰,很容易让人理解神秘的A*算法。以下是一个中文翻译版。 A*寻路初探 GameDev.net 作者: Patrick Lester 译者:Panic 2005年3月18日 译者序:很久以前就…

A星算法

A星算法 1.简述 A星算法就是试图在地图中找到一条最短路径,但不保证一定存在。 任务 小猫去找青蛙玩(好TM弱智啊~)条件 黑色方块无法通行,每走一个格子小猫消耗的体力都为1。 2.如果说你是小猫,你会怎么走&#xf…

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所读取到的数据是无效的,值得注意的是&…