☰
从TEB到DQN:深度强化学习路径规划核心解析与PyTorch实现
2026/10/14 12:06:32 网站建设 项目流程

简介:一份面向深度学习与机器人控制方向的学术资源《深度强化学习在路径规划中的应用研究》PDF,围绕移动机器人在未知环境下的实时路径规划问题,系统讲解深度强化学习技术,并重点对比传统TEB算法与深度Q学习(DQN)的差异。内容涵盖DQN算法原理、回报函数设置、动作离散化方法,以及Gazebo仿真环境中的实验结果,可直接为相关课题提供参考文献与算法设计思路。资源包共1个文件,为PDF格式,大小1.35MB,目前已有554人学习。即使没有地图先验信息,也能从文中了解到如何利用深度强化学习实现端到端路径规划,并理解其在复杂环境下的实时性优势与平滑性局限,适合机器人、人工智能方向的学生和研究人员按需查阅。

1. 深度强化学习做路径规划:从这篇论文看 DQN 凭什么替代 TEB

移动机器人路径规划这个方向,很多从业者一开始接触的都是 TEB、A*、DWA 这类传统算法。它们的核心逻辑是“先建图、再规划”,依赖激光雷达、里程计对环境做实时更新,计算资源消耗大,且换一个场景往往就要重新调参。这篇论文给出的反直觉结论是:用 DQN(Deep Q-Learning)做端到端路径规划,单步规划时间能压到 0.001~0.005 秒,比 TEB 的 0.05~0.2 秒快一个数量级,而且完全不需要地图信息。作者在 Gazebo 仿真环境里放了六个目标点,让小车走矩形轨迹,对比 DQN 与 TEB 的导航能力,最终验证了深度强化学习在实时性和环境适应性上的优势。这份资源适合正在做机器人导航、强化学习入门,或者准备在毕业设计里拿“DQN 路径规划”开题的同学——它能帮你快速理解 DQN 的完整工程链路:状态怎么定义、动作怎么离散化、回报函数怎么设计、仿真怎么搭。下面我把论文里的关键设计拆开讲,并结合实际调试经验,把训练里的坑和参数边界一并说清楚。

2. 算法选型:为什么是 DQN 而不是 Q-Learning,TEB 到底慢在哪

2.1 Q-Learning 的离散局限是天花板,DQN 用神经网络打破了它

传统 Q-Learning 的核心是维护一张 Q 表,表的行是状态、列是动作,每次探索后更新对应 Q 值,直到收敛。问题在于,机器人的状态输入是连续的——激光雷达的距离值、当前坐标、航向角都是浮点数。如果把连续状态离散化,粒度太粗则丢失信息,粒度太细则 Q 表规模爆炸。举个例子:假设状态维度只有 4 个,每个维度离散成 10 格,Q 表就有 10^4 个状态再乘以动作数;真实场景状态维度远不止 4 个,这张表根本存不下,更新也慢。这就是“维度灾难”。

DQN 的本质是用深度神经网络拟合 Q 函数 Q(s, a; θ),输入是连续状态向量,输出是每个动作的 Q 值估计。这样状态空间不必离散化,网络自动从高维输入中提取特征。论文里用的是 DQN 的基础结构——预测网络和目标网络双网络结构,目标网络的参数滞后更新,用来降低样本间的相关性。更新公式是:

