MATLAB仿真对比LEACH、LEACH-C与TS-I-LEACH无线传感器网络节能路由协议

发布时间:2026/9/2 6:22:14
MATLAB仿真对比LEACH、LEACH-C与TS-I-LEACH无线传感器网络节能路由协议 简介本资源是一套面向本科及硕士阶段无线传感器网络WSN教学与科研的MATLAB仿真代码包聚焦LEACH协议及其改进算法的建模仿真涵盖经典分布式LEACH、集中式LEACH-C以及基于时间同步优化的TS-I-LEACH三种协议实现适用于低功耗路由机制学习、算法对比分析与课程设计实践。压缩包共13个文件含4个核心MATLAB脚本.m实现主流程与协议逻辑7张PNG图像直观展示簇头分布、能量消耗曲线与轮次性能对比结果1个说明文档.txt提供运行指引与参数配置说明另有1个备份文件.asv整体体积仅493KB轻量易部署。已有173人下载学习所有代码经MATLAB 2014a/2019a实测可直接运行附带完整仿真结果图便于理解协议工作机制、验证能耗均衡性与生命周期差异是开展WSN协议仿真实验与算法改进研究的实用入门材料。1. 项目背景与无线传感器网络路由协议概述无线传感器网络WSN是物联网和智能感知领域的基石它由大量资源受限的微型传感器节点构成负责在特定区域内协作地感知、采集和处理信息。然而这些节点通常由电池供电部署在环境恶劣或难以接近的区域更换电池几乎不可能。因此如何高效地管理和利用节点有限的能量最大限度地延长整个网络的生存时间成为了WSN研究中最核心、最经典的挑战。路由协议作为决定数据从源节点到汇聚节点传输路径的“交通规则”其设计优劣直接决定了网络能量的消耗速度。一个糟糕的路由协议可能导致部分节点过早耗尽能量而失效形成网络空洞甚至导致整个网络瘫痪。在众多节能路由协议中LEACHLow-Energy Adaptive Clustering Hierarchy协议无疑是一座里程碑。它由MIT的研究者在2000年提出其核心思想是通过分簇和轮转机制来均衡网络负载。简单来说LEACH将网络运作划分为一个个的“轮次”。在每一轮开始时所有节点通过一个随机概率决定自己是否成为本轮的“簇头”。簇头负责接收其周围普通成员节点的数据进行数据融合以消除冗余然后将聚合后的数据发送给远方的基站Sink。普通节点则只需将数据发送给距离自己最近的簇头从而避免了每个节点都进行长距离通信的巨大能耗。由于簇头承担了更多的通信和计算任务其能量消耗远大于普通节点。LEACH通过随机轮换簇头的方式让能量消耗的重担由网络中的所有节点共同分担避免了少数节点因一直担任簇头而过早死亡从而显著延长了网络寿命。然而经典的LEACH协议也存在一些明显的缺陷。例如其簇头选举是完全随机的可能导致本轮选举出的簇头恰好是能量很低的节点或者簇头在地理上分布不均造成部分区域通信负载过重。为了改进这些问题后续研究者提出了许多LEACH的变种协议。其中LEACH-CLEACH-Centralized和TS-I-LEACHTwo-Stage Improved LEACH就是两个具有代表性的改进方案。LEACH-C引入了基站的中心控制能力由基站根据全局信息如节点位置和剩余能量来优化簇头的选择和分簇结果从而获得更优的网络拓扑。而TS-I-LEACH则通过引入一个两阶段的簇头选举机制综合考虑节点的剩余能量和到基站的距离旨在选举出能量更充足、位置更合理的节点作为簇头。本次我们借助MATLAB这一强大的科学计算与仿真平台来亲手实现并对比分析这三种协议。MATLAB因其强大的矩阵运算能力、丰富的可视化工具以及相对友好的编程接口成为了通信网络仿真尤其是算法原型验证的利器。通过仿真我们可以直观地观察网络拓扑的动态变化、节点能量的衰减过程、网络生存时间等关键指标从而深刻理解不同协议设计背后的逻辑与优劣。这不仅仅是一次代码编写练习更是一次深入无线传感器网络核心机制的探索之旅。2. 仿真环境搭建与核心参数设计在开始编写任何一行协议代码之前搭建一个合理、可复现的仿真环境是至关重要的。这就像进行物理实验前需要校准仪器一样一个定义清晰的仿真场景是后续所有分析和结论可信的基础。我们的仿真环境将基于一个经典的WSN场景进行构建。2.1 网络场景与节点模型定义我们假设将100个传感器节点随机部署在一个100米 x 100米的方形监测区域内。基站Sink的位置对协议性能有显著影响通常将其置于区域外或区域中心。为了体现长距离通信的能耗我们将基站设置在区域外的坐标50, 175处。每个节点在初始化时被赋予相同的初始能量例如0.5焦耳J。这个能量值虽然不大但对于仿真中定义的能耗模型来说是一个合适的量级。节点的能耗模型是整个仿真的心脏它决定了每一次通信行为所付出的“代价”。我们采用在WSN研究中被广泛接受的第一阶无线电模型。这个模型将发送和接收数据的能耗分解为电路运行能耗和功率放大能耗。发送能耗 发送一个l比特的数据包到距离d处的接收方其能耗E_Tx计算公式为E_Tx(l, d) l * E_elec l * ε_fs * d^2当 d d0E_Tx(l, d) l * E_elec l * ε_mp * d^4当 d d0 其中E_elec是发射电路或接收电路处理每比特数据所消耗的能量如50 nJ/bit。ε_fs和ε_mp分别是自由空间和多径衰减模型的功率放大系数。d0是一个距离阈值通常根据环境计算得出当通信距离小于d0时路径损耗与距离平方成正比大于等于d0时与距离四次方成正比这模拟了真实环境中远距离通信能耗急剧增加的现象。接收能耗 接收一个l比特的数据包能耗E_Rx为E_Rx(l) l * E_elec它只包含电路处理能耗。数据融合能耗 簇头节点在将成员节点的数据转发给基站前会进行数据融合以压缩冗余信息。我们假设簇头每处理来自一个成员节点的1比特数据需要消耗E_DA焦耳的能量如5 nJ/bit/signal。在MATLAB中我们会将这些参数定义为全局变量或通过结构体传递方便管理和修改。% 仿真参数示例 Params.num_nodes 100; % 节点总数 Params.field_size 100; % 区域大小 (米) Params.sink.x 50; % 基站x坐标 Params.sink.y 175; % 基站y坐标 Params.E_init 0.5; % 节点初始能量 (J) Params.E_elec 50e-9; % 发射/接收电路能耗 (J/bit) Params.E_fs 10e-12; % 自由空间放大系数 (J/bit/m^2) Params.E_mp 0.0013e-12; % 多径衰减放大系数 (J/bit/m^4) Params.E_da 5e-9; % 数据融合能耗 (J/bit/signal) Params.d0 sqrt(Params.E_fs / Params.E_mp); % 距离阈值 Params.packet_length 4000; % 数据包长度 (比特)2.2 仿真流程与性能指标仿真的核心是一个大循环每一轮循环代表网络运行的一个“轮次”。在每一轮中三种协议LEACH, LEACH-C, TS-I-LEACH会依次执行其特有的簇头选举和稳态数据传输阶段并更新所有节点的剩余能量。当网络中存活节点能量0的数量低于某个阈值例如20%时仿真停止。我们需要记录并对比的关键性能指标包括网络生存时间通常用“第一个节点死亡FND”、“一半节点死亡HND”和“最后一个节点死亡LND”的轮次来衡量。FND往往更能反映网络的覆盖质量。网络总剩余能量随时间轮次的变化曲线反映了协议的整体节能效率。每轮数据包成功传输量发送到基站的总数据量反映了网络的数据吞吐能力。簇头分布可视化通过动画或静态图展示不同轮次下簇头节点的位置直观比较簇头选举策略的优劣。注意在MATLAB中实现动画或实时绘图可能会显著降低仿真速度。一种实用的做法是每间隔一定轮次如每10轮或50轮绘制并保存一帧拓扑图或者在仿真结束后统一绘制关键轮次的快照。3. 经典LEACH协议随机分簇的奠基者LEACH协议的核心魅力在于其分布式和自组织的特性它不需要任何全局信息每个节点仅根据一个随机数和预设的概率独立决定自己是否成为簇头。3.1 簇头选举的随机阈值算法在每一轮开始时每个节点i都会生成一个0到1之间的随机数并将其与一个动态阈值T(n)进行比较。如果随机数小于T(n)则该节点宣布自己为本轮簇头。阈值T(n)的计算公式是协议均衡性的关键T(n) p / (1 - p * (r mod (1/p))), 如果 n ∈ GT(n) 0, 其他情况其中p是期望的簇头百分比例如0.05即5%的节点成为簇头。r是当前轮次索引从0开始。G是在过去1/p轮中未曾当选过簇头的节点集合。mod是取模运算。这个公式的设计非常巧妙。它确保概率收敛每个节点在每1/p轮中有且仅有一次机会成为簇头。随着轮次增加未当过簇头的节点其T(n)值会逐渐增大直到最终被选上。分布式执行每个节点只需要知道全局参数p、当前轮次r以及自己的历史状态过去1/p轮是否当过簇头就可以独立做出决定无需与其他节点通信协商。在MATLAB中实现时我们需要为每个节点维护一个状态变量记录其最近一次当选簇头的轮次以便判断它是否属于集合G。3.2 成簇与稳态传输阶段簇头选举完成后新当选的簇头节点会以相同的发射功率向全网广播一个“簇头宣告”消息。普通节点根据接收到的信号强度这里简化为距离选择加入信号最强的簇头并向其发送“加入请求”。至此分簇完成。随后进入稳态传输阶段该阶段被进一步划分为多个时隙。LEACH通常采用TDMA时分多址方式簇头为其所有成员节点分配一个专用的发送时隙。成员节点只在属于自己的时隙内唤醒并向簇头发送数据在其他时隙休眠以节省能量。簇头则在所有时隙保持唤醒接收数据并在所有成员数据接收完毕后进行数据融合然后在专用的“簇头间通信”时段如果存在或直接以较高功率将聚合数据发送给基站。3.3 MATLAB实现要点与常见陷阱在编写LEACH的MATLAB代码时有几个细节需要特别注意阈值的正确更新确保T(n)在每个节点每轮都根据公式重新计算。集合G的判断是关键逻辑错误会导致某些节点永远无法成为簇头或者频繁成为簇头。距离计算与能耗更新在计算节点间或节点到基站的距离时使用欧几里得距离。在更新节点能耗时必须严格按照能耗模型区分发送、接收和融合操作并根据距离d与d0的关系选择正确的放大系数。这是仿真结果是否可信的基石。“死亡”节点的处理一旦节点的能量降至0或以下应将其标记为“死亡”。死亡节点不再参与簇头选举、成簇和数据传输。在计算网络统计量如存活节点数、总能量时必须排除它们。避免循环依赖在计算能耗时发送方消耗的能量取决于接收方是谁以确定距离d。要确保在模拟一轮通信流程时数据流向清晰避免出现A向B发送数据但计算能耗时却用了A到C的距离这种错误。实操心得在调试初期可以设置一个很小的总轮数如5轮并详细打印出每一轮每个节点的状态是否簇头、剩余能量、所属簇ID等通过人工检查少数节点几轮内的行为来验证簇头选举逻辑和能耗计算是否正确。这是定位逻辑错误最有效的方法。4. 集中式LEACH-C协议全局优化的尝试LEACH-C协议认识到了完全随机选举的局限性它通过引入一个“控制中心”——基站来优化分簇过程。其核心思想是在每轮开始时所有存活节点将自己的当前位置和当前剩余能量信息发送给基站。基站拥有全局视野可以运行一个优化算法来产生本轮“最优”的簇头集合和分簇方案然后将方案广播回所有节点。4.1 基站的优化算法从随机到规划基站收到所有节点的信息后面临一个优化问题如何选择k个簇头k p * NN为存活节点数并将所有非簇头节点分配给其中一个簇头使得网络的总通信能耗最小这是一个典型的组合优化问题严格求解是NP难的。LEACH-C原论文中采用了一种模拟退火Simulated Annealing算法来寻找近似最优解。模拟退火算法的基本步骤是初始解随机生成一个分簇方案即随机指定k个簇头并将其他节点随机分配给最近的簇头。评估代价定义一个代价函数通常就是根据能耗模型计算该分簇方案下所有节点完成一轮数据传输所消耗的总能量。产生新解通过随机扰动当前解例如随机交换一个簇头和一个普通节点的角色或者将一个节点重新分配给另一个簇头来产生一个新解。接受新解计算新解的代价。如果新代价更低则接受新解如果更高则以一个随时间迭代次数衰减的概率接受它这是“退火”思想的体现有助于跳出局部最优。迭代重复步骤3和4直到满足停止条件如达到最大迭代次数或温度冷却到阈值。最终基站将得到的优化分簇方案每个节点的角色簇头或成员每个成员所属的簇头ID广播给全网。4.2 与LEACH的对比与开销分析LEACH-C的优势显而易见由于基站掌握了全局信息它产生的分簇方案通常比LEACH的随机分簇更优。簇头分布更均匀每个簇的规模更平衡并且可以倾向于选择剩余能量更高的节点作为簇头。这往往能带来更长的网络生存时间尤其是FND指标。然而LEACH-C的代价是额外的通信开销和计算开销通信开销每轮开始所有节点都需要向基站发送一次状态信息位置和能量。虽然这些控制包较小但在大规模网络中累积起来也是一笔不小的能量支出尤其是在节点距离基站较远时。计算开销模拟退火算法在基站端运行其计算复杂度远高于LEACH的简单随机数比较。对于资源丰富的基站来说这通常不是问题但这也意味着协议无法在完全分布式、无中心的环境中运行。单点故障与可扩展性整个网络的运行依赖于基站。如果基站失效或者网络规模极大导致基站处理不过来协议就会瘫痪。在MATLAB实现中我们需要单独编写模拟退火算法的模块。代价函数的计算需要模拟在该分簇方案下的一轮完整通信这是计算最密集的部分。为了提高仿真效率可以适当减少模拟退火的迭代次数或者采用更简单的启发式算法如直接选择能量最高的k个节点作为簇头然后将其他节点分配给最近的簇头作为对比。注意事项在计算LEACH-C的能耗时务必不要忘记计入每轮开始时所有节点向基站发送控制消息的能耗。很多初学者在实现时只计算了稳态数据传输的能耗导致LEACH-C的性能被高估。这部分开销是评估集中式协议时必须考虑的成本。5. 改进型TS-I-LEACH协议两阶段选举的权衡TS-I-LEACH协议试图在LEACH的完全分布式和LEACH-C的全局优化之间找到一个平衡点。它改进了LEACH的簇头选举机制引入了两阶段选举和更全面的选举因子但依然保持了分布式的特性无需基站参与每轮的全局优化。5.1 两阶段选举机制详解TS-I-LEACH的“两阶段”指的是候选簇头选举和最终簇头确认两个阶段。第一阶段候选簇头选举这一阶段类似于LEACH每个节点根据一个改进的阈值T(n)来决定是否成为候选簇头。T(n)在LEACH原始阈值的基础上引入了节点的剩余能量因子T(n) p / (1 - p * (r mod (1/p))) * (E_curr / E_avg) * (1 / D_to_sink_norm)注不同文献对T(n)的具体形式有不同定义但核心思想都是让剩余能量高、距离基站相对较近的节点有更高概率成为候选簇头。E_curr是节点当前能量E_avg是网络平均能量D_to_sink_norm是节点到基站距离的归一化值。这个公式使得能量充足、位置较好的节点更有可能进入候选池从源头上提升了簇头节点的平均质量。第二阶段最终簇头确认并非所有候选簇头都会成为最终的簇头。在第一阶段后每个候选簇头会广播一个包含自身ID和剩余能量的消息。其他候选簇头在收到消息后会将自己与邻居候选簇头进行比较。比较的准则通常是如果自己的剩余能量低于某个邻居候选簇头且距离该邻居足够近小于一个竞争半径R_comp则自己退出竞争放弃成为最终簇头。通过这种局部竞争可以避免在很小区域内产生多个簇头从而实现簇头在地理上的大致均匀分布。5.2 性能预期与实现难点TS-I-LEACH期望达到的效果是选举出的簇头节点既具有较高的剩余能量有利于担任簇头工作又能在空间上分布相对均匀有利于负载均衡。它比LEACH更智能又比LEACH-C开销小。在MATLAB中实现TS-I-LEACH的挑战在于竞争半径R_comp的设定这个参数没有统一的最优值需要根据网络密度和规模进行实验调整。设置过大会导致竞争过于激烈最终簇头数过少设置过小则竞争效果不明显簇头可能仍然聚集。局部信息的获取在第二阶段候选簇头需要知道邻居候选簇头的能量和位置信息。这需要通过额外的广播消息来实现增加了控制开销。在仿真中我们需要模拟这一广播和监听过程。阈值的归一化处理在计算T(n)时能量和距离可能需要归一化到[0,1]区间以避免某个因子占据绝对主导。归一化的方式如线性归一化、基于最大最小值归一化也会影响结果。踩坑实录在实现TS-I-LEACH时我曾忘记在第二阶段处理“退出竞争”的节点状态。导致这些节点虽然退出了簇头竞争但在后续代码中仍被当作普通节点处理而实际上它们在第一阶段已经是“候选簇头”不应再作为普通节点去加入其他簇。这造成了逻辑混乱和仿真错误。正确的做法是在第二阶段竞争结束后明确区分出“最终簇头”、“退出竞争的候选节点降级为普通节点”和“从一开始就是普通节点”三种状态。6. 仿真结果对比分析与深度解读在完成了三种协议的MATLAB实现并运行仿真后我们会得到一系列数据图表。如何解读这些图表并从中提炼出有意义的结论是仿真的最终目的。6.1 生存时间与能量效率对比我们通常会绘制“存活节点数 vs. 轮次”的曲线图。图中可以清晰标出FND、HND和LND的轮次。典型现象LEACH-C的FND和HND轮次通常会显著晚于LEACH这得益于其全局优化的分簇有效保护了能量较低的节点。TS-I-LEACH的曲线通常介于两者之间但更接近LEACH-C表明其改进是有效的。能量消耗曲线绘制“网络总剩余能量 vs. 轮次”曲线。LEACH的曲线下降速度可能最快且后期可能呈现不规则的阶梯状下降因为随机选举可能导致某些轮次能耗极高。LEACH-C的曲线下降通常最平缓、最稳定。TS-I-LEACH的曲线应比LEACH平缓。数据吞吐量对比绘制“每轮发送到基站的总数据量 vs. 轮次”曲线。在节点大量死亡前三种协议的数据量可能相近。但随着节点死亡LEACH可能因为簇头分布不均导致部分区域数据无法送达其吞吐量下降最快。LEACH-C和TS-I-LEACH由于拓扑更优能维持更长时间的有效数据传输。6.2 簇头分布可视化分析通过绘制不同轮次例如第1轮、第100轮、第300轮的网络拓扑快照用不同标记表示簇头、普通节点和死亡节点可以直观对比LEACH簇头分布随机可能出现空白区域无簇头或密集区域多个簇头紧挨着。LEACH-C簇头分布非常均匀几乎覆盖整个区域簇头间距大致相当。TS-I-LEACH簇头分布比LEACH均匀但可能不如LEACH-C完美偶尔会有两个簇头距离稍近。这种可视化能最直接地揭示不同选举策略的效果。6.3 协议选择与场景适配的思考仿真结果并非给出“谁绝对最好”的答案而是揭示了不同协议的适用场景LEACH适用于对网络生存时间要求相对宽松、节点成本极低、部署环境简单、或对分布式和鲁棒性要求极高的场景。它的简单性本身就是一种可靠性。LEACH-C适用于基站能力强大、能量充足或有线供电且对网络稳定性和寿命有极高要求的场景。例如在环境监测基站附近部署的传感器网络。TS-I-LEACH适用于希望获得比LEACH更好性能但又无法承担LEACH-C的集中式通信开销或网络不具备稳定中心节点的场景。它是一种不错的折中方案。此外仿真中的参数如节点密度、区域大小、基站位置、期望簇头百分比p都会显著影响协议的性能排名。例如在网络规模较小或节点密度极高时LEACH-C的优势可能不那么明显而当基站非常远时LEACH-C每轮的控制开销会变得非常大可能抵消其优化带来的收益。因此任何关于协议优劣的结论都必须基于具体的仿真场景和参数。7. MATLAB仿真进阶技巧与优化建议当基本仿真跑通后我们可以从工程和学术两个角度进行深化让整个项目更具价值。7.1 代码结构优化与可扩展性初始的仿真代码可能将所有协议的实现混在一个主脚本里随着逻辑变复杂这会难以维护。建议采用模块化设计simulation_main.m主脚本负责参数设置、仿真循环调度、结果绘图。leach_round.m函数输入当前网络状态输出执行一轮LEACH后的新状态和本轮能耗。leach_c_round.m函数实现LEACH-C的一轮操作内部调用模拟退火函数。ts_i_leach_round.m函数实现TS-I-LEACH的一轮操作。energy_model.m函数专门计算发送、接收、融合操作的能耗。plot_network.m函数负责绘制网络拓扑图。这样的结构清晰便于单独调试每个协议也方便未来集成新的协议进行对比。7.2 统计显著性分析与参数敏感性测试一次随机的节点部署和随机数序列得到的仿真结果可能具有偶然性。为了得到更可靠的结论需要进行多次蒙特卡洛仿真。多次运行在相同的全局参数下改变节点随机部署的种子和协议内部的随机数种子独立运行仿真程序N次例如20次。数据聚合对FND、HND、LND、总传输数据量等关键指标计算其N次运行的平均值和标准差或置信区间。结果展示在绘制生存曲线时可以绘制带阴影区域的曲线阴影部分表示多次运行结果的波动范围如±1个标准差这样能直观看出协议的鲁棒性。此外可以系统性地改变某个关键参数如期望簇头百分比p、节点初始能量E_init、网络规模num_nodes观察协议性能指标如何变化这称为参数敏感性分析。例如绘制“不同p值下的网络生存时间FND”曲线可以帮助我们为特定场景选择最优的p值。7.3 可视化与调试技巧实时调试在开发阶段可以在每轮循环结束后使用drawnow命令配合plot实时更新拓扑图观察协议动态执行过程这对于发现逻辑错误如簇头选举异常、节点状态转换错误非常有帮助。日志记录将关键事件如节点死亡、簇头选举结果写入日志文件或结构体便于仿真结束后进行回溯分析。性能剖析使用MATLAB的profile工具查看仿真代码的运行时间热点。通常距离计算尤其是嵌套循环计算所有节点两两距离和模拟退火算法是主要的耗时部分。对于距离计算可以尝试向量化操作来替代循环以提升仿真速度。通过这个完整的MATLAB仿真项目我们不仅复现了无线传感器网络路由协议从经典到改进的演进脉络更掌握了通过建模仿真来评估和比较通信协议性能的一套完整方法论。从环境参数设定、能耗模型编码到复杂选举算法的实现再到结果的可视化与统计分析每一步都锻炼了我们将理论转化为实践的能力。最重要的是我们理解了在工程设计中没有“银弹”任何优秀的方案都是在特定约束和需求下权衡利弊的结果。这种基于仿真的、量化的分析思维对于从事网络、通信乃至更广泛的系统设计工作都是极为宝贵的。本文还有配套的精品资源点击获取