?? deec2.m
字號(hào):
clear
%1.初始參數(shù)設(shè)定模塊
%.傳感器節(jié)點(diǎn)區(qū)域界限(單位 M)
xm=100;
ym=100;
%(1)匯聚節(jié)坐標(biāo)給定
sink.x=0.5*xm;
sink.y=0.5*ym;
%區(qū)域內(nèi)傳器節(jié)數(shù)
n=100
%簇頭優(yōu)化比例(當(dāng)選簇頭的概率)
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;
%高能量節(jié)點(diǎn)超出一節(jié)點(diǎn)能量的百分比
a=1;
%最大循環(huán)次數(shù)
rmax=5000
%算出參數(shù) do
do=sqrt(Efs/Emp);
Et=0;
%2.無(wú)線傳感器網(wǎng)絡(luò)模型產(chǎn)生模塊
%構(gòu)建無(wú)線傳感器網(wǎng)絡(luò),在區(qū)域內(nèi)均勻投放100個(gè)節(jié)點(diǎn),并畫(huà)出圖形
for i=1:1:n
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).E=Eo*(1+rand*a);
E(i)= S(i).E;
Et=Et+E(i);
%initially there are no cluster heads only nodes
S(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);
S(n+1).xd=sink.x;
S(n+1).yd=sink.y;
%3.網(wǎng)絡(luò)運(yùn)行模塊
%簇頭節(jié)點(diǎn)數(shù)
countCHs=0;
cluster=1;%此定義的目的僅僅是給定一個(gè)1開(kāi)始的下標(biāo)參數(shù),真正的簇頭數(shù)應(yīng)該還減去1
flag_first_dead=0;
flag_teenth_dead=0;
flag_all_dead=0;
%死亡節(jié)點(diǎn)數(shù)
dead=0;
first_dead=0;
teenth_dead=0;
all_dead=0;
%活動(dòng)節(jié)點(diǎn)數(shù)
allive=n;
%counter for bit transmitted to Bases Station and to Cluster Heads
packets_TO_BS=0;
packets_TO_CH=0;
%(1)循環(huán)模式設(shè)定
for r=0:1:rmax %該 for 循環(huán)將下面的所有程序包括在內(nèi),直到最后一 end 才結(jié)束循環(huán)
r
%每過(guò)一個(gè)輪轉(zhuǎn)周期(本程序?yàn)?0次)使各節(jié)點(diǎn)的S(i).G參數(shù)(該參數(shù)用于后面的簇選舉,在該輪轉(zhuǎn)周期內(nèi)已當(dāng)選過(guò)簇頭的節(jié)點(diǎn)不能再當(dāng)選)恢復(fù)為零
if(mod(r, round(1/P) )==0)
for i=1:1:n
S(i).G=0;
S(i).cl=0;
end
end
Ea=Et*(1-r/rmax)/n;
%(2)死亡節(jié)點(diǎn)檢查模塊
dead=0;
for i=1:1:n
%檢查有無(wú)死亡節(jié)點(diǎn)
if (S(i).E<=0)
dead=dead+1;
%(3)第一個(gè)死亡節(jié)點(diǎn)的產(chǎn)生時(shí)間(用輪次表示)
%第一個(gè)節(jié)點(diǎn)死亡時(shí)間
if (dead==1)
if(flag_first_dead==0)
first_dead=r;
flag_first_dead=1;
end
end
%10%的節(jié)點(diǎn)死亡時(shí)間
if(dead==0.1*n)
if(flag_teenth_dead==0)
teenth_dead=r;
flag_teenth_dead=1;
end
end
if(dead==n)
if(flag_all_dead==0)
all_dead=r;
flag_all_dead=1;
end
end
end
if S(i).E>0
S(i).type='N';
end
end
STATISTICS.DEAD(r+1)=dead;
STATISTICS.ALLIVE(r+1)=allive-dead;
%(4)簇頭選舉模塊
countCHs=0;
cluster=1;
for i=1:1:n
if Ea>0
p(i)=P*n*S(i).E*E(i)/(Et*Ea);
if(S(i).E>0)
temp_rand=rand;
if ( (S(i).G)<=0)
%簇頭的選舉,當(dāng)選的簇頭會(huì)把各種相關(guān)信存入下面程序所給定的變量中
if(temp_rand<= (p(i)/(1-p(i)*mod(r,round(1/p(i))))))
countCHs=countCHs+1;
packets_TO_BS=packets_TO_BS+1;
PACKETS_TO_BS(r+1)=packets_TO_BS;
S(i).type='C';
S(i).G=round(1/p(i))-1;
C(cluster).xd=S(i).xd;
C(cluster).yd=S(i).yd;
distance=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );
C(cluster).distance=distance;
C(cluster).id=i;
X(cluster)=S(i).xd;
Y(cluster)=S(i).yd;
cluster=cluster+1;
%計(jì)算簇頭發(fā)送4000bit數(shù)據(jù)到基站的能量消耗(這里應(yīng)是所有節(jié)點(diǎn)包括簇頭每一輪發(fā)送4000bit數(shù)據(jù))
distance;
if (distance>do)
S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance ));
end
if (distance<=do)
S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Efs*4000*( distance * distance ));
end
end
end
% S(i).G=S(i).G-1;
end
end
end
STATISTICS.COUNTCHS(r+1)=countCHs;
%(5)簇內(nèi)成員選擇簇頭模塊(即簇的形成模塊)
%簇內(nèi)成員對(duì)簇頭的選擇(即簇的形成)算法
for i=1:1:n
if ( S(i).type=='N' && S(i).E>0 )
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-1
temp=min(min_dis,sqrt( (S(i).xd-C(c).xd)^2 + (S(i).yd-C(c).yd)^2 ) );
if ( temp<min_dis )
min_dis=temp;
min_dis_cluster=c;
end
end
%簇內(nèi)節(jié)點(diǎn)(發(fā)送4000bit數(shù)據(jù))能量消耗
if(min_dis_cluster~=0)
min_dis;
if (min_dis>do)
S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis));
end
if (min_dis<=do)
S(i).E=S(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis));
end
%簇頭(接受和融合這一簇內(nèi)節(jié)點(diǎn)4000bit數(shù)據(jù))的能量消耗
S(C(min_dis_cluster).id).E = S(C(min_dis_cluster).id).E- ( (ERX + EDA)*4000 );
packets_TO_CH=packets_TO_CH+1;
else
min_dis;
if (min_dis>do)
S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis));
end
if (min_dis<=do)
S(i).E=S(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis));
end
packets_TO_BS=packets_TO_BS+1;
end
S(i).min_dis=min_dis;
S(i).min_dis_cluster=min_dis_cluster;
else
min_dis=sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 );
if (min_dis>do)
S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis));
end
if (min_dis<=do)
S(i).E=S(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis));
end
packets_TO_BS=packets_TO_BS+1;
end
end
end
STATISTICS.PACKETS_TO_CH(r+1)=packets_TO_CH;
STATISTICS.PACKETS_TO_BS(r+1)=packets_TO_BS;
end
first_dead
teenth_dead
all_dead
STATISTICS.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,結(jié)構(gòu)體數(shù)組,包括下面的5個(gè)變量;
%countCHs(r+1),每一輪所選出的簇頭數(shù)目;
%packets_TO_BS(r+1),基站收到的數(shù)據(jù)包總數(shù);
%PACKETS_TO_CH(r+1),簇頭收到的數(shù)據(jù)包總數(shù);
%first_dead,第一個(gè)節(jié)點(diǎn)死亡的時(shí)間;
%teenth_dead=r,10%的節(jié)點(diǎn)死亡的時(shí)間;
%dead(r+1),每一輪的死亡節(jié)點(diǎn)數(shù);
%allive(r+1),每一輪的活動(dòng)節(jié)點(diǎn)數(shù)。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -