news 2026/10/29 16:42:13

深度强化学习与DQN在无人机三维航路规划中的落地实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度强化学习与DQN在无人机三维航路规划中的落地实践

简介:东北大学本科毕业设计论文《基于深度强化学习的无人机航路规划方法研究》的完整PDF版本,面向无人机自主导航、路径规划方向的毕设学生、研究生及相关工程技术人员。论文针对静态与动态障碍环境分别提出两种算法:动态自适应势场算法(DAPF)将每个障碍视为智能体,通过多智能体强化学习动态调节势场,解决传统人工势场法的局部极小点问题;自适应扰动流场动态系统算法(AIFDS)受流水避石启发,自适应改变流场方向与大小,可与SAC、DDPG、PPO、TD3等连续动作空间强化学习算法结合。内容涵盖集中式/分布式多智能体实现对比、与A*、RRT、蚁群算法的路径质量与安全性比较,并给出多进程加速框架以提升训练效率。论文约80页,公式、实验图表与超参数设置完整,便于复现。资源为单个PDF文件,压缩包大小26.6MB,已有3363人学习。适合作为毕设写作范文、强化学习算法实现的参考资料与无人机航路规划研究的入门教材。

1. 基于深度强化学习的无人机航路规划,到底在解决什么问题

很多刚入手无人机路径规划的工程师,第一反应是把 A*、RRT 或者人工势场搬过来用。但在动态威胁、禁飞区实时变化、风场扰动这类任务里,传统规划器要么重规划太慢,要么根本想不到“绕一下”的长期收益。基于深度强化学习的无人机航路规划方法研究,就是把“航路规划”变成“策略学习”:无人机不再每次从头算一条静态路径,而是通过深度 Q 网络这类算法,在仿真环境里反复试飞,把“看到什么状态、该往哪飞”的映射关系直接学进神经网络权重里。这篇笔记适合正在做毕业设计、比赛或预研课题的工程师,目标是让你用一套可复现的 DQN 基线,把三维航路规划从论文公式落到能跑的代码上,并看清参数和坑在哪。

和传统方法比,DRL 航路规划最大的价值不是“最优”,而是“可迁移”。训练好的策略网络对同一类型的新地图有很强的适应力,遇到临时出现的禁飞区也能基于局部观测做出反应,不需要重新求解。这对有实时性要求的无人机起降平台对接、低空物流航段切换这类任务尤其有意义。下面我会直接用手上常用的方案串一遍完整落地路径,包括环境建模、状态与奖励设计、训练脚本、参数解读和排错记录,你照着复现即可。

2. 为什么选深度强化学习做航路规划:从马尔可夫决策过程到 DQN 选型

2.1 把航路规划重写成 MDP:状态、动作、奖励三件事

把航路规划变成强化学习问题,第一步是建立马尔可夫决策过程。无人机在 t 时刻有位置、速度、当前油量、目标方向、附近威胁距离等一组信息,这就是观测状态 (s_t)。动作 (a_t) 是航向角变化量、速度或高度调整量。环境根据动作给出新状态 (s_{t+1}),并返回一个奖励 (r_t)。整个飞行过程就变成一个序列决策问题:策略网络输入状态,输出动作概率或 Q 值,目标是把累计折扣回报最大化。

这里要特别提醒,航路规划 MDP 的“状态”不能只放坐标。我常用的做法是加入相对目标点的距离和方位角、最近威胁的距离和方位角、以及到威胁区的相对速度方向。这样网络才能学到“我在往威胁区飞”这个中间语义。只给绝对坐标,训练会明显变慢,而且换一张地图就失效,因为网络没有相对几何概念可供泛化。

动作空间设计上,大多数人会用连续控制(TD3 / SAC)或离散航向角集(DQN)。如果你是在做毕设,我建议从离散动作起步,原因很简单:DQN 收敛稳定,回报曲线好解释,答辩时能画出清晰的训练曲线和航路图。离散动作可以是“左转 25°、直飞、右转 25°”三档,或者加上“上升、水平、下降”的垂直档,构成 9 个动作组合。这样既保留三维规划能力,又不至于让动作维度撑爆 Q 网络输出层。

2.2 DQN 的核心公式与网络结构要点

