当前位置: 首页 > news >正文

改进A星算法:剔除冗余节点与光滑转折点

改进A星算法 剔除冗余节点,光滑转折点 对比优化前后路径。

在路径规划领域,A星算法无疑是一颗耀眼的明星。然而,原始的A星算法生成的路径可能存在冗余节点,并且转折点不够光滑,影响了路径的实用性和美观性。今天咱们就来聊聊如何对A星算法进行改进,解决这些小烦恼。

剔除冗余节点

冗余节点是什么

冗余节点就是那些对整体路径走向没有实质性影响的节点。比如在一条笔直的路径上,中间有若干个挨得很近且几乎在同一直线上的节点,它们对于从起点到终点的路径描述并没有提供更多有效信息。

代码实现思路

假设我们已经通过A星算法得到了一条路径path,这是一个节点列表。我们可以遍历这个列表,对于每一个节点path[i],检查它是否可以被跳过,即判断path[i-1]path[i]path[i+1]是否大致在同一条直线上。

def remove_redundant_nodes(path): new_path = [path[0]] for i in range(1, len(path) - 1): p1 = path[i - 1] p2 = path[i] p3 = path[i + 1] # 这里简单通过斜率判断是否在同一直线,实际应用可能需要更精确方法 if (p3[1] - p1[1]) * (p2[0] - p1[0])!= (p2[1] - p1[1]) * (p3[0] - p1[0]): new_path.append(p2) new_path.append(path[-1]) return new_path

代码分析

  1. 首先,我们创建一个新的路径列表new_path,并将原路径的起点加入其中。
  2. 然后,从原路径的第二个节点开始遍历,一直到倒数第二个节点。对于每个节点p2,我们取出它前一个节点p1和后一个节点p3
  3. 通过比较斜率来判断这三个节点是否大致在同一条直线上。如果不在同一条直线上,说明p2是有意义的,将其加入新路径;如果在同一条直线上,说明p2可能是冗余的,跳过它。
  4. 最后,将原路径的终点加入新路径,并返回这个剔除冗余节点后的新路径。

光滑转折点

为什么要光滑转折点

在实际应用中,过于尖锐的转折点可能会导致机器人、车辆等在路径执行过程中遇到困难,比如难以快速平稳地转弯。

代码实现思路

我们可以使用一些曲线拟合的方法来光滑转折点。这里简单介绍一种基于贝塞尔曲线的方法。假设我们有三个相邻的节点p1p2p3,我们可以生成一条贝塞尔曲线来连接p1p3,并使用曲线上的点来替代p2

import numpy as np import matplotlib.pyplot as plt def bezier_curve(points, num=20): t = np.linspace(0, 1, num) curve = np.zeros((num, 2)) for i in range(num): curve[i] = (1 - t[i]) ** 2 * points[0] + 2 * (1 - t[i]) * t[i] * points[1] + t[i] ** 2 * points[2] return curve def smooth_turns(path): new_path = [] for i in range(len(path) - 2): p1 = np.array(path[i]) p2 = np.array(path[i + 1]) p3 = np.array(path[i + 2]) curve = bezier_curve([p1, p2, p3]) new_path.extend(curve[1:-1].tolist()) new_path.append(path[-1]) return new_path

代码分析

  1. bezier_curve函数实现了贝塞尔曲线的生成。它接受三个点points,并生成num个点组成的贝塞尔曲线。通过np.linspace生成从0到1的num个均匀分布的参数t
  2. 然后根据贝塞尔曲线的公式(1 - t)^2p1 + 2(1 - t)tp2 + t^2 * p3计算曲线上每个点的坐标。
  3. smooth_turns函数遍历路径,对于每三个相邻的节点,生成贝塞尔曲线,并将曲线上除起点和终点外的点加入新路径,最后加入原路径的终点。

对比优化前后路径

直观对比

为了更直观地看到优化前后路径的差异,我们可以通过绘图来展示。假设我们在一个二维平面上进行路径规划,起点和终点固定,通过A星算法得到原始路径,然后对其进行上述的冗余节点剔除和转折点光滑处理,得到优化后的路径。

