1.程序功能描述
LEACH的原理在于它将传感器节点分为两类:簇头节点和普通节点。普通节点将数据发送给距离自己最近的簇头节点,然后簇头节点将收集到的数据融合后发送给基站。这种机制可以减少网络中节点的能耗,并且能够提高数据融合比例,减少传输数据量。本课题将分别对比leach协议在不同初始能量,不同数据包长度,以及不同控制包长度的条件下,网络的剩余节点数目,剩余能量,网络接收到的数据量以及网络累计接收数据量。

2.测试软件版本以及运行结果展示
MATLAB2022a版本运行

基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_数据基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_f5_02基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_2d_03基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_数据_04基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_f5_05基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_数据_06基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_数据_07基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_f5_08基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_数据_09基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_f5_10基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_数据_11基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点_2d_12

3.核心程序

clear;
close all;
warning off;
addpath(genpath(pwd));
rng('default')

x_area           = 100; %仿真场地大小  
y_area           = 100;
Num_sink         = 200; %节点数目
packet_Length    = 4000;%数据包长度    
ctrPacket_Length = 100; %控制包长度
rmax             = 2000;
Eo               = 0.3;%初始能量

%运行leach代码
[least_sink_number1,least_engry1,get_data_per_sink1,get_data_all1] = func_Leach(x_area,y_area,Num_sink,packet_Length,ctrPacket_Length,rmax,Eo);
Eo               = 0.4;%初始能量
[least_sink_number2,least_engry2,get_data_per_sink2,get_data_all2] = func_Leach(x_area,y_area,Num_sink,packet_Length,ctrPacket_Length,rmax,Eo);
Eo               = 0.5;%初始能量
[least_sink_number3,least_engry3,get_data_per_sink3,get_data_all3] = func_Leach(x_area,y_area,Num_sink,packet_Length,ctrPacket_Length,rmax,Eo);




steps=40;
figure;
plot(1:steps:length(least_sink_number1),least_sink_number1(1:steps:end),'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
hold on;
plot(1:steps:length(least_sink_number2),least_sink_number2(1:steps:end),'-mo',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.5,0.9,0.0]);
hold on;
plot(1:steps:length(least_sink_number3),least_sink_number3(1:steps:end),'-r>',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
hold on;

grid on;
title('剩余节点数目个数');
legend('初始能量0.3','初始能量0.4','初始能量0.5');


figure;
plot(1:steps:length(least_engry1),least_engry1(1:steps:end),'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
hold on;
plot(1:steps:length(least_engry2),least_engry2(1:steps:end),'-mo',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.5,0.9,0.0]);
hold on;
plot(1:steps:length(least_engry3),least_engry3(1:steps:end),'-r>',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
hold on;
grid on;
title('剩余能量');
legend('初始能量0.3','初始能量0.4','初始能量0.5');



figure;
plot(1:steps:length(get_data_per_sink1),get_data_per_sink1(1:steps:end),'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
hold on;
plot(1:steps:length(get_data_per_sink2),get_data_per_sink2(1:steps:end),'-mo',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.5,0.9,0.0]);
hold on;
plot(1:steps:length(get_data_per_sink3),get_data_per_sink3(1:steps:end),'-r>',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
hold on;

grid on;
title('节点接收到的数据');
legend('初始能量0.3','初始能量0.4','初始能量0.5');



figure;
plot(1:steps:length(get_data_all1),get_data_all1(1:steps:end),'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
hold on;
plot(1:steps:length(get_data_all2),get_data_all2(1:steps:end),'-mo',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.5,0.9,0.0]);
hold on;
plot(1:steps:length(get_data_all3),get_data_all3(1:steps:end),'-r>',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
hold on;


grid on;
title('累计接收到的数据');
legend('初始能量0.3','初始能量0.4','初始能量0.5');
12_003m



  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.

4.本算法原理
LEACH(Low Energy Adaptive Clustering Hierarchy)是一种应用于无线传感器网络的分层路由协议。它的主要目标是通过自适应地创建和调整集群来延长网络的生命周期。LEACH的实现基于以下原理和数学公式。

    LEACH的原理在于它将传感器节点分为两类:簇头节点和普通节点。普通节点将数据发送给距离自己最近的簇头节点,然后簇头节点将收集到的数据融合后发送给基站。这种机制可以减少网络中节点的能耗,并且能够提高数据融合比例,减少传输数据量。

   在LEACH中,每个节点都有一个阈值,当节点的能量低于这个阈值时,该节点就会停止作为簇头节点的工作,转为普通节点。这个阈值是通过以下公式计算的:

Threshold = P * num_of_cluster_heads

其中,P是一个预先设定的常量,num_of_cluster_heads是网络中簇头节点的数量。

   在LEACH中,节点首先随机选择是否成为簇头节点。如果它选择成为簇头节点,那么它会向网络中所有其他节点广播一个包含自己ID和成为簇头节点意愿的消息。当消息收到时,普通节点会根据距离簇头节点的远近,以及节点的剩余能量来选择加入哪个簇。

在仿真过程中,我们需要考虑以下几个性能指标:

1.数据量

    在LEACH中,每个簇头节点收集并融合其所属簇内所有节点的数据,然后发送给基站。因此,数据量的大小与簇内节点的数量以及每个节点发送的数据量有关。我们可以使用以下公式来计算数据量:

Data = num_of_cluster_heads * num_of_nodes_per_cluster * data_per_node

其中,num_of_cluster_heads是簇头节点的数量,num_of_nodes_per_cluster是每个簇内的节点数量,data_per_node是每个节点发送的数据量。
2. 能耗

   在LEACH中,节点的能耗主要来自于发送和接收数据,以及进行数据融合的能耗。我们可以使用以下公式来计算网络的总能耗:

Total_Energy = Energy_Transmit + Energy_Receive + Energy_Fusion

其中,Energy_Transmit是发送数据的能耗,Energy_Receive是接收数据的能耗,Energy_Fusion是进行数据融合的能耗。这些能耗可以通过每个节点的传输距离、传输速率、处理能力等因素计算得出。
3. 存活节点

    在仿真过程中,我们需要追踪网络中存活节点的数量。存活节点是指其能量仍高于阈值的节点。在LEACH中,如果节点的能量低于阈值,它会停止作为簇头节点的工作,转为普通节点。我们可以通过以下公式来计算存活节点的数量:

Num_Alive_Nodes = num_of_nodes - num_of_dead_nodes

    其中,num_of_nodes是网络中总节点的数量,num_of_dead_nodes是网络中已经死亡的节点的数量。

    以上就是基于LEACH路由协议的网络性能的matlab仿真的基本原理、数学公式以及性能指标的详细介绍。在实际仿真过程中,还需要考虑其他许多因素,例如节点的分布、传输模型的选取、数据融合算法的优化等。这些因素都会对仿真结果产生影响,因此需要根据实际应用场景进行合理的设定和分析。