无人机NOMA蜂窝卸载:建模、性能分析与Matlab仿真
1. 项目背景与整体设计思路1.1 这个研究到底在解决什么问题先说个场景大家应该都有感触。现在人一多的地方演唱会、体育赛事、地铁高峰手机信号看起来满格但网速就是上不去朋友圈图片转圈圈。这个问题的本质是地面基站太忙了它同时要服务的用户太多每个用户分到的资源严重不足。传统家庭里蜂窝网络通过把小区切小片、加基站来扩容可这种地面扩容方式在热点场景有个天然瓶颈——你没有办法在广场中央临时竖一根很高的铁塔。这时候无人机就跳出来了。无人机基站的特点是机动部署、按需升起、视距信道概率高能够快速在热点区域上空形成一张“临时网络”把地面基站的流量接走一部分。这个动作在学术界和工业界叫蜂窝卸载cellular offloading也就是让UAV承担一部分用户的服务任务减轻地面基站压力。但问题来了无人机能接走几个用户如果UAV和地面基站都采用传统正交多址OMA比如4G的OFDMA那种资源块分配一个资源块只能服务一个用户空中基站的服务容量其实相当有限。尤其当热点区域用户密集的时候UAV必须飞得更高、功率更大、资源更多才能覆盖足够多的用户但无人机是电池供电的功耗和续航就那么点。所以方案就变成在卸载链路上引入非正交多址NOMA。NOMA允许同一个资源块同时服务多个用户靠功率域区分用户信号接收端用SIC串行干扰消除解码。这样UAV在同一个时频资源上就能服务多个用户吞吐量和连接数都能提上去。我的这个项目核心就是围绕UAV NOMA 蜂窝卸载这个组合做一套完整的性能分析和优化验证。1.2 系统架构怎么搭三层协同四步闭环整个系统的结构可以拆成三层来看。第一层是用户层。热点区域里有一批地面用户设备每个用户的位置、信道状况、服务质量需求都不一样。有的用户距离UAV近、信道好有的用户被建筑物遮挡、信道差这正好是NOMA发挥优势的场景把信道差异大的用户配成一个NOMA簇强用户帮助解码弱用户两个人都拿到服务。第二层是无人机层。UAV作为空中中继或空中基站负责转发或直接服务一部分用户起到卸载地面流量、扩展覆盖范围的作用。UAV的位置水平坐标和高度、发射功率、用户调度策略这些都可以作为优化变量。第三层是地面基站层。地面基站仍然存在负责UAV覆盖不到或者不适合卸载的用户。UAV和地面基站之间通过回传链路连接卸载决策需要综合考虑两边的负载和信道条件。整个研究闭环是四个步骤建立系统模型用户位置分布、UAV信道模型、NOMA传输模型、干扰模型。推导性能指标中断概率、遍历速率、系统吞吐量、能量效率。设计优化问题在满足用户最低速率约束、UAV功率约束的前提下最大化系统性能。仿真验证用Matlab实现场景生成、传输过程模拟、优化算法求解对比NOMA与OMA、有UAV与无UAV的情况。这个流程是通信系统研究的标准范式但每一步落到具体场景都有不少细节。后面我逐一展开。1.3 为什么选NOMA不用OMA或其它多址NOMA的优势没那么玄乎很多人一听到NOMA就联想到复杂的数学推导其实它的核心思想用一句话就能说明白让不同用户用相同的时频资源依靠功率域差异来区分接收端用SIC一层层地“剥”出每个用户的信号。对比OMANOMA的优势非常直观频谱效率更高OMA把一个资源块只给一个用户NOMA把它同时给两三个用户单位频谱上的数据传输量更大。用户公平性更好OMA面对信道条件差的用户比如小区边缘用户要么给它大量资源块浪费频谱要么它就只能饿着NOMA可以在同一个资源块上让强弱用户同时传输用功率分配来平衡体验。连接密度更高这对热点卸载场景尤其关键。NOMA天然适合海量连接同一资源同时服务多个用户能显著降低接入阻塞概率。这个观点我强调一下NOMA最适合的场景恰好就是“用户数多、业务量大、信道差异化明显”的蜂窝卸载场景。如果用户数很少、信道状况都差不多NOMA的优势就不明显了。所以UAV卸载和NOMA并不是硬凑在一起的两个热点词它们是有内在逻辑关系的配合。2. 系统模型与NOMA核心原理2.1 信道模型怎么建LoS/N-LoS是UAV信道建模的核心关键在UAV通信系统里信道模型和传统地面通信有个很大区别UAV和地面用户之间大概率存在视距LoSLine of Sight传播路径尤其是UAV飞得较高时。视距传播意味着信号衰减更慢、信道更稳定但也意味着更容易被建筑物遮挡导致非视距N-LoS传播。所以在建模时不能简单套用地面瑞利衰落模型而是要采用概率性LoS/N-LoS信道模型。一条典型UAV到地面用户的链路建模方式是这样的根据UAV和用户之间的仰角计算LoS概率P_LoS(θ) 1 / (1 a * exp(-b * (θ - a)))其中a、b是环境参数城市环境通常a 9.61b 0.16θ是用户到UAV的仰角单位是度。根据LoS/N-LoS分别计算路径损耗PL_LoS 20*log10(4*π*f*d/c) η_LoSPL_NLoS 20*log10(4*π*f*d/c) η_NLoSη_LoS和η_NLoS是额外损耗项城市环境一般取1dB和20dB左右d是UAV到用户的距离。在LoS/N-LoS基础上叠加小尺度衰落。LoS路径下主要是莱斯衰落RicianN-LoS路径下是瑞利衰落Rayleigh。这里有个细节容易忽略仰角θ不仅影响LoS概率还影响路径损耗计算中的距离。UAV高度越高LoS概率越大但距离也越大路径损耗也越大所以UAV高度并不是越高越好。这个权衡在优化部分会专门处理。Matlab里生成这种信道的代码框架如下部分省去初始化function [h, PL] generate_UAV_channel(pos_uav, pos_user, fc) % pos_uav: [x, y, z]无人机位置 % pos_user: [x, y, 0]用户位置 % fc: 载波频率 c 3e8; d_2d norm(pos_uav(1:2) - pos_user(1:2)); d_3d norm(pos_uav - pos_user); theta atand(pos_uav(3) / d_2d); % 仰角度 % 环境参数 a 9.61; b 0.16; eta_LoS 1; eta_NLoS 20; P_LoS 1 / (1 a * exp(-b * (theta - a))); if rand() P_LoS PL_LoS 20*log10(4*pi*fc*d_3d/c) eta_LoS; % 莱斯衰落K因子取5dB经验值 K 5; h sqrt(K/(K1)) * exp(1j*2*pi*rand()) sqrt(1/(K1)) * sqrt(1/2)*(randn()1j*randn()); PL db2pow(-PL_LoS); else PL_NLoS 20*log10(4*pi*fc*d_3d/c) eta_NLoS; % 瑞利衰落 h sqrt(1/2)*(randn()1j*randn()); PL db2pow(-PL_NLoS); end end这个函数每次调用会生成一条新的随机信道在蒙特卡洛仿真中需要循环多次取平均才能得到稳定可靠的性能曲线。2.2 功率域NOMA与SIC解码流程NOMA的核心是发射端的叠加编码和接收端的串行干扰消除SIC。以最简单的2用户NOMA为例。发射端把两个用户的信号叠加在一起发送x sqrt(P1)*s1 sqrt(P2)*s2其中P1 P2 P_total为了公平性通常给信道条件差的用户弱用户分配更大的发射功率。假设用户2信道差就令P2 P1。在接收端用户1强用户直接解调用户2的信号把它从混合信号中减去然后解调自己的信号。这个过程叫SIC一层一层剥。用户2弱用户信道差直接把自己的信号当作噪声解调自己的信号即可不需要做SIC。为什么弱用户不做SIC因为弱用户信道差它即使去解调强用户信号解出来的可靠性也很差减去之后反而带来误差传播。所以NOMA的SIC规则是信道条件好的用户负责做SIC信道条件差的用户直接解码自己的信号。在2用户场景下两个用户的接收SINR表达式为弱用户直接解码自身信号把强用户信号当干扰SINR_2 P2 * |h2|^2 / (P1 * |h2|^2 σ^2)强用户先解弱用户信号扣除后解码自身信号SINR_1 P1 * |h1|^2 / σ^2注意强用户解弱用户信号时的SINR是SINR_2-1 P2 * |h1|^2 / (P1 * |h1|^2 σ^2)只有当这个值足够大满足弱用户的解码门限时SIC才能成功。如果这个条件不满足SIC会失败强用户的信号也解不出来这就是NOMA的中断事件之一。这个细节在实际仿真中最容易踩坑。很多新手仿真NOMA直接按理想SIC假设来做假设SIC一定成功得出的性能曲线异常好看但不符合实际。我的建议是仿真中务必要检查SIC的约束条件即强用户能否成功解码弱用户信号否则系统性能会被明显高估。Matlab里NOMA发射与SIC解码的核心流程可以写成这样以2用户为例变量含义见注释% 发射端叠加编码 % P_alloc [P_weak, P_strong] 注意弱用户功率更大 x_uav sqrt(P_alloc(1)) * data_symbol_weak sqrt(P_alloc(2)) * data_symbol_strong; % 接收端 % 用户1强用户 % 第一步解调弱用户信号把弱用户信号从混合信号中解出来 shat_weak qamdemod(y1, M, UnitAveragePower, true); % 重建弱用户信号并从接收信号中减去 y1_sic y1 - sqrt(P_alloc(1)) * qammod(shat_weak, M, UnitAveragePower, true); % 第二步解调自身信号 shat_own qamdemod(y1_sic, M, UnitAveragePower, true); % 用户2弱用户直接解调自身信号不做SIC shat_own_weak qamdemod(y2, M, UnitAveragePower, true);这是基带等效的仿真方式固定调制方式来看误码率或中断也可以把过程抽象成SINR计算来推中断概率两种思路都可以取决于你要分析什么指标。2.3 用户配对是NOMA系统里最影响成败的环节NOMA系统里不是所有用户都适合分到同一个资源块上。理想情况下一个NOMA簇应选择信道差异大的用户因为信道差异越大功率区分越明显SIC越容易成功。如果两个用户信道差不多功率分配很难拉开差距强用户去解弱用户的信号时容易失败系统性能反而比OMA差。用户配对策略主要有三种随机配对简单但性能最差常用来做性能下限参考。远近配对密集区域最常用把距离UAV最近和最远的用户配成一组信道差异最大。一维搜索/排序配对把所有用户按信道增益排序第1个和最后1个配对第2个和倒数第2个配对以此类推。这个策略性能接近最优复杂度不高工程上最实用。在Matlab里排序匹配的实现非常简洁% 按信道增益降序排列 [~, idx] sort(channel_gain, descend); num_pairs floor(K / 2); pair_matrix zeros(num_pairs, 2); % 信道好的用户与信道差的用户两两配对 for p 1:num_pairs pair_matrix(p, :) [idx(p), idx(K - p 1)]; end我实测下来这个策略对比随机配对系统吞吐量能提升25%以上在信道差异大的场景效果尤其明显。研究项目中强烈建议用排序配对作为基线方案。3. 性能分析指标体系中断概率、遍历速率、能量效率3.1 中断概率怎么算、怎么仿中断概率的物理含义是用户的接收SINR低于解码门限的概率。它直接反映了通信链路的可靠性在UAV卸载场景里尤其关键因为UAV信道受到LoS/N-LoS随机性的影响中断概率会在不同位置之间剧烈变化。理论推导的思路大致是根据NOMA的SINR表达式结合信道增益的分布莱斯/瑞利求P(SINR γ_th)的概率。这个在单UAV两用户的场景下可以推出闭式解复杂场景下就靠蒙特卡洛仿真。Matlab仿真的核心循环如下num_trials 1e5; % 仿真次数 interrupt_count 0; for trial 1:num_trials h1 generate_UAV_channel(pos_uav, pos_user1, fc); h2 generate_UAV_channel(pos_uav, pos_user2, fc); % 计算两个用户的SINR SINR_weak P2 * abs(h2)^2 / (P1 * abs(h2)^2 noise_power); SINR_strong P1 * abs(h1)^2 / noise_power; % 判断是否中断任一个用户SINR低于门限就中断 if SINR_weak gamma_th || SINR_strong gamma_th interrupt_count interrupt_count 1; end end interrupt_prob interrupt_count / num_trials;需要强调一点仿真次数不是越多越好而是要结合你要分析的最小概率精度来选。如果你要评估中断概率在10^-3级别的性能仿真次数至少要10^5次以上不然方差大了收敛不了。我做这个项目时一开始只跑了10^4次曲线抖动非常明显后来提到10^5次才稳定下来。3.2 遍历速率与系统吞吐量衡量“一共能传多少数据”中断概率回答的是“能不能通”遍历速率回答的是“通了能传多少”。在NOMA系统中用户的可达速率可以直接用香农公式弱用户R_2 log2(1 SINR_2)强用户R_1 log2(1 SINR_1)系统吞吐量则是所有用户速率之和。不过这里有个注意点NOMA的系统总吞吐量并不总是比OMA高当用户信道差异过小、SIC解码开销过大时NOMA可能不如OMA。所以做NOMA性能分析时务必要同时绘制OMA的基线曲线作为对照这才是客观的评估做法。我在项目里通常是这么组织结果对比的方案总吞吐量用户公平性速率差复杂度地面基站无UAV基线较差低UAV OMA中等中低UAV NOMA随机配对中高中中UAV NOMA排序配对高较好中UAV NOMA优化后最高更好高这张表基本对应了项目里最终要出的仿真结果图。3.3 能量效率无人机续航约束下的关键指标无人机系统有一个绕不开的约束电池容量有限。UAV通信的功率虽然远小于飞行功率但设计系统时仍然要考虑每焦耳能量能传输多少比特也就是能量效率EEEnergy EfficiencyEE R_total / P_total其中P_total包括UAV的通信发射功率和飞行功率。在我的仿真中通信功率在0.1W~2W量级而出力功率通常需要几十瓦到上百瓦视无人机尺寸而定。所以如果只看通信功率算能量效率结果会严重失真。实际仿真时我通常这样设置UAV通信功率0.1W ~ 2W可优化UAV飞行功率50W固定悬停功耗带宽1MHz噪声功率谱密度-174dBm/Hz计算能量效率时要明确你是在评估“通信能量效率”只算发射功率还是“系统能量效率”包含飞行功耗。两个口径的结论不一样只算通信功率时最优策略是增加发射功率来换容量算上飞行功耗后发射功率的影响被稀释优化空间反而在飞行时间和位置部署上。4. Matlab仿真实现从参数设置到完整代码框架4.1 环境与工具箱准备代码我是在Matlab R2022b上开发的核心功能其实只需要基础工具箱没有任何需要额外安装的依赖。这里给新手一个建议Matlab的通信工具箱Communications Toolbox提供的qammod、qamdemod、awgn函数非常方便但如果你没有这个工具箱用自己写的基础函数也能替代因为仿真核心在于SINR计算逻辑而不在调制解调本身。我在实际开发中遇到过一个问题单位的混用导致仿真结果差了好几个数量级。这里给大家整理一个单位转换速查表参数常用单位换算关系功率dBm / WP(W) 10^((P_dBm-30)/10)噪声功率谱密度dBm/Hz-174dBm/Hz 1.38e-20 W/Hz带宽MHz1MHz 1e6 Hz路径损耗dB需转成线性值后相乘单位换算错误是新手最常犯的错误没有之一。我有一次仿真噪声算错了一个量级导致所有用户SINR偏高系统吞吐量曲线全线飘红花了一整天才排查出来。建议在代码开头做一个自检断言确保噪声功率在合理的区间比如1MHz带宽下噪声功率约等于-114dBm即4e-15W量级。4.2 系统初始化与参数配置我习惯把所有可调参数集中放在一个初始化脚本里方便批量跑实验。核心参数如下%% 系统参数配置 % 场景参数 num_users 8; % 用户数量 area_radius 300; % 覆盖区域半径米 uav_height 100; % UAV悬停高度米 uav_pos [0, 0, uav_height]; % UAV位置 % 信道参数 fc 2e9; % 载波频率 2GHz bandwidth 1e6; % 带宽 1MHz noise_dbm -174 10*log10(bandwidth); % 噪声功率dBm noise_power 10^((noise_dbm-30)/10); % 噪声功率W % 功率参数 uav_power_total 1; % UAV总发射功率W num_clusters 4; % NOMA簇数量每簇2用户 power_per_cluster uav_power_total / num_clusters; % 每簇功率W % 用户位置随机生成热点区域聚集分布 user_positions area_radius * randn(num_users, 2); % 这里用randn生成聚集分布模拟热点区域用户抱团的特征有个经验值得分享用户位置分布方式会显著影响仿真结果。如果用均匀分布用户之间的距离大概率差距不大NOMA的配对优势不明显如果用randn高斯分布生成用户会形成聚集分布更接近现实热点场景也更能体现NOMA和UAV位置优化的价值。所以做对比实验时要把用户坐标固定下来用rng设置随机种子让所有方案在同一组用户位置上对比这样结果才公平。4.3 主循环信道生成、功率分配与速率求和整个仿真的主流程可以分为四步生成所有用户到UAV的信道或信道增益。按信道增益对用户进行排序配对形成NOMA簇。在每个簇内做功率分配。计算每个用户的SINR与可达速率累加得到系统总吞吐量。对应的Matlab主函数框架大致如下function [sum_rate, sinr_matrix] simulate_uav_noma(uav_pos, user_positions, params) K size(user_positions, 1); h_gain zeros(K, 1); % 1. 生成所有用户信道增益 for k 1:K h_gain(k) generate_UAV_channel(uav_pos, user_positions(k,:), params.fc); end % 2. 排序配对用户按信道增益排序后两两配对 [~, idx] sort(abs(h_gain), descend); num_pairs floor(K / 2); pair_matrix zeros(num_pairs, 2); for p 1:num_pairs pair_matrix(p, :) [idx(p), idx(K - p 1)]; end % 3. 簇内功率分配以固定比例分配为例可替换为优化算法 alpha_weak 0.8; % 弱用户获得80%功率 sinr_matrix zeros(K, 1); rates zeros(K, 1); for p 1:num_pairs u_weak pair_matrix(p, 1); % 弱用户信道差功率大 u_strong pair_matrix(p, 2); % 强用户信道好功率小 P_weak alpha_weak * power_per_cluster; P_strong (1 - alpha_weak) * power_per_cluster; h_w h_gain(u_weak); h_s h_gain(u_strong); % 4. 计算SINR考虑SIC约束 % 弱用户直接解码自身 sinr_weak P_weak * abs(h_w)^2 / (P_strong * abs(h_w)^2 noise_power); % 强用户先解弱用户信号再解自身信号 sinr_weak_at_strong P_weak * abs(h_s)^2 / (P_strong * abs(h_s)^2 noise_power); if sinr_weak_at_strong params.gamma_th % SIC成功 sinr_strong P_strong * abs(h_s)^2 / noise_power; else % SIC失败强用户中断 sinr_strong 0; end sinr_matrix(u_weak) sinr_weak; sinr_matrix(u_strong) sinr_strong; rates(u_weak) log2(1 sinr_weak); rates(u_strong) log2(1 sinr_strong); end sum_rate sum(rates); end这个函数是整套仿真的核心。后面无论是画吞吐量随发射功率变化的曲线还是画中断概率随门限变化的曲线都是调用这个函数循环多次取平均。4.4 优化模块穷举、凸优化与交替优化的选择项目中“优化”部分的核心是在满足用户最低速率约束和UAV功率约束的前提下最大化系统吞吐量。优化变量一般包括每簇内的功率分配比例αUAV的水平位置UAV的高度我的经验是分三步走由简到繁第一步固定UAV位置优化功率分配只考虑功率分配时如果NOMA簇数不多每簇只有2个用户可以用穷举搜索把α从0.5到0.95步进扫描选使总吞吐量最大的α。alpha_list 0.5:0.01:0.95; best_alpha 0.5; best_rate 0; for alpha alpha_list [sum_rate, ~] simulate_uav_noma_fixed_alpha(...); % 传入alpha参数 if sum_rate best_rate best_rate sum_rate; best_alpha alpha; end end步长设0.01时精度已经足够对应SINR变化约0.1dB量级再小就白白增加仿真时间了。这种穷举法的复杂度是O(n)在标量优化问题里非常实用。第二步固定功率分配优化UAV位置UAV的水平位置优化是整个项目里效果最明显的模块。我的做法是把覆盖区域网格化对每个网格点计算一次系统总吞吐量然后选最优位置。虽然网格法不是最优雅的算法但它直观、鲁棒适合作为基线。grid_step 20; % 网格步长20米 x_grid -area_radius:grid_step:area_radius; y_grid -area_radius:grid_step:area_radius; best_pos [0, 0]; best_rate 0; for x x_grid for y y_grid [sum_rate, ~] simulate_uav_noma([x, y, uav_height], user_positions, params); if sum_rate best_rate best_rate sum_rate; best_pos [x, y]; end end end注意这个网格循环的耗时步长20米、覆盖600×600米的区域时大约是31×31961次仿真调用每次调用的计算量不大总耗时在几分钟以内完全可以接受。如果想加快速度可以先粗扫50米步长再精扫10米步长做两级搜索效率能提升近5倍。第三步联合优化联合优化的完整问题是非凸的直接求解很难。业界标准的做法是块坐标下降法BCD先固定UAV位置优化功率分配再固定功率分配优化UAV位置交替迭代直到收敛。这种方法虽然不是全局最优但工程上效果好、收敛快通常在5到10次迭代内就能稳定。这个策略和机器学习里EM算法的思路类似——把复杂联合优化拆成多个简单子问题轮换着解。我在项目里采用的就是这个方案实际效果满足需求而且相比全局优化求解器BCD完全不依赖额外工具箱纯手写就能实现。4.5 性能对比实验设计三组对照实验缺一不可做系统研究最忌讳只给出一条性能曲线自说自话。我建议至少设计三组对照实验UAVNOMA方案 vs UAVOMA方案这是证明NOMA引入价值的核心对比。有UAV卸载 vs 无UAV卸载纯地面基站这是证明UAV卸载价值的核心对比。优化位置 vs 固定位置如悬停区域中心这是证明优化算法有效性的核心对比。三组实验跑完论文或报告的核心结果就已经立住了。Matlab里绘图的实操建议是先画吞吐量随发射功率变化的曲线再画中断概率随SINR门限变化的曲线两张图放一起系统性能的“快与稳”就都展示出来了。5. 优化设计中的工程权衡与经验5.1 功率分配为什么不能直接平均分功率分配是NOMA系统里最灵敏的旋钮甚至可以说是决定NOMA系统成败的第一要素。很多新手直接让一个簇内的两个用户均分功率结果NOMA和OMA没什么区别仿真曲线几乎重合然后怀疑自己NOMA实现有误。这其实是理解偏差NOMA的功率分配不是为了“公平”而是为了制造可控的用户间干扰。弱用户需要更大的功率来保证基本解码强用户功率小但因为信道好靠着SIC扣除干扰后依然能获得不错的速率。如果功率平均分配弱用户SINR不够强用户SIC也解不干净两边都遭殃。经验值在2用户NOMA簇中α弱用户功率占比取0.7到0.85之间效果最好。具体的最优值取决于信道差异信道差越悬殊α应该越高。这部分扫描出图后你会看到一条明显的单峰曲线最优α就在峰顶。5.2 UAV高度LoS概率与路径损耗的拉锯战UAV高度优化是很有意思的一个问题。飞得高覆盖范围大、LoS概率高但距离远、路径损耗大飞得低路径损耗小但LoS概率下降、阴影衰落概率增大。这两者之间存在一个“黄金高度”我实测城市环境下通常在80到120米之间。Matlab里验证这个规律的方法是固定UAV水平位置和用户分布让高度从30米到200米步进扫描画出吞吐量随高度变化的曲线。你会看到一条先升后降的单峰曲线峰顶就是该环境下的最优高度。这个结论在多个文献中都出现过验证起来也不复杂也是我建议在论文或报告里必须放的一张图。5.3 UAV水平位置不是简单放在中心很多人在没有做过优化时直觉认为UAV应该悬停在覆盖区域的几何中心。但一旦用户分布不均匀几何中心往往不是最优位置。因为NOMA系统的吞吐量由每个簇的信道差异和总信道质量共同决定UAV稍微移动到用户密集区一侧多数用户的信道质量改善整体吞吐量提升。我在一组随机生成的高斯分布用户场景下跑过实验UAV最优位置相比区域中心系统吞吐量提升了约18%。这个收益在蜂窝卸载场景里相当可观所以UAV位置优化是整篇论文里投入产出比最高的部分。值得注意的是UAV位置优化有个“多峰”问题网格扫描得到的最佳位置可能不是全局最优尤其是在复杂地形和楼群遮挡下。工程上建议做多次随机初始点扫描比如从5个不同位置出发做局部搜索取全局最优能显著降低掉进局部最优的概率。5.4 用户调度策略与公平性约束优化不能只看总吞吐量忽略每个用户的感受。如果系统只管总吞吐量算法很容易把功率全部配给信道好的用户信道差的用户彻底断掉。所以优化问题中要加入公平性约束比如每个簇内弱用户的最低速率不小于某个门限或者整个系统采用“最大最小速率”目标max-min fairness。在仿真中加入公平性约束的实现方式% 在优化循环中增加约束判断 if rate_weak R_min rate_strong R_min % 满足约束保留该方案 else % 不满足约束方案无效 continue; end我做功率分配优化时会同时画两条曲线无约束最大吞吐量和带最小速率约束的最大吞吐量。两条曲线的差距反映了公平性导致的系统吞吐量代价这也是论文里的经典对比图表。6. 常见问题与排查技巧实录6.1 仿真吞吐量异常偏高的诊断思路如果你跑出来的吞吐量比论文里同样参数的结果高一倍以上要怀疑是不是以下问题首先检查噪声单位是否换算正确。特别是用dBm计算的噪声功率在代入SINR公式前必须转成瓦特。我就犯过这个错结果吞吐量整体虚高3dB以上。其次是检查信道生成时是否把信道增益和路径损耗重复相乘了。有些实现会在信道函数里把路径损耗算进h里又在主函数里再次乘一遍路径损耗造成信道增益虚高。自查方法很简单打印某条信道的abs(h)^2和路径损耗公式的理论值对比应该在一个数量级上。6.2 NOMA性能反而低于OMA的排查顺序这是新手最常面临的“灵魂拷问”。排除模型本身问题后按这个顺序排查一查配对策略。随机配对在用户数多的时候很容易形成信道相似的配对NOMA优势自然发挥不出来。换排序配对再试。二查功率分配。α是否在合理区间弱用户功率是否确实大于强用户如果功率分配反了或者均分NOMA优势就没了。三查SIC约束是否被正确建模。如果省略SIC约束条件强用户速率会被高估总吞吐量虚高但如果你加了约束却碰巧每个簇的SIC条件都不满足速率会突降到0。中间态需要结合具体数值分析。6.3 仿真优化不收敛或收敛到很差的位置如果你用交替优化BCD但性能提升不明显大概率问题出在初始化位置。UAV初始位置如果离全局最优太远块的交替迭代会被困在局部最优。建议用5到10个随机初始位置分别跑取最优结果。这个做法在Matlab里实现很简单同时也能增强结果的统计学说服力。6.4 仿真耗时过长蒙特卡洛次数的理性选择蒙特卡洛仿真最纠结的就是精度和时间的平衡。参考做法先用小规模测试比如2000次确定曲线的大致趋势好不好再按需要的精度确定最终次数。如果只有一条曲线10^5次足够如果要扫描十几组参数每组都10^5次会非常耗时。此时可以降到2×10^4次曲线虽然有点毛刺但趋势和结论不受影响把主要实验参数下的精确值单独跑一次10^5次的加精细版。6.5 参数速查表300行代码跑通的基础配置最后把我常用的一组基础参数整理成表格作为这套仿真框架的默认配置。不同场景按需调整即可。参数推荐取值说明载波频率2GHz常用UAV通信频段也可扩展至28GHz带宽1MHz小带宽便于计算便于理解噪声功率谱密度-174dBm/Hz标准热噪声底UAV高度100m城市环境经验最优区间中间值UAV总发射功率1W对应30dBm常用UAV通信功率上限用户数6~12每簇2个用户方便按簇划分覆盖半径200~500m热点区域尺度每簇弱用户功率占比α0.7~0.85最优值随信道差异变化LoS/NLoS环境参数a9.61, b0.16, η_LoS1, η_NLoS20城市环境经验值按照这套参数单次蒙特卡洛仿真的耗时通常在几十秒到几分钟之间跑完整套论文图表约20张图大概需要一到两天在资源和时间上是完全可控的。如果你要跑更大规模参数扫描可以考虑先用1000次小样本快速筛选再对最优区域加密采样效率能提高一个量级。我做这个项目最大的体会是UAV和NOMA这两个技术都不算特别新的方向但把它们组合在蜂窝卸载场景里分析并系统化地做优化仍然能发现不少有价值的结论。尤其是UAV位置优化对NOMA系统吞吐量的显著影响这个结论在纯地面系统中是得不到的。项目本身给我最大的收获不是某一张曲线图而是“理解系统特性-抽象成优化问题-用仿真验证闭环”这套完整的思考方法论。如果是刚开始接触这个方向的同学建议先把基础仿真框架跑通再逐步加入优化模块一步步来不要一上来就想着复现全部论文图表。先把最核心的代码调通以后后面很多工作就是在这个框架上做配置和扩展了。