# 假设path是原始路径,path1是剔除冗余节点后的路径,path2是光滑处理后的路径 plt.plot([p[0] for p in path], [p[1] for p in path], label='Original Path', marker='o') plt.plot([p[0] for p in path1], [p[1] for p in path1], label='Path after removing redundant nodes', marker='s') plt.plot([p[0] for p in path2], [p[1] for p in path2], label='Path after smoothing turns', marker='^') plt.legend() plt.show()

效果分析

从图中可以明显看出,原始路径可能存在一些不必要的曲折和冗余点。剔除冗余节点后的路径更加简洁,转折点光滑后的路径则更加流畅,更符合实际应用中对路径的要求。无论是机器人的移动路径,还是游戏角色的行动轨迹,优化后的路径都能带来更好的效果。

改进A星算法 剔除冗余节点,光滑转折点 对比优化前后路径。

通过对A星算法进行剔除冗余节点和光滑转折点的改进,我们让路径规划更加实用和高效。在实际项目中,根据具体需求还可以进一步调整和优化这些方法,以达到最佳的路径规划效果。希望这篇文章能给大家在路径规划相关的开发工作中带来一些启发!

http://www.jsqmd.com/news/245585/

相关文章:

  • 2.Java实现电子签名的两种工具
  • Mac系统如何批量命名,Mac批量重命名软件工具
  • 基于拉丁超立方采样与自适应核密度估计的电力系统概率潮流精准计算
  • GBDT 生态的未来演化:从技术竞争到协同标准的形成
  • adb 远程连接设备
  • Mac文件批量重命名工具:A Better Finder Rename
  • 从 RPA 迈向智能自治,开启企业外部群运营的“自动驾驶”时代
  • 大数据领域数据服务的数据分析工具选择
  • 快讯|DeepSeek Engram论文详解存算分离,华为SWE-Lego开源轻量级代码智能体全栈方案,
  • 企业微信 RPA 外部群自动化实战:5 大技术瓶颈与解决方案
  • 学Simulink--基础储能管理场景实例:基于Simulink的光储联合系统削峰填谷能量管理仿真
  • 纳米级精准,实路见证:OBS-ONE SPN10车载废气测量系统项目实战全攻略
  • 康养休闲旅游服务实训室教学应用与实践
  • 手把手教你学Simulink--基础储能管理场景实例:基于Simulink的储能参与电网调频(AGC)控制策略仿真
  • Springboot英语自适应学习平台4ao8x(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 基于Simulink的储能参与电网调频(AGC)控制策略仿真
  • FLAC-PFC隧道开挖与衬砌结构的精细耦合模拟:平衡开挖与注释代码详解
  • 当轴承开始“咳嗽“:用MATLAB做个机械故障体检
  • 从概念到车间:CAD——驱动现代机械产品诞生的数字引擎
  • Springboot应急物资管理系统s8124(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 学Simulink--基础储能管理场景实例:基于Simulink的储能SOC均衡控制策略仿真
  • 2026制造业突围战:ERP和MES系统集成成为降本增效关键抓手
  • 康养休闲旅游服务实训室设备列表与功能介绍
  • ERP与MES系统集成如何选?2026最新靠谱厂商实战测评出炉
  • 学Simulink--基础微电网场景实例:基于Simulink的孤岛模式下微电网电压频率稳定控制仿真
  • 深夜盯着变压器运行数据,屏幕上跳动的温度数值总让人心里发毛。二维温流耦合模型就像给变压器做CT扫描,今天咱们来拆解这个能看透铁芯油路秘密的COMSOL神操作
  • 学Simulink--基础储能管理场景实例:基于Simulink的储能参与电网调频(AGC)控制策略仿真
  • Java全栈开发面试实录:从基础到实战的深度探讨
  • 全桥LLC开关电源及TMS320F28034单片机控制:硬件原理图、开环仿真模型、控制源代码、...
  • NAS自由:一个技术爱好者的“断电”实验