news 2026/5/1 7:36:40

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

作者头像

张小明

前端开发工程师

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:06:12

WSRP(Web Services for Remote Portlets)技术详解

前言 在现代企业信息系统架构中,统一门户(Enterprise Portal)作为用户访问各类业务系统的单一入口,承担着信息聚合、身份统一、用户体验一致等关键职责。然而,随着业务系统的不断扩展,如何高效、安全、可维…

作者头像 李华
网站建设 2026/5/1 5:01:12

SOLIDWORKS Simulation:“本地交互”的接触参数,都代表什么?

在使用 SOLIDWORKS Simulation 进行装配体或多实体零件受力分析时,关键的本地交互功能该如何设置? “连接” 功能中的“本地交互”是定义零件间接触关系的核心工具,其中“相触”设置最为常用,直接决定了力如何通过接触面进行传递…

作者头像 李华
网站建设 2026/4/22 22:43:57

技术架构自动化转换工具避坑实录:架构师分享10个血泪教训与解决方案

技术架构自动化转换工具避坑实录:架构师的10个血泪教训与实战解决方案 摘要/引言 问题陈述:在数字化转型浪潮中,企业架构升级已成为技术部门的核心任务。手动进行架构转换不仅耗时耗力(平均周期6-12个月,错误率高达35%),更难以应对快速变化的业务需求。架构自动化转换…

作者头像 李华
网站建设 2026/5/1 6:18:20

为什么律师花在汽车和衣服上的钱,比同等收入的大学教授更多?

律师在汽车和衣物上的支出高于同等收入的大学教授,核心是职业属性、形象价值、社交需求的差异,导致两类群体对 “外在形象” 的投入逻辑完全不同 —— 对律师而言,汽车和衣物是生产性投资;对教授而言,更多是消费性支出…

作者头像 李华
网站建设 2026/5/1 6:14:12

全球首个1米高精度特大城市开放空间数据集(Tif)

数据简介 本数据集提供全球169个特大城市的开放空间分类数据,涵盖公园绿地、运动空间、交通空间等五类城市开放空间,为城市宜居性和可持续发展研究提供精细空间数据。 数据详情 基本参数 数据引用 引用:Fan, R., Wang, L., Xu, Z. et al.…

作者头像 李华