1.問題描述:
無線傳感器網路中LEACH協議作業原理,然后通過NS2將LEACH和LEACH-C,MTE在設定的仿真環境中做了仿真對比.仿真結果表明,MTE比LEACH和LEACH-C有更長的網路生存時間,當SINK節點位置在感知區域內時LEACH性能優于LEACH-C.當SINK節點位置遠離感知區域時LEACH-C性能比LEACH更好.
2.部分程式:
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=Erx
ETX=50*0.000000001;
ERX=50*0.000000001;
%Transmit Amplifier types
Efs=10*0.000000000001;
Emp=0.0013*0.000000000001;
%Data Aggregation Energy
EDA=5*0.000000001;
%高能量節點超出一節點能量的百分比
a=1;
%最大回圈次數
rmax=5000
%算出引數 do
do=sqrt(Efs/Emp);
Et=0;
%2.無線傳感器網路模型產生模塊
%構建無線傳感器網路,在區域內均勻投放100個節點,并畫出圖形
for i=1:1:n
S3(i).xd=rand(1,1)*xm;
S4(i).xd=S3(i).xd;
XR4(i)=S4(i).xd;
XR3(i)=S3(i).xd;
S3(i).yd=rand(1,1)*ym;
S4(i).yd=S3(i).yd;
YR4(i)=S4(i).yd;
S4(i).G=0;
YR3(i)=S3(i).yd;
S3(i).G=0;
S3(i).E=Eo*(1+rand*a);
S4(i).E=S3(i).E;
E3(i)= S3(i).E;
E4(i)= S4(i).E;
Et=Et+E3(i);
%initially there are no cluster heads only nodes
S3(i).type='N';
S4(i).type='N';
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.網路運行模塊
%簇頭節點數
countCHs3=0;
cluster3=1;%此定義的目的僅僅是給定一個1開始的下標引數,真正的簇頭數應該還減去1
flag_first_dead3=0;
flag_teenth_dead3=0;
flag_all_dead3=0;
%死亡節點數
dead3=0;
first_dead3=0;
teenth_dead3=0;
all_dead3=0;
%活動節點數
allive3=n;
%counter for bit transmitted to Bases Station and to Cluster Heads
packets_TO_BS3=0;
packets_TO_CH3=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;
S3(i).cl=0;
end
end
Ea=Et*(1-r/rmax)/n;
El3(r+1)=0;
for i=1:100
El3(r+1)=S3(i).E+El3(r+1);
end
Ec3(r+1)=Et-El3(r+1);
%(2)死亡節點檢查模塊
dead3=0;
for i=1:1:n
%檢查有無死亡節點
if (S3(i).E<=0)
dead3=dead3+1;
%(3)第一個死亡節點的產生時間(用輪次表示)
%第一個節點死亡時間
if (dead3==1)
if(flag_first_dead3==0)
first_dead3=r;
flag_first_dead3=1;
end
end
%10%的節點死亡時間
if(dead3==0.1*n)
if(flag_teenth_dead3==0)
teenth_dead3=r;
flag_teenth_dead3=1;
end
end
if(dead3==n)
if(flag_all_dead3==0)
all_dead3=r;
flag_all_dead3=1;
end
end
end
if S3(i).E>0
S3(i).type='N';
end
end
STATISTICS.DEAD3(r+1)=dead3;
STATISTICS.ALLIVE3(r+1)=allive3-dead3;
%(4)簇頭選舉模塊
countCHs3=0;
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))))))
countCHs3=countCHs3+1;
packets_TO_BS3=packets_TO_BS3+1;
PACKETS_TO_BS3(r+1)=packets_TO_BS3;
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
STATISTICS.COUNTCHS3(r+1)=countCHs3;
%(5)簇內成員選擇簇頭模塊(即簇的形成模塊)
%簇內成員對簇頭的選擇(即簇的形成)演算法
for c=1:1:cluster3-1
x3(c)=0;
end
y3=0;
z3=0;
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;
x3(c)=x3(c)+1;
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 );
packets_TO_CH3=packets_TO_CH3+1;
S3(i).min_dis=min_dis;
S3(i).min_dis_cluster=min_dis_cluster;
else
y3=y3+1;
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=packets_TO_BS3+1;
end
end
end
if countCHs3~=0
u3=(n-y3)/countCHs3;
for c=1:1:cluster3-1
z3=(x3(c)-u3)*(x3(c)-u3)+z3;
end
LBF3(r+1)=z3/countCHs3;
else LBF3(r+1)=0;
end
STATISTICS.PACKETS_TO_CH3(r+1)=packets_TO_CH3;
STATISTICS.PACKETS_TO_BS3(r+1)=packets_TO_BS3;
end
countCHs4=0;
cluster=1;%此定義的目的僅僅是給定一個1開始的下標引數,真正的簇頭數應該還減去1
flag_first_dead4=0;
flag_teenth_dead4=0;
flag_all_dead4=0;
%死亡節點數
dead4=0;
first_dead4=0;
teenth_dead4=0;
all_dead4=0;
%活動節點數
allive4=n;
%counter for bit transmitted to Bases Station and to Cluster Heads
packets_TO_BS4=0;
packets_TO_CH4=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;
S4(i).cl=0;
end
end
Ea=Et*(1-r/rmax)/n;
El4(r+1)=0;
for i=1:100
El4(r+1)=S4(i).E+El4(r+1);
end
Ec4(r+1)=Et-El4(r+1);
%(2)死亡節點檢查模塊
dead4=0;
for i=1:1:n
%檢查有無死亡節點
if (S4(i).E<=0)
dead4=dead4+1;
%(3)第一個死亡節點的產生時間(用輪次表示)
%第一個節點死亡時間
if (dead4==1)
if(flag_first_dead4==0)
first_dead4=r;
flag_first_dead4=1;
end
end
%10%的節點死亡時間
if(dead4==0.1*n)
if(flag_teenth_dead4==0)
teenth_dead4=r;
flag_teenth_dead4=1;
end
end
if(dead4==n)
if(flag_all_dead4==0)
all_dead4=r;
flag_all_dead4=1;
end
end
end
if S4(i).E>0
S4(i).type='N';
end
end
STATISTICS.DEAD4(r+1)=dead4;
STATISTICS.ALLIVE4(r+1)=allive4-dead4;
%(4)簇頭選舉模塊
countCHs4=0;
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))))))
countCHs4=countCHs4+1;
packets_TO_BS4=packets_TO_BS4+1;
PACKETS_TO_BS4(r+1)=packets_TO_BS4;
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
STATISTICS.COUNTCHS4(r+1)=countCHs4;
3.仿真結論:

D-40
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278412.html
標籤:其他
下一篇:HTML基礎知識(2)
