1. 项目概述与核心矛盾拆解
老规矩,先说结论。这个项目看起来是做“无线传感器网络物理层安全”方向的一个仿真验证课题。标题里的关键词拆开来看,基本就是三件事:多跳收集-传输、窃听者存在、硬件噪声干扰。合在一起,研究的就是一句话——在不完美的硬件条件下,怎么让一个多跳WSN网络里的数据安全地传出去,不被中间某个位置和区域里的窃听节点截获。
先说这个课题的动机。传统的WSN安全研究大多假设网络里的硬件是理想工作的,也就是“接收机想收多少精度就能给多少精度”,但这个假设在真实的传感器节点上根本不成立。传感器节点受成本、体积、功耗、工艺的限制,本身就存在严重的射频收发损伤,比如相位噪声、放大器非线性、IQ不平衡。这些损伤反映到基带信号上,就变成一个很讨厌的东西——硬件噪声。它的存在直接抬高了合法接收链路的误码率,更致命的是,它也会波及到窃听链路。到底谁受影响更大,就需要建模算清楚。
再看“多跳”这个设定。单跳WSN在小范围场景里还能撑得住,但规模一上来,节点能量有限加上信号衰减,必须要靠中继节点接力传数据。多跳的好处是单个节点发射功率不用太高,路径损耗也能逐段补偿;坏处是每一级中继都会增加时延和累积噪声,还引入了“中继节点是否值得信任”的问题。在物理层安全研究里,中继也可能是一个潜在的窃听者,甚至某些中间节点本身就是一个“被动窃听者”的伪装体。
于是,路径选择就非常关键了。路径怎么走,中继选哪几个节点接力,决定了窃听节点能不能截获足够多的信息。这个项目采用的核心思路,就是在已知网络拓扑和部分信道状态信息的情况下,动态选择一条安全性最好的传输路径,在有窃听者、有硬件噪声的情况下,让系统的安全速率尽量拉高。
乍一听这个课题像是纯粹的学术仿真,但实际落地场景并不少。比如工业物联网里的加密数据巡检回传、农田环境监测数据的汇聚、战场区域的传感器情报接力,甚至智能电网里的远程抄表网络,都可能面对类似的“节点泄密”和“合格但非理想硬件”问题。对研究生而言,这个课题能练到的东西很实在:物理层安全的信噪比建模能力、中继转发策略选择、路径优化与仿真协同验证,以及Matlab下整套蒙特卡洛仿真流程的设计能力。
适合谁来读这篇?如果你正在做WSN方向的研究课题,或者你手头已经有一个多跳传输的物理层模型想扩展到安全性能分析,又或者你只是想在Matlab里跑一套能带信道噪声和安全中断概率的完整WSN仿真框架,这篇文应该能省你一个月的调研时间。
2. 系统建模与关键环节设计
2.1 场景拓扑与节点角色划分
建模之前,先想明白网络拓扑长什么样。这个项目的场景不是那种密密的随机撒点,而是典型的“数据收集-汇聚”型结构。网络里存在一个源节点,若干个中继节点,一个汇聚节点,以及一个或多个被动窃听节点。
我在实测这类仿真的时候,建议把节点角色先拆干净:
- 源节点(Source):产生数据包,通过多跳方式向汇聚节点传输;
- 中继节点(Relay):接收上一跳信号,放大转发或译码转发,不产生业务数据;
- 汇聚节点(Sink / Destination):最终接收数据的地方,通常是整个网络的逻辑中心;
- 窃听节点(Eavesdropper):被动侦听信道,尽可能恢复源节点发出的信息。
需要注意,这一个模型下的“中继集合”和“窃听者集合”是预定义好的。路径选择算法要做的,就是在源到汇聚之间找到一条中继序列,使整条链路的可达安全速率最大,同时满足端到端的可靠性约束(比如接收信噪比阈值)。
实际摆布节点时我一般这么干:源节点固定在原点附近,汇聚节点放在区域的另一端中远距离处,中继节点在两者之间散布,窃听节点布置在数据流必经的区域边缘,防止它待在太靠近源的地方导致路径选择算法直接崩溃——那样所有路径的安全速率都会很低,没有比较意义。
拓扑确定以后就是信道建模的问题。常用的做法是采用大尺度路径损耗叠加上行信道衰落,也就是我们常说的复合信道模型。路径损耗指数设为3到4之间,对应典型的地面传感网络环境。对于每一段链路,信道增益可以写成:
[ h = \sqrt{\frac{G \cdot d^{-\alpha}}{L}} \cdot f ]
这里G是天线增益常数,d是通信距离,α是路径损耗指数,L是系统损耗因子,f是信道衰落系数,一般建模为均值为0、方差为1的复高斯随机变量。这个公式在做蒙特卡洛仿真时是核心模子,所有链路的实时状态都由它生成。
2.2 硬件噪声的影响机制与建模
硬件噪声这个话题,很多论文随口提一句就带过了,真做仿真的人是藏不住的。因为它直接决定了信噪比表达式的结构:合法链路和窃听链路里的噪声底噪不是同一个。
理想接收机下,接收信噪比是发射功率乘信道增益再除以热噪声功率。而引入硬件噪声之后,接收信号里会额外多一个项:由发射端和接收端电路损伤引入的加性噪声。这个噪声的功率与信号功率成比例,并不是固定的热噪声底。
数学上可以这样表达:合法接收端收到的信号为
[ y_d = h_{s,d} x + \eta_{tx} + \eta_{rx} + n_d ]
其中η_tx和η_rx分别表示发射机硬件损伤和接收机硬件损伤产生的失真噪声,它们的方差分别是发射功率乘以一个比例因子和接收信号功率乘以另一个比例因子。常见的做法是设发射端损伤系数为κ_t,接收端损伤系数为κ_r,则:
[ \sigma^2_{\eta,tx} = \kappa_t P_t,\quad \sigma^2_{\eta,rx} = \kappa_r P_r ]
这里的性质比较妙:发射端损伤是常数项,因为发射功率是固定值;但接收端损伤正比于收到信号的功率,所以链路长、衰落大,接收端噪声绝对值也大。这就导致硬件噪声对“长链路”的惩罚更重,对“短链路”影响反而小。多跳传输里中继节点拉短了单跳距离,其实是在无意中缓解了硬件噪声对链路可靠性的恶化。
窃听链路也一样要加上这份噪声,因为窃听者的设备同样是物理器件,不是理想接收机。问题来了:合法用户和窃听者的硬件损伤系数该设多少?成熟的文献里一般取κ_t和κ_r在0.01到0.1之间,对应硬件损伤从较轻到严重的情况。实际仿真时我建议把双方损伤系数设为一样,或者让窃听者设备略差一些,因为这更符合“敌方设备成本受限”的直觉。但注意,这里不能把窃听者建模得太差,否则路径选择算法轻松赢,结果没有说服力。
2.3 安全速率定义与目标函数设计
搞物理层安全,核心指标绕不开可达安全速率。这个指标的含义就是:在窃听者存在的情况下,合法信道能安全传输的最大信息速率。如果窃听信道的容量大于合法信道容量,安全速率为负,意味着安全的保密传输根本无法建立。安全速率定义为:
[ R_s = \max{ R_d - R_e, 0 } ]
其中R_d是目的节点链路的可达速率,R_e是窃听链路的可达速率。在AWGN信道下,它们各自取对数形式:
[ R_d = \log_2(1 + \gamma_d),\quad R_e = \log_2(1 + \gamma_e) ]
γ_d是目的节点接收信噪比,γ_e是窃听节点接收信噪比。硬件噪声的影响在这里会直接反映到γ的表达式中。考虑硬件损伤后,合法接收端等效信噪比不是简单地把噪声项换成热噪声+P_硬件,而是:
[ \gamma_d = \frac{P_t |h_{s,d}|^2}{\sigma^2 + \kappa_t P_t + \kappa_r P_t |h_{s,d}|^2} ]
这里分母第一项是热噪声,第二项是发射端硬件损伤,第三项是接收端硬件损伤。可以看到,分母里含有信道增益的项会把高信噪比的收益“压平”,即使发射功率再大,等效信噪比也会趋近于某个上限。这就是硬件损伤导致的“信噪比天花板效应”。
多跳场景下,每个中继节点都经历一次“接收-放大/译码-再发送”的过程,噪声逐级累积,安全速率也要逐段计算后取最小值。整条路径的安全速率等于路径上各跳安全速率的最小值,因为端到端通信的安全性由最弱的一跳决定。这个结论很重要,它意味着路径选择算法不是在一堆跳出里随便挑个平均最高的,而是要找“最不拖后腿”的那条路。目标函数就可以写为:
[ R_s^{path} = \min_{i=1,\dots,N} R_s^{(i)} ]
路径选择的任务就变成:在所有候选路径集合中,找到使上式最大的那一条。
3. 路径选择策略与核心算法解析
3.1 为什么路径选择能提升安全性能
直接回答一个问题:路径选择为什么能提升安全性能?因为不同路径经过的中继节点不同,链路距离不同,各跳的信道状态不同,窃听者能截获的信号强度当然也不一样。选一条让窃听者收到信号最弱的路径,等于在提升合法端到端传输的“安全余量”。
你可以把WSN里的数据传输想象成一个快递员要从仓库送包裹到客户手里。正常目标是:包裹不能在途中被劫走。如果快递员选择的路线经过一片无监控区域且信号屏蔽良好,劫匪根本听不到包裹车的动静,那安全性自然高。而如果路线正中劫匪埋伏点,就算后段路况再好,包裹也得丢。路径选择算法就是这个“选路”的过程,在多个备选路线里权衡“哪条路被监控最薄弱”。
另一个层面,多跳传输本身在安全上有个天然优势:中间节点接收后重新发送信号,等于每跳都重新固定了发射功率,窃听者必须靠近某一跳才能截获较强信号。而路径选择进一步放大了这个优势——它主动把每一跳的位置“绕开”窃听者的高收益区域。
3.2 候选路径生成与筛选流程
路径选择的第一步是生成候选路径。不能把所有节点排列组合都试一遍,那样复杂度指数爆炸。实际做法是两步走:先用广度优先搜索(BFS)或者K条最短路径算法生成一组数量可控的候选路径,再做路径安全速率评估与排序。
在Matlab里生成候选路径,我习惯这样写:
% 生成邻接矩阵,节点之间距离小于通信半径则连边 adjMatrix = zeros(N_nodes, N_nodes); for i = 1:N_nodes for j = i+1:N_nodes dist = norm(pos(i,:) - pos(j,:)); if dist <= commRange adjMatrix(i,j) = 1; adjMatrix(j,i) = 1; end end end % 用BFS枚举从源到汇聚的所有路径(限制最大跳数) paths = {}; queue = {srcNode}; while ~isempty(queue) currentPath = queue{1}; queue(1) = []; lastNode = currentPath(end); if lastNode == sinkNode paths{end+1} = currentPath; % 找到一条完整路径 continue; end if length(currentPath) > maxHops continue; % 超过最大跳数直接剪枝 end neighbors = find(adjMatrix(lastNode,:)); for k = 1:length(neighbors) if ~ismember(neighbors(k), currentPath) newPath = [currentPath, neighbors(k)]; queue{end+1} = newPath; end end end这段代码生成的候选路径数量取决于网络密度和最大跳数限制。实际仿真中,如果节点数量在20个以内,路径数量不会太多,运算完全可接受。如果节点数量达到50个以上,就需要用Yen算法或者限制跳数下限来剪枝,否则内存撑不住。
筛选原则我提三个实用建议:
- 跳数越少越好,因为每跳都引入噪声累积和硬件失真,跳数多虽然在能量上分摊了压力,但在信息传输质量上是不利的;
- 尽量避开窃听者周边区域,算法上可以通过给窃听者附近链路的安全速率加一个惩罚系数来实现;
- 每一跳的距离尽量均衡,避免出现“超长跳”导致接收信噪比断崖式下降。
3.3 路径安全速率的迭代评估方法
候选路径生成完后,要对每一条路径评估其端到端安全速率。这里涉及的一件麻烦事是:每一跳的信号传输,窃听者也有机会截获。所以路径的每一跳都有两个速率要算:合法中继接收速率和窃听者截获速率。整跳的安全速率是两者差值取正。
在Matlab里实现这个评估过程,核心代码如下:
function R_s_path = evaluatePath(path, chanParams, noiseParams, taps) R_s_path = inf; for hop = 1:length(path)-1 txNode = path(hop); rxNode = path(hop+1); % 合法链路的信道系数 h_d = channelGain(pos(txNode,:), pos(rxNode,:), chanParams); % 窃听链路的信道系数 h_e = channelGain(pos(txNode,:), pos(evNode,:), chanParams); % 计算合法接收等效信噪比 gamma_d = computeSNR(h_d, P_t, noiseParams); % 计算窃听接收等效信噪比 gamma_e = computeSNR(h_e, P_t, noiseParams); % 该跳安全速率 R_s_hop = log2((1+gamma_d)/(1+gamma_e)); if R_s_hop < R_s_path R_s_path = R_s_hop; end end R_s_path = max(R_s_path, 0); end这里的channelGain函数生成复信道系数并考虑路径损耗和衰落,computeSNR函数根据2.2节中的公式计算等效信噪比。评估完成之后,在候选路径集合里挑R_s_path最大的那条作为最优路径。
需要注意一点:在信道路径损耗固定、但小尺度衰落随机的情况下,单次评估选出的最优路径可能只是“瞬时最优”。更稳健的做法是进行多次信道实现,统计每条路径的平均安全速率和中断概率,再做路径决策。这个我在项目里实际是分成两层做的:第一层用平均信道状态做路径预选,第二层在每个传输时隙里结合瞬时信道状态做微调。两层结合的效果比单层好得多。
3.4 算法复杂度与实时性权衡
说实话,路径选择算法在真实WSN里要落地,实时性是个躲不开的门槛。节点本身计算能力有限,不可能像Matlab仿真里那样把所有路径都枚举一遍再排序。为了贴近实际,我在这个项目里做了两个简化。
第一个简化:候选路径集合不是每时隙都重新生成。网络拓扑在没有节点死亡的情况下是稳定的,候选路径集合只需要在初始化阶段生成一次,之后每隔若干时隙或者信道状态发生显著变化时再更新。第二个简化:评估路径时不采用瞬时信道状态,而是使用统计平均的信道增益和信噪比,这样避免了频繁信道估计带来的开销。
路径选择算法整体复杂度我做了一个简单的对比,如下表所示:
| 指标 | 穷举全路径 | 限制跳数+剪枝 | 实时微调 |
|---|---|---|---|
| 时间复杂度 | 指数级 | 多项式级 | 线性级 |
| 所需信道信息 | 全局CSI | 全局统计CSI | 局部瞬时CSI |
| 适合网络规模 | ≤10节点 | 10~30节点 | ≥30节点 |
| 抗信道变化能力 | 弱 | 中 | 强 |
这个项目选的是中间路线:限制跳数生成路径,统计CSI预评估,瞬时CSI微调。这个方案的复杂度可以接受,而且在5到30个节点规模的WSN里,仿真性能和算法耗时都能得到很好的平衡。
4. Matlab仿真实现与关键代码解读
4.1 整体仿真框架搭建
仿真程序的结构我按“初始化-信道生成-路径选择-性能统计”四个模块来组织。用脚本文件划分的话,大概是这样的文件结构:
| 文件/模块 | 功能 |
|---|---|
| initNetwork.m | 初始化节点位置、角色、发射功率、噪声参数 |
| generateChannel.m | 生成所有链路的信道系数 |
| pathSelection.m | 候选路径生成与评估 |
| runSimulation.m | 蒙特卡洛主循环,统计安全速率、中断概率等指标 |
| plotResults.m | 绘制安全速率对比曲线和网络拓扑示意 |
先看初始化部分。节点布局我用两类方式混合:一类是网格规则布局,方便调试;一类是随机散布,模拟真实场景。随机散布的时候要保证节点不重叠,中继节点和窃听节点的位置尤其要控制好。窃听节点不能离源节点太近,否则合法传输的信息刚发出就被截获,安全速率大概率为零,路径选择算法再怎么优化也无力回天。
初始化代码的核心片段:
% 区域范围 areaSize = [100, 100]; rng(42); % 固定随机种子,保证结果可复现 % 随机生成节点坐标 pos = rand(N_nodes, 2) .* repmat(areaSize, N_nodes, 1); % 固定源节点和汇聚节点 pos(srcNode,:) = [5, 50]; pos(sinkNode,:) = [95, 50];这里固定源节点和汇聚节点,一是为了避免随机生成导致源与汇聚距离过近、失去多跳意义;二是让实验对比时不同方案之间的拓扑差异只来自中继节点布局,不来自端节点位置。
4.2 硬件噪声参数的设定逻辑
硬件噪声参数是整个仿真里最容易“拍脑袋”的地方。我建议先设置几组基准值,做敏感性分析,再固定到最终数值。常见的做法是:
- 发射端损伤系数 κ_t ∈ {0.01, 0.05, 0.1}
- 接收端损伤系数 κ_r ∈ {0.01, 0.05, 0.1}
- 热噪声功率取 -90 dBm,发射功率取 0 dBm 到 20 dBm 之间
需要注意的是,硬件噪声系数如果设得太高,合法信道的SNR天花板会压得非常低,任何路径选择算法都救不回来,曲线全平了,论文写起来很不好看;设得太低,又等于退回到理想硬件模型,白做了硬件噪声建模。比较稳妥的值是κ_t和κ_r都取0.05到0.1之间,此时能明显看到硬件损伤对安全速率的压制作用,同时路径选择算法依然能分出优劣。
我在初始化代码里这样写:
% 硬件损伤参数 kappa_t = 0.05; % 发射机硬件损伤系数 kappa_r = 0.07; % 接收机硬件损伤系数 noisePower = 10^(-90/10); % 热噪声功率,单位W P_t = 10^(10/10); % 发射功率 10dBm4.3 蒙特卡洛主循环与性能统计
蒙特卡洛仿真的核心思想就是对同一个拓扑重复生成多次信道实现,统计出路径选择算法平均性能。循环里每一步做的事情:
- 生成所有链路的信道系数;
- 运行路径选择算法获得当前最优路径;
- 计算该路径的端到端安全速率;
- 记录该次是否发生安全中断(安全速率低于目标速率)。
在Matlab里,循环体不要写得过于复杂。信道重新生成的部分可以直接调用generateChannel函数,剩下的交给矩阵计算。我写过一个版本的循环体,运行5000次蒙特卡洛,20个节点的网络耗时大概在十分钟左右。如果你机器慢或者节点更多,可以减少循环次数,或者用parfor并行化。这个提升极明显,四核机器基本能把耗时压到四分之一。
关于安全中断概率的计算,这里有一个容易踩坑的地方:安全中断的定义到底是“安全速率为零”还是“安全速率低于目标速率”。在很多文献里用的是后者,因为即使安全速率为正但低于需求速率,传输仍然是不可用的。我在项目里把目标安全速率设为1 bit/s/Hz,对应的中断概率能清楚地反映路径选择和硬件噪声对安全性的影响。
4.4 关键代码运行结果解读
仿真完成后,结果的可视化是决定你是否能一眼看出门道的环节。我通常输出三个图:
第一张图是网络拓扑示意图,标出节点位置、选中路径和窃听者位置,直观展示路径选择如何绕开窃听者;
第二张图是不同算法下的安全速率CDF曲线,横轴是安全速率,纵轴是累积概率,能看出路径选择算法是否整体拉高了安全速率的分布;
第三张图是安全中断概率随发射功率的变化曲线,这是我判断系统性能的“第一指标”。
以一组实际仿真结果为例。节点总数15个,窃听者1个,路径损耗指数3.5,硬件噪声系数κ_t=0.05、κ_r=0.07,发射功率从0 dBm到20 dBm递增。运行2000次蒙特卡洛后,路径选择算法的平均安全速率比固定最短路径算法高约35%,安全中断概率在10 dBm发射功率处降低了约40%。这个提升在论文里是相当可观的。
再看硬件噪声的影响:如果κ_t和κ_r都设置为0(理想硬件),安全速率会高出约20%,但这是“虚假的乐观”——实际传感器节点的硬件损伤根本不可能为零。所以论文里一定要同时给出理想硬件和实际硬件两组结果作为对比,才能说明路径选择的提升不是靠理想化假设“刷”出来的。
5. 典型问题与调试记录
5.1 安全速率恒为0的问题
这是我第一次跑这个仿真时遇到的最大的坑。跑了半天,发现路径选择算出来的安全速率全部是0,一开始还以为算法写错了,后来逐步排查发现问题出在窃听节点位置上。源节点固定在(5,50),窃听节点放在(30,50),距离源节点只有25米,而合法路径的第一跳通常也在这个距离量级上,导致窃听信道质量与合法信道质量相当甚至更好,安全速率被压到零。
排查思路分享给你:
- 先输出每一跳的合法SNR和窃听SNR,看差值是否为负;
- 再检查路径选择目标函数里是否对R_s做了max(0, ·)处理——如果已经处理,那么安全速率为0不一定代表算法错,可能是信道条件太差;
- 最后调整窃听者位置,让它处在合法路径中段的侧翼位置,而不是贴脸位置。
调整之后,安全速率立刻有区分度了。这个经验说明一个道理:仿真里的“性能增强”需要在合理的场景配置下才能体现,场景本身设置得一边倒,再强的算法也白搭。
5.2 硬件噪声系数导致结果波动剧烈
当κ_t和κ_r设置过大(超过0.15)时,合法信道的SNR天花板效应会让安全速率曲线变得很平稳但不是因为算法好,而是因为所有路径的速率都被压在了同一个低水平上。这时候路径选择算法的优势体现不出来,曲线几乎重合。
解决方式就是做敏感性分析,先跑一组不同κ值下的结果,确定一个能让路径选择算法产生明显区分度的参数区间。我建议的流程是:
- 固定其他参数,分别取κ=0(理想),0.01,0.05,0.1;
- 跑出四组安全中断概率曲线;
- 看四条曲线的间距,间距过小说明参数设置不合适,间距过大则要检查是否算法退化成“选最近路径”。
这个方法能帮你快速找到“甜点区间”。我个人的经验是,0.03到0.08之间是比较合适的范围。
5.3 候选路径数量爆炸的问题
节点数一旦超过25个,邻接矩阵里很多节点两两互连,BFS枚举出来的路径数量可以轻松到几万条。此时评估所有路径的耗时线性上涨,整个仿真循环跑完可能要几个小时。
我的处理方案是三层限制:
- 限制最大跳数。源到汇聚的直线距离除以通信半径,往上取整再加1,就是合理的最大跳数;
- 限制路径最小跳数。小于等于2跳的路径直接排除,因为这种路径等于没有中继选择空间;
- 随机采样。如果路径数量仍然过多,就随机抽取一部分作为候选集合,而不是全部枚举。注意随机采样的随机种子要固定,保证可复现。
这三个手段叠加以后,候选路径数量能被压到50条以内,性能损失非常小,因为真正有竞争力的路径就那么几条,穷举的价值并不高。
5.4 固定随机种子的必要性
搞仿真的老手都明白,随机种子不固定,结果每次跑都不一样,除非你只在意趋势不在意具体数值。但要写论文、做对比实验,或者给导师汇报,数值必须稳定可复现。整个仿真过程里凡是涉及随机的部分,处处都要固定种子。
我在每个模块的入口都放了rng设置,这样不管怎么调整模块顺序,结果都是确定的:
rng(2024001); % 初始化网络随机种子 rng(2024002); % 信道生成随机种子固定种子还有一个好处:调试时可以反复跑同一组信道数据,定位算法问题,而不会被随机性干扰。这个习惯是真的能省下大量排错时间。
6. 个人取舍与实操建议
最后聊几句实在的。这个项目我整体跑下来,最大的体会是:路径选择算法的性能提升是一个系统工程,不是光写对目标函数就行。节点布局、信道参数、硬件噪声系数、窃听者位置、候选路径数量限制,任何一个环节设置不合理,最终结果都会失真。
如果你打算在硕士论文里用这套仿真框架,我建议在对比实验里加入三组方案:理想硬件环境下的路径选择、实际硬件噪声下的路径选择、以及固定最短路径作为基线。三组结果放在一张图里,既能直观展示路径选择的增益,又能体现硬件噪声建模的必要性,评审看起来会非常舒服。
还有一点个人经验:这篇项目里所有信道模型都用的是经典瑞利衰落加路径损耗,这是安全速率表达式能做到闭式解析的边界。如果你想继续扩展,可以考虑加Nakagami或相关阴影衰落,但大概率没有闭式解,就得靠蒙特卡洛硬算,代码复杂度会提升一个档次。
真正的工业场景里,被动窃听者位置并不总是已知的。真实部署时更常见的做法是:默认最坏情况下的窃听者位置分布,保守地选择路径。也就是说,路径选择算法里用的窃听信道不是某一个固定节点的信道,而是附近多个潜在窃听位置中的“最强者”。这个思路改动起来也不麻烦,把评估窃听速率时单点取信道改成多点取最大值就行,效果会稳健很多。
如果让我重新设计一遍这个仿真,我会把重点放在“联合能量与安全”的路径选择上,把节点剩余能量也纳入目标函数。毕竟一个节点如果因为反复被选中作为中继而过早耗电死亡,那整条路径的安全速率再高也没有意义。这属于下一步扩展,你可以根据自己课题的实际需求决定要不要加。