• 大小: 23KB
    文件类型: .m
    金币: 2
    下载: 1 次
    发布日期: 2021-05-07
  • 语言: Matlab
  • 标签: wsn分簇  

资源简介

wsn分簇协议leach和deec的仿真代码,使用matlab编写,很详细,适合初学者仿真使用。

资源截图

代码片段和文件信息

clear  
%1.初始参数设定模块  
%.传感器节点区域界限(单位 M)  
xm=200;  
ym=200;  
%(1)汇聚节坐标给定  
sink.x=0.5*xm;  
sink.y=0.5*ym;  
%区域内传器节数  
n=100  
%簇头优化比例(当选簇头的概率)  
p=0.05;  
P=0.05;  
%能量模型(单位 焦)  
%初始化能量模型  
Eo=0.5;  
%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=1;  
%最大循环次数  
rmax=5000  
%算出参数 do  
do=sqrt(Efs/Emp);  
Et=0;  
%2.无线传感器网络模型产生模块  
%构建无线传感器网络在区域内均匀投放100个节点并画出图形  
for i=1:1:n  
    S1(i).xd=rand(11)*xm;  
    S2(i).xd=S1(i).xd;  
    S3(i).xd=S1(i).xd;  
    S4(i).xd=S3(i).xd;  
    XR4(i)=S4(i).xd;  
    XR3(i)=S3(i).xd;  
    XR2(i)=S2(i).xd;  
    XR1(i)=S1(i).xd;  
    S1(i).yd=rand(11)*ym;  
    S2(i).yd=S1(i).yd;  
    S3(i).yd=S1(i).yd;  
    S4(i).yd=S3(i).yd;  
    YR4(i)=S4(i).yd;  
    S4(i).G=0;  
    YR3(i)=S3(i).yd;  
    S3(i).G=0;  
    YR2(i)=S2(i).yd;  
    YR1(i)=S1(i).yd;  
    S1(i).G=0;  
    S2(i).G=0;  
    S1(i).E=Eo*(1+rand*a);  
    S2(i).E=S1(i).E;  
    S3(i).E=S1(i).E;  
    S4(i).E=S3(i).E;  
    E3(i)= S3(i).E;  
    E4(i)= S4(i).E;  
    Et=Et+E3(i);  
  
    %initially there are no cluster heads only nodes  
    S1(i).type=‘N‘;  
    S2(i).type=‘N‘;  
    S3(i).type=‘N‘;  
    S4(i).type=‘N‘;  
end  
  
S1(n+1).xd=sink.x;  
S1(n+1).yd=sink.y;  
S2(n+1).xd=sink.x;  
S2(n+1).yd=sink.y;  
%3.网络运行模块  
%簇头节点数  
countCHs1=0;  
cluster1=1;%此定义的目的仅仅是给定一个1开始的下标参数,真正的簇头数应该还减去1  
flag_first_dead1=0;  
flag_teenth_dead1=0;  
flag_all_dead1=0;  
%死亡节点数  
dead1=0;  
first_dead1=0;  
teenth_dead1=0;  
all_dead1=0;  
%活动节点数  
allive1=n;  
%counter for bit transmitted to bases Station and to Cluster Heads  
packets_TO_BS1=0;  
packets_TO_CH1=0;  
%(1)循环模式设定  
for r=0:1:rmax     %该 for 循环将下面的所有程序包括在内,直到最后一 end 才结束循环  
    r  
  %每过一个轮转周期(本程序为10次)使各节点的S(i).G参数(该参数用于后面的簇选举,在该轮转周期内已当选过簇头的节点不能再当选)恢复为零  
  if(mod(r round(1/p) )==0)  
    for i=1:1:n  
        S1(i).G=0;  
        S1(i).cl=0;  
    end  
  end  
%(2)死亡节点检查模块  
dead1=0;  
for i=1:1:n  
    %检查有无死亡节点  
    if (S1(i).E<=0)  
        dead1=dead1+1;   
        %(3)第一个死亡节点的产生时间(用轮次表示)  
        %第一个节点死亡时间  
        if (dead1==1)  
           if(flag_first_dead1==0)  
              first_dead1=r;  
              flag_first_dead1=1;  
           end  
        end  
        %10%的节点死亡时间  
        if(dead1==0.1*n)  
           if(flag_teenth_dead1==0)  
              teenth_dead1=r;  
              flag_teenth_dead1=1;  
           end  
        end  
        if(dead1==n)  
           if(flag_all_dead1==0)  
              all_dead1=r;  
              flag_all_dead1=1;  
           end  
        end  
    end  
    if S1(i).E>0  
        S1(i).type=‘N‘;  
    end  
end  
STATISTICS.DEAD1(r+1)=dead1;  
STATISTICS.ALLIVE1(r+1)=allive1-dead1;  
%(4)簇头选举模块  
countCHs1=0;  
cluster1=1;

评论

共有 条评论

相关资源