⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nojunyunevote2new.m.txt

📁 在matlab下对无线传感器网络进行仿真
💻 TXT
📖 第 1 页 / 共 2 页
字号:
%ddddddddddddddddddddd      基于选票分簇算法的能量消耗--非均匀分簇       ddddddddddddddddddddddddddd
%开始每个节点广播ID号和当前能量;接收计算,每个节点广播ID号和当前选票和适宜性(或节点度)
%接收,若本节点选票最多,作为簇头,并广播本节点ID号结束;簇成员节点接受簇头信息,加入并广播本节点ID号结束。

%能量消耗包括两部分:簇形成阶段的能耗和数据传输阶段的能耗。
%dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd

N=50;                    %节点个数 
f=1;                     %最后结果数组下标,50-500, 每隔50取一数,共有10

while N<=500

g=5;                     %相同条件下的重复次数    
for t=1:g
%dddddddddddddddddddddddddddddd     节点配置    dddddddddddddddddddddddddddddddddddddd
%   radius=25;                              %广播距离
X_axis=100;                    %x轴长度 代表节点分布范围中的一维 
Y_axis=100;                    %y轴长度 代表节点分布范围中的另一维 
Loca=[X_axis*rand(1,N);Y_axis*rand(1,N)]';    %产生坐标矩阵 

for i=1:N
    e(i)=10;                  %节点的能量 
    Eprog(i)=0;
end  
er=0.533*10^(-6);
et=1.066*10^(-6);
eta=3.076*10^(-9);
efuse=1.8*10^(-7);
es=1.75*10^(-7);
D=-175;
c=0.2;
dopt=sqrt((er+et)/eta);
radius=dopt/2;                              %广播距离
dT=210;                             %门限距离,小于直接传输到网关,大于多跳到网关

%ddddddddddddddddddddddddddddd         节点位置示意图    dddddddddddddddddddddddddddddddd
 %plot(Loca(:,1),Loca(:,2),'o')

%ddddddddddddddddddddddddddd        计算邻居节点矩阵   ddddddddddddddddddddddddddddddddddddddd
                                 
for i=1:N
    d(i)=0;                             %节点的度 
end    
for i=1:N
    for j=i:N
        dis(i,j)=sqrt((Loca(i,1)-Loca(j,1))*(Loca(i,1)-Loca(j,1))+(Loca(i,2)-Loca(j,2))*(Loca(i,2)-Loca(j,2)));          %存放节点间距离 
        dis(j,i)=dis(i,j);
    end
end
dmax=0;
dmin=250;
for i=1:N
    dis(i,N+1)=sqrt((Loca(i,1))*(Loca(i,1))+(Loca(i,2)-D)*(Loca(i,2)-D));          %存放节点到网关的距离 
    if dis(i,N+1)>dmax
       dmax=dis(i,N+1);
    end
    if dis(i,N+1)<dmin
       dmin=dis(i,N+1);
    end
end
  
for i=1:N   
    r(i)=radius*(1-c*(dmax-dis(i,N+1))/(dmax-dmin));
    for j=1:N
        if dis(i,j)<=r(i)&&i~=j
           d(i)=d(i)+1;
           neibor(i,d(i))=j;
       end 
    end
   if d(i)==0
     neibor(i,1)=0;
   end  
end
for i=1:N
    n1=ceil(dis(i,N+1)/dopt);
    syms k;
    n2=double(symsum(1/k,1,n1));
    dn(i)=dis(i,N+1)/n2;
end

%ddddddddddddddddddddddddddd        节点布置后,直到所有节点能量耗尽,所经历的轮数   ddddddddddddddddddddddddddddddddddddddd
lunum=0;
flag2=1;
Ecluz=0;
Edataz=0;
flag3=0;
Nper=10;
dienote=0;

while flag2==1

%ddddddddddddddddddddddddddd        计算节点初始阶段的能量消耗   ddddddddddddddddddddddddddddddddddddddd
for i=1:N
    Edata(i)=0;
    Einit(i)=0;
    Eprog(i)=0;
end    

for i=1:N
    if e(i)~=0
       Einit(i)=(6*8+8*8+8*8)*(eta*r(i)^2+et)+d(i)*(6*8+8*8+8*8)*er;
    end   
end    


      
%ddddddddddddddddddddddddddd        计算节点初始选票   ddddddddddddddddddddddddddddddddddddddd
for i=1:N
    if e(i)~=0
       E(i)=e(i);
       if d(i)~=0
          for k=1:d(i)
              E(i)=E(i)+e(neibor(i,k));
          end
       end  
       v(i,i)=e(i)/E(i);
       if d(i)~=0
          for k=1:d(i)
              v(i,neibor(i,k))=e(neibor(i,k))/E(i);
          end
       end   
    end
