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

📄 fps.m

📁 wsn路由
💻 M
📖 第 1 页 / 共 2 页
字号:
            if (min_dis>do)
                S2(i).E=S2(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis)); 
            end
            if (min_dis<=do)
                S2(i).E=S2(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis)); 
            end
            packets_TO_BS2(m)=packets_TO_BS2(m)+1;
     end
  end
end
STATISTICS.PACKETS_TO_BS2(m,r+1)=packets_TO_BS2(m);
end
d1=0.765*xm/2;
K=sqrt(0.5*n*do/pi)*xm/d1^2;
d2=xm/sqrt(2*pi*K);
Er=4000*(2*n*ETX+n*EDA+K*Emp*d1^4+n*Efs*d2^2);
S3(n+1).xd=sink.x;
S3(n+1).yd=sink.y;
S4(n+1).xd=sink.x;
S4(n+1).yd=sink.y;
%3.网络运行模块
%簇头节点数
cluster3=1;%此定义的目的仅仅是给定一个1开始的下标参数,真正的簇头数应该还减去1
flag_first_dead3=0;
flag_teenth_dead3=0;
%死亡节点数
first_dead3(m)=0;
teenth_dead3(m)=0;
%counter for bit transmitted to Bases Station and to Cluster Heads
packets_TO_BS3(m)=0;
%(1)循环模式设定
for r=0:1:rmax     %该 for 循环将下面的所有程序包括在内,直到最后一 end 才结束循环
    r;
  %每过一个轮转周期(本程序为10次)使各节点的S(i).G参数(该参数用于后面的簇选举,在该轮转周期内已当选过簇头的节点不能再当选)恢复为零
  if(mod(r, round(1/P) )==0)
    for i=1:1:n
        S3(i).G=0;
    end
  end
  El3(m,r+1)=0;
  for i=1:100
    El3(m,r+1)=S3(i).E+El3(m,r+1);
  end
Es3(m,r+1)=Et-El3(m,r+1);
Ea=Et*(1-r/rmax)/n;
%(2)死亡节点检查模块
dead3(m)=0;
for i=1:1:n
    %检查有无死亡节点
    if (S3(i).E<=0)
        dead3(m)=dead3(m)+1; 
        %(3)第一个死亡节点的产生时间(用轮次表示)
        %第一个节点死亡时间
        if (dead3(m)==1)
           if(flag_first_dead3==0)
              first_dead3(m)=r;
              flag_first_dead3=1;
           end
        end
        %10%的节点死亡时间
        if(dead3(m)==0.1*n)
           if(flag_teenth_dead3==0)
              teenth_dead3(m)=r;
              flag_teenth_dead3=1;
           end
        end
    end
    if S3(i).E>0
        S3(i).type='N';
    end
end
STATISTICS.DEAD3(m,r+1)=dead3(m);
%(4)簇头选举模块
cluster3=1;
for i=1:1:n
 if Ea>0
 p(i)=P*n*S3(i).E*E3(i)/(Et*Ea);
 if(S3(i).E>0)
   temp_rand=rand;     
   if ( (S3(i).G)<=0)  
       %簇头的选举,当选的簇头会把各种相关信存入下面程序所给定的变量中
        if(temp_rand<= (p(i)/(1-p(i)*mod(r,round(1/p(i))))))
            packets_TO_BS3(m)=packets_TO_BS3(m)+1;
            S3(i).type='C';
            S3(i).G=round(1/p(i))-1;
            C3(cluster3).xd=S3(i).xd;
            C3(cluster3).yd=S3(i).yd;
            distance=sqrt( (S3(i).xd-(S3(n+1).xd) )^2 + (S3(i).yd-(S3(n+1).yd) )^2 );
            C3(cluster3).distance=distance;
            C3(cluster3).id=i;
            X3(cluster3)=S3(i).xd;
            Y3(cluster3)=S3(i).yd;
            cluster3=cluster3+1;
           %计算簇头发送4000bit数据到基站的能量消耗(这里应是所有节点包括簇头每一轮发送4000bit数据)
           distance;
            if (distance>do)
                S3(i).E=S3(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance )); 
            end
            if (distance<=do)
                S3(i).E=S3(i).E- ( (ETX+EDA)*(4000)  + Efs*4000*( distance * distance )); 
            end
        end     
    end
    % S3(i).G=S3(i).G-1;  
  end 
 end
