启发式算法里RRT的详尽剖析及Python实践

深度解析启发式算法中的RRT及Python实现

文章引言

此篇文章是博主在研习人工智能领域时,用于自身学习、研讨或品鉴而记录的学习笔记,依据博主对相关领域的理解予以撰写。文章归类于👉启发式算法专栏:【启发式算法】(8)---《RRT算法详细介绍(Python)》

一、RRT算法的核心思想

RRT的核心要义是借助在空间里随机抽取采样点,逐步构建起树形结构的搜索树,以此高效探寻空间并找寻从起始点到终点的可行路径。RRT侧重于迅速探索尚未涉足的空间区域,进而全面覆盖整个搜索空间。

二、基本流程

输入内容:

包含起点 q_start、终点 q_goal、空间约束(例如障碍物、边界等)、最大迭代次数 N 以及步长 Δq

具体步骤:

  1. 初始化一棵树 T,树的根节点为起点 q_start
  2. 每一次迭代操作:
  3. 随机获取一个采样点 q_rand(可能完全随机,也可能以一定概率采样为 q_goal,此为“目标偏向”)。
  4. 在树中找出离 q_rand 最近的节点 q_nearest
  5. q_nearest 朝着 q_rand 移动固定步长 Δq,得到新节点 q_new
  6. q_new 不在障碍物区域内,将其加入树中,并把其父节点设为 q_nearest
  7. q_newq_goal 很近,可认为已找到可行路径。
  8. 若找到路径,沿父节点回溯获取路径;否则直到达到最大迭代次数。

三、RRT算法伪代码

def RRT(q_start, q_goal, N, Δq):
    T = Tree(q_start)
    for i in range(N):
        q_rand = random_sample()
        q_nearest = nearest_node(T, q_rand)
        q_new = steer(q_nearest, q_rand, Δq)
        if is_valid(q_nearest, q_new):
            T.add_node(q_new, parent=q_nearest)
            if distance(q_new, q_goal) < threshold:
                return extract_path(T, q_new)
    return failure

[Python] RRT算法实现

下面提供一个简化版的Python实现示例,并配合图示说明RRT的执行过程。

"""《RRT算法》
    时间:2025.06.16
    作者:不去幼儿园
"""
import numpy as np
import matplotlib.pyplot as plt
import random

class Node:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.parent = None

def distance(n1, n2):
    return np.hypot(n1.x - n2.x, n1.y - n2.y)

def get_random_node(goal_sample_rate, goal):
    if random.random() < goal_sample_rate:
        return Node(goal.x, goal.y)
    return Node(random.uniform(0, 100), random.uniform(0, 100))

def steer(from_node, to_node, extend_length=5.0):
    dist = distance(from_node, to_node)
    theta = np.arctan2(to_node.y - from_node.y, to_node.x - from_node.x)
    new_x = from_node.x + extend_length * np.cos(theta)
    new_y = from_node.y + extend_length * np.sin(theta)
    new_node = Node(new_x, new_y)
    new_node.parent = from_node
    return new_node

def is_collision(node):
    # 简化处理:假设无障碍物
    return False

def rrt(start, goal, max_iter=500, goal_sample_rate=0.05):
    nodes = [start]
    for _ in range(max_iter):
        rnd = get_random_node(goal_sample_rate, goal)
        nearest = min(nodes, key=lambda n: distance(n, rnd))
        new_node = steer(nearest, rnd)

        if not is_collision(new_node):
            nodes.append(new_node)
            if distance(new_node, goal) < 5.0:
                goal.parent = new_node
                nodes.append(goal)
                break
    return nodes

def draw_path(last_node):
    path = []
    node = last_node
    while node:
        path.append((node.x, node.y))
        node = node.parent
    path = path[::-1]
    plt.plot([x for x, y in path], [y for x, y in path], '-r')

def draw_tree(nodes):
    for node in nodes:
        if node.parent:
            plt.plot([node.x, node.parent.x], [node.y, node.parent.y], '-g')

start = Node(10, 10)
goal = Node(90, 90)

nodes = rrt(start, goal)
draw_tree(nodes)
draw_path(goal)
plt.plot(start.x, start.y, "bs", label="Start")
plt.plot(goal.x, goal.y, "gs", label="Goal")
plt.legend()
plt.grid(True)
plt.axis([0, 100, 0, 100])
plt.title("RRT Path Planning (No Obstacles)")
plt.show()

有博主提供了更完善的RRT算法,可在以下github库中查看:RRT算法

[Results] 运行结果

图示说明:

