• 大小: 5KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-05-11
  • 语言: Matlab
  • 标签: 代码  

资源简介

MATLAB平台的LEACH协议代码.对于搞毕业设计的人还是很好的东西。

资源截图

代码片段和文件信息

clear;
%%%%%%%%%%%%%%%%%%%%%%%%%    参数初始化      %%%%%%%%%%%%%%%%%%%%%%%%
xm=100;%待投放节点的场景范围
ym=100;
sink.x=0.5*xm;%基站的位置
sink.y=0.5*ym;
n=100;%节点总数
data_packet=4000;%每个节点采集数据形成的数据包大小
p=0.05;%期望蔟头占所有节点的百分比
%能量模型
Eo=0.05;%初始能量
ETX=50*0.000000001;%Eelec=Etx=Erx
ERX=50*0.000000001;
Efs=10*0.000000000001;%放大器的两个参数
Emp=0.0013*0.000000000001;
EDA=5*0.000000001;%融合单位数据所要消耗的能量
rmax=1999;%运行的总轮数
do=sqrt(Efs/Emp);%能量损耗的界限值:大于它则符合friss free space model,小于它则符合two-ray ground model
%%%%%%%%%%%%%%%%%%%%%%%%%    参数初始化结束    %%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%    簇的建立          %%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:1:n
    S(i).xd=rand(11)*xm;%随机生成节点的坐标
    S(i).yd=rand(11)*ym;
    S(i).G=0;%节点是否属于集合G的标志
    S(i).type=‘N‘;%表征普通节点   
    S(i).E=Eo;%初始化节点能量
end
S(n+1).xd=sink.x;%画出基站节点‘x‘
S(n+1).yd=sink.y;

firstflag=0;
firstflag_round=0;
for r=0:1:rmax%开始循环
    r %输出当前的轮数
    dead=0;%统计总的死亡节点数  
    if(mod(r round(1/p) )==0)%G为最近1/p轮不是簇头的节点集
        for i=1:1:n
            S(i).G=0;
        end
    end

    for i=1:1:n
        if (S(i).E<=0)
            dead=dead+1;%统计总的死亡节点个数   
        else
            S(i).type=‘N‘;
        end
    end
    if(dead>0 && firstflag==0)
        firstflag=1;
        firstflag_round=r;
    end
    if (dead == n)%如果节点全部死亡退出循环
        break;
    end
    STATISTICS(r+1).DEAD=dead;%统计第r+1轮的死亡节点数

    %%%%%%%%%%%%%%%%%%%%%%%%%第一阶段:簇首节点的选择
    cluster=1;%记录簇的个数
    for i=1:1:n
        if(S(i).E>0 && (S(i).G)<=0)%属于候选节点集合
            temp_rand=rand;%生成一个0-1的随机数     
            if(temp_rand<= (p/(1-p*mod(rround(1/p)))))%若生成的随机数小于门限值T(n),就成为簇头
                S(i).type=‘C‘;%标志该节点为簇头
                S(i).G=round(1/p)-1;%标志该节点在最近的1/p轮中不会再成为簇头
                C(cluster).xd=S(i).xd;%记录簇头的位置
                C(cluster).yd=S(i).yd;
                C(cluster).distance=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );%簇头距离基站的距离
                C(cluster).id=i;%簇头的在原来n个节点中的编号
                C(cluster).packet=0;%该簇头所控制的簇成员个数         
                cluster=cluster+1;   
            end
        end     
    end
    CLUSTERHS(r+1)=cluster-1;%统计第r+1轮的簇头数
    %%%%%

评论

共有 条评论