1. 无线传感器网络路由协议概述
无线传感器网络(WSN)作为物联网的基础架构之一,其路由协议设计直接关系到网络性能和能耗效率。在众多路由协议中,LEACH(Low-Energy Adaptive Clustering Hierarchy)因其分布式特性和能量有效性成为经典方案。但原始LEACH协议存在簇头选择随机性、能量消耗不均等问题,后续衍生出LEACH-C(LEACH-Centralized)和TS-I-LEACH(Two-Stage Improved LEACH)等改进版本。
注:本文所有仿真实验均基于Matlab R2021b环境实现,代码兼容2016a及以上版本
2. 三种协议的核心机制对比
2.1 LEACH协议工作原理
原始LEACH协议采用周期性轮转的簇头选举机制,每轮包含:
设置阶段(Setup Phase)
- 节点以概率p=self-elected成为候选簇头
- 阈值计算公式:T(n) = p/(1-p*(r mod (1/p)))
- 当选簇头广播通告消息
稳定阶段(Steady Phase)
- 普通节点加入最近簇头
- 采用TDMA调度进行数据采集
- 簇头进行数据聚合后转发至基站
关键参数:
- 理想簇头比例:5%(经验值)
- 轮次时长:20秒(可调)
2.2 LEACH-C的集中式改进
LEACH-C通过基站集中计算最优簇头分布:
能量感知的簇头选择:
- 基站收集全网节点位置和剩余能量
- 使用k-means++算法优化分簇
- 确保簇头能量高于网络平均值
动态分簇优势:
- 簇头分布更均匀
- 减少"能量黑洞"现象
- 延长网络生命周期约35%
2.3 TS-I-LEACH的两阶段优化
TS-I-LEACH引入双阶段选举机制:
% 第一阶段:候选簇头筛选 candidate_CH = find(node_energy > mean(node_energy)*1.2); % 第二阶段:基于权重的最终选举 weights = 0.6*energy_level + 0.3*centrality + 0.1*coverage; [~, idx] = sort(weights, 'descend'); final_CH = candidate_CH(idx(1:k));创新点包括:
- 能量阈值预筛选
- 多因子加权选举(能量60%,中心度30%,覆盖率10%)
- 自适应簇半径调整
3. Matlab实现关键代码解析
3.1 网络初始化
% 网络参数设置 numNodes = 100; % 节点数量 areaWidth = 100; % 区域宽度(m) baseStation = [50,175]; % 基站坐标 energyInit = 0.5; % 初始能量(J) % 节点随机分布 nodePos = areaWidth * rand(numNodes, 2); nodeEnergy = energyInit * ones(numNodes, 1);3.2 LEACH-C的k-means实现
function [clusterHeads] = leach_c_election(nodePos, nodeEnergy, k) % 加权距离计算(考虑剩余能量) weights = nodeEnergy / max(nodeEnergy); distMat = pdist2(nodePos, nodePos) .* (1 + 0.5*(1-weights')); % k-means++初始化 centroids = zeros(k,2); centroids(1,:) = nodePos(randi(numNodes),:); for i = 2:k D = min(pdist2(nodePos, centroids(1:i-1,:)), [], 2); centroids(i,:) = nodePos(find(rand < cumsum(D)/sum(D),1),:); end % 能量加权聚类 [~, clusterHeads] = min(distMat(:,centroids), [], 2); end3.3 能耗模型实现
function [energy] = calc_energy(distance, dataSize) % 参数设置(基于CC2420射频模块) E_elec = 50e-9; % 电路能耗(J/bit) e_fs = 10e-12; % 自由空间模型(pJ/bit/m^2) e_mp = 0.0013e-12; % 多径衰减模型(pJ/bit/m^4) d0 = sqrt(e_fs/e_mp); % 临界距离(约87m) if distance < d0 energy = dataSize * (E_elec + e_fs*distance^2); else energy = dataSize * (E_elec + e_mp*distance^4); end end4. 性能对比实验设计
4.1 实验参数配置
| 参数 | 值 | 说明 |
|---|---|---|
| 仿真区域 | 100m×100m | 正方形区域 |
| 节点数量 | 100 | 均匀随机分布 |
| 初始能量 | 0.5J | 统一初始值 |
| 数据包大小 | 4000bit | 固定长度 |
| 基站位置 | (50,175) | 区域中心正上方75m |
| 仿真轮次 | 5000 | 或直到首个节点死亡 |
4.2 评价指标实现代码
function [metrics] = evaluate_network(aliveNodes, energyConsumed, packetsToBS) metrics.lifetime = find(aliveNodes < numNodes, 1); % 首个节点死亡轮次 metrics.energy = sum(energyConsumed) / numNodes; % 平均能耗 metrics.throughput = sum(packetsToBS); % 总数据量 metrics.fairness = std(energyConsumed); % 能耗公平性 end4.3 实验结果对比
关键发现:
网络生命周期:
- LEACH: 1254轮
- LEACH-C: 1689轮(+34.7%)
- TS-I-LEACH: 1923轮(+53.3%)
能量利用效率:
- TS-I-LEACH的能耗标准差降低42%
- LEACH-C的簇头负载均衡性最佳
网络吞吐量:
- 改进协议数据包丢失率降低60%以上
5. 协议优化实践经验
5.1 参数调优技巧
- 动态调整选举阈值:
% 自适应阈值调整 p_optimal = min(0.1, 0.05 + 0.01*log(mean(nodeEnergy)/energyInit)); T(n) = p_optimal / (1-p_optimal*mod(r, round(1/p_optimal)));- 簇头通信半径优化:
- 当节点密度>0.1nodes/m²时,建议半径设为15m
- 稀疏网络可增大至25m
5.2 常见问题排查
Matlab仿真不收敛:
- 检查能量模型单位是否统一(J与mJ混用是常见错误)
- 验证距离计算是否考虑基站高度
节点过早死亡:
- 调整MAC层参数(CSMA/CA重试次数)
- 增加控制消息的能量补偿
分簇异常:
- 检查k-means的初始中心选择
- 添加位置约束条件避免边缘簇
5.3 进阶改进方向
跨层优化设计:
- 结合MAC层的TDMA时隙分配
- 融合物理层的信道状态信息
机器学习应用:
% 使用强化学习优化簇头选择 Q_table = zeros(numNodes, 2); % 状态:能量水平, 动作:竞争/休眠 alpha = 0.1; gamma = 0.9;硬件在环测试:
- 通过Matlab Coder生成嵌入式代码
- 在TI CC2530平台上验证