• 大小: 6KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-06-05
  • 语言: Matlab
  • 标签: wsn  仿真  

资源简介

用matlab实现无线传感网的仿真过程,包括能量消耗模型,节点分布方式等。结合注释,很容易看懂。适合初学者,有助于论文写作的需要。

资源截图

代码片段和文件信息

% my leach code based on fuzzy logical method
clear;
%% 参数的初始化
    xm=100; 
    ym=100; % 传感区域范围
    n=100; %节点总数
    p=0.1; %簇头概率
    % 能量模型初始化数据
    E0=1;%初始能量
    Elec=50e-9;%发送、接收能量,每bit  
    Efs=10e-12;%耗散能量,每bit
    Emp=0.0013e-13;%融合能耗,每bit
    do = sqrt( Efs/Emp );
    cc=0.8;%融合率
    rmax=1000;%轮数设置
    MaxDis_CH_Node = sqrt( (xm-0)^2 + (ym-0)^2 ); %簇头广播范围

    CM=25;%控制信息大小
    DM=4000;%数据信息大小
     figure(1);% 显示图片 

    for i=1:1:n
        S(i).xd=rand(11)*xm;
        S(i).yd=rand(11)*ym;
        S(i).G=0;%每一个周期结束后,重新设置为0
        S(i).E=E0;%节点的初始能量
        S(i).type=‘N‘;%节点的类型为普通
        plot(S(i).xdS(i).yd‘o‘);
       hold on;%保持所畫的圖像
    end

%% 计算网关节点与其他节点的距离, 找出节点与网关的最小距离
    MinDist_Node_Sink = zeros(1n);
    Sink(1).xd = 0; Sink(1).yd = 0;
    Sink(2).xd = 0; Sink(2).yd = ym;
    Sink(3).xd = xm; Sink(3).yd = ym;
    Sink(4).xd = xm; Sink(4).yd = 0;
    for i = 1: n
            TempDist_Node_Sink = zeros(14);
            for j = 1 : 4
                TempDist_Node_Sink(j) = sqrt( (Sink(j).xd - S(i).xd)^2 + ( Sink(j).yd - S(i).yd )^2  );
            end
            MinDist_Node_Sink(i) = min(TempDist_Node_Sink);
    end
 %%
    first_dead_Round = 0; %第一个死亡节点出现的轮数
    flag_first_dead=0; % 记录第一个死亡节点
    half_dead_Round = 0;
    flag_half_dead = 0;
    Round_Alive_Num = zeros( 1rmax+1 ); %每轮存活节点数目记录
    RoundCluster = zeros( 1rmax ); %记录每轮簇头节点数目
    Remaining_En = zeros(1rmax);


%% 开始
for r = 1:1:rmax 
    % 如果轮数为一个周期的整数倍, 则将S(i).G 设置为0 ,即所有节点都没有成为簇头节点
    if( r>=2 )
        if  (  Remaining_En(r-1) == 0 )
            continue;
        end
    end
   r+1;
    if( mod(rround(1/p))==0 )
        for i = 1:n
            S(i).G = 0;
        end
    end
    
     hold off; % 每一轮重新绘制图片
    
     figure(1);    
    
   %% 死亡节点标记为红色
   dead = 0;
    for i = 1:n
        if( S(i).E <= 0 )
            plot( S(i).xd S(i).yd ‘red.‘ );
            S(i).E = 0; % 死亡节点剩余能量为0 
            dead = dead +1;
            if( dead == 1 && flag_first_dead == 0 ) % 标记第一个死亡节点
                first_dead_Round = r;
                flag_first_dead = 1;
            end
            if( dead == (n/2) && flag_half_dead == 0 )
                half_dead_Round = r;
                flag_half_dead = 1;
            end
            hold on;
        else
            S(i).type = ‘N‘;
            plot( S(i).xd S(i).yd ‘o‘ );
            hold on;
        end 
        Remaining_En(r) = Remaining_En(r) + S(i).E; % 第r 轮总剩余能量
    end
     Round_Alive_Num(r+1) = n - dead; %记录第 r 轮 存活节点个数
    
   %% 成簇阶段,寻找簇头节点,并计算簇头与基站的距离
   cluster = 0;% 每一轮开始前 将簇头数目重置为 0;
   for i = 1:n
        if( S(i).E > 0 )
            if( S(i).G <= 0 )
                temp

评论

共有 条评论