无线传感网络 LEACH 分簇路由算法仿真分析系统
项目简介
本项目是一个基于 MATLAB 平台的无线传感网络(WSN)仿真系统,专门用于研究和分析 LEACH(Low-Energy Adaptive Clustering Hierarchy)低功耗自适应集成分簇路由算法。系统通过模拟真实的物理层能耗模型,复现了 LEACH 协议的簇头选举、分簇形成、数据融合及传输全过程,并提供了详细的可视化图表来评估网络生命周期和能量效率。
功能特性
- 网络环境构建:支持自定义网络区域大小、节点数量、基站位置及初始能量,随机分布传感器节点。
- 自适应分簇机制:实现了基于概率阈值的簇头轮换选举算法,保证网络能耗的负载均衡。
- 动态拓扑仿真:模拟非簇头节点基于信号强度(距离)加入最近簇头的过程,并实时可视化网络拓扑连线。
- 高精度能耗模型:采用一阶无线电能耗模型,区分自由空间模型(Free Space)和多径衰落模型(Multipath Fading),精确计算发射、接收及数据融合的能量消耗。
- 稳健性机制:包含了当某一轮次未产生簇头时的备用机制,允许节点直接与基站通信。
- 全方位性能评估:自动记录并绘制存活节点数、网络总剩余能量、基站接收数据包数量等关键指标,并统计 FND(首个节点死亡)、HND(半数节点死亡)等生命周期节点。
系统要求
- MATLAB R2016a 及以上版本
- 无需额外工具箱(Toolbox),基于基础 MATLAB 函数实现
使用方法
- 确保 MATLAB 工作路径包含核心仿真脚本。
- 直接运行主仿真脚本。
- 仿真过程中会实时显示网络拓扑变化(Figure 1)。
- 仿真结束后,系统将自动弹出网络生命周期、剩余能量和数据包统计图表,并在命令行窗口输出详细的统计报告。
核心算法与代码实现逻辑分析
本项目的主仿真逻辑完全包含在核心脚本中,以下是基于实际代码的详细实现分析:
1. 参数配置与网络初始化
- 仿真参数:代码设定了 100x100m 的监测区域,基站位于 (50, 50) 中心位置。部署了 100 个传感器节点,每个节点初始能量为 0.5 Joules。
- 能耗参数:定义了详细的电路能耗参数。
*
ETX/
ERX (发送/接收电路): 50 nJ/bit
*
Efs (自由空间放大): 10 pJ/bit/m²
*
Emp (多径衰落放大): 0.0013 pJ/bit/m⁴
*
EDA (数据融合): 5 nJ/bit
* 数据包大小设定为 4000 bits。
- 节点结构:使用结构体数组
S 存储节点信息,包括坐标 (xd, yd)、能量 (E)、节点类型 (type) 以及簇头选举历史标志 (G)。初始化阶段通过随机函数 rand 生成节点坐标并绘制初始分布图。
2. 主仿真循环 (Main Loop)
仿真按“轮”(Round)进行循环,最大轮数设定为 1000 轮。
#### A. 状态重置与统计
- 周期性重置:为了保证所有节点都有机会成为簇头,代码利用模运算
mod(r, round(1/p)) 周期性地重置节点的 G 标志位。 - 存活检测:每轮开始时遍历所有节点,检查
S(i).E 是否小于等于 0。死亡节点被标记为黑色点,存活节点为蓝色圈。 - 生命周期记录:实时监测并记录首个节点死亡轮数 (FND)、半数节点死亡轮数 (HND) 以及全部死亡轮数 (LND)。
#### B. 簇头选举阶段 (Cluster Head Election)
- 阈值计算:对于未在近期当选过簇头(
G<=0)的存活节点,计算选举阈值 T(n)。
* 公式实现:
t = p / (1 - p * mod(r-1, round(1/p)))。这里使用了
r-1 修正了 MATLAB 1-based 索引带来的偏移。
- 随机选举:节点生成一个随机数,若小于
t,则当选簇头。 - 状态更新:当选节点类型变为 'C'(红色显示),并设置
G 值以在后续 1/p 轮内禁止再次参选。同时计算簇头到基站的距离。
#### C. 分簇建立阶段 (Cluster Setup)
- 最近邻原则:若本轮有簇头产生,普通节点遍历所有当前簇头,计算欧氏距离,选择距离最近的簇头加入。
- 拓扑记录:在此时记录节点归属的簇索引
min_dis_cluster,并使用绘图函数 line 绘制节点与簇头之间的连线,直观展示分簇结构。
#### D. 数据传输与能量消耗 (Data Transmission)
代码区分了两种传输场景:
1.
成员节点 -> 簇头:
* 计算节点到簇头的距离
dist。
* 根据距离阈值 $d_0 = sqrt{E_{fs}/E_{mp}}$ 判定传输模型。若距离小于 $d_0$,采用自由空间模型 ($d^2$);否则采用多径衰落模型 ($d^4$)。
* 扣除发送节点能量,统计发送给簇头的数据包
PACKETS_TO_CH。
* 扣除簇头接收数据能耗 (
ERX * packetLength)。
2.
簇头 -> 基站:
*
数据融合:簇头消耗
EDA * packetLength 的能量模拟数据聚合处理。
*
长距离回传:计算簇头到基站的距离,同样依据 $d_0$ 判断模型,扣除发送能耗。
* 统计成功发送至基站的数据包
PACKETS_TO_BS。
- 场景二:直接传输 (Backup Mechanism)
* 代码逻辑中包含
else 分支处理“本轮未选举出簇头”的情况(虽然概率较低)。
* 在该模式下,所有存活节点直接尝试与基站通信,计算到基站的直接距离并扣除相应能耗。这增强了系统的鲁棒性。
3. 可视化与结果输出
- 动态仿真图 (Figure 1):通过
drawnow 实现动画效果,显示节点存活状态、基站位置、簇头位置及分簇连线。为提高行效率,每 10 轮刷新一次。 - 结果分析图:
*
Figure 2:存活节点数随轮数变化曲线,展示网络衰亡速度。
*
Figure 3:网络总剩余能量曲线,反映 LEACH 的能耗均衡性。
*
Figure 4:基站接收数据包累计曲线,评估网络吞吐量。
- 终端报告:仿真结束后,利用
fprintf 输出摘要,包括区域参数、FND、HND 等关键生命周期指标。