資源簡介
基于matlab的PSO版leach,一種改進(jìn),智能優(yōu)化算法 粒子群算法的leach算法協(xié)議,僅供大家參考
代碼片段和文件信息
clear;
xm=100;?%X軸?Y軸
ym=100;?%%
sink.x=0.5*xm;?%傳輸目的地(基站)
sink.y=0.5*ym;?%
n=100;%節(jié)點(diǎn)總數(shù)
p=0.1;%簇頭節(jié)點(diǎn)的概率
a=0.5;%%%%%%%%%%%%%%適應(yīng)值函數(shù)歸一化比例
E0=0.05;%初始能量
ETX=50*0.000000001;%傳輸能量/bit
ERX=50*0.000000001;%接收能量/bit
EFS=10*0.000000000001;%耗散能量/bit
EMP=0.0013*0.000000000001;
EDA=5*0.000000001;%融合能量/bit
rmax=300;%總輪數(shù)
do=sqrt(EFS/EMP);?%???
figure(1);%圖
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%~~~~~~~初始化,隨機(jī)選節(jié)點(diǎn)坐標(biāo)、節(jié)點(diǎn)標(biāo)準(zhǔn)
for?i=1:1:n
????S(i).xd=rand(11)*xm;%X
????S(i).yd=rand(11)*ym;%Y
????S(i).G=0;%每一周期結(jié)束此變量為0
????S(i).E=E0;?%能量
????S(i).F=0;%???
????S(i).type=‘N‘;%節(jié)點(diǎn)類型為普通
????S(i).cluster=0;%第i個節(jié)點(diǎn)所屬簇的id,初始為0
????S(i).AVG=0;
????temp_rnd=i;?%??
????plot(S(i).xdS(i).yd‘o‘);
????hold?on;
end
%~~~~~~~~~~
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
S(n+1).xd=sink.x;?%例如100節(jié)點(diǎn),?基站為101
S(n+1).yd=sink.y;
plot(S(n+1).xdS(n+1).yd‘x‘);?
figure(1);
countCHs=0;
rcountCHs=0;
cluster=1;?%族頭
countCHs;
rcountCHs=rcountCHs+countCHs;
flag_first_dead=0;?%第一個死亡節(jié)點(diǎn)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%~~~~~~~~~~~~~~~~~
for?r=0:1:rmax?
????r?%輸出第幾輪
????if(mod(rround(1/p))==0)?%?判斷T(n)?by?31/52?
????????for?i=1:1:n;
????????????S(i).G=0;
????????????S(i).cl=0;
????????end
????end
????
????%初始為0
????hold?off;
????dead=0;
????packets_TO_BS=0;
????packets_TO_CH=0;
????PACKETS_TO_BS(r+1)=0;
????PACKETS_TO_CH(r+1)=0;
????figure(1);
????
????%%%%%%%%%%%%%%%%%%%%%%%
????%~~~~將死亡節(jié)點(diǎn)判為紅色,未死亡的為黑色
????for?i=1:1:n
????????if(S(i).E<=0)?%能量為0時?節(jié)點(diǎn)死亡
????????????plot(S(i).xdS(i).yd‘red?.‘);
????????????dead=dead+1;
????????????hold?on;
????????end
????????if(S(i).E>0)
????????????S(i).type=‘N‘;
????????????plot(S(i).xdS(i).yd‘o‘);
????????????hold?on;
????????end
????end
????%~~~~~~~~~
????%%%%%%%%%%%%%%%%%%%%%%
????
????plot(S(n+1).xdS(n+1).yd‘x‘);
????STATISTICS(r+1).DEAD=dead;?%統(tǒng)計(jì)死亡數(shù)
????DEAD(r+1)=dead;?%
????
????%%%%%%%%%%%%%%%%%%%%%%%%%%
????%~~~~~~~~~~~~~~~~~死亡數(shù)等于1時,?記第一個死亡
????if?(dead==1)
????????if(flag_first_dead==0)
????????????first_dead=r;
????????????flag_first_dead=1;
????????end
????end
????%~~~~~~
????%%%%%%%%%%%%%%%%%%%%%%%%%%%
????
????%
????countCHs=0;
????cluster=1;
????
????%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
????%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~begin選臨時簇頭,已去除臨時簇頭傳輸消息!!
????for?i=1:1:n
????????if(S(i).E>0)?%能量大于0
????????????if(S(i).G<=0)?%???
????????????????temp_rand1=rand;?%隨機(jī)數(shù)
????????????????if(temp_rand1<=(p/(1-p*mod(rround(1/p)))))?%隨機(jī)數(shù)與T(n)判斷,小成為簇頭節(jié)點(diǎn)
????????????????????S(i).type=‘D‘;?%類型變換,第一輪為臨時簇頭
????????????????????D(cluster).xd=S(i).xd;?%簇頭節(jié)點(diǎn)X軸
????????????????????D(cluster).yd=S(i).yd;?%簇頭節(jié)點(diǎn)Y軸
????????????????????S(i).cluster=cluster;?%記入簇頭數(shù)
????????????????????cluster=cluster+1;?%簇頭加1
????????????????????countCHs=countCHs+1;?%簇頭節(jié)點(diǎn)數(shù)目?????
????????????????????packets_TO_BS=packets_TO_BS+1;%數(shù)據(jù)包+1
????????????????end
????????????end
????????end
????end
????%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~end選臨時簇頭
????%%%%%%%%%%%%%%%%%%%%%%%%
評論
共有 條評論