end
%(5)簇内成员选择簇头模块(即簇的形成模块)
%簇内成员对簇头的选择(即簇的形成)算法
for i=1:1:n
   if ( S3(i).type=='N' && S3(i).E>0 )
     if(cluster3-1>=1)
       min_dis=Inf;
       min_dis_cluster=0;
       for c=1:1:cluster3-1
           temp=min(min_dis,sqrt( (S3(i).xd-C3(c).xd)^2 + (S3(i).yd-C3(c).yd)^2 ) );
           if ( temp<min_dis )
               min_dis=temp;
               min_dis_cluster=c;
           end
       end
       %簇内节点(发送4000bit数据)能量消耗
            min_dis;
            if (min_dis>do)
                S3(i).E=S3(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis)); 
            end
            if (min_dis<=do)
                S3(i).E=S3(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis)); 
            end
        %簇头(接受和融合这一簇内节点4000bit数据)的能量消耗
            S3(C3(min_dis_cluster).id).E = S3(C3(min_dis_cluster).id).E- ( (ERX + EDA)*4000 ); 
            S3(i).min_dis=min_dis;
            S3(i).min_dis_cluster=min_dis_cluster;
   else
            min_dis=sqrt( (S3(i).xd-S3(n+1).xd)^2 + (S3(i).yd-S3(n+1).yd)^2 );
            if (min_dis>do)
                S3(i).E=S3(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis)); 
            end
            if (min_dis<=do)
                S3(i).E=S3(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis)); 
            end
            packets_TO_BS3(m)=packets_TO_BS3(m)+1;
   end
  end
end
STATISTICS.PACKETS_TO_BS3(m,r+1)=packets_TO_BS3(m);
end
cluster=1;%此定义的目的仅仅是给定一个1开始的下标参数,真正的簇头数应该还减去1
flag_first_dead4=0;
flag_teenth_dead4=0;
%死亡节点数
first_dead4(m)=0;
teenth_dead4(m)=0;
%counter for bit transmitted to Bases Station and to Cluster Heads
packets_TO_BS4(m)=0;
%(1)循环模式设定
for r=0:1:rmax     %该 for 循环将下面的所有程序包括在内,直到最后一 end 才结束循环
    r;
  %每过一个轮转周期(本程序为10次)使各节点的S(i).G参数(该参数用于后面的簇选举,在该轮转周期内已当选过簇头的节点不能再当选)恢复为零
  if(mod(r, round(1/P) )==0)
    for i=1:1:n
        S4(i).G=0;
    end
  end
  El4(m,r+1)=0;
  for i=1:100
    El4(m,r+1)=S4(i).E+El4(m,r+1);
  end
Es4(m,r+1)=Et-El4(m,r+1);
Ea=Et*(1-r/rmax)/n;
%(2)死亡节点检查模块
dead4(m)=0;
for i=1:1:n
    %检查有无死亡节点
    if (S4(i).E<=0)
        dead4(m)=dead4(m)+1; 
        %(3)第一个死亡节点的产生时间(用轮次表示)
        %第一个节点死亡时间
        if (dead4(m)==1)
           if(flag_first_dead4==0)
              first_dead4(m)=r;
              flag_first_dead4=1;
           end
        end
        %10%的节点死亡时间
        if(dead4(m)==0.1*n)
           if(flag_teenth_dead4==0)
              teenth_dead4(m)=r;
              flag_teenth_dead4=1;
           end
        end
    end
    if S4(i).E>0
        S4(i).type='N';
    end
end
STATISTICS.DEAD4(m,r+1)=dead4(m);
%(4)簇头选举模块
cluster4=1;
for i=1:1:n
 if Ea>0
 p(i)=P*n*S4(i).E*E4(i)/(Et*Ea);
 if(S4(i).E>0)
   temp_rand=rand;     
   if ( (S4(i).G)<=0)  
       %簇头的选举,当选的簇头会把各种相关信存入下面程序所给定的变量中
        if(temp_rand<= (p(i)/(1-p(i)*mod(r,round(1/p(i))))))
            packets_TO_BS4(m)=packets_TO_BS4(m)+1;
            S4(i).type='C';
            S4(i).G=round(1/p(i))-1;
            C4(cluster4).xd=S4(i).xd;
            C4(cluster4).yd=S4(i).yd;
            distance=sqrt( (S4(i).xd-(S4(n+1).xd) )^2 + (S4(i).yd-(S4(n+1).yd) )^2 );
            C4(cluster4).distance=distance;
            C4(cluster4).id=i;
            X4(cluster4)=S4(i).xd;
            Y4(cluster4)=S4(i).yd;
            cluster4=cluster4+1;
           %计算簇头发送4000bit数据到基站的能量消耗(这里应是所有节点包括簇头每一轮发送4000bit数据)
           distance;
            if (distance>do)
                S4(i).E=S4(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance )); 
            end
            if (distance<=do)
                S4(i).E=S4(i).E- ( (ETX+EDA)*(4000)  + Efs*4000*( distance * distance )); 
            end
        end     
    end
    % S4(i).G=S4(i).G-1;  
  end 
 end