DQN 的思想是用深度神经网络拟合 Q 函数 (Q(s, a))。Q 值表示在状态 s 下选择动作 a 后,未来累计奖励的期望。更新目标来自贝尔曼方程:

  • 当前 Q 值:(Q(s_t, a_t))
  • 目标 Q 值:(r_t + \gamma \cdot \max_{a'} Q(s_{t+1}, a'))

其中 (\gamma) 是折扣因子,取值接近 1(比如 0.99)代表网络更看重长期回报。DQN 之所以要引入目标网络,是因为如果只用同一个网络不断更新,Q 值会像猫追自己尾巴一样发散。目标网络每隔 C 步从当前网络同步一次参数,然后用它计算目标 Q 值,相当于给学习过程一个延迟的“标尺”。经验回放池则把每一步转移存成 ((s_t, a_t, r_t, s_{t+1})) 的四元组,训练时随机采样小批量数据,打破数据相关性,提高训练稳定性。

具体到网络结构,输入是状态向量(维数看你怎么拼观测),中间是两层 256 或 128 的全连接层,激活函数用 ReLU,输出是动作空间大小的 Q 值向量。对于三维规划,有时我会在输入层做“分叉处理”:相对目标信息进入一个子网,威胁信息进入另一个子网,到中间层再拼接。这样网络能更独立地提取两类特征,实测比全拼在一起收敛快 15% 左右。

2.3 为什么不用 A* 或 RRT 而用 DRL:一个对照视角

A* 和 RRT 擅长静态已知环境下的几何路径搜索。它们能保证连通性和一定最优性,但地图一变就要全部重算,而且很难处理无人机的动力学约束和运动不确定性。人工势场法对实时威胁反应快,但容易陷入局部极小,在狭窄走廊里会震荡甚至撞墙。深度强化学习走的是另一条路:离线大规模训练、在线一次推理。策略网络是前向传播,微秒级出动作,天然支持周期性决策,这正是无人机航路规划在动态环境中需要的实时性。

还要澄清一点:不是选了 DRL 就完全抛弃经典方法。我常用 A* 生成专家轨迹,再用行为克隆做预训练,把专家知识灌进策略网络的初始参数。这样比纯从零开始强化学习少探索很多无效空间,训练稳定性和最终回报都会更好。后面训练脚本里我会给一个可选的行为克隆启动逻辑,这正是很多人忽略的“起点优势”。

3. 从零搭一套 DQN 无人机航路规划:三维环境建模与训练脚本

3.1 先造一个能练的仿真环境:威胁区、禁飞区、目标点

做深度强化学习航路规划,环境是第一优先级的代码,不是训练脚本。环境模拟器要干三件事:提供状态观测、执行动作、裁决碰撞或任务成败。我一般用 Python + Gymnasium 接口自定义环境,内部用 NumPy 做几何计算,然后接一个小的可视化和数据记录模块。构建环境的第一步是定义空间边界和威胁分布。假设任务区域是 20 km × 20 km × 2 km,起始点在西南角低空,目标点在东北角,中间随机部署若干个柱状威胁区和一个禁飞区,每个危险区用一个圆柱体近似:中心坐标、半径、高度范围。无人机视为质点,但加上最大航向角速度和高度变化率约束,这比纯质点更接近真实飞机,训练出的航路也不会有急转弯。

下面是一段简化版环境建模代码,只包含核心逻辑。威胁区用列表存,每个元素是[x, y, z_bottom, z_top, radius]。无人机状态用[x, y, z, heading, speed]表示,航向角以正北为 0 度、顺时针为正。

