• 大小: 3KB
    文件类型: .zip
    金币: 2
    下载: 2 次
    发布日期: 2021-11-13
  • 语言: 其他
  • 标签: WSN仿真  

资源简介

WSN仿真-Leach分簇+能量消耗控制,附源代码(注释详细)WSN仿真-Leach分簇+能量消耗控制,附源代码(注释详细)

资源截图

代码片段和文件信息

clear all
close all
clc;

xm=100;                    %x轴范围
ym=100;                    %y轴范围
n=100; 
p=0.08;

%随机产生100个点
for i=1:1:n            
    S(i).xd=rand(11)*xm;
    S(i).yd=rand(11)*ym;
    S(i).temp_rand=rand; 
    S(i).type=‘N‘;      %进行选举簇头前先将所有节点设为普通节点
    S(i).selected=‘N‘;
    S(i).power=500;   %初始能量为500
    hold on;
end

flag=1;

   %在此进行10次分簇
for r=1:1:10
  figure(r);
    for i=1:1:n             %随机产生100个点
    S(i).temp_rand=rand;    %0-1之间的随机数
    end
  for i=1:1:n 
     if  S(i).selected==‘N‘   %被选为候选节点,选过了之后就不再被选
                              
       if ( S(i).temp_rand<=(p/(1-p*mod(rround(1/p)))))
           S(i).type=‘C‘;      %节点类型为蔟头
           S(i).selected=‘O‘;    %选过了之后就不再被选
           plot(S(i).xdS(i).yd‘ro‘); %绘制簇头节点
           text(S(i).xdS(i).ydnum2str(i));  %绘制节点标号
           
       else    S(i).type=‘N‘;      %节点类型为普通 
                  plot(S(i).xdS(i).yd‘.‘); %绘制普通节点
                  text(S(i).xdS(i).ydnum2str(i));%绘制节点标号          
       end
       
    else                          %本来是普通节点
        plot(S(i).xdS(i).yd‘.‘);      %普通节点以o标记
        text(S(i).xdS(i).ydnum2str(i));
    end
    hold on;

  end
  
  
%采用距离矩阵判断最近的簇头结点
yy=zeros(n);
for a=1:1:n
    if S(a).type==‘N‘
        for b=1:1:n
          if S(b).type==‘C‘
          S(a).power=S(a).power-1; %每收1个候选簇头信息,即接收信息,则能量-1
          S(b).power=S(b).power-2; %簇头被簇成员接收信息,即发送信息,则能量-2
          length(ab)=sqrt((S(a).xd-S(b).xd)^2+(S(a).yd-S(b).yd)^2); %簇头与每个普通节点的距离
          else
          length(ab)=10000;    
          end
        end
        [valb]=min(length(a:));   %找到离自己最近的簇头节点
        plot([S(b).xd;S(a).xd][S(b).yd;S(a).yd])  %将节点与簇头连起来,即加入簇头集合
        S(a).power=S(a).power-2; %通知簇头成为其成员,发送信息能量-2
        S(b).power=S(b).power-2; %被通知成为簇头,接收信息,则能量-1
        yy(ab)=1;
        hold on 
    else
     length(a:)=10000;     %若是簇头节点,则到所有的节点距离都为最大
     end
end

%本次分簇后,计算通信过程能量的消耗
for m=1:1:10          %每个簇成员每轮向簇头发送10次数据
    for i=1:1:n 
    if S(i).type==‘C‘
    number=sum(yy(:i));  %计算该簇头有多少个成员节点
    S(i).power=S(i).power-number;   %每接受一次,簇头能量-number
    else
    S(i).power=S(i).power-2;        %每次成员能量-2
    end
    end
end


%对每轮完成后,判断能量是否耗尽
for i=1:1:n 
    if (S(i).power)<0
        plot(S(i).xdS(i).yd‘k.‘‘markersize‘30);
        text(S(i).xdS(i).yd‘能量耗尽‘); 
        flag=0;
        break;
    end
    
end
% %如果存在能量耗尽,跳出循环
% if flag==0
% break;
% end 
%重置所有节点
for i=1:1:n 
   S(i).type=‘N‘;   
end

end


%     if flag==0
%     break
%     end 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        3000  2018-04-23 22:40  wsn3.m
     文件        3475  2018-04-22 15:00  WSNLeach分簇+能量.txt

评论

共有 条评论