Loss = (r + γ · max_a' Q_target(s', a'; θ⁻) - Q_pred(s, a; θ))²

其中 θ 是预测网络参数,θ⁻ 是目标网络参数,γ 是折扣因子。预测网络每步都更新,目标网络每隔 N 步才从预测网络复制一次参数。这个滞后机制是 DQN 能稳定收敛的关键:如果只有一个网络,每次更新都会同时影响目标值,优化目标总在变,训练容易震荡甚至发散。

提示:目标网络参数复制周期 N 和折扣因子 γ 是两个最敏感的超参。N 太短(比如 1)等于没有目标网络,N 太长(比如 10000)则目标值长期失真,常见范围在 100~1000 之间;γ 接近 1 表示重视远期收益,但训练初期容易不稳定,0.9~0.99 区间比较常用。

2.2 TEB 的优化链路:从超图构建到 g2o 多轮迭代,时间花在哪

要理解 DQN 快在哪,先知道 TEB 慢在哪。TEB(Timed Elastic Band)把路径表示成一系列带时间戳的位姿序列,每个状态包含坐标、角度和时间。它把路径规划转成一个多目标约束优化问题,约束条件包括:障碍物距离、路径总长度、消耗时间、机器人运动学可行性、几何约束等。

TEB 的完整流程分四步:首先初始化全局路径为连续序列;然后对序列中的路径点做插入和删除操作,调整路径点密度;接着将路径点与障碍物映射成超图——超图的顶点是序列中的状态,边是约束条件;最后把整个超图塞进 g2o 框架做多轮迭代优化,求出最优路径 B* 后再结合车身模型做可行性分析,可行则计算控制速度,不可行就重新优化。

时间开销主要在三处:一是建图环节,TEB 强依赖环境地图,无论是先验地图还是实时 SLAM 构建,都有不可忽略的预处理成本;二是超图构建和迭代优化,每轮迭代都要计算所有约束的雅可比矩阵,路径点一多,计算量非线性增长;三是在线运行时,传感器数据持续更新地图,每次更新都可能触发重规划。论文里测的数据是 TEB 单步规划 0.05~0.2 秒,在多目标点连续导航场景下,这个延迟累加起来很明显。DQN 则完全不同——训练完成后,前向推理只是一次网络前传,不需要建图,不需要迭代优化,单步规划 0.001~0.005 秒。

2.3 论文里容易忽略的一个细节:表格写的是 D3QN,正文却是 DQN

拆这篇论文时我发现一个值得注意的地方:理论部分介绍的是 DQN 的基础版本,更新公式和运算过程图都是标准 DQN 的写法;但在实验结果部分的算法对比表里,出现了“Teb 和 D3QN 的路径规划结果”这样的表述。D3QN 是 Dueling Double DQN 的缩写,它是在 DQN 基础上做了两项改进——Double DQN 解耦动作选择和 Q 值估计,Dueling Network 把 Q 值拆成状态价值 V 和优势函数 A。论文正文没有展开讲这两处改进,但对比表用了 D3QN。这里有两种可能:实验代码实际跑的是 D3QN,但论文写作时理论部分沿用了 DQN 的表述;或者作者在实验阶段升级了算法,但正文没同步更新。

无论哪种情况,对读者来说,你复现的时候直接上 D3QN 或 Dueling DQN 是更稳的选择,收敛速度和解锁效果都比基础 DQN 好。我一般会在论文复现时默认用 Double DQN + Dueling Network 的组合,改动量不大但收益明显。后文的实现细节我也会按这个方向展开。

3. 把 DQN 落地到路径规划:状态、动作、回报函数三件套的设计与代码实现

3.1 任务建模:从传感器输入到线速度和角速度输出的端到端映射

论文把路径规划定义为“决策器”——输入是传感器数据,输出是线速度和角速度。由于 DQN 是离散动作算法,线速度被固定为 0.15 m/s,角速度按离散档位设置。这种设计的逻辑是:机器人的运动控制频率一般 10 Hz 左右,每一步选一个角速度,线速度恒定,只要动作集覆盖“直行、左转、右转”的基本转向能力,小车就能在这个离散控制模式下到达目标点。

论文表 1 给出了动作设置,但没有在正文列全具体角度值。常见的做法是设置 5 到 7 个离散动作,例如:

动作编号线速度 (m/s)角速度 (rad/s)语义
00.15-0.5右转
10.15-0.2右偏
20.150.0直行
30.150.2左偏
40.150.5左转

动作数不宜太多,5~7 个是平衡粒度与学习难度的经验区间。动作太少小车转向能力不足,动作太多则每个动作被采样的频率下降,Q 值估计不准确。状态空间我建议包含这几项:当前坐标与目标点的距离、当前航向与目标方向的夹角、以及激光雷达的 360 度距离扫描(降采样到 36 维或 72 维)。这样网络输入维度大约在 40~80 之间,既保留了足够的环境感知信息,又不会让网络过于庞大。

3.2 核心代码:DQN 网络的 PyTorch 实现与训练循环

论文没有给出源码,只给了算法流程图和公式。这里我按自己复现时的做法,给出一个可运行的 DQN 核心实现。网络结构很简单:三层全连接,输入层接状态向量,隐藏层用 ReLU,输出层节点数等于动作数。

import torch import torch.nn as nn import torch.optim as optim import numpy as np import random from collections import deque class DQNNetwork(nn.Module): def __init__(self, state_dim, action_dim, hidden_dim=128): super(DQNNetwork, self).__init__() self.fc1 = nn.Linear(state_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, hidden_dim) self.fc3 = nn.Linear(hidden_dim, action_dim) def forward(self, x): x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) return self.fc3(x) # 输出每个动作的 Q 值 class ReplayBuffer: def __init__(self, capacity=10000): self.buffer = deque(maxlen=capacity) def push(self, state, action, reward, next_state, done): self.buffer.append((state, action, reward, next_state, done)) def sample(self, batch_size): batch = random.sample(self.buffer, batch_size) states, actions, rewards, next_states, dones = zip(*batch) return (np.array(states), np.array(actions), np.array(rewards), np.array(next_states), np.array(dones)) def __len__(self): return len(self.buffer)