end    
for i=1:N
    if e(i)~=0
       if d(i)==0
          fitness(i)=e(i);
       else   
          fitness(i)=e(i)/d(i);           %节点的适应性
       end    
       curvote(i)=v(i,i);
       if d(i)~=0
          for k=1:d(i)
              curvote(i)=curvote(i)+v(neibor(i,k),i);          %节点的总选票
          end
       end
    end   
 end

%ddddddddddddddddddddddddddd  查找本节点是否是邻居集合中最多选票的节点,如是发簇头广播 ddddddddddddddddddddddddddddddddddddddd
for i=1:N
    CH(i)=0;
    cluster_head(i)=0;
end    
for i=1:N
    if e(i)~=0
       maxvote=curvote(i);
       maxvoteID(i)=i;
       flag=0;
       if d(i)~=0
          for k=1:d(i)
             if curvote(neibor(i,k))>maxvote
                flag=1;
                break
             end
          end
       end   
       if flag==0
          cluster_head(i)=i;
          CH(i)=1;
          Eprog(i)=Eprog(i)+4*8*(eta*r(i)^2+et);         %发簇头信息
       end
    end   
end

    
%ddddddddddddddddddddddddddd       处理收到的簇头信息的节点,按适宜性选择簇头  ddddddddddddddddddddddddddddddddddddddd
for i=1:N
    schnum(i)=0;
end    
for i=1:N
    if CH(i)==1
       if d(i)~=0 
          for k=1:d(i)
              schnum(neibor(i,k))=schnum(neibor(i,k))+1;
              sch(neibor(i,k),schnum(neibor(i,k)))=i;
              CH(neibor(i,k))=2;
              Eprog(neibor(i,k))=Eprog(neibor(i,k))+4*8*er+4*8*(eta*r(neibor(i,k))^2+et);       %接收簇头信息并发撤消包
              if d(neibor(i,k))~=0
                 for b=1:d(neibor(i,k))
                     Eprog(neibor(neibor(i,k),b))=Eprog(neibor(neibor(i,k),b))+4*8*er;       %接收撤消包
                 end    
              end
          end
       end  
    end  
end   
     
 for i=1:N
     if CH(i)==2
        fitness1=0;
        if schnum(i)~=0
           for k=1:schnum(i)           %收到的簇头集合中适宜性最高的簇头
               if fitness(sch(i,k))>fitness1
                  fitness1=fitness(sch(i,k));
                  head=sch(i,k); 
              end
            end
        end 
        flag1=0; 
        if d(i)~=0
           for k=1:d(i)                     %簇头的适宜性是否在未被覆盖的节点中最高
               if CH(neibor(i,k))==0
                  if fitness(neibor(i,k))>fitness1
                     flag1=1;
                     break
                 end
              end
           end 
        end
        if flag1==0
           cluster_head(i)=head;
           CH(i)=1;
           Eprog(i)=Eprog(i)+6*8*(eta*r(i)^2+et);         %发加入信息
        end
    end   
  end
  
%ddddddddddddddddddddddddddd       处理未被覆盖的节点  ddddddddddddddddddddddddddddddddddddddd 
flag=1;
while flag==1
      flag=0;
      chval=3;    
      for i=1:N            %重新计算未覆盖节点的选票    
          if e(i)~=0 
             if CH(i)==0
                flag=1;
                E(i)=e(i);
                if d(i)~=0
                   for k=1:d(i)
                       if CH(neibor(i,k))==0
                          E(i)=E(i)+e(neibor(i,k));
                       end  
                   end   
                end  
                v(i,i)=e(i)/E(i);
                if d(i)~=0
                   for k=1:d(i)
                       if CH(neibor(i,k))==0
                          v(i,neibor(i,k))=e(neibor(i,k))/E(i);
                       else   
                          v(i,neibor(i,k))=0;
                       end 
                   end   
                end
            end
          end
      end   
         
        for i=1:N
            if e(i)~=0
               if CH(i)==0
                  Eprog(i)=Eprog(i)+6*8*(eta*r(i)^2+et);         %发新选票信息 
                  curvote(i)=v(i,i);
                  if d(i)~=0
                     for k=1:d(i)
                         if CH(neibor(i,k))==0
                            curvote(i)=curvote(i)+v(neibor(i,k),i);
                         end  
                     end  
                  end
               end
            end   
        end
        
        for i=1:N               %查找本节点是否是邻居集合中最多选票的节点,如是发簇头广播
            if e(i)~=0
               if CH(i)==0
                  maxvote=curvote(i);
                  maxvoteID(i)=i;
                  flag1=0;
                  if d(i)~=0
                     for k=1:d(i)
                         if CH(neibor(i,k))==0
                            if curvote(neibor(i,k))>maxvote
                               flag1=1;
                               break
                            end
                         end  
                     end
                  end    
                  if flag1==0
                     cluster_head(i)=i;
                     CH(i)=chval;
                     Eprog(i)=Eprog(i)+4*8*(eta*r(i)^2+et);         %发簇头信息
                  end     
               end
            end  
        end
        
       for i=1:N            %  处理收到的簇头信息的节点

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -