news 2026/6/15 13:18:42

改进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/6/12 21:38:06

为什么经济学里有那么多数学公式?

要深入理解 “经济学里数学公式多” 的现象,需要从 **“工具的合理必要性”“学术生态的非理性内卷”** 两个层面结合分析 —— 前者解释了数学公式 “为何存在”,后者解释了数学公式 “为何过多甚至泛滥”,二者共同构成了当前经济学中数学公…

作者头像 李华
网站建设 2026/6/13 3:45:51

python基于vue的汽车租赁系统的续租django flask pycharm

目录 基于Vue与Python的汽车租赁系统续租功能实现 开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 基于Vue与Python的汽车租赁系统续租功能实现 技术栈组合 系统采用前后端分离架构&#x…

作者头像 李华
网站建设 2026/6/13 15:26:40

java学习--LinkedHashSet

一、LinkedHashSet 是什么?LinkedHashSet 是 Java 集合框架中 java.util 包下的实现类,它继承自 HashSet,同时实现了 Set 接口,底层基于 LinkedHashMap 实现(本质是「哈希表 双向链表」)。可以把它理解为&…

作者头像 李华