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_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   

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

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

### A*算法优化技巧和策略 #### 启发函数的选择与调整 启发式函数计对于A*算法性能至关重要。不同的应用场景适合不同类型的启发式函数。通常情况下,更接近实际代价估计的启发式函数能够提高搜索效率[^4]。 为了平衡速度与精度,在某些场景下可以选择较为宽松的启发方式来加快求解过程;而在其他场合,则应追求更高的准确性,即使这意味着计算时间会有所增加。例如,在游戏AI路径寻找中,有时快速获得可行方案比绝对最优更重要。 ```python def heuristic(a, b): # 使用曼哈顿距离作为简单的启发式估算 return abs(a.x - b.x) + abs(a.y - b.y) ``` #### 避免局部最优陷阱的方法 当遇到复杂环境时,标准形式下的A*可能会陷入局部极值点而无法继续前进。为此,可以通过引入多个互补性的评价指标或是混合采用几种不同的探索模式来进行改进[^3]: - **多启发式组合**:结合两种以上相互独立但又具有定关联性的评估机制; - **随机扰动因子**:给定范围内随机化部分参数取值,打破单调性; - **记忆结构增强**:记录已访问节点及其状态特征,防止重复劳动并促进全局视野构建。 #### 数据结构优化 合理选择数据存储方式同样有助于提升整体表现。优先队列(Priority Queue)是实现开放式列表的理想工具之,因为它允许高效地获取当前成本最低的状态进行扩展操作。此外,利用散列表(Hash Table)管理关闭表能显著减少查找耗时[^1]。 ```python import heapq open_list = [] # 小顶堆用于维护待处理结点 heapq.heappush(open_list, (f_score[start], start)) closed_set = set() # 散列表保存已经考察过的结点 ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值