end
%(5)簇内成员选择簇头模块(即簇的形成模块)
%簇内成员对簇头的选择(即簇的形成)算法
for i=1:1:n
   if ( S4(i).type=='N' && S4(i).E>0 )
     if(cluster4-1>=1)
       min_dis=sqrt( (S4(i).xd-S4(n+1).xd)^2 + (S4(i).yd-S4(n+1).yd)^2 );
       min_dis_cluster=0;
       for c=1:1:cluster4-1
           temp=min(min_dis,sqrt( (S4(i).xd-C4(c).xd)^2 + (S4(i).yd-C4(c).yd)^2 ) );
           if ( temp<min_dis )
               min_dis=temp;
               min_dis_cluster=c;
           end
       end
       %簇内节点(发送4000bit数据)能量消耗
       if(min_dis_cluster~=0)    
            min_dis;
            if (min_dis>do)
                S4(i).E=S4(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis)); 
            end
            if (min_dis<=do)
                S4(i).E=S4(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis)); 
            end
        %簇头(接受和融合这一簇内节点4000bit数据)的能量消耗
            S4(C4(min_dis_cluster).id).E = S4(C4(min_dis_cluster).id).E- ( (ERX + EDA)*4000 ); 
       else 
            min_dis;
            if (min_dis>do)
                S4(i).E=S4(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis)); 
            end
            if (min_dis<=do)
                S4(i).E=S4(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis)); 
            end
            packets_TO_BS4(m)=packets_TO_BS4(m)+1;
        end
        S4(i).min_dis=min_dis;
        S4(i).min_dis_cluster=min_dis_cluster;
   else
            min_dis=sqrt( (S4(i).xd-S4(n+1).xd)^2 + (S4(i).yd-S4(n+1).yd)^2 );
            if (min_dis>do)
                S4(i).E=S4(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis)); 
            end
            if (min_dis<=do)
                S4(i).E=S4(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis)); 
            end
            packets_TO_BS4(m)=packets_TO_BS4(m)+1;
   end
  end
end
STATISTICS.PACKETS_TO_BS4(m,r+1)=packets_TO_BS4(m);
end
m=m+1;
end
r=0:0.5:5;
subplot(2,1,1);
plot(r,first_dead1,':ok',r,first_dead2,'-xr',r,first_dead3,'--sb',r,first_dead4,'-.pm');
legend('leachm1','leachm2','DEEC1','DEEC2');
xlabel('x(a)');
ylabel('y(time)');
title('\bf leach(1,2)和DEEC(1,2)的稳定周期对比');
subplot(2,1,2);
plot(r,teenth_dead1,':ok',r,teenth_dead2,'-rx',r,teenth_dead3,'--sb',r,teenth_dead4,'-.pm');
legend('leachm1','leachm2','DEEC1','DEEC2');
xlabel('x(a)');
ylabel('y(time)');
title('\bf leach(1,2)和DEEC(1,2)的生命周期对比');
%r=0:5000;
%plot(r,STATISTICS.DEAD1(8,:),':k',r,STATISTICS.DEAD2(8,:),'-r',r,STATISTICS.DEAD3(8,:),'--b',r,STATISTICS.DEAD4(8,:),'-.m');
%legend('leachm1','leachm2','DEEC1','DEEC2');
%xlabel('x(time)');
%ylabel('y(dead)');
%title('\bf leach(1,2)和DEEC(1,2)在时a=3.5的死亡节点数随时间的变化对比');
%r=0:5000;
%plot(r,STATISTICS.PACKETS_TO_BS1(8,:),':k',r,STATISTICS.PACKETS_TO_BS2(8,:),'-r',r,STATISTICS.PACKETS_TO_BS3(8,:),'--b',r,STATISTICS.PACKETS_TO_BS4(8,:),'-.m');
%legend('leachm1','leachm2','DEEC1','DEEC2');
%xlabel('x(time)');
%ylabel('y(data)');
%title('\bf leach(1,2)和DEEC(1,2)在a=3.5时传输到基站的数据对比');
%r=0:5000;
%plot(r,Es1(8,:),':k',r,Es2(8,:),'-r',r,Es3(8,:),'--b',r,Es4(8,:),'-.m');
%legend('leachm1','leachm2','DEEC1','DEEC2');
%xlabel('x(time)');
%ylabel('y(substance)');
%title('\bf leach(1,2)和DEEC(1,2)在a=3.5时网络能量消耗对比');

⌨️ 快捷键说明

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