逻辑说明:DQNNetwork 的 forward 输出的是每个动作的 Q 值张量,不经过 softmax——因为 Q 值本身就是回归目标,不是概率分布。ReplayBuffer 用 deque 实现,超过容量自动淘汰最旧样本,保证采样集合是最新的经验流。这里的 capacity 对应论文里说的“回忆单元容量阈值”,达到阈值后才开始从缓冲区采样训练。

训练循环的关键部分如下:

def train_dqn(env, policy_net, target_net, optimizer, buffer, args): state = env.reset() episode_reward = 0 for step in range(args.max_steps): # epsilon 贪心策略:探索或利用 if random.random() < args.epsilon: action = random.randint(0, args.action_dim - 1) else: state_tensor = torch.FloatTensor(state).unsqueeze(0) with torch.no_grad(): q_values = policy_net(state_tensor) action = q_values.argmax().item() next_state, reward, done, _ = env.step(action) buffer.push(state, action, reward, next_state, done) if len(buffer) > args.batch_size: # 从缓冲区随机采样一批数据 states, actions, rewards, next_states, dones = buffer.sample(args.batch_size) states = torch.FloatTensor(states) actions = torch.LongTensor(actions) rewards = torch.FloatTensor(rewards) next_states = torch.FloatTensor(next_states) dones = torch.FloatTensor(dones) # 计算当前 Q 值:取预测网络中对应动作的 Q 值 q_values = policy_net(states).gather(1, actions.unsqueeze(1)).squeeze(1) # 计算目标 Q 值:目标网络输出的最大 Q 值 with torch.no_grad(): next_q_values = target_net(next_states).max(1)[0] target_q = rewards + args.gamma * next_q_values * (1 - dones) loss = nn.MSELoss()(q_values, target_q) optimizer.zero_grad() loss.backward() optimizer.step() # 周期性同步目标网络参数 if step % args.target_update == 0: target_net.load_state_dict(policy_net.state_dict()) episode_reward += reward if done: break return episode_reward

逻辑说明:训练循环里最值得留意的是目标 Q 值的计算——用目标网络算 next_state 的最大 Q 值,乘折扣因子 γ,再加即时奖励。dones 乘在 (1 - dones) 上是为了让终止状态的 Q 值目标只等于即时奖励,不再往后累加。损失函数用 MSELoss,本质上是让 Q 值回归到目标值。target_update 周期控制目标网络参数复制的频率,对应论文里说的“目标网络的更新会有一定的滞后性”。

参数说明:epsilon 从 1.0 线性衰减到 0.1 是惯例——初期高探索,后期低随机。衰减速度要配合环境规模:六目标点导航场景下,一般 20000~50000 步完成衰减比较合适。batch_size 建议 32 或 64,过大则样本相关性强,过小则梯度噪声大。learning_rate 取 1e-4 到 3e-4,用 Adam 优化器。

3.3 回报函数公式拆解:四个分量各自的边界和坑

论文给出的回报函数如式 (2) 所示,由四部分组成:与目标点距离的变化量、与目标点的角度偏差、到达目标正奖励 200、碰撞障碍物负奖励 200。这里逐一拆开讲:

第一个分量是距离差项 Dt−1 − Dt,这一步比上一步更靠近目标,就给出正值。这个分量的好处是提供稠密梯度,让小车不至于在稀疏奖励环境下完全不知道往哪走。但它有一个“绕远路”陷阱:如果小车先远离目标再绕回,惩罚和奖励相互抵消,网络可能学到震荡行为。解决的办法是给这个分量加一个缩放因子,论文里的缩放因子应该就是公式里的 α,建议取 0.1 到 0.5 之间,让单步距离变化的贡献不至于压过终端奖励。

