做5G应急网络无人机部署的人,大概率都碰到过这样一个问题:方案听起来都对,可真到拍板的时候,谁也说不清为什么选这个不选那个。覆盖范围要大、业务容量要高、续航得够、成本还不能离谱,再加上抗毁性和可靠性,指标一多,决策就成了扯皮现场。我最早接手这类项目时也走了一段弯路,后来逐步把层次分析法(AHP)引入到初步网络规划阶段,配合Matlab做快速计算,把“拍脑袋选方案”变成了“打分排序选方案”,整个过程可控、可解释、可复现。这篇文章就把这套流程完整拆开讲,从理论建模、判断矩阵构造到Matlab源码实现和实际运行结果,适合做应急通信、无线网络规划、无人机行业应用,以及相关课题设计的同学参考。
1. 无人机应急网络规划:先从决策需求说起
1.1 5G应急网络里的无人机到底怎么部署
应急通信场景有很多种:山区暴雨导致地面基站失联、大型活动现场短时间内涌入大量人流、偏远地区临时需要专网保障。这些场景有一个共同点:地面通信基础设施要么受损、要么根本不存在,但又必须在几小时内恢复基本语音和数据服务。这时候,无人机挂载轻量化5G基站升空,就可以快速建立临时覆盖。这几年这类方案已经不是什么实验项目,国内外的应急演练里都能看到它的身影。
但无人机部署不是“飞一架上去”这么简单。飞多高、用几架、怎么协同,会直接影响网络性能。我拆成三种典型形态来看:
- 高空单机广覆盖:一架载重较大的无人机升到300米左右,挂一个轻量化基站,覆盖半径能做到5公里上下。优点是覆盖大、调度简单,缺点是业务容量有限,而且一旦这架飞机出问题,整片区域就失联了。
- 中空多机组网:三到五架无人机在150米左右高度组成链状或网格状覆盖,通过空地链路互联。覆盖和容量都排在中间位置,冗余性也比单机好,比较适合需要“恢复一片区域”的场景。
- 低空集群:让十几架小型无人机在80米以下高度密集部署,每架覆盖半径不大,但可以拼出高容量区域。这个方案容量最高、冗余性最强,但成本高、协同复杂,续航也短。
这三种方案没有绝对的好坏,完全取决于应急场景到底要什么。如果是地震后保证搜救队伍通信,可能更看重覆盖和抗毁;如果是一场大型演唱会临时保障,业务容量就变成第一优先级。所以做初步网络规划,本质上是在多个目标之间做权衡决策。
1.2 为什么初步规划阶段适合用层次分析法
在决定用AHP之前,我其实试过几种办法,先说结论:在“初步规划”这个时间点上,AHP是性价比最高的。
如果一开始就上粒子群或遗传算法,你得先定义一个完整的目标函数,把覆盖、容量、成本、抗毁性全部量化成数学表达式,还要给出初始化种群和迭代参数。这在项目前期根本不现实,因为你连精确的信道模型和地形数据都还没有,算出来的结果大概率也是“垃圾进,垃圾出”。
如果直接做链路预算和覆盖仿真,又太慢。应急场景给决策的时间窗口只有几个小时,你不可能光学射线追踪模型就花上一天。而且仿真的前提是方案已经基本确定,否则算十种方案来回对比,时间成本无法接受。
AHP的核心价值在于,它能把你脑子里的定性判断结构化。比如“覆盖范围比部署成本重要”这件事,平时只能靠开会讨论,但用AHP,你可以把这种判断变成判断矩阵里的数字,再通过一致性检验判断这些数字有没有自相矛盾。计算量极小,Matlab跑一次连一秒都不用,结果还能清清楚楚打印出来给团队看。所以我说它是一个很好的“先粗选、后细算”的开头工具。它不会替代后续的仿真和实测,但它能帮你在数据不完整的时候,先做出一个不后悔的方向性决策。
2. 手把手搭建AHP决策模型
2.1 三层结构:目标、准则、方案怎么定
AHP模型的第一步是搭层次结构。这个结构通常分三层:目标层、准则层、方案层。
目标层这一层非常直白,本例中就是“选出最优的5G应急网络无人机部署方案”。
准则层是我个人认为整个模型里最关键的一层。准则选得好不好,直接决定决策结果有没有参考价值。我给这个项目定了五个准则:
- 覆盖范围(C1):用覆盖半径或覆盖面积衡量,应急场景首先要让人“找得到网”。
- 业务容量(C2):用同时支持在线用户数或小区吞吐量衡量,决定网络能不能真正用起来。
- 续航驻空能力(C3):用连续驻空时间衡量,应急网络不是飞几分钟就算完,至少要撑到地面抢修完成。
- 部署成本(C4):包含无人机平台、挂载设备、运输、人力等综合费用,预算约束是现实存在的。
- 抗毁可靠性(C5):用系统冗余度和故障切换能力衡量,应急场景最怕单点失效。
方案层就是上面说的三个候选方案:S1高空单机、S2中空多机、S3低空集群。它们在五个准则下的表现可以先用一个表定下来,后面填判断矩阵时心里就有数了。
| 候选方案 | 飞行高度 | 覆盖半径 | 在线容量 | 驻空时间 | 综合成本 | 冗余性 |
|---|---|---|---|---|---|---|
| S1 高空单机 | 300m | 5km | 约200用户 | 6h | 约50万 | 低 |
| S2 中空多机 | 150m | 8km | 约800用户 | 4h | 约120万 | 中 |
| S3 低空集群 | 80m | 3km | 约1200用户 | 2h | 约200万 | 高 |
这些数字在我这里是“初步规划阶段的经验估值”,不是最终设计值。但没关系,AHP要的就是这种量级的判断,而不是厘米级精度。
2.2 判断矩阵的标度规则与构造方法
层次结构搭好之后,下一步就是构造判断矩阵,这也是AHP最核心、最需要认真对待的一步。
判断矩阵采用Saaty提出的1到9标度法:1表示两个因素同等重要,3表示前者比后者稍微重要,5表示明显重要,7表示强烈重要,9表示极端重要,2、4、6、8是中间过渡值。反过来比较就填倒数,比如覆盖范围对业务容量是3,那业务容量对覆盖范围就是1/3。
我拿实际生活打个比方。假如你选餐厅,觉得口味比环境明显重要,就给口味和环境这一对比值填5;反过来,环境比口味就是1/5。这里的“5”不是数学意义上是五倍,而是“排序意义上的显著差异”,这一点很多人理解偏了。
准则层的判断矩阵我写成这样:
A = [ 1 3 4 5 2 1/3 1 2 4 1/2 1/4 1/2 1 3 1/3 1/5 1/4 1/3 1 1/4 1/2 2 3 4 1 ]读法就是:第一行第一列永远是1,表示覆盖范围和它自己同等重要;第一行第二列是3,表示覆盖范围比业务容量稍微重要;第二行第一列自然是1/3。检查一下:对角线全是1,对角线对称位置互为倒数,这是判断矩阵的最基本规则。
这里必须强调,判断矩阵里的数字应该来自场景需求,而不是拍脑袋。做应急网络规划时,最好由项目经理、网络工程师、现场指挥一起打分,把不同角色的诉求都量化进去。代码只是把人的判断计算成排序,如果输入质量不高,输出自然不可信。
2.3 权重计算与一致性检验的数学原理
判断矩阵构造完成之后,要从中提取出每个准则的权重。最常用、理论最严谨的方法是特征向量法。
设判断矩阵为A,它的最大特征值对应的特征向量就是权重向量。直觉上可以这样理解:一个完全一致的判断矩阵里,各行的比值关系是严格固定的,这个固定关系恰好体现在主特征向量里;即使矩阵不完全一致,主特征向量也仍然能代表“整体上”的权重关系。所以我先把A做特征值分解,取出最大特征值对应的特征向量,再归一化,就得到了五个准则的权重。
但取权重之前,必须先过一致性检验这关。所谓一致性,很好理解:如果我认为覆盖比容量重要(A比B重要),容量比续航重要(B比C重要),那我就不应该认为覆盖比续航还次要。判断矩阵如果存在这种矛盾,计算出来的权重就没有意义。一致性指标的计算方式如下:
CI = (lambda_max - n) / (n - 1) CR = CI / RI其中n是矩阵阶数,RI是平均随机一致性指标,只和阶数有关。n等于5的时候,RI取1.12。CR小于0.1,我们就认为判断矩阵的一致性可以接受;如果CR大于0.1,说明打分矛盾太多,建议回到判断矩阵去修改。
从数学角度看,当矩阵完全一致时,lambda_max恰好等于n,CI就是0。所以CI实际上衡量的是矩阵偏离完全一致的程度。这个约束非常重要,它不是走过场,而是AHP比“随便打个分求平均”更可靠的核心原因。
3. Matlab源码实现:从主流程到核心函数
3.1 主脚本的整体设计思路
Matlab代码并不复杂,但结构要清爽。我的做法是把任务拆成四步:第一步输入准则层判断矩阵;第二步计算准则权重并做一致性检验;第三步依次读取五个方案层判断矩阵,分别计算方案在单准则下的权重;第四步把准则权重和方案权重加权求和,得到综合得分并排序。
写代码时我习惯把每一层矩阵都放在脚本最前面,用清晰的变量名和注释标记好。这样做的好处是,你在做参数敏感性分析时,只需要改动脚本顶部的几行数据,不用深入函数内部到处找。算例规模小,没有必要一开始就搞类、搞包,一个脚本加两个小函数是最舒服的节奏。
还要注意,方案层的判断矩阵一共有五个,分别对应五个准则,存放顺序要一致。我这里用的是Matlab的元胞数组(cell),按下标顺序存放,既灵活又不容易混。
3.2 判断矩阵输入与自动校验
写计算函数时,我加了几道基础的输入校验。首先,判断矩阵必须是方阵,否则没法求特征值;其次,对角线元素必须全为1,这是AHP的基本性质;最后,矩阵阶数不能超过9,因为后面会用到的RI表只做到9阶。
这些校验虽然简单,但能在实际使用中帮你省掉很多排查时间。你可能会问:顺序不对成什么程度会被校验拦住?比如一个本该是5阶的矩阵,不小心填成4阶,特征值还是能算出来,但结果完全错误。加了校验,程序会在第一步就报错,而不是等到最后给你一个看似合理实则错误的排序结果。
3.3 权重计算、CR求解与排序输出(附源码)
下面给出完整可运行的源码。主脚本负责组织流程和输出结果,ahp_eig函数负责单层权重计算和一致性判断。
%% AHP_5G_UAV_Deployment.m % 5G应急网络无人机部署方案AHP决策 % 层次分析法用于初步网络规划 clear; clc; close all; %% 1. 准则层判断矩阵 % C1 覆盖范围, C2 业务容量, C3 续航驻空, C4 部署成本, C5 抗毁可靠 A = [ 1 3 4 5 2 1/3 1 2 4 1/2 1/4 1/2 1 3 1/3 1/5 1/4 1/3 1 1/4 1/2 2 3 4 1 ]; %% 2. 计算准则权重并做一致性检验 [W, CR, lambda_max] = ahp_eig(A); fprintf('准则层权重: '); fprintf('%.4f ', W); fprintf('\n最大特征值: %.4f, CR = %.4f\n', lambda_max, CR); if CR >= 0.1 error('准则层一致性检验不通过,请调整判断矩阵'); end %% 3. 方案层判断矩阵 % 三个方案: S1 高空单机广覆盖, S2 中空多机组网, S3 低空集群 % 依次对应 5 个准则 B = cell(5, 1); B{1} = [1 1/3 1/5; 3 1 1/3; 5 3 1]; % 覆盖范围 B{2} = [1 1/4 1/5; 4 1 1/3; 5 3 1]; % 业务容量 B{3} = [1 1/3 1/3; 3 1 1; 3 1 1]; % 续航驻空 B{4} = [1 3 5; 1/3 1 3; 1/5 1/3 1]; % 部署成本 B{5} = [1 1/3 1/4; 3 1 1/2; 4 2 1]; % 抗毁可靠 n_scheme = size(B{1}, 1); S = zeros(n_scheme, 1); for k = 1:5 [Wk, CRk, ~] = ahp_eig(B{k}); if CRk >= 0.1 fprintf('准则%d对应的方案判断矩阵CR = %.4f,不通过\n', k, CRk); end fprintf('准则%d下方案权重: %.4f %.4f %.4f, CR = %.4f\n', ... k, Wk(1), Wk(2), Wk(3), CRk); S = S + W(k) * Wk; end %% 4. 综合得分与排序 fprintf('\n===== 方案综合得分 =====\n'); [~, idx] = sort(S, 'descend'); for i = 1:n_scheme fprintf('S%d: %.4f\n', i, S(i)); end fprintf('推荐方案: S%d\n', idx(1));function [W, CR, lambda_max] = ahp_eig(A) % AHP_EIG 使用特征向量法计算AHP判断矩阵权重和一致性比例 % 输入: A - 判断矩阵 % 输出: W - 归一化权重向量, CR - 一致性比例, lambda_max - 最大特征值 n = size(A, 1); % 基础校验 if size(A, 2) ~= n error('判断矩阵必须为方阵'); end if any(abs(diag(A) - 1) > 1e-6) error('判断矩阵对角线元素必须为1'); end if n > 9 error('RI表只支持到9阶矩阵'); end % 特征值分解 [V, D] = eig(A); lambda_vec = real(diag(D)); lambda_max = max(lambda_vec); [~, idx] = max(lambda_vec); W = abs(V(:, idx)); W = W / sum(W); % 一致性检验 CI = (lambda_max - n) / (n - 1); RI_table = [0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45]; RI = RI_table(n); CR = CI / RI; if n < 3 CR = 0; % 一阶、二阶矩阵天然一致 end end这段代码可以直接保存成两个文件:主脚本和一个函数文件。函数文件在Matlab中另存为ahp_eig.m即可。运行后,命令行会依次打印准则层权重、每一个方案矩阵的CR值,以及三个方案的综合得分排序。
3.4 可复用:把代码改造成函数
如果你不想每次修改都打开脚本,可以把主脚本也封装成函数,输入是准则层判断矩阵和方案层判断矩阵元胞数组,输出是权重、CR和综合得分。我提供一个改造思路,核心代码不变,只包一层外壳:
function [S, W, CR] = ahp_5g_uav(A, B) % AHP_5G_UAV 一键计算无人机部署AHP决策 % 输入: A - 准则层判断矩阵 % B - 方案层判断矩阵元胞数组 % 输出: S - 方案综合得分, W - 准则权重, CR - 准则一致性比例 n_scheme = size(B{1}, 1); [W, CR, ~] = ahp_eig(A); S = zeros(n_scheme, 1); for k = 1:length(B) [Wk, ~, ~] = ahp_eig(B{k}); S = S + W(k) * Wk; end [~, idx] = sort(S, 'descend'); fprintf('推荐方案: S%d\n', idx(1)); end这样你以后做别的决策,比如选基站位置、选回传链路方案,只需要换成自己的判断矩阵和方案矩阵,调用同一个函数就行。
4. 真实案例:用AHP从三个备选部署方案中选最优
4.1 场景假设与参数设定
为了展示完整流程,我构造了一个贴近现实的场景:某山区因暴雨引发道路中断,地面基站供电机房被洪水浸泡,整个乡镇的通信基本瘫痪。应急通信车没法在短时间内开到现场,唯一可行的手段是无人机快速升空,恢复该区域的5G覆盖。初步判断,受影响区域半径约3公里,人口集中在几个村子,预计高峰时段同时在网用户可能达到1000人以上,需要至少撑过4小时的黄金救援期。
在这个场景下,三个备选方案分别是前面提过的S1高空单机、S2中空多机、S3低空集群。这些方案的参数是我根据公开产品资料和工程经验估算的,不同项目肯定有差异,但用来做AHP演示足够了。
注意,这里我用的是“初步规划”思路:不借助高精度地形和信道模型,先把方向和大概率正确的方案选出来,后续再做详细设计。这就像装修房子先确定“要不要砸墙”的大方向,而不是一上来就确定每个插座的位置。
4.2 运行结果与分析
我把前面那段代码在Matlab环境里跑了一遍,过程结果如下(具体数值可能因Matlab版本和浮点计算