
无线传感器网络deec算法.doc
9页无线传感器网络无线传感器网络 DEECDEEC 算法算法clear%1.初始参数设定模块%.传感器节点区域界限(单位 M)xm=100;ym=100;%(1)汇聚节坐标给定sink.x=0.5*xm;sink.y=0.5*ym;%区域内传器节数n=100%簇头优化比例(当选簇头的概率)P=0.1;%能量模型(单位 焦)%初始化能量模型Eo=0.5;%Eelec=Etx=ErxETX=50*0.000000001;ERX=50*0.000000001;%Transmit Amplifier typesEfs=10*0.000000000001;Emp=0.0013*0.000000000001;%Data Aggregation EnergyEDA=5*0.000000001;%高能量节点超出一节点能量的百分比a=1;%最大循环次数rmax=5000%算出参数 dodo=sqrt(Efs/Emp);Et=0;%2.无线传感器网络模型产生模块%构建无线传感器网络,在区域内均匀投放 100 个节点,并画出图形for i=1:1:nS(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).E=Eo*(1+rand*a);E(i)= S(i).E;Et=Et+E(i);%initially there are no cluster heads only nodesS(i).type='N';endd1=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);S(n+1).xd=sink.x;S(n+1).yd=sink.y;%3.网络运行模块%簇头节点数countCHs=0;cluster=1;%此定义的目的仅仅是给定一个 1 开始的下标参数,真正的簇头数应该还减去 1flag_first_dead=0;flag_teenth_dead=0;flag_all_dead=0;%死亡节点数dead=0;first_dead=0;teenth_dead=0;all_dead=0;%活动节点数allive=n;%counter for bit transmitted to Bases Station and to Cluster Headspackets_TO_BS=0;packets_TO_CH=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:nS(i).G=0;S(i).cl=0;endendEa=Et*(1-r/rmax)/n;%(2)死亡节点检查模块dead=0;for i=1:1:n%检查有无死亡节点if (S(i).E0S(i).type='N';endendSTATISTICS.DEAD(r+1)=dead;STATISTICS.ALLIVE(r+1)=allive-dead;%(4)簇头选举模块countCHs=0;cluster=1;for i=1:1:nif Ea>0p(i)=P*n*S(i).E*E(i)/(Et*Ea);if(S(i).E>0)temp_rand=rand; if ( (S(i).G)do)S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance )); endif (distance0 )if(cluster-1>=1)min_dis=sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 );min_dis_cluster=0;for c=1:1:cluster-1temp=min(min_dis,sqrt( (S(i).xd-C(c).xd)^2 + (S(i).yd-C(c).yd)^2 ) );if ( tempdo)S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis)); endif (min_disdo)S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis)); endif (min_disdo)S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis)); endif (min_dis<=do)S(i).E=S(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis)); endpackets_TO_BS=packets_TO_BS+1;endendendSTATISTICS.PACKETS_TO_CH(r+1)=packets_TO_CH;STATISTICS.PACKETS_TO_BS(r+1)=packets_TO_BS;endfirst_deadteenth_deadall_deadSTATISTICS.DEAD(r+1)STATISTICS.ALLIVE(r+1)STATISTICS.PACKETS_TO_CH(r+1)STATISTICS.PACKETS_TO_BS(r+1)STATISTICS.COUNTCHS(r+1)r=0:5000;subplot(2,2,1);plot(r,STATISTICS.DEAD);subplot(2,2,2);plot(r,STATISTICS.ALLIVE);subplot(2,2,3);plot(r,STATISTICS.PACKETS_TO_BS);subplot(2,2,4);plot(r,STATISTICS.COUNTCHS);%STATISTICS,结构体数组,包括下面的 5 个变量;%countCHs(r+1),每一轮所选出的簇头数目;%packets_TO_BS(r+1),基站收到的数据包总数;%PACKETS_TO_CH(r+1),簇头收到的数据包总数;%first_dead,第一个节点死亡的时间;%teenth_dead=r,10%的节点死亡的时间;%dead(r+1),每一轮的死亡节点数;%allive(r+1),每一轮的活动节点数。
