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

article/2025/10/2 21:44:07

基于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_from=333.999.0.0
基于开源算法:https://github.com/Grizi-ju/PythonRobotics/tree/master/PathPlanning/AStar
(个人认为,用哪种语言不重要,重要的是改进点及改进思路)

将从以下5个点进行改进:
1、启发函数——曼哈顿距离等
2、权重系数——动态加权等
3、搜索邻域——基于8邻域搜索改进
4、搜索策略——双向搜索、JPS策略等
5、路径平滑处理——贝塞尔曲线、B样条曲线等

一、基础代码详解

本人已经做了详细的中文注释,代码地址:https://github.com/Grizi-ju
在这里插入图片描述
在这里插入图片描述

算法预处理:
1、将地图栅格化,每一个正方形格子的中央成为节点(索引index)
2、确定起始点和目标点
3、定义open_set列表与closed_set列表,open_set中存放待考察的节点,closed_set中存放已经考察过的节点
4、初始时,定义起点为父节点,存入closed_set
5、父节点周围共有8个节点,定义为子节点,并存入open_set中,成为待考察对象

二、启发函数改进(理论)

A星算法评价函数为f(n)=g(n)+h(n),其中h(n)为启发函数,启发函数的改进对算法行为影响很大
启发函数的作用:指引正确的扩展方向
其中:
f(n) 是节点 n的评价函数
g(n)是在状态空间中从初始节点到节点 n的实际代价
h(n)是从节点n到目标节点的最佳路径的估计代价。
g(n)是已知的,所以在这里主要是 h(n) 体现了搜索的启发信息。换句话说,g(n)代表了搜索的广度的优先趋势。

0、Dijkstra

如果h(n)=0,那么只有g(n)实际上是有用的,这时A*算法退化成迪杰斯特拉算法,它能保证一定可以找到一条最优路径

Dijkstra和贪心算法的缺点:
1.Dijkstra算法很好地找到了最短路径,但它浪费了时间去探索那些没有前途的方向。
2.贪婪的最好的第一次搜索在有希望的方向上探索,但它可能找不到最短的路径。

A*算法结合了这两种方法

在这里插入图片描述

1、曼哈顿距离

标准的启发函数是曼哈顿距离(Manhattan distance)
在这里插入图片描述
在这里插入图片描述

h = np.abs(n1.x - n2.x) + np.abs(n1.y - n2.y)     #  Manhattan

在这里插入图片描述
在这里插入图片描述

2、欧几里得距离(欧氏距离)

如果单位可以沿着任意角度移动(而不是网格方向),那么也许应该使用直线距离:
在这里插入图片描述

h = math.hypot(n1.x - n2.x, n1.y - n2.y)       #  Euclidean

在这里插入图片描述
在这里插入图片描述

3、对角线距离(切比雪夫距离)

如果在地图中允许对角运动,那么需要一个不同的启发函数

dx = np.abs(n1.x - n2.x)                        #  Diagnol distance 
dy = np.abs(n1.y - n2.y)
min_xy = min(dx,dy)
h = dx + dy + (math.sqrt(2) - 2) * min_xy   

在这里插入图片描述
在这里插入图片描述

参考论文:《一种面向非结构化环境的改进跳点搜索路径规划算法》等


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

相关文章

猴子都能看懂的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.新…

脏读、幻读和不可重复读

一、引言 脏读、不可重复读和幻读是数据库中由于并发访问导致的数据读取问题。当多个事务同时进行时可以通过修改数据库事务的隔离级别来处理这三个问题。 二、问题解释 1、脏读(读取未提交的数据) 脏读又称无效数据的读出,是指在数据库访…

一文详解脏读、不可重复读、幻读

MySQL 是支持多事务并发执行的。否则来一个事务处理一个请求,处理一个人请求的时候,其它事务都等着,那估计都没人敢用MySQL作为数据库,因为用户体验太差,估计都要砸键盘了。 既然事务可以并发操作,这里就有一些问题:一…