本文主要是介绍基于matlab模拟leach,leach-c以及TS-I-Leach三种协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统
信号处理 图像处理 路径规划 元胞自动机 无人机
⛄ 内容介绍
在无线传感网络中,每个传感器节点的能量有限,难以随时对传感器节点补充能量,所以能量是整个网络中的一项重要资源,决定了整个网络的生存时间.因此,根据无线传感网络的特点来设计一种高效节能的路由协议是研究无线传感网络的一项重要内容. 随着对无线传感网络的深入研究,越来越多的无线传感网络路由协议被提出来,但每种路由协议都是针对不同的应用需求而产生的,只是对其中的一项或几项参数进行了改进,没有面面俱到地对所有参数进行完善.本文在综合比较了平面路由协议和分层路由协议的基础上选择了对经典的分簇路由协议 LAECH进行研究,并针对该协议的不足,提出了一种基于LEACH的改进协议.
⛄ 部分代码
function [STATISTICS1,FD1,TD1,AD1]=leach(IniEng,NetSize,NoOfNode,NoOfRound,cluster_head_percentage)
xm=NetSize;
ym=NetSize;
sink.x=0.5*xm;
sink.y=1.35*ym;
n=NoOfNode;
p=cluster_head_percentage;
Eo=IniEng;%Initial energy
%Eelec=Etx=Erx
ETX=50*0.000000001;
ERX=50*0.000000001;
%Transmit Amplifier types
Efs=10*0.000000000001;
Emp=0.0013*0.000000000001;
%Data Aggregation Energy
EDA=5*0.000000001;
a=0;
rmax=NoOfRound;
do=sqrt(Efs/Emp);
do
for i=1:1:n
S(i).xd=rand(1,1)*xm;
%XR(i)=S(i).xd;
S(i).yd=rand(1,1)*ym;
%YR(i)=S(i).yd;
S(i).G=0;
S(i).E=Eo*(1+rand*a);
%initially there are no cluster heads only nodes
S(i).type='N';
end
S(n+1).xd=sink.x;
S(n+1).yd=sink.y;
countCHs=0;
cluster=1;
flag_first_dead=0;
flag_teenth_dead=0;
flag_all_dead=0;
dead=0;
first_dead=0;
teenth_dead=0;
all_dead=0;
allive=n;
%counter for bit transmitted to Bases Station and to Cluster Heads
packets_TO_BS=0;
packets_TO_CH=0;
for r=0:1:rmax
r
if(mod(r, round(1/p) )==0)
for i=1:1:n
S(i).G=0;
%S(i).cl=0;
end
end
dead=0;
for i=1:1:n
if (S(i).E<=0)
dead=dead+1;
if (dead==1)
if(flag_first_dead==0)
first_dead=r;
flag_first_dead=1;
end
end
if(dead==0.1*n)
if(flag_teenth_dead==0)
teenth_dead=r;
flag_teenth_dead=1;
end
end
if(dead==n)
if(flag_all_dead==0)
all_dead=r;
flag_all_dead=1;
end
end
end
if S(i).E>0
S(i).type='N';
end
end
STATISTICS.DEAD(r+1)=dead;
STATISTICS.ALLIVE(r+1)=allive-dead;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TotalNetworkEnergy=0;
for i=1:n
if S(i).E>0
TotalNetworkEnergy=TotalNetworkEnergy+S(i).E;
end
end
STATISTICS.TotalEnergy(r+1)=TotalNetworkEnergy;
STATISTICS.AvgEnergy(r+1)=TotalNetworkEnergy/n;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
countCHs=0;
cluster=1;
for i=1:1:n
if(S(i).E>0)
temp_rand=rand;
if ( (S(i).G)<=0)
if(temp_rand<= (p/(1-p*mod(r,round(1/p)))))
countCHs=countCHs+1;
packets_TO_BS=packets_TO_BS+1;
PACKETS_TO_BS(r+1)=packets_TO_BS;
S(i).type='C';
S(i).G=round(1/p)-1;
C(cluster).xd=S(i).xd;
C(cluster).yd=S(i).yd;
distance=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );
C(cluster).distance=distance;
C(cluster).id=i;
X(cluster)=S(i).xd;
Y(cluster)=S(i).yd;
cluster=cluster+1;
distance;
if (distance>do)
S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance ));
end
if (distance<=do)
S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Efs*4000*( distance * distance ));
end
end
end
% S(i).G=S(i).G-1;
end
end
STATISTICS.COUNTCHS(r+1)=countCHs;
%pause;
for i=1:1:n
if ( S(i).type=='N' && S(i).E>0 )
if(cluster-1>=1)
min_dis=Inf;
min_dis_cluster=0;
for c=1:1:cluster-1
temp=min(min_dis,sqrt( (S(i).xd-C(c).xd)^2 + (S(i).yd-C(c).yd)^2 ) );
if ( temp<min_dis )
min_dis=temp;
min_dis_cluster=c;
end
end
min_dis;
if (min_dis>do)
S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis));
end
if (min_dis<=do)
S(i).E=S(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis));
end
S(C(min_dis_cluster).id).E = S(C(min_dis_cluster).id).E- ( (ERX + EDA)*4000 );
packets_TO_CH=packets_TO_CH+1;
S(i).min_dis=min_dis;
S(i).min_dis_cluster=min_dis_cluster;
else
min_dis=sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 );
if (min_dis>do)
S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis));
end
if (min_dis<=do)
S(i).E=S(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis));
end
packets_TO_BS=packets_TO_BS+1;
end
end
end
STATISTICS.PACKETS_TO_CH(r+1)=packets_TO_CH;
STATISTICS.PACKETS_TO_BS(r+1)=packets_TO_BS;
end
STATISTICS1=STATISTICS;
FD1=first_dead;
TD1=teenth_dead;
AD1=all_dead;
STATISTICS.DEAD(r+1);
STATISTICS.ALLIVE(r+1);
STATISTICS.PACKETS_TO_CH(r+1);
STATISTICS.PACKETS_TO_BS(r+1);
STATISTICS.COUNTCHS(r+1);
⛄ 运行结果
⛄ 参考文献
[1] 陈晨. 基于LEACH的无线传感器网络路由协议的改进[D]. 北京工业大学.
[2] 刘苏. 基于簇头选举和多跳路由的LEACH协议研究[D]. 西南大学, 2013.
[3] 付得胜. 无线传感网络LEACH路由协议的改进研究[D]. 重庆大学, 2016.
⛳️ 代码获取关注我
❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料
这篇关于基于matlab模拟leach,leach-c以及TS-I-Leach三种协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!