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

📄 nojunyunevote2new.m.txt

📁 在matlab下对无线传感器网络进行仿真
💻 TXT
📖 第 1 页 / 共 2 页
字号:
           if CH(i)==chval
              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))=chval+1;
                     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)~=1&&CH(i)~=chval                %CH(i)~=0&&CH(i)~=1
              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  
         chval=chval+2;
     end    
%ddddddddddddddddddddddddddd      簇形成阶段每个节点的能量消耗   ddddddddddddddddddddddddddddddddddddddd  

for i=1:N
    if e(i)~=0
       Eclu(i)=Einit(i)+Eprog(i);
    end   
end    
 
%ddddddddddddddddddddddddddd       计算簇的个数:簇头和成员   ddddddddddddddddddddddddddddddddddddddd
temp1=cluster_head;
cluster_num=1;
for i=1:N
    if e(i)~=0
       if temp1(i)==0
          continue
       end    
       head=temp1(i);
       temp1(i)=0;
       m=1;
       cluster(cluster_num,m)=head;
       m=m+1;
       for k=i+1:N
          if head==temp1(k)
             if k==head
                cluster(cluster_num,m)=i; 
             else   
                cluster(cluster_num,m)=k;
             end   
             m=m+1;
             temp1(k)=0;
         end
       end
       node_num(cluster_num)=m-1;
       cluster_num=cluster_num+1;
    end  
end
cluster_num=cluster_num-1;  

%ddddddddddddddddddddddddddd      数据传输阶段每个节点的能量消耗   ddddddddddddddddddddddddddddddddddddddd  
for i=1:cluster_num
    Edata(cluster(i,1))=5*(128*8*er*(node_num(i)-1)+efuse*128*8*(node_num(i)-1));  %簇头接收信息和融合信息能耗以及经多跳发送到网关的能耗
    for k=2:node_num(i)
        Edata(cluster(i,k))=5*128*8*(et+eta*dis(cluster(i,1),cluster(i,k))^2)+5*128*8*es;       % 成员节点采集和发送数据能耗
    end
end
%下面计算簇头到网关的路由

for i=1:cluster_num
    if dis(cluster(i,1),N+1)<=dT
       rout(cluster(i,1),1)=0;
       rout1(cluster(i,1),1)=0;
       continue
    else
       m=0;
       for j=1:cluster_num
           if dis(cluster(i,1),N+1)>dis(cluster(j,1),N+1)
               m=m+1;
               rout(cluster(i,1),m)=cluster(j,1);
           end
       end
       if rout(cluster(i,1),1)==0
          rout1(cluster(i,1),1)=0;
      end
      %求最佳中继节点的位置(x0,y0)   
      x0=Loca(cluster(i,1),1)*(1-dn(cluster(i,1))/(dis(cluster(i,1),N+1)));
      y0=Loca(cluster(i,1),2)*(1-dn(cluster(i,1))/(dis(cluster(i,1),N+1)))+D*dn(cluster(i,1))/(dis(cluster(i,1),N+1));
      flag5=1;
      rout1(cluster(i,1),1)=0;
      dmin1=dn(cluster(i,1))^2;
      for j=1:m
          dtemp=(Loca(rout(cluster(i,1),j),1)-x0)^2+(Loca(rout(cluster(i,1),j),2)-y0)^2;
          if dtemp<dmin1
              dmin1=dtemp;
              node=rout(cluster(i,1),j);
              flag5=0;
          end
      end
      if flag5==0
         rout1(cluster(i,1),1)=node;
      end
  end
end
%下面计算簇头消耗的能量
for i=1:cluster_num
    if rout1(cluster(i,1),1)==0
        Edata(cluster(i,1))=Edata(cluster(i,1))+128*8*(et+eta*(dis(cluster(i,1),N+1))^2);
    else
        temp=rout1(cluster(i,1),1);
        Edata(cluster(i,1))=Edata(cluster(i,1))+128*8*(et+eta*(dis(cluster(i,1),temp))^2);
        Edata(temp)=Edata(temp)+128*8*er;
        for k=1:7
            if rout1(temp,1)==0
                Edata(temp)=Edata(temp)+128*8*(et+eta*(dis(temp,N+1))^2);
                break
            else
                temp1=rout1(temp,1);
                Edata(temp)=Edata(temp)+128*8*(et+eta*(dis(temp,temp1))^2);
                Edata(temp1)=Edata(temp1)+128*8*er;
                temp=temp1;
            end
        end
    end
