资讯动态

无线传感器网络分簇路由协议LEACH与LEACH-C机制解析及Matlab仿真实践

发布时间:2026/9/12 7:21:57 来源:尧图企业网站定制
如果让我给刚接触无线传感器网络的研究生推荐一个入门协议我会毫不犹豫地说LEACH。不是说它性能最好——恰恰相反LEACH在今天几乎没人直接部署到真实设备上。但如果你把LEACH和LEACH-C吃透了后面看HEED、TEEN、PEGASIS、SEP这些协议时你会发现它们全都在跟LEACH的框架较劲。这篇文章把我自己做LEACH和LEACH-C协议研究时的笔记整理出来了包含协议机制拆解、Matlab仿真思路、代码骨架和一些踩坑记录。适合正在做无线传感器网络课设、毕设或者刚进实验室需要快速上手路由协议仿真的同学参考。1. 为什么几十年过去LEACH仍是理解无线传感器网络能耗的入门必修课1.1 无线传感器网络的能耗困局与分簇解法的由来无线传感器网络的核心矛盾说穿了就一句话节点电池容量有限但网络生命周期要求却很长。一个典型的应用场景是环境监测几十上百个节点撒在一片区域里每个节点负责采集温度、湿度或光照数据然后想办法把数据传到远处的基站。节点体积小电池基本不可更换如果每个节点都直接跟基站通信距离稍远的节点会很快耗尽电量整片网络没过多久就会出现“感知空洞”。早期平面路由协议的做法是泛洪和中继转发数据在节点间层层跳转。这种做法容易产生广播风暴同一个数据包被多次转发网络越稠密浪费越严重。后来研究者意识到不如让节点分组协作组内选一个“小队长”来汇总数据再由小队长统一发给基站。这个思路就是分簇路由而LEACHLow Energy Adaptive Clustering Hierarchy低功耗自适应分簇分层是2000年前后由Heinzelman等人提出的经典方案也是后来无数分簇协议的起点。LEACH的贡献不在于某一条公式有多惊艳而在于它用很简单的机制同时解决了两件大事降低通信距离和减少数据冗余。簇内成员短距离发给簇头簇头做数据融合后再发往基站整体能耗会大幅下降。这个思路到今天依然不过时LoRa、NB-IoT这类低功耗物联网体系里分簇和汇聚的思想也随处可见。1.2 LEACH和LEACH-C的关系一个分布、一个集中很多人第一次看论文时会疑惑LEACH和LEACH-C到底是不是两个完全不同的协议其实可以理解为同一个框架下的两种簇头决策方式。LEACH节点自己拿主意每个节点根据一个概率阈值随机决定自己要不要当簇头不需要基站参与。好处是不用全局信息自组织能力强坏处是随机性可能导致簇头扎堆或空缺。LEACH-C基站替大家做决定。每轮开始前节点把自己的位置和剩余能量上报给基站基站用模拟退火算法选出一组最优簇头再广播告知全网。好处是决策更稳、能耗更均衡坏处是依赖基站计算能力和全局信息控制开销也更大。这两种协议非常适合对照着研究因为差异点正好对应了分布式决策和集中式决策的典型利弊权衡。把它们的机制搞明白后续你去理解任何带“改进”二字的WSN协议都会快很多。1.3 哪些人适合把这两个协议当研究入口我大致把适合接触LEACH的人分成三类。第一类是刚开始做无线传感器网络研究的学生需要先建立一个“能耗视角”知道一个数据包从采集到送达基站能量到底花在了哪些环节。第二类是做智能优化算法与WSN结合的因为LEACH-C里的模拟退火选簇头完全可以替换成粒子群、遗传算法、蚁群算法这是很多论文的标准套路。第三类是做课程设计或毕设的LEACH和LEACH-C的Matlab仿真量适中结果可视化直观用来展示网络生命周期、能耗均衡性等概念非常合适。不管你是哪一类先把下面几章的核心机制吃透再动手跑仿真效果会好很多。2. LEACH分布式分簇机制每轮“抽签”是怎样保障公平的2.1 一个完整轮次里发生了什么LEACH把网络运行时间划分成很多个轮Round每一轮又分成建立阶段和稳定阶段。建立阶段的核心是选簇头。假设全网有100个节点预期的簇头比例 (p0.05)那么平均每轮应该有5个簇头。每个还没在本轮周期内当过簇头的节点都会算一个阈值 (T(n))然后取一个 (0) 到 (1) 之间的随机数如果随机数小于阈值就宣布当选。簇头选出来后会向周围广播一个很短的通知消息普通节点收到多个簇头的通知后选择信号最强也就是距离最近的那个加入簇头再给成员分配TDMA时隙。稳定阶段负责传数据。每个节点在自己被分配的时隙内把数据发给簇头其余时间可以睡觉。簇头收齐所有成员的数据后把它们融合成一个数据包再直接发送给基站。稳定阶段通常比建立阶段长得多因为建立阶段的控制消息属于额外开销占比越小网络能量利用效率越高。这里有一个容易忽略的细节LEACH要求所有节点都能直接跟基站通信也就是单跳模型。节点之间不需要多跳路由这降低了路由维护成本但也限制了网络规模。如果你以后看到多跳LEACH的改进论文多半就是为了解决这个限制。2.2 簇头选举阈值公式的数值演化LEACH选簇头的核心公式长这样[ T(n) \frac{p}{1 - p \times (r \bmod \frac{1}{p})} ]其中 (p) 是期望的簇头比例(r) 是当前轮次。计算时只考虑最近 (1/p) 轮内没有当选过簇头的节点集合 (G)如果节点不在 (G) 里阈值就是0。我第一次看这个公式觉得它很绕后来用数值算了一遍才明白它有多巧妙。假设 (p0.05)那么 (1/p20)也就是每20轮一个周期。某个节点在第一轮时(r \bmod 20 1)阈值是[ T \frac{0.05}{1 - 0.05 \times 1} \approx 0.0526 ]第二轮阈值变大一点[ T \frac{0.05}{1 - 0.05 \times 2} \approx 0.0556 ]第10轮的时候[ T \frac{0.05}{1 - 0.05 \times 10} 0.1 ]第19轮的时候[ T \frac{0.05}{1 - 0.05 \times 19} 0.5 ]也就是说随着周期推进还没当过簇头的节点越来越少阈值越来越高当选概率越来越大。到了周期末尾任何一个还没有当过簇头的节点都有50%的概率当选。到了第20轮(r \bmod 20 0)阈值又回到0.05同时 (G) 集合重置为所有节点新一轮洗牌开始。这个设计保证了两个关键性质同一个周期内每个节点最多当选一次同时节点长期来看当选机会相对均等。能量消耗不再集中在少数节点身上这是LEACH均衡能耗的思想基础。2.3 随机选举的隐患公平但不均匀公式保证的是数学期望上的公平但实际运行中随机性会让结果出现波动。比如这一轮选出的5个簇头可能恰好都集中在网络左下角右上角的大片成员节点要跨越很远的距离才能把数据送到簇头能耗立刻上去。下一轮又可能某个簇头周围只挂了两个成员负载严重不均衡。这个问题在仿真里会表现为单次实验的寿命曲线波动很大第一次节点死亡时间FND可能早也可能晚。所以我一直建议做对比实验时不要只跑一次而是固定多组随机种子做蒙特卡洛平均后面仿真部分会细说。3. 稳定阶段的TDMA调度与数据融合省电全靠这些细节3.1 TDMA时隙如何让节点按需开启射频很多人研究LEACH时只盯着簇头选举公式其实稳定阶段的TDMA调度才是省电的重要一环。簇头确定成员后会给每个成员分配一个独立的时隙成员只需要在自己的时隙里打开射频发送数据其他时间可以直接进入低功耗休眠状态。无线传感器节点的能耗大头是射频收发电路如果能减少射频开启时间就能实打实地省电。TDMA天然避免了簇内节点的数据碰撞所以不需要像载波监听那样反复侦听信道也节省了退避重传的开销。另外簇内通信采用CDMA码分多址来区分不同簇之间的信号簇间不会互相干扰传输可靠性也有保障。3.2 做一次完整能量账融合到底省了多少我们算一笔具体的账。假设数据包长度 (l4000) bit(E_{elec}50) nJ/bit(ε_{fs}10) pJ/bit/m²。一个节点把数据发给20米外的簇头时发送能耗为[ E_{Tx} l \times E_{elec} l \times ε_{fs} \times d^2 ]代入数字[ E_{Tx} 4000 \times 50 \times 10^{-9} 4000 \times 10 \times 10^{-12} \times 20^2 ]第一项是发射电路开销 (2 \times 10^{-4}) J第二项是放大功率开销 (1.6 \times 10^{-5}) J合计约 (2.16 \times 10^{-4}) J。如果节点直接把同样的数据发给150米外的基站显然超过了自由空间模型和双径衰落模型的分界阈值 (d_0 \approx 87) 米此时要用 (d^4) 模型[ E_{Tx} 4000 \times 50 \times 10^{-9} 4000 \times 0.0013 \times 10^{-12} \times 150^4 ]这一项算下来放大开销已经远超发射电路开销能耗会高出几个量级。所以“多跳短传”能省电的原因就在这里距离平方项甚至四次方项对能耗的影响是决定性的。再看数据融合。100个节点每个发4000bit数据给簇头簇头如果原封不动转发100个包到基站光能耗就是单个数据包的一百倍。LEACH的做法是簇头把100个包融合成1个数据包再发给基站融合能耗 (E_{DA}) 只有5 nJ/bit。这就相当于把100个人的零散汇报压缩成一份汇总报告通信量和能耗都被压缩到了一个很低的水平。3.3 簇头到基站的距离是隐藏的“能耗杀手”还有一个容易被忽略的问题是簇头到基站的距离差异。离基站远的簇头光“最后一跳”就要消耗大量能量数据包越重开销越大。这也是后面LEACH-C要重点优化的对象之一因为基站知道每个节点的位置可以让离基站远的节点尽量少承担簇头职责把转发任务交给出力更划算的节点。4. LEACH-C的集中式分簇设计把随机事件变成全局优化4.1 从位置报报到基站决策LEACH-C的执行流程LEACH-C和LEACH最大的不同是簇头由基站统一指定而不是节点自己抽签。每一轮开始的时候所有存活节点把自己的位置坐标和剩余能量打包发往基站。基站接收到所有节点的信息后先计算全网的平均剩余能量然后把能量低于平均值的节点排除掉只有高于平均能量的节点才有资格成为候选簇头。这一步非常关键。它的逻辑是能量太低的节点即使当选簇头也扛不住簇头的额外负载反而会加速死亡。基站接下来从候选节点里选出大约 (p \times N) 个节点作为簇头选的时候要同时考虑距离和剩余能量目标是让这一轮的网络总能耗尽量小同时簇头分布尽量均匀。选完后基站把簇头的ID、簇头与成员的对应关系广播给全网。节点根据广播消息知道自己属于哪个簇然后继续走TDMA和数据传输流程。数据平面的稳定传输阶段跟LEACH基本一样区别只在前面的控制平面多了一套上报和广播流程。4.2 模拟退火选簇头的目标和实现要点簇头选择为什么需要模拟退火因为从候选节点里挑出一组簇头要评估的不仅仅是这组节点的能耗还要把所有成员节点分配进最近的簇之后计算全网通信总代价。候选组合的数量随着节点数爆炸式增长穷举完全不现实贪心算法又容易陷入局部最优。模拟退火是解决这类组合优化问题的一个实用选择。目标函数可以写成[ E_{total} \sum_{i1}^{N} E_{Tx}(i, CH(i)) \sum_{c1}^{C} E_{Rx}(c) \sum_{c1}^{C} E_{DA}(c) \sum_{c1}^{C} E_{Tx}(c, BS) ]第一项是每个成员节点到所属簇头的发送能耗第二项是簇头接收成员数据的能耗第三项是簇头做融合计算的能耗第四项是簇头发往基站的能耗。整个优化目标就是让这个总和最小。模拟退火的关键参数一般是初始温度 (T_0)、降温系数 (\alpha)、每个温度下的迭代次数和终止温度。我常用的初始温度是1000降温系数0.95每次迭代50次终止温度1。实际操作中如果发现算法收敛太慢或者陷入局部最优优先检查初温和降温速率而不是盲目增加迭代次数。4.3 两种协议差异对照没有谁是全面优胜者我把LEACH和LEACH-C的差异做成了一张表方便后面做仿真时对照思考。对比维度LEACHLEACH-C簇头决策方式节点分布式抽签基站集中式优化选点所需全局信息无需要所有节点的位置和能量控制开销较低较高每轮都有位置上报和广播簇头数量稳定性波动较大相对稳定簇头空间分布可能扎堆或空缺可通过目标函数调节均匀性对基站算力的要求无特殊要求需要执行全局优化典型优势自组织、部署简单能耗更均衡、生命周期更长典型劣势簇头分布不均依赖全局信息和计算扩展性受限从仿真结果来看LEACH-C在第一个节点死亡时间上通常明显晚于LEACH因为它从能量和距离两个维度同时做了优化。但它的代价是每轮额外的信息上报量以及基站需要维护全局状态。这本质上是一个性能和开销的权衡。5. Matlab仿真的搭建过程参数、数据结构和两套主循环5.1 核心参数和能量模型设定用Matlab做无线传感器网络协议仿真最大的好处是矩阵运算方便画图方便调试起来非常直观。我常用的初始参数如下这些参数基本沿用了很多论文里的经典设置方便跟别人的结果横向对比。参数取值网络区域100 m × 100 m节点数量100基站位置(50, 150)区域外节点初始能量0.5 J数据包长度4000 bit控制包长度100 bit簇头比例 p0.05发射/接收电路能耗 E_elec50 nJ/bit自由空间功放系数 ε_fs10 pJ/bit/m²双径衰落功放系数 ε_mp0.0013 pJ/bit/m⁴数据融合能耗 E_DA5 nJ/bit能量模型的分界距离 (d_0) 是这么算出来的[ d_0 \sqrt{\frac{ε_{fs}}{ε_{mp}}} \sqrt{\frac{10}{0.0013}} \approx 87.7 \text{ m} ]距离小于 (d_0) 用自由空间模型 (d^2)大于等于 (d_0) 用双径衰落模型 (d^4)。这个分界的意义在于远距离通信的能耗增长非常快所以协议最好让大部分通信都发生在短距离内这也是分簇要解决的原始问题。5.2 节点数据结构的组织方式Matlab里我习惯用结构体数组来管理节点。每个节点的字段包括坐标、剩余能量、存活状态、是否簇头等。nodes struct(x, [], y, [], energy, [], alive, [], isCH, []); for i 1:numNodes nodes(i).x netSize * rand; nodes(i).y netSize * rand; nodes(i).energy energy0; nodes(i).alive 1; nodes(i).isCH 0; end我建议不要在一开始就把簇头相关字段都塞进去而是保持结构跟协议流程对应。后面每一轮里先调用选举函数再更新状态结构会清晰很多。5.3 LEACH主循环的骨架代码核心循环逻辑按轮推进每一轮先做簇头选举再完成数据传输和能量更新。for r 1:maxRounds % 1. 找出所有存活节点 aliveIdx find([nodes.alive] 1); if isempty(aliveIdx) break; end % 2. 簇头选举分布式随机选举 CH []; for i aliveIdx if nodes(i).isCH 0 threshold p / (1 - p * mod(r, round(1/p))); if rand threshold nodes(i).isCH 1; CH [CH, i]; end end end % 3. 非簇头节点选择最近的簇头 for i aliveIdx if nodes(i).isCH 0 [minDist, chosenCH] findNearestCH(i, CH, nodes); % 记录归属关系后面算能耗要用 end end % 4. 稳定传输成员发数据给簇头簇头融合后发给基站 for i aliveIdx if nodes(i).isCH 1 % 接收成员数据 融合 发往基站 else % 发送数据给簇头 end end % 5. 更新能量标记死亡节点 for i 1:numNodes if nodes(i).energy 0 nodes(i).alive 0; nodes(i).energy 0; end end end实际写代码的时候第4步要按前面给出的能量公式计算发送和接收能耗然后从相应节点的剩余能量里扣除。每个节点传完数据之后立刻检查能量是否耗尽避免出现负数。5.4 LEACH-C代码改造与模拟退火核心改成LEACH-C时把第2步整个替换为基站集中决策就好。基站在这一步先收集所有节点上报的位置和能量再调用一个模拟退火函数返回选中的簇头集合。% LEACH-C的核心模拟退火选簇头 meanEnergy mean([nodes(aliveIdx).energy]); candidate aliveIdx([nodes(aliveIdx).energy] meanEnergy); numCH max(5, round(p * numNodes)); numCandidate length(candidate); % 随机初始化一组簇头集合 currentSet candidate(randperm(numCandidate, min(numCH, numCandidate))); currentCost calcTotalCost(currentSet, nodes, baseStation); T 1000; alpha 0.95; T_end 1; while T T_end for k 1:50 % 扰动随机替换一个候选簇头 newSet currentSet; idx randi(length(newSet)); newIdx candidate(randi(numCandidate)); newSet(idx) newIdx; newCost calcTotalCost(newSet, nodes, baseStation); if newCost currentCost || rand exp(-(newCost - currentCost) / T) currentSet newSet; currentCost newCost; end end T T * alpha; end CH currentSet;calcTotalCost函数里要计算每个非簇头节点到最近簇头的距离累积发送能耗再计算簇头的接收、融合和转发能耗。这一步是全仿真里最容易出错的地方一定要对照能量模型逐项核对。跑完协议流程后我会每隔10轮记录一次存活节点数量和网络剩余总能量最后画出存活节点数随轮次变化的曲线以及网络总能量下降曲线。这两条曲线用来评价协议生命周期和能耗效率非常直观。6. 仿真结果解读与排错经验曲线背后的真实信息6.1 生命周期指标怎么选FND、HND各有偏向评估无线传感器网络协议性能时最常用的指标是生命周期但“生命周期”本身有歧义。不同论文会采用不同的定义。FNDFirst Node Death第一个节点死亡时的轮数代表网络开始出现覆盖空洞的时间点。HNDHalf Nodes Death一半节点死亡时的轮数代表网络服务能力大幅下降的时间点。LNDLast Node Death最后一个节点死亡的轮数代表网络彻底瘫痪的时间点。只看LND会掩盖问题。有些协议在前期能耗控制得很好但最后几个节点的能量利用率极差LND也很长有些协议前期就出现节点大量死亡但最后几个节点因为距离近反而能撑很久。所以我一般建议至少同时报告FND和HND两个指标。如果做数值对比最好对同一组随机种子跑10次或20次取平均否则单次实验受随机性影响太大得不出稳定的结论。6.2 一次对比仿真带来的直观结论以我常用的参数配置0.5J初始能量、100个节点、基站放在(50,150)跑完一轮仿真LEACH的存活曲线通常是前期平滑到中期开始出现明显下降最后一段尾部拖得很长。LEACH-C的曲线在前期更平缓FND明显更晚但一旦开始节点死亡曲线下降速度往往更陡。这个现象不难解释。LEACH-C选簇头时综合考虑了剩余能量和距离前中期能耗更均匀所以能推迟第一个节点死亡。但是到网络后期剩余节点分布比较稀疏基站再怎么优化也难挡整体能量耗尽的趋势所以曲线尾部会快速下沉。LEACH-C并不是全过程的“赢家”它赢在更长的“高质量服务期”这个结论在很多改进型协议的研究里也是通用的。6.3 几个容易让结果“变假”的调试坑第一个坑是随机种子不一致。对比协议时如果在网络初始化阶段没有固定随机种子两组实验的节点坐标和能量消耗完全不同对比就没意义了。我的做法是在初始化之前调用rng(10)这类固定随机种子保证两组实验在完全相同的网络拓扑下开始。第二个坑是能量变成负数。如果节点能量已经归零但因为计算顺序问题又继续扣减能量会变成负值。更隐蔽的是浮点误差可能让某个节点在死亡边缘反复横跳出现“昨天死了今天复活”的假象。稳妥的方案是在每轮结束统一做一次状态更新只要能量小于等于0就置为死亡然后把能量清零。第三个坑是基站位置对结论的影响。基站放在区域中心和区域外两种协议的表现完全不一样。基站放在区域中心时所有簇头的最后一条链路都比较短LEACH-C的优化空间变小优势不明显基站放在区域外某个远端LEACH-C的均匀分布和均衡选点优势才会放大。写论文对比性能时一定要说明基站位置否则结论无法复现。第四个坑是控制开销的统计。LEACH-C每轮需要所有节点向基站上报位置和能量这些控制消息同样要消耗能量。如果仿真时只算了数据传输的能量忽略控制消息的能耗LEACH-C看起来会比实际好很多结论就不公平了。建议在实现里把控制包长度也乘上对应的发送能耗等代价参与计算。最后一个建议Matlab不是性能最强的语言但做100个节点规模的WSN仿真完全够用而且可视化方便。实际跑仿真时记得把记录数据的变量提前预分配不要每轮动态扩维否则节点多了以后速度会明显下降。我个人做这个课题时最大的体会是仿真跑通只是第一步真正有价值的是想清楚每一次能量扣除背后的物理含义以及每个协议机制为什么会带来这样的波形差异。等你想明白了“为什么LEACH-C的FND更晚但尾部下降更陡”这个问题再回头去看任何一篇分簇协议的改进论文基本上就是换着法子做同一件事让簇头选得更准让能量花得更值。把这份Matlab代码骨架和排查思路吃透你后续做多跳LEACH、异构节点SEP、或者用智能优化算法替换模拟退火都会顺畅很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价