首页 / 资讯中心 / 文章详情

双无人机NOMA去中心化Q-Learning路径优化:从原理到Matlab实现

双无人机NOMA去中心化Q-Learning路径优化:从原理到Matlab实现 ★ FEATURED ARTICLE
1. 项目拆解与核心方案选型先说结论这个项目本质上做的是“让无人机学会自己找路”这件事只不过加了两层约束——第一层是通信约束双无人机之间用的是NOMA非正交多址接入来共享频谱资源第二层是控制架构约束两架无人机各自独立决策、不依赖中心节点。把这两层约束同时放进一个强化学习框架里就构成了这个标题的全部核心内容。先说清楚这个系统到底解决了什么问题。传统无人机通信中两架无人机如果同时向地面用户或基站传数据最稳妥的做法是给它们分配不同的频段或时隙互不干扰这就是OMA正交多址接入的思路。但问题在于频谱资源是有限的尤其在应急通信、临时覆盖这类场景下可用频段非常紧张。NOMA的思路则是让两架无人机在同一个频段上同时传输通过功率域或者码域来区分信号接收端利用SIC串行干扰消除技术把叠加的信号一层层解出来。这样频谱效率上来了但相应的两架无人机之间的干扰耦合也变得更强了——你飞的位置直接影响到对方的信噪比和最终吞吐量。这就引出了路径优化的问题。在NOMA系统里一架无人机的飞行轨迹不光是它自己的事它飞到哪、距离地面接收端多远、功率怎么分配都会变成另一架无人机的“干扰源”。因此双无人机的轨迹不能各自闷头优化必须放在一个耦合的环境里协调着来。传统的做法是用凸优化集中式求解但无人机网络往往是动态拓扑中心节点一旦失效整个系统就瘫了而且集中式求解在大规模场景下计算量很大。所以这个项目采用去中心化Q-Learning来解决让每架无人机作为一个独立智能体在本地维护自己的Q表通过与环境的交互来学习最优轨迹策略。Q-Learning为什么适合这个场景最大的原因是它不需要环境模型。无人机飞行过程中信道状态变化受地形、天气、用户位置等多种因素影响很难精确建模。Q-Learning作为无模型的强化学习算法天然适合这种环境动态不明、但可以不断试错优化的场景。而且单智能体Q-Learning的收敛性有成熟的理论支持实践起来比深度强化学习比如DDPG、PPO门槛低得多尤其适合在Matlab里快速验证算法思路。这套方案适合谁参考如果你正在做无人机通信、无线资源分配、强化学习在通信物理层应用这类方向的课题或者工作中需要快速验证NOMA场景下的移动性管理策略这个项目的思路和代码框架可以直接抄作业。即使你之前没接触过强化学习只要理解Q-Learning查表更新的基本逻辑也能把这套代码跑起来改参数。另外要说明一点标题里“去中心化”这个修饰词非常关键。它决定了整个算法架构的设计方向——每架无人机不是把观测数据上报给中心节点、由中心统一规划路径而是各自根据局部观测做决策只通过通信系统的性能反馈也就是奖励信号来间接感知对方的存在。这种分布式架构的好处是单架无人机失效不影响另一架继续工作网络扩展性好而且通信开销小不需要频繁交换完整状态信息。2. 核心算法设计与关键细节解析2.1 状态空间、动作空间与奖励函数——算法的“三角支架”任何强化学习项目第一步永远不是写代码而是定义清楚三个东西状态是什么、动作有哪些、奖励怎么算。这三样构成了整个学习系统的“三角支架”哪一个设计得不合理后面的训练过程都会变得极其折磨。先说状态空间。在这个双无人机NOMA场景里每架无人机需要知道哪些信息才能做出合理的路径决策从通信角度讲最核心的是它自己当前的位置坐标x, y以及它和地面接收端之间的距离从干扰耦合角度讲它最好还能知道另一架无人机的大致位置——但需要注意的是在去中心化架构下我们不能假设无人机能实时获取对方的精确坐标因为这违背了“去中心化”的初衷。因此实际工程上常用的做法是把“另一架无人机对本机的干扰强度”作为一个观测特征这个值可以通过接收信号强度推算出来不依赖直接的位置信息交换。这么做既保住了分布式决策的前提又让智能体具备了感知环境耦合度的能力。再说动作空间。无人机的路径优化动作设计有两种常见思路一种是连续动作直接输出下一时刻的目标位置或者飞行方向角另一种是离散动作把360度方向划分成多个扇区比如8个方向或者把速度档位离散化。这个项目选用Q-Learning而传统Q-Learning本质上只能处理离散动作空间表格索引是离散的所以动作空间必须离散化。我建议的划分方式是16个方向扇区加上悬停动作总共17个动作。为什么是16而不是8因为无人机路径优化的核心是在移动性和通信质量之间找平衡方向选择越细腻轨迹越平滑但动作空间越大收敛越慢。16个方向是我在类似项目里实测下来的折中选择兼顾了轨迹平滑度和收敛速度。奖励函数是这个三角支架里最讲究的部分。NOMA系统里衡量通信性能的指标一般是系统总吞吐量或者能量效率。但如果奖励函数里只有系统总吞吐量你会遇到一个问题两架无人机都飞到离接收端最近的位置去抢占信道系统总吞吐量可能反而下降因为强信号叠加导致SIC解码失败弱信号用户被完全压制。这就是NOMA系统里经典的“远近效应”问题。解决思路是在奖励函数里加入公平性约束比如用比例公平调度中常用的对数效用函数奖励定义为本机吞吐量取对数后再求和。这样设计的好处是吞吐量低的一方边际增益大智能体会主动“避让”形成一种自然的空间分集。我在实际项目里还额外加了一个惩罚项——当两架无人机距离太近、导致SIC解码失败率超过阈值时给一个负奖励这相当于给智能体画了一条“物理警戒线”训练稳定性会好很多。2.2 Q-Learning更新机制与参数调优Q-Learning的核心公式是这个Q(s, a) ← Q(s, a) α × [r γ × max(Q(s, a)) - Q(s, a)]翻译成白话就是更新Q表中某个状态动作对的估值时用“当前奖励”加上“未来最优收益的折扣”减去“当前估值”然后再乘一个学习率α加回去。这里面每个参数都有讲究。学习率α控制的是新旧经验的权重。α太大算法的学习速度快但容易震荡甚至可能发散α太小收敛速度慢尤其在状态空间较大的场景里会让人等到怀疑人生。这个项目的状态空间如果按网格化位置来离散化很容易突破数千个状态α建议在0.1到0.3之间起步训练过程中可以逐步衰减到0.05以下。折扣因子γ决定智能体“目光的长远程度”。γ接近1意味着智能体非常看重长期收益适合需要提前规划长航迹的场景γ太小则会导致短视行为——无人机只追求当前时刻的通信速率不愿意为了飞到更好的位置而暂时牺牲当前收益。在无人机路径规划场景里γ建议取0.9以上因为航迹优化本质上是一个多步决策问题一步的得失远不如整条轨迹的累积收益重要。探索率ε是去中心化这套架构里特别需要注意的一个参数。经典做法是ε-greedy策略以ε的概率随机探索以1-ε的概率选择当前Q值最大的动作。训练初期ε要设高一些0.5到0.9让智能体充分探索环境训练后期ε要降下来0.05到0.1让智能体更多利用学到的策略。但需要注意在去中心化的设定下两架无人机如果各自独立地随机探索会在训练初期产生大量“无意义的试错”——它们互相干扰导致奖励信号非常嘈杂。一个实测有效的技巧是让两架无人机错峰探索无人机A在奇数轮次探索无人机B在偶数轮次探索这样某一方在试错时另一方保持着较稳定的行为降低了交互造成的方差。还有一个容易被忽视的细节是Q表的初始化。很多人习惯把所有Q值初始化为0但在路径优化类任务里我强烈建议把Q表初始值设为一个较大的正数比如对应中等奖励水平的估值。这样做的好处是训练初期智能体倾向于尝试所有动作因为未访问过的状态动作对估值虚高贯彻了“乐观探索”原则可以有效避免训练初期过早陷入局部最优。2.3 NOMA功率分配与SIC解码的关键约束前面说了半天Q-Learning但不要忘了整个系统的“物理底座”是NOMA。NOMA通信系统与路径优化耦合时有两个硬约束必须在算法设计里体现出来否则仿真结果就是空中楼阁。第一个约束是功率分配。两架无人机在同一频段上叠加传输接收端需要区分两个信号前提条件是两路信号有足够的功率差。经典的NOMA下行链路设计里信道条件差的用户分配更大功率信道条件好的用户分配较小功率——因为强信号的用户可以用SIC先解出弱信号用户的信号再把自己信号中的干扰减掉。在无人机通信场景里信道条件主要由无人机与接收端之间的距离以及路径损耗指数决定。所以当无人机路径变化时最佳功率分配比例也在动态变化。如果你的代码里功率分配是固定的那路径优化实际上是“带着枷锁跳舞”效果必然大打折扣。顺带一提实测下来在大部分场景中让两架无人机的目标接收功率差保持在5到10 dB范围内SIC解码成功率最高。第二个约束是SIC解码成功率模型。SIC不是理想解码的它有误码概率。在仿真中你必须在奖励函数设计中体现这一点。我见过不少复现的代码直接用理想SIC假设——接收端完美解出两个信号奖励只跟信噪比挂钩。这会让Q-Learning学到一个过于乐观的策略因为现实中的SIC在信号强度接近时会频繁失败。正确的做法是为SIC解码设置一个成功概率函数比如两路信号功率比低于某个门限时解码成功概率断崖式下降。把这个概率乘进奖励函数里智能体才能真正学会规避“信号对峙”的区域。这一点也直接影响了路径优化的结果形态——最优轨迹往往不是两架无人机都飞到最靠近接收端的位置而是一架保持在较近的位置提供强信号另一架在稍远一点的位置用更小的发射功率维持可解码的弱信号形成一个自然的一近一远搭配。3. Matlab仿真实现与关键代码框架3.1 仿真环境建模与参数配置这个项目的仿真环境主要包括三个模块无人机运动学模型、无线信道模型、NOMA接收模型。很多人写这类仿真有个误区一上来就开始堆信道模型函数但其实第一步应该把无人机运动学模型想清楚因为飞行轨迹的平滑性直接由时间步长和速度上限决定。我的做法是把仿真时间离散化成等间隔的时隙time slot每个时隙内无人机执行一个动作。举个例子时隙长度设为1秒无人机巡航速度为10 m/s那么一个时隙内无人机最多移动10米。如果地图尺寸是2000米×2000米从地图一端飞到另一端至少需要200个时隙这个数量级很合适——既不会因为单步移动太大导致轨迹粗糙也不会因为移动太慢导致有效的路径探索需要太多训练回合。信道模型方面建议直接用自由空间路径损耗模型加上对数正态阴影衰落。自由空间模型作为基准已经足够而阴影衰落的加入能模拟真实环境的随机性让Q-Learning学到的策略具备一定鲁棒性。注意不要让阴影衰落的标准差设得过大否则奖励信号噪声太强Q-Learning这种查表类算法的收敛速度会明显变慢我实测建议标准差控制在2到4 dB。仿真代码的结构建议如下% 主脚本双无人机去中心化Q-Learning路径优化 % 参数初始化 map_size 2000; % 地图尺寸 (m) num_episodes 500; % 训练回合数 max_steps 300; % 每个回合最大时隙数 n_actions 17; % 动作数量16方向1悬停 alpha 0.2; % 学习率 gamma 0.95; % 折扣因子 epsilon 0.9; % 初始探索率 epsilon_min 0.05; % 最小探索率 epsilon_decay 0.995; % 探索率衰减系数 % 状态空间离散化参数 % 将地图栅格化每个格子宽度200m形成10x10的状态空间 grid_size map_size / 10; % 干扰强度离散化为5个等级 interference_levels 5; % 初始化Q表两架无人机各自维护自己的Q表 Q_UAV1 zeros(10*10*5, n_actions); Q_UAV2 zeros(10*10*5, n_actions);3.2 训练主循环与去中心化交互逻辑去中心化Q-Learning的训练循环本质上是在模拟两架无人机各自感知环境、执行动作、获取奖励的过程。注意这里有一个关键点两架无人机获取的奖励虽然都来自同一个NOMA系统但它们各自计算出的奖励数值并不同——因为它们的位置不同对系统性能的贡献和受到的干扰也不同。这里需要分别计算各自的奖励再组合成系统总奖励。训练主循环的结构如下for episode 1:num_episodes % 初始化无人机位置随机初始化保证探索多样性 pos_UAV1 [rand*map_size, rand*map_size]; pos_UAV2 [map_size - rand*map_size, map_size - rand*map_size]; % 初始化地面接收端位置固定位置也可以设置为随机 pos_ground [map_size/2, map_size/2]; for step 1:max_steps % 计算当前状态 state1 compute_state(pos_UAV1, interference_from_U2_to_U1); state2 compute_state(pos_UAV2, interference_from_U1_to_U2); % 根据epsilon-greedy策略选择动作 if rand() epsilon action1 randi(n_actions); else [~, action1] max(Q_UAV1(state1, :)); end if rand() epsilon action2 randi(n_actions); else [~, action2] max(Q_UAV2(state2, :)); end % 执行动作更新位置 pos_UAV1 update_position(pos_UAV1, action1, uav_speed, time_slot); pos_UAV2 update_position(pos_UAV2, action2, uav_speed, time_slot); % 计算NOMA系统性能得到奖励 [throughput1, throughput2, system_throughput] ... compute_noma_performance(pos_UAV1, pos_UAV2, pos_ground); reward1 compute_reward(throughput1, throughput2, pos_UAV1, pos_UAV2); reward2 compute_reward(throughput2, throughput1, pos_UAV2, pos_UAV1); % 计算下一状态并更新Q值 next_state1 compute_state(pos_UAV1, new_interference_from_U2_to_U1); next_state2 compute_state(pos_UAV2, new_interference_from_U1_to_U2); Q_UAV1(state1, action1) Q_UAV1(state1, action1) alpha * ... (reward1 gamma * max(Q_UAV1(next_state1, :)) - Q_UAV1(state1, action1)); Q_UAV2(state2, action2) Q_UAV2(state2, action2) alpha * ... (reward2 gamma * max(Q_UAV2(next_state2, :)) - Q_UAV2(state2, action2)); end % 每个回合结束衰减探索率 epsilon max(epsilon * epsilon_decay, epsilon_min); % 记录每个回合的系统总吞吐量 episode_throughput(episode) total_throughput; end这个循环看起来很简单但有个工程化细节值得展开讲compute_state函数里要同时包含本机位置和干扰等级而这个干扰等级的计算可能带来循环依赖问题——无人机A的下一状态需要知道无人机B移动后的新位置但B也要A的位置。在实际代码里最简单的做法是用上一时隙对方的位置来估计当前干扰引入一个时隙的滞后这在物理上是合理的无线信号传播、接收反馈本来就有时延不会破坏学习的收敛性。3.3 奖励函数实现与公平性平衡奖励函数的实现是整个代码里最需要反复调试的部分。我在前面章节已经讲了设计原则这里给出一个可以跑通的基础版本function reward compute_reward(own_throughput, other_throughput, own_pos, other_pos) % 主奖励自身吞吐量的对数体现公平性 r_throughput log(own_throughput 1e-6); % 距离惩罚两机距离过近时SIC解码失败概率上升 distance norm(own_pos - other_pos); if distance min_distance_threshold r_proximity_penalty -2.0; else r_proximity_penalty 0; end % 组合奖励 reward r_throughput r_proximity_penalty; end加1e-6是为了防止对数函数出现负无穷。距离惩罚阈值需要根据地图尺寸折算我在地图2000米的场景下通常设为250米——这个数值不是拍脑袋定的它取决于路径损耗指数和NOMA的功率差要求当两架无人机距离250米以内时在典型的城市微蜂窝环境下接收端的功率分离度已经难以保证SIC稳定解码。另外如果你想做更细化的研究可以在奖励里加入能耗项。无人机飞行需要消耗能量轨迹越曲折能耗越大。加入能耗惩罚后最优策略会从“快速飞到最优悬停点”变成“以更节能的路径渐进逼近”——这更接近真实任务规划的需求。不过作为基础版本先把吞吐量和公平性做好再考虑能耗这个锦上添花的因素。4. 训练效果评估与对比实验分析4.1 收敛性判断与Q值可视化技巧训练跑完之后第一件事不是看轨迹图而是看奖励曲线是否收敛。我建议记录两类指标每个回合的总奖励以及每回合结束时的系统总吞吐量。把这两个指标随训练回合数的变化曲线画出来如果曲线呈现“快速上升—波动—趋于平坦”的形态说明算法收敛了。典型情况下300到500个回合内可以收敛到稳定的水平如果1000回合还不见收敛信号基本可以判断是奖励函数设计或者状态离散化出了问题不要盲目加大训练量。还有个排查收敛问题的小技巧把Q表的热力图画出来。Q表是状态-动作的函数你可以固定某个维度比如固定干扰等级为中等水平把地图位置对应到最大Q值的动作方向用箭头图展示出来。训练初期箭头方向是杂乱的收敛后箭头会自然形成一条指向接收端附近最优悬停位置的流形。如果箭头出现了“在某个区域来回振荡”的现象说明该区域的动作收益区别太模糊需要细化状态离散化或者调整奖励中距离惩罚项的权重。4.2 NLRG——算法的收敛性判断与Q值可视化技巧实测下来的对比结果显示从表中能看出几个有意思的点NOMA去中心化Q-Learning的组合系统总吞吐量明显高于对比组原因在于Q-Learning学到的空间分集策略——两架无人机保持在较远但信号可解码的距离上既创造了功率差、又避免了相互干扰过度而集中式优化虽然理论上能求得全局最优但在仿真参数设得不够精细时容易陷在局部最优里。4.3 去中心化与集中式方案的本质差异很多初次接触这个项目的人会有疑问明明集中式训练的效果理论上更好为什么还要费劲搞去中心化这里需要澄清一个关键认知——去中心化不代表性能一定差它在以下三个层面具备集中式没有的优势第一是鲁棒性。集中式方案需要一个中心控制节点收集两架无人机的完整状态、计算联合策略再下发执行一旦中心节点失效或者通信链路中断整个系统立刻停摆。去中心化方案中每架无人机只依赖自己的局部观测局部故障只会影响单机不会造成系统性瘫痪。在应急通信、军事侦察这类对抗性场景里这个优势是压倒性的。第二是可扩展性。设想一下同样的算法从双无人机扩展到10架无人机集中式方案的动作空间是每架无人机动作空间的笛卡尔积规模指数增长你根本没法用表格型的Q-Learning求解而去中心化方案只是在系统里增加几个独立学习的智能体每个智能体面对的局部状态空间基本不变计算复杂度线性增长。第三是状态感知的现实约束。NOMA通信系统在实际部署时接收端和无人机之间虽然可以交换部分信息但共享完整的全局信道状态信息CSI的代价极大。去中心化方案中每架无人机只需要知道自己的CSI和干扰等级估计值这在工程上是完全可行的。我觉得做这类项目最容易犯的一个思维定式就是默认“最优集中式”但实际上架构选型取决于任务约束——如果任务对系统鲁棒性要求高、允许性能略有损失去中心化往往是性价比最高的选择。5. 常见问题速查表与调试心得我在复现和调试这个项目时遇到了不少问题有些问题折磨了很长时间才找到根因这里整理成速查表希望你不需要重走弯路问题表现可能原因排查思路与解决建议奖励曲线前期震荡剧烈、不收敛探索率ε过大且未及时衰减检查ε衰减策略每回合按指数衰减或改用退火策略智能体始终在某区域来回飞、不敢接近接收端距离惩罚过于激进调整SIC惩罚阈值或把惩罚从硬惩罚改为线性软惩罚总吞吐量勉强持平OMA没体现出NOMA优势功率分配固定未随路径动态调整在奖励函数计算前先按当前距离动态分配功率比例两架无人机最终位置几乎重合奖励函数缺少公平性约束加入公平性指标如对数吞吐量避免单机独占信道Q表更新后期出现反常回退学习率α未衰减Q值振荡α设初始值为0.2训练中期逐步降到0.05训练速度慢、状态空间覆盖不全栅格精度过高先用粗粒度如200m一格跑通流程再逐步细化不要一上来就追求高精度除了这些表格里列出的问题还有两个我自己踩过坑、但很难在文档里查到的细节经验第一个是关于位置边界处理的。无人机在探索过程中一定会不断撞到地图边界这个边界状态需要单独设计。不要简单地把出界的动作直接丢弃而是把无人机拉回边界内并给一个小的负奖励——它的作用是让智能体高效学会“地图边界附近没有收益”这比让它自然撞几次边界再反射性修正高效得多。第二个是关于接收端的位置设置。固定在一个点上的做法最适合做对照实验但如果想让策略更通用我建议在训练过程中以一定概率随机重置接收端的位置。这样学出来的策略不是针对某个特定地理点的“死策略”而是学会了“无论接收端在哪、我都要在它附近保持一定距离飞行”这种迁移性更强的行为。6. 扩展方向与进一步优化建议项目跑通之后互联网上做得比较多的几个扩展方向也值得说说按难度从低到高排列。最简单的扩展是修改信道模型。把自由空间路径损耗替换为城市微蜂窝信道模型或者概率性阻塞模型观察Q-Learning学到的策略是否会发生适应性变化。你的信道模型越接近真实场景奖励函数里的随机性就越大这时可以顺带研究一下增大训练回合数或者修改α衰减策略是否有缓冲作用。中等级别的扩展是引入多地面用户。双无人机配合NOMA可以服务多个地面用户这时每架无人机负责一个用户组的覆盖但用户位置又是动态的。状态空间需要加入用户位置的观测奖励函数也要体现用户公平性。这个扩展的难点在于状态空间的维度上升很快单纯靠Q表已经有些吃力可以考虑用线性函数逼近或者简单的神经网络来替代Q表——这就是从Q-Learning向DQN迈进的过渡路线。更进阶的方向包括多无人机场景的集群学习比如4架无人机、无人机与地面基站协同的异构网络、三维空间的轨迹优化加入高度维度以及把Q-Learning学到的策略作为先验知识、再用蒙特卡洛树搜索做在线路径重规划。每一个方向展开来都是一篇独立文章的量级。从我自己的体会来说把这个项目吃透最大的收获不在于学会用Q-Learning或者调通NOMA仿真而在于养成了一种“从系统角度拆解问题”的意识——你先要弄清通信系统在物理层面的约束是什么再决定强化学习框架里每个组件怎么设计最后才是代码实现和调参。这种思路换到其他领域比如无人机避障、智能反射面辅助通信、车联网资源调度同样适用。希望这篇拆解对你手头的项目有帮助如果在调试过程中遇到了上面没提到的问题按照去中心化思考的方式先怀疑奖励函数再检查状态定义多数情况下很快能找到症结。
阅读完成 · 觉得有帮助?
咨询建站