import numpy as np import gymnasium as gym from gymnasium import spaces class UAVPathEnv(gym.Env): def __init__(self, threats, start, goal, max_steps=300): super().__init__() self.threats = threats # 每个威胁: [cx, cy, z_low, z_high, r] self.start = np.array(start, dtype=np.float32) self.goal = np.array(goal, dtype=np.float32) self.max_steps = max_steps self.action_space = spaces.Discrete(9) # 3航向 x 3高度 # 观测:相对目标dx/dy/dz、距离、威胁感知特征、当前航向 obs_dim = 8 self.observation_space = spaces.Box( low=-np.inf, high=np.inf, shape=(obs_dim,), dtype=np.float32 ) def _get_obs(self): rel = self.goal - self.uav_pos[:3] dist_goal = np.linalg.norm(rel) threat_feat = [] for thr in self.threats: dx = self.uav_pos[0] - thr[0] dy = self.uav_pos[1] - thr[1] dz = self.uav_pos[2] - 0.5 * (thr[2] + thr[3]) d_safe = max(np.sqrt(dx*dx + dy*dy + dz*dz) - thr[4], 0.0) threat_feat.append(min(d_safe / 10.0, 1.0)) # 归一化 return np.concatenate([ rel / np.linalg.norm(self.goal - self.start), np.array([dist_goal / 30.0]), np.array(threat_feat[:3]), # 最多取3个最近的威胁特征 np.array([self.uav_pos[3] / 6.28]) ]).astype(np.float32) def step(self, action): # 动作拆成航向变化和高度变化 heading_delta = (action % 3 - 1) * 0.44 # 约25度 alt_delta = (action // 3 - 1) * 20.0 # 高度步进20m self.uav_pos[3] += heading_delta self.uav_pos[2] = np.clip(self.uav_pos[2] + alt_delta, 100.0, 2000.0) self.uav_pos[0] += 100.0 * np.sin(self.uav_pos[3]) self.uav_pos[1] += 100.0 * np.cos(self.uav_pos[3]) reward, done, info = self._compute_reward() return self._get_obs(), reward, done, False, info

这个环境编码有两个关键细节。第一,观测向量里相对目标坐标被起始点到目标点距离归一化,让网络在不同地图间更容易泛化。第二,威胁感知特征只取最多 3 个最近威胁的归一化距离,避免威胁数量变化导致输入维度不固定。step里的动作拆分是把 9 拆成 3×3:前 3 个是航向变化,后 3 个是高度变化,这样网络可以独立学习转向和升降。步长 100 m 对应每步约 0.4 秒的飞行时长,300 步上限能覆盖约 30 km 航程,足够跨过任务区。

3.2 奖励函数设计:距离引导、危险惩罚、时间成本

航路规划的奖励设计是决定成败的部分。如果只给“到达目标 +1,撞上威胁 -1”,在 20 km 方图里等于让无人机随机碰运气,几百万步都未必能收敛,这是典型的稀疏奖励困境。我常用的做法是“稠密距离奖励 + 威胁碰撞惩罚 + 航时成本”的组合。距离奖励部分用“当前点到目标的距离差”驱动:每走一步,如果比上一步更接近目标,就给正奖励;距离变远就罚。这本质上是势能整形,不改变最优策略,却能让网络立刻知道哪些动作有效。

威胁碰撞惩罚要小心。如果罚得太重,网络会学出“原地不动”的最优解,因为什么都不做也比被罚强。所以我会对进入威胁探测半径但未碰撞的情况给一个较小的警告负奖励,真正碰撞才给大惩罚,然后终止本回合。这样网络有机会观察到“靠近危险区会逐渐收到负面反馈”,通过梯度学会提前避让。高度变化也会消耗能量和时间,我加了每步固定的微小负奖励,相当于鼓励无人机走短航路。经过调参,我常用的权重是:接近目标加分 5.0 ×(上一步距离差)、警告奖励 -0.05、碰撞 -10.0、每步 -0.01。注意这几个权重照抄时不一定会出效果,因为你的地图尺度、步长都和我的不同,建议先用小地图跑通再放大。

3.3 DQN 训练主循环:经验回放、目标网络与 ε-greedy 衰减

环境就绪后,核心训练脚本如下。我用 PyTorch 实现一个标准 DQN,包含两个结构相同的网络:policy_net负责选动作和更新梯度,target_net负责计算目标 Q 值。训练主循环里每步先用 ε-greedy 策略选动作,存储经验到回放缓冲区,然后每 4 步做一次梯度下降。ε 从 1.0 开始,这表示初始阶段完全随机探索,随着训练线性下降到 0.05,之后再保持 5% 的探索率,防止策略固化错过更好的路径。GAMMA取 0.99,让网络把终点的成功信号传递到几十步之前。

import torch import torch.nn as nn import torch.optim as optim import random from collections import deque class Net(nn.Module): def __init__(self, obs_dim, n_actions): super().__init__() self.fc1 = nn.Linear(obs_dim, 256) self.fc2 = nn.Linear(256, 256) self.out = nn.Linear(256, n_actions) def forward(self, x): x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) return self.out(x) def train_dqn(env, episodes=5000, batch_size=64, gamma=0.99, lr=1e-4): obs_dim = env.observation_space.shape[0] n_actions = env.action_space.n policy_net, target_net = Net(obs_dim, n_actions), Net(obs_dim, n_actions) target_net.load_state_dict(policy_net.state_dict()) optimizer = optim.Adam(policy_net.parameters(), lr=lr) memory = deque(maxlen=100000) epsilon = 1.0 epsilon_min = 0.05 decay_steps = 20000 for episode in range(episodes): obs, _ = env.reset() obs = torch.tensor(obs, dtype=torch.float32).unsqueeze(0) total_reward = 0 for t in range(env.max_steps): # 探索或利用 if random.random() < epsilon: action = env.action_space.sample() else: with torch.no_grad(): q_vals = policy_net(obs) action = q_vals.argmax(dim=1).item() # 线性衰减 epsilon if epsilon > epsilon_min: epsilon = max(epsilon_min, epsilon - (1.0 - epsilon_min) / decay_steps) next_obs, reward, done, _, _ = env.step(action) next_obs_t = torch.tensor(next_obs, dtype=torch.float32).unsqueeze(0) memory.append((obs, action, reward, next_obs_t, done)) obs = next_obs_t total_reward += reward if len(memory) < batch_size: continue # 每4步训练一次 if t % 4 == 0: batch = random.sample(memory, batch_size) s_batch, a_batch, r_batch, s_next_batch, d_batch = zip(*batch) s_batch = torch.cat(s_batch) a_batch = torch.tensor(list(a_batch)).unsqueeze(1) r_batch = torch.tensor(list(r_batch), dtype=torch.float32) s_next_batch = torch.cat(s_next_batch) d_batch = torch.tensor(list(d_batch), dtype=torch.float32) q_current = policy_net(s_batch).gather(1, a_batch).squeeze() with torch.no_grad(): q_next = target_net(s_next_batch).max(dim=1).values q_target = r_batch + gamma * q_next * (1 - d_batch) loss = nn.MSELoss()(q_current, q_target) optimizer.zero_grad() loss.backward() optimizer.step() # 每100步同步目标网络 if episode % 100 == 0: target_net.load_state_dict(policy_net.state_dict()) return policy_net

几个关键参数说明。batch_size=64是稳定性和显存开销的折中,偏小会梯度噪声大,偏大容易过拟合到近期经验。lr=1e-4是 DQN 常用值,比分类任务常用的 1e-3 低一个量级,因为 Q 值回归对学习率敏感,太高会让目标 Q 值和当前 Q 值互相追逐震荡。memory=100000意味着经验池足够大,能覆盖多种起始相位和威胁分布,如果内存有限,可以降到 50000,但随机采样的多样性会变差。目标网络同步的 100 episode 间隔,在快速任务中可能稍显粗糙,如果你发现训练曲线出现周期性掉点,可以改到 25 episode。

训练结束后保存权重,推理阶段把 ε 置为 0,加载网络直接前向传播选动作,输出航点序列保存为 CSV。一个额外提示:在训练脚本里顺手把每 episode 的总奖励、碰撞次数、到达率记录到 numpy 数组,最后画图检查收敛情况。别只在终端里看跑了几行,不画图很难发现 Q 值发散的隐性故障。

3.4 必调参数清单:这些值直接决定训练能不能收敛

下面这张表是训练 DQN 航路规划时我必查的参数,按影响从大到小排列。建议先固定表中前四行,用最小地图跑通,再去调难度更大的随机威胁场景。