运行上述代码后会呈现出如下效果:绿色的线条代表RRT生成的搜索树结构,红色路径是最终从起点到终点规划出的路径,蓝色标记起点,绿色标记终点。

<p>启发式算法里RRT的详尽剖析及Python实践</p>

[Notice] 注意事项

  • 每一步都是从树中最近的节点朝着随机点延伸。
  • 最终形成一条连接起点到终点的路径。
  • 可在is_collision()中添加障碍物检测逻辑来模拟真实环境。
# 环境配置
Python                  3.11.5
torch                   2.1.0
torchvision             0.16.0
gym                     0.26.2

四、RRT的特点

优点:

  • 非常适合高维空间的路径规划。
  • 易于实现。
  • 对复杂环境有较好的适应能力。

缺点:

  • 路径并非最优,常呈“锯齿状”。
  • 随机性较强,规划时间不稳定。
  • 在障碍物密集区域效果欠佳。

五、改进版本:RRT*

RRT*(RRT Star)是RRT的优化版本,引入了“路径优化”机制:每次加入新节点时,不仅连接最近点,还会尝试重新连接周围节点以获取更短路径,理论上可得到渐近最优解。

六、应用场景

  • 机器人路径规划
  • 无人机自主导航
  • 自动驾驶车辆的避障与路径生成
  • 多自由度机械臂的运动规划

更多启发式算法文章,可前往:【启发式算法】专栏

博客系博主自用笔记,若有误导深表歉意。文章若有不当之处,还望理解与指正。因部分文字、图片等源于互联网,无法核实真实出处,若涉及相关争议,请联系博主删除。如有错误、疑问及侵权,欢迎评论留言联系作者,或添加VX:Rainbook_2 联系作者。✨

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12734.html

(0)
LomuLomu
上一篇 2025 年 7 月 4 日
下一篇 2025 年 7 月 4 日

相关推荐

  • 【深度学习】Java DL4J基于多层感知机(MLP)构建公共交通优化模型

    # 博主简介:技术领域的探索者 我是CSDN博客专家,同时也是历代文学网的总架构师。拥有15年的丰富工作经验,我精通Java编程、高并发设计、Springboot以及微服务架构。此外,我还熟悉Linux操作系统、ESXI虚拟化技术,以及云原生技术栈中的Docker和Kubernetes。我热衷于不断探索科技的前沿,将抽象的理论知识转化为实际的解决方案。我保持…

    未分类 2024 年 12 月 28 日
    37500
  • 永久pycharm激活码脚本说明+pycharm破解详细流程

    声明:以下教程中涉及的 PyCharm 破解补丁、激活码均来自互联网公开分享,仅供个人学习研究,禁止商业用途。若条件允许,请支持正版,前往 JetBrains 官方购买授权! PyCharm 是 JetBrains 出品的一款跨平台 IDE,支持 Windows、macOS 及 Linux。本文将手把手教你通过补丁方式永久激活,解锁全部专业功能。 无论你正在…

    PyCharm激活码 2025 年 11 月 20 日
    4200
  • 多端适配最新版goland激活码免费获取,专业破解教程

    申明:本教程 GoLand破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! GoLand是 JetBrains 推出的开发编辑器,功能强大,适用于 Windows、Mac 和 Linux 系统。本文将详细介绍如何通过破解补丁实现永久激活,解锁所有高级功能。 不管你是什么版本、什么操作系统。都…

    2025 年 12 月 9 日
    3800
  • IDEA激活码怎么获取?最新破解方法一文讲透!

    重要提醒:以下破解补丁与激活码均来自互联网公开分享,仅供个人学习研究,禁止商业用途。如条件允许,请支持正版:https://panghu.hicxy.com/shop/?id=18 IntelliJ IDEA 是 JetBrains 打造的跨平台 IDE,Windows、macOS、Linux 全支持。本文手把手教你用破解补丁永久解锁 2025.2 及更早版…

    2025 年 9 月 30 日
    40500
  • Java编程进阶指南——深入理解类与对象的核心概念⑦

    Java编程进阶指南📚——深入理解类与对象的核心概念⑦ 一、面向对象编程基础 1.1 面向对象编程的本质 Java作为纯粹的面向对象编程语言(OOP),其核心理念是将现实世界中的事物抽象为程序中的对象。这种编程范式强调通过对象之间的协作来解决问题。面向对象编程的优势:- 更贴近人类思维方式- 便于构建复杂的软件系统- 提升代码的可扩展性和维护性- 通过对象协…

    2025 年 5 月 19 日
    21100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信