資源簡介
LEACH分簇算法matlab代碼,手動輸入方程中所需的參數即可運行
代碼片段和文件信息
function?[STATISTICS1FD1TD1AD1]=leach(IniEngNetSizeNoOfNodeNoOfRoundcluster_head_percentage)
xm=NetSize;%設置網絡大小
ym=NetSize;
sink.x=0.5*xm;%設置基站坐標
sink.y=1.35*ym;
n=NoOfNode;%設置網絡節點數
p=cluster_head_percentage;%設置簇首概率
Eo=IniEng;%Initial?energy節點初始能量
%Eelec=Etx=Erx
ETX=50*0.000000001;%節點傳輸消耗能量,每bit
ERX=50*0.000000001;%節點接收消耗能量,每bit
%Transmit?Amplifier?types
Efs=10*0.000000000001;%耗散能量,每bit
Emp=0.0013*0.000000000001;%放大信號能耗,每bit
%Data?Aggregation?Energy
EDA=5*0.000000001;%數據融合能耗,每bit
a=0;
rmax=NoOfRound;%總輪數
do=sqrt(Efs/Emp);
do
for?i=1:1:n??????%設置所有節點的X,Y坐標,初始能量,節點類型,簇首選舉資格
????S(i).xd=rand(11)*xm;
????%XR(i)=S(i).xd;
????S(i).yd=rand(11)*ym;
????%YR(i)=S(i).yd;
????S(i).G=0;
????S(i).E=Eo*(1+rand*a);
????%initially?there?are?no?cluster?heads?only?nodes
????S(i).type=‘N‘;
end
S(n+1).xd=sink.x;%設置基站的XY坐標
S(n+1).yd=sink.y;
countCHs=0;
cluster=1;
flag_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?Heads
packets_TO_BS=0;
packets_TO_CH=0;
for?r=0:1:rmax?????
????r
????if(mod(r?round(1/p)?)==0)
????????for?i=1:1:n
????????????S(i).G=0;
????????????%S(i).cl=0;?
????????end
????end
????dead=0;
????for?i=1:1:n
????????if?(S(i).E<=0)
????????????dead=dead+1;??
????????????if?(dead==1)
????????????????if(flag_first_dead==0)
????????????????????first_dead=r;%首個死亡節點出現的輪數
????????????????????flag_first_dead=1;
????????????????end
????????????end???
????????????if(dead==0.1*n)
????????????????if(flag_teenth_dead==0)
????????????????????teenth_dead=r;%死亡節點數我x*10時的輪數(x=1--0.1*n)
????????????????????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;%第r+1輪時的死亡節點數
????STATISTICS.ALLIVE(r+1)=allive-dead;%第r+1輪時的存活節點數
????
????%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
????TotalNetworkEnergy=0;
????for?i=1:n?????????
????????if?S(i).E>0
????????????TotalNetworkEnergy=TotalNetworkEnergy+S(i).E;
????????end
????end
????STATISTICS.TotalEnergy(r+1)=TotalNetworkEnergy;%第r+1輪時的網絡總能量剩余
????STATISTICS.AvgEnergy(r+1)=TotalNetworkEnergy/n;%第r+1輪時的節點平均量剩余
????%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
????
????countCHs=0;%初始簇頭數為0
????cluster=1;
????for?i=1:1:n
????????if(S(i).E>0)
????????????temp_rand=rand;?????
????????????if?(?(S(i).G)<=0)????
????????????????if(temp_rand<=?(p/(1-p*mod(rround(1/p)))))
????????????????????countCHs=countCHs+1;
????????????????????packets_TO_BS=packets_TO_BS+1;
????????????????????PACKETS_TO_BS(r+1)=packets_TO_BS;%第r+1輪CH傳輸給BS的總數據包數
????
評論
共有 條評論