参数名推荐初值影响表现踩坑方向
GAMMA(折扣因子)0.99太小则短视,太大则收敛慢超过 0.995 在 300 步任务里 Q 值易发散
学习率 lr1e-4过高 Q 值震荡,过低学不动1e-3 以上基本必炸
探索衰减终点0.05太高策略不够确定性常驻 0.1 的探索会导致路径抖动
每步仿真步长100 m太小轨迹平滑但训练慢超过 300 m 会穿模绕不开小威胁
高度变化步进20 m过小三维能力弱,过大垂直抖动配合威胁高度带宽设置,别超过半径一半
目标网络同步间隔100 episode间隔太大训练不稳短任务可缩短到 25

这些值不是玄学,每一个都对应一个可观测的失败模式。比如 GAMMA 调太高,Q 值会收敛得慢但一旦收敛策略质量较高;但配合 300 步上限,0.995 的 GAMMA 会让远期决策权重过大,训练前期出现大量无意义探索。如果发现训练曲线像心电图一样狂跳,最先检查的应该是学习率和目标网络同步间隔,不是奖励函数。

4. 训练过程避坑:五条踩出来的血泪经验

4.1 一跑就发散:Q 值爆炸成 NaN,先查这三处

现象:训练开始几百步后 loss 变成 nan,或者回报曲线直线崩坏到负数极值。原因几乎总出现在三个地方。第一,奖励值范围没裁剪,比如碰撞惩罚 -10、距离奖励 5.0,两者差值过大形成尖刺,网络权重一步更新过大。第二,学习率太高,1e-3 以上在 Q 值回归任务基本必炸。第三,目标网络同步太频繁,导致本身没收敛的估计跟着一起扰动。

解决:奖励项先做归一化或裁剪,把所有分项控制在 [-1, 1] 附近;学习率直接降到 1e-4;目标网络同步间隔调大到 100 或 200 episode。还有一个隐藏杀手——经验回放池里的转移不是所有都满足同一量纲。如果任务里有多个起止点,不同地图的距离基准不同,奖励分布跨度自然就大,这时一定要做 reward clipping。我习惯用np.clip(reward, -1.0, 1.0),虽然损失了一点分辨率,但换来了稳定收敛。

4.2 二维训练效果不错,换三维直接翻车

现象:在二维平面地图训练好的模型,扩展到带高度威胁区时策略失效,无人机贴着威胁区顶部飞不过去或者绕远路。原因是二维训练时网络根本没接触过 “z” 维度特征,新场景的观测分布完全变了,训练好的 Q 值没有外推能力。解决办法不是“微调”,而是重建三维环境重新从随机初始化训练。这里有个经验:如果三维任务里威胁垂直于水平面的分布比较规则(比如柱状威胁贯穿所有高度),那可以先用二维训练作为行为克隆的教师,而不是直接用强化学习预训练。

4.3 奖励函数部分对了,网络却学到“原地转圈”

现象:训练几千回合后,无人机始终在一个小圈盘旋,不接近目标但也不撞威胁。检查回报会发现每步都有微小的距离奖励,因为无人机在某些位置来回移动可以稳定获得“比上一步更近一点”的正回报,形成一个局部最优陷阱。这是稠密距离奖励的经典副作用。

解决:在奖励函数里加“偏离航线惩罚”:如果无人机偏离起始点到目标点的连线超过某个阈值(比如 3 km),每步扣分加倍。这迫使无人机沿走廊前进,不再绕圈刷距离奖励。另一个思路是对连续 N 步距离总和不会增加的情况直接终止 episode 并扣分,相当于给“原地转圈”加一个明确的探测失败信号。我踩过这个坑后,现在每版奖励函数都会画出“位置热力图 vs 奖励分布”检查有没有局部高奖励坑位,能省好几天的调参时间。

4.4 有目标网络和经验池,但训练到一半策略“失忆”

现象:训练中段策略质量突然下降,然后又慢慢恢复。这是 DQN 的“灾难性遗忘”在强化学习中的变种——经验回放池里老旧经验和新经验的分布差异过大,Q 网络参数被新经验的梯度推进到一个区域,旧经验上计算出的 Q 值全错。尤其在威胁布局中途变化(课程学习)时很典型。

解决:提升经验池大小(从 100000 增至 300000),同时把批量采样改为按时间轴加权:近期经验采样概率高,早期经验采样概率低。更简单的做法是减小每次更新步幅,让网络在参数空间走小碎步,不会一次性被新分布拽走。如果你用课程学习,在每个阶段切换时,先冻结目标网络 50 个 episode,让当前策略适应新环境后再恢复同步。

4.5 换一张地图表现差到离谱:观测泛化不足

现象:训练图里威胁是 3 个,测试图中威胁变成 5 个,策略直接失效。很多人的环境把威胁数量固定为 3,_get_obs()里只拼接了 3 个威胁特征,换图后要么截断要么补零,网络学到的是“威胁数量少”而不是“会躲避威胁”。解决思路是要么把威胁数量在训练时就随机变化,统一取距离最近的前 K 个威胁特征(K 取经验上限,比如 8 个),多余补零;要么不依赖固定维度的威胁特征,改为按距离排序取最近 3 个,超过 3 个时自然舍弃。后者更省算力,但会丢失背后漏掉的威胁信息。另一种做法是把地图栅格化后作为图像输入到卷积层,让网络自己提取威胁分布特征——这会显著增加网络复杂度和训练时长,不是毕设首选。

5. 验证与进阶:让训练好的策略真正可评估、可改进、可交付

5.1 用蒙特卡洛统计评估航路质量,别拿单个 episode 说话

训练完成后,评估不能只看一个 episode 的航路图。我通常固定随机种子生成 20 个不同威胁布局的测试场景,用训练好的策略网络跑 20 轮,统计四个指标:平均航路长度、碰撞次数、到达率、平均飞行时间。这四个指标联合起来才能说明问题的——只有到达率高但航路长度远,说明策略会绕远路;航路短但碰撞率高,说明网络在用冒险换长度。表格里记录每次评估结果,作为一个基线版本号,后续调参才能用数据说话。

5.2 和传统算法做对照实验:给答辩和评审一个明确结论

DRL 航路规划好不好,对照实验是评审最关注的。我一般会让 A* 算法(用三维栅格建图,考虑禁飞区和威胁代价)在同一组测试地图上规划,记录相同两项指标:路径长度和计算延迟。常见结论会有两种走向。第一种,DRL 路径比 A* 长 10%-15%,但推理速度快几个数量级;第二种,在动态威胁场景中 A* 每次重规划需要几百毫秒,而 DRL 每步决策是微秒级,总耗时优势明显。把这个结论用表格呈现,比你写一万字“本文提出”更有说服力。如果你用的是 RRT*,可以补一个成功率对比:RRT* 在窄走廊场景会因为采样随机性导致规划失败率高,DRL 不存在这个问题。

5.3 从 DQN 到更好算法:Dueling DQN 与优先级回放

基线跑通后,往上加一个 Dueling DQN 能稳定提升最终航路质量。Dueling 网络把 Q 值拆成状态价值 V(s) 和优势函数 A(s, a),航路规划任务里大部分状态(空旷区域)的价值差异来自整体位置,而不是具体动作选择。这种拆分让网络在空旷区域也能学到有意义的价值,动作选择更平稳。另一个高性价比改进是优先经验回放(PER),对碰撞和接近成功的转移分配更高采样权重——这类经验恰恰是航路规划里最有学习价值的。这两个改进实现起来各增加 30-50 行代码,训练时间几乎不变,但通常在到达率上提升 5-10 个百分点,值得一做。

5.4 行为克隆预训练:让强化学习不从头摸索

我之前提到行为克隆预训练,这里展开说一个简单做法。用 A* 生成几千条从随机起始点到目标点的最优路径,把每步的“状态 → 最优动作”作为监督样本,先对策略网络做几步分类训练,再转换到强化学习。这相当于让 A* 当了一回“老师”,把先验知识写进网络初始权重。整个附加训练只要 1-2 分钟,但能把强化学习的有效探索起点提前很多,初期回报曲线直接高出一个身位。需要注意的是,行为克隆预训练后的网络要保留一定随机性(不把输出 logits 硬编码成 one-hot),否则后续强化学习阶段容易陷入教师路径的惯性,学不会动态避障。我踩过一次这个坑,最后在预训练阶段给交叉熵损失加了一个噪声扰动才解决。

5.5 一张能放进论文的评估表格模板