第二个分量是角度偏差项,小车当前朝向与目标方向的夹角越小,奖励越高。这个分量的作用是引导小车“先转身再前进”,而不是倒着走或横着漂。角度偏差的计算用余弦值更平滑:cos(θ_diff) 在 0 度时为 1,180 度时为 −1,天然归一化在 [−1, 1],不需要额外调尺度。

第三个和第四个分量是终端奖励——到达目标给 +200,碰到障碍物给 −200。200 这个数值并不是随便定的,它的量级要显著大于单步的稠密小奖励,让网络明确区分“任务完成”和“任务失败”。但这里有一个容易忽略的问题:如果单步小奖励的量级过大,比如距离差项动辄给到 50,那么 200 的终端奖励就失去区分度。我一般会把单步奖励控制在 ±5 以内,终端奖励定在 ±100~±200,拉开一个数量级的差距。

注意:回报函数是 DQN 训练中最大的“玄学”来源,牵一发动全身。论文里给的只是公式骨架,实际复现时每个分量的权重都必须根据小车运动速度、控制频率、地图尺寸做重新标定。速度 0.15 m/s、控制频率 10 Hz 时,两步之间小车最多移动 0.03 米,距离差项的量级天然很小,如果权重设得太大,角度偏差项就完全被淹没。

4. 在 Gazebo 里做仿真验证:从环境搭建到六目标点对比实验

4.1 仿真环境选型:为什么是 Gazebo 而不是 MuJoCo 或 Webots

论文选择在 Gazebo 上搭建仿真环境,核心原因是它集成了 ODE 物理引擎,能更真实地还原机器人的动力学模型。路径规划不是纯粹的 2D 几何问题——小车有惯性、有最大加速度、轮胎有打滑,纯数学仿真里能走通的路径,物理仿真里可能会因为转向不足而撞墙。Gazebo 的物理引擎会实时计算这些动力学效应,让策略网络在训练阶段就接触到接近真实的运动特性。

相比 MuJoCo,Gazebo 的优势在于 ROS 生态的无缝集成。路径规划任务通常用 ROS 做节点通信,Gazebo 可以直接跑 ROS 的仿真节点,用话题(Topic)收发激光数据和速度指令,不需要自己写中间层。Webots 物理精度也不错,但 ROS 集成的成熟度不如 Gazebo。如果你是在 Linux 环境做机器人开发,Gazebo 加 ROS 是首选组合。

我一般会用 TurtleBot3 模型做载体——它自带差分驱动模型、激光雷达插件和 URDF 描述文件,Gazebo 仿真和真实硬件的行为很接近,后续如果想迁移到真实机器人,代码改动量很小。Gazebo 环境的搭建分两步:一是写 world 文件定义地面、墙壁和障碍物,二是写机器人模型和传感器插件。如果你不想从零写,直接用 TurtleBot3 Gazebo 的功能包跑起来也能做实验。

4.2 DQN 与 TEB 的对比实验设计:六个目标点走矩形轨迹的深意

论文的实验设计是在静态环境中设置六个目标点,让小车走一个矩形轨迹,对比 DQN 和 TEB 的规划结果。矩形轨迹的设计很有讲究——它不是一个点对点的简单导航,而是连续经过六个目标点的多目标导航任务。这要求算法不仅能在单段路径上规划,还必须在到达一个目标后立即切换到下一个目标,这个过程中小车的位置和朝向都会发生变化,对算法的重规划能力是实打实的考验。

TEB 在这类任务上的典型表现是:每到达一个目标点,需要重新做全局规划或局部调整,因为 TEB 是局部优化器,它的超图只覆盖当前局部路径。如果全局路径发生变化,比如切换目标点,TEB 必须在新目标点的基础上重新初始化路径序列并再次迭代优化,这就会在目标点切换处产生明显的停顿或减速。DQN 则没有这个问题——输入状态里包含当前目标坐标和相对位置,网络直接输出动作,切换目标只是改变了输入向量的一个分量,不需要做额外的初始化。

实验对比表(表 2)给出了三个维度的数据:地图依赖、规划时间和调参数量。其中 DQN 不依赖地图信息,TEB 需要地图;DQN 的单步规划时间是 0.001~0.005 秒,TEB 是 0.05~0.2 秒;调参方面 DQN 的数量显著少于 TEB,且都能到达目标。这三个维度的对比实际上对应着两个应用价值:一是计算资源受限的场合,DQN(训练完成后)的推理开销远小于在线优化;二是环境变化的场合,DQN 不需要重新建图,换一个环境直接就能跑,而 TEB 需要重新构建地图和调整超图参数。

4.3 静态环境六目标点仿真:一个可参考的训练评估流程

我复现论文实验时的流程,可以作为一个参考模板。首先是训练阶段,在 Gazebo 中加载静态环境,机器人从起点出发,依次到达六个目标点,每个 episode 设定最大步数 600 步(60 秒),超过则强制终止。每步的观测数据是激光雷达距离值降采样到 36 维,加上当前坐标、目标坐标、航向偏差,总共 40 维状态。动作空间用前述的 5 个离散动作。

训练配置文件的核心参数如下:

# dqn_config.yaml 训练配置参考 gazebo_world: "turtlebot3_house_lite.world" laser_downsample: 36 # 激光降采样维度 state_dim: 40 # 36(laser) + 2(坐标) + 2(目标) 的组合 action_dim: 5 # 离散动作数 dqn: gamma: 0.95 # 折扣因子 epsilon_start: 1.0 # 初始探索率 epsilon_end: 0.1 # 最小探索率 epsilon_decay_steps: 30000 # 探索率衰减步数 batch_size: 64 # 训练批量大小 learning_rate: 0.0002 # 学习率 memory_capacity: 20000 # 经验回放容量 target_update: 500 # 目标网络更新周期 max_steps_per_episode: 600 # 单局最大步数 reward: distance_scale: 0.3 # 距离差项缩放因子 angle_scale: 0.2 # 角度偏差项缩放因子 arrive_bonus: 200 # 到达目标奖励 collision_penalty: 200 # 碰撞障碍物惩罚

训练完成后,评估阶段的做法是把 epsilon 设为 0,即完全按策略网络 argmax 选择动作,让小车从测试起点出发,经过六个目标点走完整条矩形轨迹,记录到达目标数、碰撞次数和每段路径长度。我测试时会跑 10 次取平均,避免单次随机性掩盖真实水平。

5. DQN 路径规划避坑指南:收敛失败、奖励失衡、仿真与实机落差

5.1 报错或结果异常:训练 loss 持续震荡不下降

  • 现象:训练过程中 loss 上下波动剧烈,没有明显的下降趋势,小车在原地打转或者反复撞墙,episode reward 长期在零附近徘徊。
  • 原因:最常见的是目标网络更新周期设置太短,导致 Q 值目标一直在变,优化目标不稳定。另一个常见原因是学习率偏高,Adam 的学习率在 1e-3 以上时容易让 Q 值估计发散。
  • 解决:把 target_update 调到 500 以上,确认目标网络参数是“隔一段才同步”而非“每步都同步”;学习率降到 1e-4 到 3e-4 之间。如果还不行,就检查回报函数里奖励的量级是否相差过大——终端奖励 200 和单步小奖励 0.1 的量级差距达到 2000 倍,梯度会被终端奖励主导,网络几乎学不到中间过程的引导信号。

5.2 训练能收敛但路径走不好:直角转弯变圆弧漂移

  • 现象:小车能到目标点,但路径是明显的大半径圆弧,而不是平滑的转向,整体路径比 TEB 规划的结果长不少。
  • 原因:论文也指出了一个关键问题——DQN 的输出是离散动作,角速度档位只有 5 个,小车只能在有限的转向幅度中选择。当接近目标点时,角度偏差减小,但最小的角速度档位依然偏大,导致小车不断左右摆头——路径上表现为“之字形”或“圆弧形”。
  • 解决:在靠近目标点时切换控制策略,距离目标点小于 0.3 米时改用比例控制器直接对角度误差做闭环调节,或者把角速度档位细化——从 3 档变成 5 档,加入 ±0.15 rad/s 的微调档位,圆弧半径会明显缩小。代价是动作数增多,训练时间会有少量增加。

5.3 换一个环境就失效:过拟合静态地图

  • 现象:在训练用的 Gazebo 地图里效果很好,换一张地图(哪怕只是挪动障碍物位置),策略立刻失效,小车频繁撞墙。
  • 原因:网络可能学会了“背地图”而不是“理解导航”。如果训练环境固定,激光雷达的扫描模式会和地图中障碍物的位置强相关,网络提取的特征里有大量只属于这张地图的信息。论文中只说了“不依赖地图信息”,但这是指运行时不需要地图,训练阶段如果只在单张地图上训练,依然会形成地图相关的过拟合。
  • 解决:在训练阶段做域随机化,每训练一个 epoch 就轻微移动障碍物位置,甚至改变墙体布局,让网络学到“避开障碍物”而不是“避开特定障碍物”。实操中也可以在地图里加入随机摆放的圆柱体障碍物作为干扰项。这个技巧能显著提升策略在新环境里的泛化能力。

5.4 仿真里走得稳,实机上乱跑:物理参数不一致

  • 现象:同一个策略在 Gazebo 里表现稳定,部署到真实小车后频繁抖动,速度不稳,转弯明显迟滞。
  • 原因:仿真里的小车模型参数——最大加速度、轮胎摩擦力、电机响应延迟——都是理想值。Gazebo 的 ODE 物理引擎虽然接近真实,但永远不会完全一致。DQN 训练时学到的“执行动作后状态会这样变化”的认知,在实机上因为物理特性差异而出现偏差。
  • 解决:仿真训练阶段给电机响应加入随机延迟和噪声,模拟真实电机的滞后特性;把控制频率从仿真中的高频降到实机的实际频率(比如 10 Hz),确保训练时的时间步长和实机一致。还有一个实用技巧:在仿真里故意调低轮子的最大加速度,让训练出来的策略更“保守”,对实机的物理参数偏移有一定容忍度。论文没有涉及实机验证,但如果你要复现,最好提前把这条纳入考虑范围。

6. 从基础 DQN 到 D3QN 和 PER:训练稳定性的进阶改进方向

想改善论文实验的稳定性和收敛速度,确实有几个工作量不大但收益明确的算法变体值得按顺序尝试。第一个是 Double DQN,解决 Q 值高估问题。基础 DQN 用同一个网络既选动作又算目标值,天然会高估 Q 值,因为取 max 会把所有动作估计误差里的正向偏差放大。改动虽然只有几行代码——在计算目标 Q 值时,用预测网络选择动作,再用目标网络计算这个动作的 Q 值——但能明显减少训练前期的高估现象。

第三个是优先经验回放(PER)。论文的基础版是均匀随机采样,每个样本的重要程度相同。但在路径规划中,碰撞障碍物和到达目标这两个终止状态的样本数量远少于普通行进样本,均匀采样会让这些关键样本的训练权重不足。PER 按 TD 误差的绝对值给样本设定优先级,误差越大越优先被采样。实现时需要维护一个 SumTree 数据结构,采样复杂度从 O(1) 降到 O(log n),但收敛速度的提升通常值得这个代价。

顺便验证一个具体改进的效果:在实际项目里,从基础 DQN 升级到 Dueling Double DQN 后,收敛所需步数通常能减少 30%~50%,且最终的平均路径长度更短。路径平滑性方面,论文的实验结果指出“强化学习在路径的平滑性上还没有达到 TEB 的效果”,这是离散动作输出的结构性问题。我自己实践时发现一个实用技巧:在 DQN 训练完成后,对于已经训练好的策略,可以把离散角速度输出通过一个低通滤波器平滑,再把平滑后的角速度指令发给底盘。这个滤波器的时间常数要按实机控制频率标定,我一般取 0.2~0.3 秒,能在几乎不影响路径长度的情况下显著减少摆动。

提示:算法再花哨,最终都要用数据说话。我的习惯是每调整一个改进项,就在同一张地图上用固定随机种子重新训练一遍,记录 1k 步、5k 步、10k 步时的平均回报和碰撞次数,横向对比后再决定取舍。

从那以后,我每次复现这类论文任务时都强制自己先做基线实验再上改进算法——先把基础 DQN 在简单地图上跑通收敛,再逐步加入 Dueling、Double、PER 等改进项,每一步都留下一份可对比的评估记录。这样即使后续出现“改了一点代码但结果变差”的情况,也能快速定位是哪一步改动导致的。做法上切勿跳过这个步骤直接跑完整版本。希望这些拆解和踩坑记录能帮到你,特别是正在拿“DQN 路径规划”做课题的读者——把论文里的公式变成能跑的代码,再把能跑的代码调稳,这个过程的收获远大于论文本身。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询