异构传感器网络的路由算法

  • w8_542316
    了解作者
  • 1.9KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-04-02 07:51
    上传日期
对异构WSN的Leach源程序做了很多改进,很有帮助,可以运行
yigou.rar
  • yigou.m
    6.5KB
内容介绍
%综合考虑三方面,簇首为比的形式 clear; E=0; w1=0.3,w2=0.1,w3=0.6 xm = 100; ym = 100; AE=0; r=75; sink.x=50; sink.y=175; n=100 T=zeros(1,n); p=0.05; packetLength=4000;%数据包长度 ctrPacketLength=100;%控制包长度 Eo=1; ETX=50*0.000000001; ERX=50*0.000000001; Efs=10*0.000000000001; Emp=0.0013*0.000000000001; EDA=5*0.000000001; INFINITY=999999999999999; rmax=9999 do=sqrt(Efs/Emp); figure(1); S(n+1).xd=sink.x; S(n+1).yd=sink.y; for i=1:1:15 Eo(i)=1.5; end for i=15:1:n Eo(i)=1; end for i=1:1:n E=E+Eo(i); S(i).xd=rand(1,1)*xm;%坐标 XR(i)=S(i).xd; S(i).yd=rand(1,1)*ym; YR(i)=S(i).yd; S(i).G=0; S(i).type='N';%普通节点 S(i).E=Eo(i); S(i).ENERGY=0; S(i).d=sqrt((S(i).xd-(S(n+1).xd))^2 + (S(i).yd-(S(n+1).yd))^2); for j=1:1:10 if (j-1)*r<S(i).d<j*r S(i).TABLEID=j; end end end E=E/n; countCHs=0; rcountCHs=0; cluster=1; countCHs; rcountCHs=rcountCHs+countCHs; flag_first_dead=0; for r=0:1:rmax %主循环,每次1轮 r if(mod(r, round(1/p))==0) for i=1:1:n S(i).G=0; S(i).cl=0; end end dead=0; packets_TO_BS=0; packets_TO_CH=0; PACKETS_TO_CH(r+1)=0; PACKETS_TO_BS(r+1)=0; for i=1:1:n AE=S(i).E+AE; if (S(i).E<=0) dead=dead+1; end if (S(i).E>0) S(i).type='N'; end end AE=AE/n; if (dead==n)%节点全部死亡退出循环 break; end STATISTICS(r+1).DEAD=dead; DEAD(r+1)=dead; if (dead==1) if(flag_first_dead==0) first_dead=r flag_first_dead=1; end end for c=1:1:5 xiao(c)=INFINITY; for i=1:1:n if(S(i).E>0) distance=sqrt((S(i).xd-(S(n+1).xd))^2 + (S(i).yd-(S(n+1).yd))^2);%到sink的距离 W(i)=w1*S(i).E*(E-S(i).E)/AE+w2*T(i)+w3*distance; if ((S(i).G)<=0) %如果该节点在候选集合中 if W(i)<xiao(c) xiao(c)=W(i); C(c).id = i; W(i)=INFINITY; S(i).type = 'C'; S(i).G=1; C(c).xd = S(i).xd; C(c).yd = S(i).yd; C(c).distance = distance; C(c).id = i; X(c)=S(i).xd; Y(c)=S(i).yd; distanceBroad = sqrt(xm*xm+ym*ym); if (distanceBroad >=do) S(i).E = S(i).E-(ETX*ctrPacketLength + Emp*ctrPacketLength*(distanceBroad*distanceBroad*distanceBroad*distanceBroad));%广播自成为簇头 else S(i).E = S(i).E-(ETX*ctrPacketLength + Efs*ctrPacketLength*(distanceBroad*distanceBroad)); end packets_TO_BS = packets_TO_BS+1; PACKETS_TO_BS(r+1) = packets_TO_BS; end end end i=i+1; end T(C(c).id)=T(C(c).id)+1; end for c = 1:1:cluster-1 if S(C(c).id).TABLEID~=1 for k=S(C(c).id).TABLEID:(-1):1 for j=1:1:cluster-1 if S(C(c).id).TABLEID==k-1 S(C(c).id).E=S(C(c).id).E-(ERX + EDA)*packetLength; end end end else S(i).E = S(i).E-((ETX+EDA)*packetLength+ Efs*packetLength*(distance*distance)); end end for i=1:1:n if (S(i).type=='N'&S(i).E>0) %普通节点 S(i).min_dis=INFINITY; S(i).min_dis_cluster=1; %加入最近的簇头 for c=1:1:5 %簇头数量一共是cluster-1 temp=sqrt((S(i).xd-C(c).xd)^2+(S(i).yd-C(c).yd)^2); if (temp< S(i).min_dis) S(i).min_dis=temp; S(i).min_dis_cluster=C(c).id; end S(i).E=S(i).E-ETX*ctrPacketLength; end if S(S(i).min_dis_cluster).type=='C' for k=1:1:n if (S(k).min_dis_cluster==S(i).min_dis_cluster) tempki=(S(i).xd-S(k).xd)^2+(S(i).yd-S(k).yd)^2; if (tempki+(S(i).min_dis)^2)<(S(k).min_dis)^2 S(k).min_dis_cluster=i; if (tempki>(do^2)) S(k).E=S(k).E-(ETX*(ctrPacketLength)+Emp*ctrPacketLength*(tempki*tempki)); %向簇头发送加入控制消息 S(k).E=S(k).E-(ETX*(packetLength)+Emp*packetLength*(tempki*tempki)); %向簇头数据包 else S(k).E=S(k).E-(ETX*(ctrPacketLength)+Efs*ctrPacketLength*tempki); %向簇头发送加入控制消息 S(k).E=S(k).E-(ETX*(packetLength)+Efs*packetLength*tempki); %向簇头数据包 end S(k).E=S(k).E-ETX*(ctrPacketLength); %接收簇头确认加入控制消息 %Energy dissipated %簇头接收簇成员数据包消耗能量,接收加入消息和和确认加入消息 if(tempki>0) S(i).E=S(i).E-((ERX+EDA)*packetLength); %接受簇成员发来的数据包 S(i).E=S(i).E-ERX*ctrPacketLength ; %接收加入消息 if (tempki>(do^2))%簇头向簇成员发送确认加入的消息 S(i).E=S(i).E-(ETX*(ctrPacketLength)+Emp*ctrPacketLength*(tempki*tempki)); else S(i).E=S(i).E-(ETX*(ctrPacketLength)+Emp*ctrPacketLength*tempki); end end S(k).E = S(k).E - ETX * ctrPacketLength; end end end end if S(S(i).min_dis_cluster).type=='C' if (S(i).min_dis>do) S(i).E=S(i).E-(ETX*(ctrPacketLength)+Emp*ctrPacketLength*(S(i).min_dis*S(i).min_dis*S(i).min_dis*S(i).min_dis)); %向簇头发送加入控制消息 S(i).E=S(i).E-(ETX*(packetLength)+Emp*packetLength*(S(i).min_dis*S(i).min_dis*S(i).min_dis*S(i).min_dis)); %向簇头数据包 else S(i).E=S(i).E-(ETX*(ctrPacketLength)+Emp*ctrPacketLength*( S(i).min_dis*S(i).min_dis)); %向簇头发送加入控制消息 S(i).E=S(i).E-(ETX*(packetLength)+Emp*packetLength*(S(i).min_dis*S(i).min_dis)); %向簇头数据包 end S(i).E=S(i).E-ETX*(ctrPacketLength); %接收簇头确认加入控制消息 %Energy dissipated %簇头接收簇成员数据包消耗能量,接收加入消息和和确认加入消息 if(S(i).min_dis>0) S(S(i).min_dis_cluster).E=S(S(i).min_dis_cluster).E-((ERX + EDA)*packetLength ); %接受簇成员发来的数据包 S(S(i).min_dis_cluster).E=S(S(i).min_dis_cluster).E-ERX *ctrPacketLength ; %接收加入消息 if (S(i).min_dis>do)%簇头向簇成员发送确认加入的消息 S(S(i).min_dis_cluster).E=S(S(i).min_dis_cluster).E-(ETX*(ctrPacketLength)+Emp*ctrPacketLength*(S(i).min_dis*S(i).min_dis*S(i).min_dis*S(i).min_dis)); else S(S(i).min_dis_cluster).E=S(S(i).min_dis_cluster).E-(ETX*(ctrPacketLength)+Emp*ctrPacketLength*(S(i).min_dis*S(i).min_dis)); end PACKETS_TO_CH(r+1)=n-dead-cluster+1; %所有的非死亡的普通节点都发送数据包 end end end end end countCHs; rcountCHs = rcountCHs + countCHs; end x=1:1:r; y=1:1:r; %z=1:1:r; for i=1:1:r; x(i)=i; y(i)=n-STATISTICS(i).DEAD; %z(i)=CLUSTERHS(i); end %plot(x,y,'r',x,z,'b'); plot(x,y,'r'); hold on; end
评论
    相关推荐
    • 程序员算法
      这是一个算法文档压缩包,其中包括《可能与不可能的边界》、《具体数学》、《算法的乐趣》、《啊哈!算法》。这些书很适合对算法感兴趣的朋友,书籍讲解算法非常有趣。注意,其中有些文档是试读版本。
    • 算法实验
      算法实验算法实验算法实验算法实验算法实验算法实验算法实验算法实验
    • 大数据算法
      本书共分为10章,第1章概述大数据算法,第2章介绍时间亚线性算法,第3章介绍空间亚线性算法,第4章概述外存算法,第5章介绍大数据外存查找结构,第6章讲授外存图数据算法,第7章概述MapReduce算法,第8章通过一系列...
    • 算法
      算法 算法
    • SIFT 算法
      SIFT 算法SIFT 算法SIFT 算法SIFT 算法
    • RSA算法
      RSA算法是公钥加密算法中重要的算法之一,本算法即实现RSA的加解密过程。
    • 分词算法介分词算法
      算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语...
    • unify算法
      unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法
    • 寻路算法
      寻路算法 寻路封装
    • dsp算法算法算法算法
      dsp各种算法