基于深度强化学习的无人机TSP路径规划:从建模到实战部署
发布时间:2026/10/20 10:03:47 锦皓数字建站

我最早做这个课题是因为手里接了一个无人机配送的仿真验证任务一架四旋翼要在尽量短的时间内访问完若干个任务点最后回到起降点。乍一看就是经典的旅行商问题TSP但把“车”换成“无人机”问题性质马上变了。后来我基于深度强化学习做了一套求解方案用在高层的任务点排序、低层的航迹控制上既覆盖了毕业设计需要的完整实验链路也满足了某企业项目对实时性和可部署性的要求。这篇博文就把这套实战方案完整拆一遍从问题建模、算法选型、训练稳定性到指标设计、交付差异给正在做毕设选题或者准备把强化学习落到无人机路径规划上的朋友一个可以直接参考的技术路线。1. 无人机TSP的问题重构为什么书本上的模型不够用1.1 经典TSP与无人机TSP的差异经典TSP的定义非常简单给定若干城市的坐标找一条经过所有城市且只经过一次的最短闭合回路。计算机科学里研究的是组合优化性质图论里讨论的是NP难度。但当执行者从抽象的点变成一架真实无人机时最短路径不再是唯一目标准确说是“最短”这个目标本身都需要重新定义。无人机的能耗并不严格正比于距离旋翼在悬停、匀速巡航、转弯、爬升时的功率消耗差异很大。风向、风速、电池容量限制、禁飞区、建筑物遮挡这些问题都会让两个节点之间的“代价”变成方向相关、时间相关的量。更关键的是无人机存在最小转弯半径很多在几何上最短的折线路径实际飞行时根本走不出来。所以在无人机TSP里用户给的不是一张带权完全图而是一个带物理约束的连续状态空间。我在实际建模时会把经典TSP里的“城市”扩展成带属性的任务点坐标、耗时、优先级、时间窗、电量消耗预估。把“路”扩展成一条满足动力学约束的可行航迹而不是一条直线。这样问题就从单纯的“排序问题”变成“排序轨迹规划”的耦合优化问题。这是无人机TSP和课本TSP最大的区别也是整个算法设计的起点。1.2 深度强化学习在这里有什么不可替代的价值传统解法大致分成三类精确算法、元启发式算法和近似算法。精确算法能拿到最优解但规模超过二三十个节点时计算时间会迅速失控遗传算法、蚁群算法这些元启发式能处理中等规模但它们每一次求解都是独立的优化过程遇到新的任务点分布需要重新跑一遍迭代实时性很难保证。深度强化学习解决的是“离线训练在线推理”的问题。网络通过大量随机实例学出一种从环境状态到动作的映射规则训练结束以后给它一组新的任务点坐标它可以在几十毫秒内输出一个排序结果不需要重新搜索。这种特性非常契合无人机实时任务任务点可能临时增加环境可能动态变化不可能每次都花几十秒重新计算全局路径。另一个优势是深度强化学习方便融入传感器信息。视觉图像、雷达点云、GPS坐标这些东西本质上都能通过神经网络编码成状态特征。只要训练环境做得足够真实学出来的策略可以直接感知障碍物和威胁区域这是传统组合优化工具很难做到的。当然DRL也会带来训练不稳定、泛化性能难保证的问题但这些可以通过后续方案设计来控制。2. 整体方案设计状态、动作、奖励这三件事定成败2.1 状态空间该怎么设计很多第一次做这个课题的人上来就把所有信息一股脑塞给网络想着“网络自己会学”。实际上状态空间设计得不好训练过程会非常痛苦。我习惯把状态分成三组任务点状态、无人机状态、环境状态。任务点状态包括每个节点的坐标、访问状态、剩余需求、优先级和时间窗无人机状态包括当前位置、剩余电量、当前速度、航向环境状态包括障碍物位置、威胁区域、风场等信息。这里最容易被忽略的是“访问状态”的表达。如果直接用布尔值记录“访问过/没访问过”网络很难区分出“已经访问过”这个信息因为它本质上是顺序相关的。推荐的做法是用一个mask向量在动作输出时直接把已访问节点对应的概率设为负无穷从机制上禁止重复访问。另一个设计细节是坐标系的选择。绝对坐标会导致模型难以泛化到不同尺度的任务区域。我通常会把所有坐标减去当前无人机位置再用整个任务区域的最大边长做归一化让网络看到的是相对坐标。这个改动看起来简单但对泛化性能的提升非常明显特别是在从50个节点的训练环境迁移到100个节点的测试环境时。2.2 动作空间直接用连续控制还是输出节点选择动作空间是另一个决定训练难度的分岔口。如果你的目标是解一个TSP排序问题最自然的做法是让网络输出一个“下一访问节点”的离散动作也就是在未访问节点集合上做一个分类。这种情况下可以用带mask的softmax输出概率配合指针网络或者注意力模型来构造策略网络。如果你的场景还需要无人机同时决定具体的航迹比如绕开障碍物、考虑转弯半径那么就需要连续动作空间直接输出期望航向角、速度或者下一时刻的参考位置。连续动作空间适合用PPO、TD3这类连续控制算法但训练难度明显更高因为动作空间是无限大的一个微小的动作偏差都可能导致碰撞或电量耗尽。在实际项目中我不建议把所有决策都压在一个网络里。更可靠的做法是两段式高层决策网络负责从所有未访问任务点中选一个作为当前目标输出离散动作低层控制网络或传统控制器负责生成从当前位置到目标点的可行航迹输出连续量。打个比方高层策略像外卖员决定下一单去哪个客户家低层控制像骑车时怎么避开路人。两个问题解耦后每个网络的任务都更单纯训练难度会低很多。2.3 奖励函数最容易踩坑的地方奖励函数是整个强化学习方案里最容易被低估的部分它直接决定了策略最终会学出什么畸形行为。一开始我做尝试时用的奖励很简单每访问一个新任务点给10完成任务再给50总航程每增加一米给-0.1。结果策略很快学会了一种奇特的行为无人机在两个相邻任务点之间来回小幅度绕圈反复蹭“访问新节点”的奖励或者故意绕远路拖延时间只因为总惩罚远小于新节点奖励。后来我把奖励重新拆开设计只有第一次访问节点才给正奖励重复访问完全不给分路径代价用归一化后的长度惩罚而不是绝对长度再加上一个能量惩罚项如果剩余电量过低就施加一个较大负值并重置该回合。对于有时间窗的任务还会加入“早到等待惩罚”和“迟到惩罚”。这些项不是越多越好每个项都要配一个合适的权重权重设置需要在小规模随机实例上做一轮敏感性实验。重要的一点是奖励尺度不能太大也不能太小。如果每个节点的奖励都是100路径惩罚是0.01那策略根本不在乎路径长短只会疯狂追求访问节点数反过来如果路径惩罚大到路径长度稍微变化就压过访问奖励策略会选择干脆停在原地不动因为多走一步都是亏。我一般会把单回合总奖励控制在正负10这个量级这样网络的学习信号不会过强或过弱。3. 核心算法选型与网络结构3.1 组合优化层为什么优先考虑注意力机制类模型经典TSP这类排列问题输出是一个变长的节点序列。通用的卷积网络或全连接网络很难处理这种“输出元素数量不固定”的任务。早期有人用循环神经网络来逐个输出节点但效果一般长序列信息容易丢失。现在的主流思路是用注意力机制把任务节点通过Encoder编码成一堆特征向量然后Decoder逐个生成下一个节点。注意力模型有一个很大的优势它对输入节点数量不敏感。训练的时候用50个节点测试时换成120个节点只要位置编码设计得好网络仍然能输出合理的排序结果。我用的选点策略网络就是这个思路Encoder部分把每个任务点映射成特征表示加上当前无人机位置和剩余电量信息Decoder部分根据已访问集合结合mask机制输出所有未访问节点的概率分布每次采样一个节点作为下一目标。训练这个选点策略时我建议用带baseline的策略梯度方法。具体来说用同一个网络在同一个输入实例上做两次采样一次作为当前策略轨迹一次作为基线轨迹用两条轨迹的奖励差异作为优势估计。这样比直接使用一个固定Baseline的方差要小得多收敛也更快。这个思路来源于经典强化学习里的REINFORCE with baseline但在注意力模型上更容易训练。3.2 低层控制层PPO、TD3还是经典控制无人机从当前点到目标点的飞行控制可以简单建模成二维平面上的运动也可以直接建出完整的六自由度模型。我实际实验时先用一个简单的质点模型验证整体逻辑再用带惯性环节和传感器噪声的模型做联合微调。低层控制网络的算法选择上PPO是最省心的它对超参数的敏感性相对较低熵正则项能防止策略过早固化。如果场景中障碍物密集、需要非常精细的连续动作TD3这类带确定性策略的算法往往效果更好但TD3对参数初始化、经验回放比例、探索噪声都比较敏感需要更多调试时间。DDPG我后来基本不推荐用于无人机近距离机动因为它经常会出现Q值过估计导致训练过程中性能突然掉下去。这里要说一句低层控制不一定非要用神经网络。如果任务是常规的室内或园区环境没有太多动态障碍传统控制加路径跟踪就完全够用。让强化学习去学那些本来就能用传统控制解决的问题只会增加训练难度。只有环境存在较强的随机性和不确定性时低层控制网络才真正有价值。所以我在方案里的建议是“先经典控制后端到端强化”这是一个工程风险最低的路线。3.3 两阶段训练的联合微调策略很多人以为端到端训练就是“一个网络从输入图像输出航迹奖励函数统一调”这是最大的误解。端到端的梯度要穿越高频率控制层梯度方差极大训练曲线经常是灾难性的波动。我采用的策略是分阶段训练先把高层选点策略冻住只更新低层控制策略让它学会在给定的目标点序列下稳定飞行然后把低层控制策略冻住只更新高层选点策略让它基于一条理想的直线航线代价来学习排序。两个子策略各自收敛后再解冻所有参数做联合微调。这时高层的奖励不再来自理想化直线代价而是来自低层控制策略真实执行后的能耗和路程。联合微调的作用是让高层排序“理解”低层飞行的真实代价比如某些节点虽然直线距离近但转弯和避障消耗很大高层就会学会避开这些组合。联合微调阶段的学习率要比预训练阶段低通常降到原来的三分之一到五分之一训练步数也不用太长让两个模块微调对齐即可。4. 实战环境搭建与训练细节4.1 仿真环境的分级选择如果一上来就打开物理引擎、加载真实地图、开启气象扰动大概率会陷入“不知道问题出在算法还是环境”的困境。我强烈建议把仿真环境分成三级第一级是纯二维网格世界任务点随机生成无人机假设能沿直线飞行用来验证选点策略的正确性第二级加入简单多边形障碍物和电量约束允许使用低层控制策略或经典路径规划用来验证整体路径的可行性第三级才进入高保真仿真加入转弯速率限制、风场扰动、传感器噪声用来评估真实部署可行性。每一级环境都要保留独立的接口方便用同一套算法代码做对比。我见到的失败案例大多是跳级太快比如直接上高保真仿真训练一个晚上连基础的任务完成率都上不去最后发现是传感器噪声过大而不是算法本身有问题。调试问题要先排除环境问题再排除奖励问题最后才动网络结构。这是很重要的排查顺序。在实践中环境里还要加入“随机任务生成器”每次reset时随机生成新任务点、随机设置无人机起始位置和电量。如果训练集永远只有那几张固定地图模型学出来的可能是地图记忆而不是通用策略。任务生成的随机性要和后续测试规模的分布保持一致训练时可以比测试规模略小但类型不能差太远。4.2 训练稳定性我踩过的大坑与解法训练不收敛是深度强化学习项目里最常见的情况无人机TSP尤其如此。我踩过的第一个坑是奖励尺度不统一。路径长度惩罚上千访问奖励只有几十网络直接放弃行动。我后来把所有奖励项做了min-max归一化让单回合总奖励控制在正负10附近。第二个坑是经验回放的时间相关性。PPO这类on-policy算法不应该使用经验回放每次更新必须用当前策略采样的数据而DQN类算法才需要经验回放。我曾经用类似做法把历史episode塞给PPO更新结果策略评估严重偏置训练曲线看起来很好但实际执行效果很差。原因是过时的数据不能代表当前策略的分布训练方差会暴涨。第三个坑是熵正则参数的设置。熵系数太大策略永远在随机探索学不出有效路径太小的策略很快就坍缩成总去最近节点丧失了全局优化能力。我一般从0.01开始如果发现策略过早确定每500轮降低一半直到性能稳定。学习率方面配合warmup预热和线性衰减可以有效避免前期梯度爆炸。4.3 训练流程参考伪代码下面给出一个实战训练流程的伪代码展示高层选点策略训练的核心循环。我这里不依赖具体深度学习框架只体现逻辑结构。# 高层选点策略训练循环伪代码 for episode in range(max_episodes): state env.reset() done False log_probs [] rewards [] visited [] while not done: mask build_mask(current_node, visited) action, log_prob policy_network(state, mask) next_state, reward, done env.step(action) log_probs.append(log_prob) rewards.append(reward) state next_state baseline_rewards rollout_with_critic(state, env) discounted_rewards discount(rewards, gamma0.99) advantage discounted_rewards - baseline_rewards loss -sum(log_probs * advantage) entropy_penalty(0.01) optimizer_step(loss)这个循环看起来简单但关键点都在细节里mask必须在采样之前就屏蔽已访问节点advantage需要从真实轨迹中计算不能直接用最终奖励熵惩罚要加到损失函数里而不是额外手动给reward。每一步的reward最好在环境中同时返回方便用可视化工具实时检查。4.4 超参数参考表下面这张表是我在实际训练中反复调试后得到的一组可行参数不同场景需要微调但可以当作起点。参数高层选点策略低层控制策略算法类型注意力模型 策略梯度PPO学习率1e-4warmup后线性衰减3e-4clip后衰减Batch Size64256熵系数0.010.01GAE Lambda-0.95Clip范围-0.2训练任务点数范围20~8020~120单回合最大步数200200这个表不是万能药但如果你的训练一直震荡可以从学习率和熵系数开始调通常比改动网络结构更快见效。5. 实验结果分析与核心指标5.1 评估指标别只看路径长度很多初学者只盯着“平均路径长度”一个指标这是不够的。在无人机场景里“总能耗”往往比“路径长度”更能说明问题。我实际评估时会同时看四类指标总能耗、单实例求解耗时、任务完成率和泛化性能。总能耗需要结合无人机的功率模型来计算不同速度、不同转向下功率不同不能简单用距离换算。求解耗时是实时性指标在高保真仿真里如果单实例需要几秒钟才能决策一次那任务点一多就完全跑不过来。任务完成率指的是在电量约束和障碍约束下能够成功访问所有任务点的回合比例。泛化性能则看模型从训练规模迁移到更大规模时路径长度恶化了多少。这些指标不能只看平均值还要看方差。我在实验中发现遗传算法平均路径长度不错但最差情况非常离谱有时会因为坏种子生成一个很差的结果深度强化学习模型的方差通常更小稳定性更好。要在论文或项目报告里同时公布均值和标准差才是一个有说服力的对比。5.2 对比基线的选择原则对比基线设置不公平是答辩和项目评审中最容易被攻击的点。正确的基线应该是小规模问题用精确算法求最优解用来回答“离最优解有多远”中等规模用成熟元启发式算法比如遗传算法、蚁群算法用来回答“跟传统优化比是否有优势”大规模用简单启发式比如最近邻算法用来回答“是不是至少比朴素策略好”。我见过一个反面案例只跟随机策略做对比DRL模型当然赢得毫无悬念但没有任何说服力。也见过另一个反面案例拿DRL和一个专为静态TSP调参到极致的元启发式算法对比然后说DRL更差这同样不公平因为DRL的优势在实时性和动态环境而不是在静态离线场景下追求最优。合理做法是这样在静态50节点实例上DRL和传统元启发式打平或略差但在动态场景中任务点突然变化传统元启发式需要重新计算DRL可以直接复用已学策略在几十毫秒内输出新方案这是传统方法的几十倍速度提升。把这两种场景放在一张对比表里才能体现出深度强化学习的真实价值。5.3 一组典型观察结果为了直观展示实验结果形态我列一组来自我方验证环境下的典型观察数据不同环境差异会很大但可以作为量级参考。50节点随机实例最近邻算法平均路径长度约为基准值的118%求解耗时约0.02秒。经典元启发式算法平均路径长度约为基准值的97%但单实例求解耗时平均约8秒且方差大。训练后的注意力选点策略平均路径长度约为基准值的98%单批次推理100个实例总耗时约0.2秒平均单实例耗时才2毫秒。加入动态障碍和电量约束后低层控制策略的任务完成率达到85%比不带控制层的直线规划高了近20个百分点。这组数据说明两件事第一DRL模型在静态问题上有能力逼近传统优化算法第二在实时决策和高维约束场景下DRL的速度优势非常明显。这正好呼应“毕设/企业双适配”的主题毕设里用静态实例证明模型有效性企业场景里用动态实例证明实时性和鲁棒性。6. 毕设与企业场景的差异化适配6.1 毕业设计的核心理论闭环与消融实验毕设评审最看重的是“你理解这个问题并且亲手验证了每个设计选择”。所以不能只做“训练了一个模型效果还不错”这种级别的工作。我在给A同学指导时建议把课题拆成四个递进的部分问题定义与建模、算法设计与实现、实验对比与分析、消融实验与讨论。消融实验非常加分。比如通过“去掉mask机制”“去掉baseline”“把相对坐标改成绝对坐标”这几个控制变量来说明每一个设计组件的具体贡献。这会让答辩评委看到你不是在调参而是在做系统性的工程验证。另外毕设论文里要写清楚公式推导过程尤其是策略梯度目标函数、注意力机制的注意力权重计算这些是评审老师最容易展开追问的地方。还有一个容易被忽略的点实验数据要可复现。建议把每个随机种子下的实验记录都保留好答辩前重新跑一遍关键实验确保曲线能稳定复现。如果只是临时跑了一组漂亮的曲线答辩现场一问细节就露馅。扎实的数据管理能力本身就是毕设评分的重要加分项。6.2 企业项目的核心接口、异常处理和混合架构企业场景对“创新性”的容忍度很低最关心的是模块能不能稳定嵌入到已有业务流程里。所以DRL模型不能只是一个孤立的Python脚本而要封装成有明确输入输出的服务接口。输入是任务点坐标数组、无人机当前位置、剩余电量、障碍物列表输出是目标点序列和参考航迹。接口协议尽量统一方便调度系统调用。异常处理是企业项目中绕不开的一环。电量不足时模型要能主动触发返航机制而不是硬着头皮继续访问下一个任务点当某个任务点临时被取消或新增模型要能在不重新训练的情况下自动调整排序如果模型因为某个极端输入输出不合法动作系统需要有规则层拦截并切换回保守策略。我建议采用混合架构DRL模型作为在线推荐器输出排序建议规则系统和传统求解器作为兜底。如果DRL输出结果在质量阈值以内就采纳如果输出结果超时、置信度低或者被规则校验拒绝就回退到启发式方案。这种架构能大幅降低上线风险也是企业项目更容易通过验收的形式。6.3 时间规划建议书下面是一个可以参考的思路假设毕设周期为八周企业项目在此基础上再增加两周阶段天数核心任务需求与建模第1~7天阅读相关文献确定状态空间、动作空间和奖励函数小规模环境搭建第8~14天实现二维简化环境训练第一个可工作的选点策略低层控制训练第15~21天建立带障碍和电量约束的环境训练低层控制策略联合微调第22~28天解冻两个模块做联合微调记录训练曲线基线对比实验第29~35天跑精确算法、元启发式算法、DRL对比实验消融实验第36~42天去掉关键模块做消融实验并分析原因论文或文档整理第43~49天整理图表撰写论文或项目文档答辩或部署验收第50~56天准备答辩材料/完成接口联调与异常测试如果做企业项目我会在第15天前就把接口定义清楚避免后期返工。实际交付时还要准备一份“模型局限说明”明确告诉使用方哪些场景下模型不适用这比承诺“万能”更能赢得信任。7. 常见问题与排查心得7.1 训练不收敛怎么办训练曲线长期不下降先不要动网络结构按以下顺序排查检查奖励尺度是不是跨度过大检查动作概率熵是不是还没下降说明模型没在有效学习检查mask是不是写对了如果已访问节点的概率没有被屏蔽策略会卡在重复访问的循环里最后检查baseline是否有效。这个顺序一半的case都能解决。如果训练过程中loss出现明显尖峰大概率是某一步更新时advantage计算出了极大值。可以从梯度裁剪入手把gradient clip设成0.5或1.0这在PPO和注意力模型上都很有效。还有一个小技巧先固定一个简单的实例做训练看模型能不能完全记住并过拟合。如果连固定实例都学不会说明网络容量或训练流程有问题如果能过拟合再换随机实例集往往就通了。7.2 策略出现“刷分”行为reward hacking在无人机任务里非常常见。我遇到过的最典型情况是模型会把线路规划成在几个点之间打转为了反复获得“到达新节点”的奖励。排查时把每个episode的“访问节点数”和“总航程”画在散点图里如果访问节点数持续增加而总航程也异常膨胀基本可以确定是奖励设计有问题。解决的思路是增加“第一次访问才有效”的硬性判定并在奖励函数里加入一个“绕路惩罚项”比如对无人机飞行轨迹的总转角做惩罚。这样策略即使想绕圈也要付出代价。还要注意奖励函数的各个分量之间不要存在“对冲”比如节点奖励远大于路径惩罚就会诱导绕路。权重设置好后在小规模数据集上跑几十个episode人工检查几条轨迹的可视化基本能快速发现奖励漏洞。7.3 泛化性差换个规模就崩模型在50节点上表现很好拿到100节点就完全失效这是初学者最容易遇到的瓶颈。原因往往是状态表示里包含了绝对坐标或者训练时节点数范围太窄。解决方案分两步第一使用相对坐标数据集归一化第二训练时把节点数做成随机分布例如从50到120之间均匀采样。这样模型见过不同规模的任务才能学到与规模无关的排序规律。另一个重要技巧是解码时使用“贪心搜索”和“采样”的混合策略。训练时用采样提高探索评估时可以用贪心搜索或者beam search能明显提升稳定性和路径质量。不少人只在训练时用采样评估时也随机采样结果每次跑出来的路径质量差别巨大给人一种模型不稳定的错觉。实际上调低评估阶段温度参数让动作概率分布更尖锐泛化性能通常不会太差。7.4 训练时间过长资源有限深度强化学习很吃计算资源。如果只有一块普通显卡建议先降低环境复杂度把视觉输入去掉只用数值坐标做状态能大幅减少训练时间。另外用混合精度训练能把显存占用降低近一半训练速度也有提升。若还是太慢可以先训练一个更小的网络配置等验证整体流程可用后再恢复到完整配置。还有一个更取巧的做法把训练和验证并行化。训练过程中每隔固定步数就在一个固定验证集上跑一次评估一旦验证指标连续多次没有提升就提前停止训练。这个机制可以节省大量不必要的训练时间也算一种有效的早停策略。在多次踩过坑之后我最大的体会是深度强化学习项目成败的关键不在算法多炫而在于你愿不愿意把状态、动作、奖励这三件基础工作做到足够细致。只要先让低层控制策略飞得稳、高层选点策略看得准再去做联合微调绝大多数问题都会变得可控。如果你现在正卡在训练不收敛或者指标对不上先别急着换网络结构回去重新审视状态表示和奖励配比大概率能找到突破口。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。