场景编号威胁数航路长度(km)碰撞次数到达率推理耗时(ms/步)
TG-01327.30100%0.42
TG-02530.1095%0.43
TG-03732.8190%0.44

每增加一个威胁数,到达率略有下降是正常现象,这说明策略的泛化边界在哪。作为参考,你用 A* 在同样的 TG-03 场景里,单次重规划耗时通常超过 3 秒,这就是 DRL 方法的性价比体现在哪。表格数据画成折线图放在论文里,既直观又能体现工作量。

5.6 我自己的交付习惯

因为做过几次毕设指导,我养成了一个固定习惯:训练结束后把策略网络、航路输出 CSV、评估报告放到同一个目录,并在 README 里写清楚地图参数和训练超参。这个目录结构当作一个成品包交付,导师或评委可以随时拿着跑一个 episode 看航路效果。有一次答辩前答辩老师临时要求看“换个起点能不能飞”,我直接改了参数重新跑了几轮测试,因为策略网络在训练时已经见过大量随机起点,换点不用重训,现场演示非常顺利。这也是基于深度强化学习的无人机航路规划方法研究这个方向真正值钱的地方——训练一次,之后每次部署都是前向推理,几毫秒出航路点。希望这篇笔记能帮你把 DQN 航路规划的坑提前避开,少走几周弯路。

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

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

算法竞赛中的排列组合问题解析与实现

1. 题目背景与需求分析"周年纪念晚会"这道题目出自《信息学奥赛一本通》第1582页&#xff0c;是一道典型的算法竞赛题目。这类题目通常考察选手对数学建模和算法设计的综合能力。题目核心需求可以理解为&#xff1a;给定若干约束条件&#xff0c;设计一个算法来计算满…

作者头像 李华
网站建设 2026/10/29 16:37:55

n8n与Affinity节点:客户关系管理自动化实战

1. 认识n8n与Affinity节点第一次接触n8n是在去年自动化一个客户关系管理系统时。当时需要将销售线索从邮件自动同步到CRM&#xff0c;传统方案要么需要写大量胶水代码&#xff0c;要么得购买昂贵的SaaS服务。n8n这个开源工作流工具完美解决了这个问题——特别是它的Affinity节点…

作者头像 李华
网站建设 2026/10/29 16:36:49

军工卫星视频传输的WebUploader改造与优化实践

1. 军工行业卫星视频传输的特殊挑战 在军工行业的卫星视频传输场景中&#xff0c;我们面临着几个独特的技术挑战。首先是文件体积问题&#xff0c;一颗高分辨率侦察卫星在6小时工作周期内产生的视频数据量可能达到200GB以上。其次是网络环境的不稳定性&#xff0c;卫星与地面站…

作者头像 李华
网站建设 2026/10/29 16:36:32

Deep Geometric Prior:深度学习在曲面重建中的革新应用

1. 项目概述&#xff1a;Deep Geometric Prior 如何革新曲面重建 曲面重建是计算机图形学和计算机视觉领域的经典难题&#xff0c;简单来说就是从离散的点云数据中恢复出光滑连续的曲面模型。传统方法通常依赖手工设计的能量函数或正则化项&#xff0c;而这篇论文提出的Deep Ge…

作者头像 李华
网站建设 2026/10/29 16:36:32

企业生成式AI应用:核心技术、挑战与优化方案

1. 企业生成式AI的现状与核心挑战 2025年的企业生成式AI领域正经历着从技术探索到规模化落地的关键转折点。作为一名深度参与多个行业AI落地的技术顾问&#xff0c;我观察到当前企业应用呈现三个鲜明特征&#xff1a;头部企业开始建立专属模型工厂、中型企业聚焦垂直场景的微调…

作者头像 李华
网站建设 2026/10/29 16:35:16

风云三国2.4问鼎天下修改指南:作弊、配置表与存档备份

风云三国2.4问鼎天下这版包&#xff0c;我从年初玩到现在&#xff0c;前后废掉过三个存档。第一个是征兵太慢熬不住&#xff0c;第二个是中期被三家同时宣战打到只剩一座城&#xff0c;第三个纯粹是自己作死——在存档里硬塞了一批校验对不上的东西&#xff0c;进游戏一点开部队…

作者头像 李华