☰
双无人机NOMA去中心化Q-Learning路径优化:从原理到Matlab实现
2026/10/22 8:36:51 网站建设 项目流程

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仿真,而在于养成了一种“从系统角度拆解问题”的意识——你先要弄清通信系统在物理层面的约束是什么,再决定强化学习框架里每个组件怎么设计,最后才是代码实现和调参。这种思路换到其他领域(比如无人机避障、智能反射面辅助通信、车联网资源调度)同样适用。希望这篇拆解对你手头的项目有帮助,如果在调试过程中遇到了上面没提到的问题,按照去中心化思考的方式,先怀疑奖励函数,再检查状态定义,多数情况下很快能找到症结。

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

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

立即咨询