end        

%ddddddddddddddddddddddddddd      一轮结束后每个节点的能量消耗和剩余能量   ddddddddddddddddddddddddddddddddddddddd 

for i=1:N
    if e(i)~=0
       e(i)=e(i)-Edata(i)-Eclu(i);
       Ecluz=Ecluz+Eclu(i);
       Edataz=Edataz+Edata(i);
    end   
end 
lunum=lunum+1;

if N==200
   if lunum<=20 
      Ehead(t,lunum)=0;
      for i=1:cluster_num
          if e(i)~=0
             Ehead(t,lunum)=Ehead(t,lunum)+Edata(cluster(i,1))+Eclu(cluster(i,1));
          end
      end
   end
end

for i=1:N
    if e(i)<=1*10^(-10) &&e(i)~=0            %能量耗尽后,该节点从邻居集中删去
       e(i)=0;
       if N==200
          dienote=dienote+1;
          if dienote==Nper
              die(t,Nper/10)=lunum; 
              Nper=Nper+10;
           end
        end
       if d(i)~=0
          for k=1:d(i)
              nei=neibor(i,k);
              if d(nei)~=0  
                 for j=1:d(nei)
                     if neibor(nei,j)==i
                        if j~=d(nei)
                           for x=j:d(nei)-1 
                               neibor(nei,x) =neibor(nei,x+1);
                           end  
                        end
                        break
                     end    
                  end
                  neibor(nei,d(nei))=0;
                  if d(nei)>0
                     d(nei)=d(nei)-1;
                  end
              end
          end 
       end 
       d(i)=0;
       if flag3==0
          first_lu=lunum;
          flag3=1;
    %     flag2=0;
    %      break
       end   
    end
end    

flag4=0;
for i=1:N    
    if e(i)>=1*10^(-10)
       flag4=1;
       break
    end
end    
    if flag4==0
       flag2=0;
       last_lu=lunum;
    end     
end

%ddddddddddddddddddddddddddd  算法结束 ddddddddddddddddddddddddddddddddddddddd
first_luf(t)=first_lu;     %重复100次,每次的第一个节点死去经历的轮数
last_luf(t)=last_lu;         %重复100次,每次的最后一个节点死去经历的轮数
Ecluzf(t)=Ecluz;             %重复100次,每次的簇形成消耗的能量
Edatazf(t)=Edataz;          %重复100次,每次的数据传输消耗的能量

end                     % 对于相同的传输半径,重复100次结束

%dddddddddddddddddddddd计算各参数100次的平均值dddddddddddddddddddddddd
sum=0;
sum1=0;
sum2=0;
sum3=0;
if N==200
   for i=1:20
       sum4(i)=0;
       sum5(i)=0;
   end
end

for i=1:g
    sum=sum+first_luf(i);
    sum1=sum1+last_luf(i);
    sum2=sum2+Ecluzf(i);
    sum3=sum3+Edatazf(i);
end    
if N==200
   for j=1:20
       for i=1:g
           sum4(j)=sum4(j)+Ehead(i,j);
           sum5(j)=sum5(j)+die(i,j);
       end
    end
end

first_lu_z(f)=sum/g;
last_lu_z(f)=sum1/g;
Ecluzz(f)=sum2/g;
Edatazz(f)=sum3/g;
if N==200
   for i=1:20
       Eheadz(i)=sum4(i)/g;
       diez(i)=sum5(i)/g;
   end
end

N=N+50;
f=f+1;
end                    %程序结束

%dddddddddddddddddddd     画图        dddddddddddddddddddddddd

 









⌨️ 快捷键说明

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