?? bp4.m
字號:
end
if (min_dis<=do)
S2(i).E=S2(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis));
end
end
S2(i).min_dis=min_dis;
S2(i).min_dis_cluster=min_dis_cluster;
else
min_dis=sqrt( (S2(i).xd-S2(n+1).xd)^2 + (S2(i).yd-S2(n+1).yd)^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
end
end
end
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.網(wǎng)絡(luò)運行模塊
%簇頭節(jié)點數(shù)
countCHs3=0;
cluster3=1;%此定義的目的僅僅是給定一個1開始的下標參數(shù),真正的簇頭數(shù)應(yīng)該還減去1
flag_first_dead3=0;
flag_teenth_dead3=0;
%死亡節(jié)點數(shù)
dead3=0;
first_dead3(m)=0;
teenth_dead3(m)=0;
%活動節(jié)點數(shù)
allive3=n;
%counter for bit transmitted to Bases Station and to Cluster Heads
%(1)循環(huán)模式設(shè)定
for r=0:1:rmax %該 for 循環(huán)將下面的所有程序包括在內(nèi),直到最后一 end 才結(jié)束循環(huán)
r;
%每過一個輪轉(zhuǎn)周期(本程序為10次)使各節(jié)點的S(i).G參數(shù)(該參數(shù)用于后面的簇選舉,在該輪轉(zhuǎn)周期內(nèi)已當選過簇頭的節(jié)點不能再當選)恢復(fù)為零
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;
%(2)死亡節(jié)點檢查模塊
dead3=0;
for i=1:1:n
%檢查有無死亡節(jié)點
if (S3(i).E<=0)
dead3=dead3+1;
%(3)第一個死亡節(jié)點的產(chǎn)生時間(用輪次表示)
%第一個節(jié)點死亡時間
if (dead3==1)
if(flag_first_dead3==0)
first_dead3(m)=r;
flag_first_dead3=1;
end
end
%10%的節(jié)點死亡時間
if(dead3==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
%(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)
%簇頭的選舉,當選的簇頭會把各種相關(guān)信存入下面程序所給定的變量中
if(temp_rand<= (p(i)/(1-p(i)*mod(r,round(1/p(i))))))
countCHs3=countCHs3+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;
%計算簇頭發(fā)送4000bit數(shù)據(jù)到基站的能量消耗(這里應(yīng)是所有節(jié)點包括簇頭每一輪發(fā)送4000bit數(shù)據(jù))
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)簇內(nèi)成員選擇簇頭模塊(即簇的形成模塊)
%簇內(nèi)成員對簇頭的選擇(即簇的形成)算法
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
%簇內(nèi)節(jié)點(發(fā)送4000bit數(shù)據(jù))能量消耗
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
%簇頭(接受和融合這一簇內(nèi)節(jié)點4000bit數(shù)據(jù))的能量消耗
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
end
end
end
end
countCHs4=0;
cluster=1;%此定義的目的僅僅是給定一個1開始的下標參數(shù),真正的簇頭數(shù)應(yīng)該還減去1
flag_first_dead4=0;
flag_teenth_dead4=0;
%死亡節(jié)點數(shù)
dead4=0;
first_dead4(m)=0;
teenth_dead4(m)=0;
%活動節(jié)點數(shù)
allive4=n;
%counter for bit transmitted to Bases Station and to Cluster Heads
%(1)循環(huán)模式設(shè)定
for r=0:1:rmax %該 for 循環(huán)將下面的所有程序包括在內(nèi),直到最后一 end 才結(jié)束循環(huán)
r;
%每過一個輪轉(zhuǎn)周期(本程序為10次)使各節(jié)點的S(i).G參數(shù)(該參數(shù)用于后面的簇選舉,在該輪轉(zhuǎn)周期內(nèi)已當選過簇頭的節(jié)點不能再當選)恢復(fù)為零
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;
%(2)死亡節(jié)點檢查模塊
dead4=0;
for i=1:1:n
%檢查有無死亡節(jié)點
if (S4(i).E<=0)
dead4=dead4+1;
%(3)第一個死亡節(jié)點的產(chǎn)生時間(用輪次表示)
%第一個節(jié)點死亡時間
if (dead4==1)
if(flag_first_dead4==0)
first_dead4(m)=r;
flag_first_dead4=1;
end
end
%10%的節(jié)點死亡時間
if(dead4==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
%(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)
%簇頭的選舉,當選的簇頭會把各種相關(guān)信存入下面程序所給定的變量中
if(temp_rand<= (p(i)/(1-p(i)*mod(r,round(1/p(i))))))
countCHs4=countCHs4+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;
%計算簇頭發(fā)送4000bit數(shù)據(jù)到基站的能量消耗(這里應(yīng)是所有節(jié)點包括簇頭每一輪發(fā)送4000bit數(shù)據(jù))
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)簇內(nèi)成員選擇簇頭模塊(即簇的形成模塊)
%簇內(nèi)成員對簇頭的選擇(即簇的形成)算法
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
%簇內(nèi)節(jié)點(發(fā)送4000bit數(shù)據(jù))能量消耗
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
%簇頭(接受和融合這一簇內(nèi)節(jié)點4000bit數(shù)據(jù))的能量消耗
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
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
end
end
end
end
m=m+1;
end
r=0:0.5:5;
subplot(2,1,1);
plot(r,first_dead1,':k',r,first_dead2,'-r',r,first_dead3,'--b',r,first_dead4,'-.m');
legend('leachm1','leachm2','DEEC1','DEEC2');
xlabel('x(time)');
ylabel('y(dead)');
title('\bf leach(1,2)和DEEC(1,2)的生命周期對比');
subplot(2,1,2);
plot(r,teenth_dead1,':k',r,teenth_dead2,'-r',r,teenth_dead3,'--b',r,teenth_dead4,'-.m');
legend('leachm1','leachm2','DEEC1','DEEC2');
xlabel('x(time)');
ylabel('y(data)');
title('\bf leach(1,2)和DEEC(1,2)的穩(wěn)定周期對比');
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -