LEACH協議MATLAB模擬程式碼
阿新 • • 發佈:2021-01-17
相關英文縮寫 :
無線感測網路 wireless sensor network(WSN)
基站 base station (BS)
移動閘道器 mobile sink (MS)
簇群 Cluster
簇頭 Cluster Head(CH)
簇員 Cluster Member(CM)
無線感測網路:
無線感測網, 一般是由許多感測器節點(sensor node)自組織形成的網路,用來把感知到的資訊通過單跳或者多跳的方式傳送到基站(BS),由於感測器節點的電池能量是有限的,所以對資料轉發的有效性要求很高,即用最少的能量消耗換來最大的資料轉發量,因此需要有了許多路由演算法。
路由協議(演算法)按照 sink 的型別可以分為兩類:
1、靜態閘道器(static sink): 比較早期的路由協議,如LEACH, Flooding等協議
2、動態閘道器 MS(mobile sink) : 該類演算法被證明是比第一類演算法更加有效的, 最新的路由協議基本都是第二類。
LEACH協議MATLAB程式碼 :
% my leach code based on fuzzy logical method
clear;
%% 引數的初始化
xm=100;
ym=100; % 感測區域範圍
n=100; %節點總數
p=0.1; %簇頭概率
% 能量模型初始化資料
E0= 1;%初始能量
Elec=50e-9;%傳送、接收能量,每bit
Efs=10e-12;%耗散能量,每bit
Emp=0.0013e-13;%融合能耗,每bit
do = sqrt( Efs/Emp );
cc=0.8;%融合率
rmax=1000;%輪數設定
MaxDis_CH_Node = sqrt( (xm-0)^2 + (ym-0)^2 ); %簇頭廣播範圍
CM=25;%控制資訊大小
DM=4000;%資料資訊大小
figure(1);% 顯示圖片
for i=1:1:n
S(i).xd=rand( 1,1)*xm;
S(i).yd=rand(1,1)*ym;
S(i).G=0;%每一個週期結束後,重新設定為0
S(i).E=E0;%節點的初始能量
S(i).type='N';%節點的型別為普通
plot(S(i).xd,S(i).yd,'o');
hold on;%保持所畫的影象
end
%% 計算閘道器節點與其他節點的距離, 找出節點與閘道器的最小距離
MinDist_Node_Sink = zeros(1,n);
Sink(1).xd = 0; Sink(1).yd = 0;
Sink(2).xd = 0; Sink(2).yd = ym;
Sink(3).xd = xm; Sink(3).yd = ym;
Sink(4).xd = xm; Sink(4).yd = 0;
for i = 1: n
TempDist_Node_Sink = zeros(1,4);
for j = 1 : 4
TempDist_Node_Sink(j) = sqrt( (Sink(j).xd - S(i).xd)^2 + ( Sink(j).yd - S(i).yd )^2 );
end
MinDist_Node_Sink(i) = min(TempDist_Node_Sink);
end
%%
first_dead_Round = 0; %第一個死亡節點出現的輪數
flag_first_dead=0; % 記錄第一個死亡節點
half_dead_Round = 0;
flag_half_dead = 0;
Round_Alive_Num = zeros( 1,rmax+1 ); %每輪存活節點數目記錄
RoundCluster = zeros( 1,rmax ); %記錄每輪簇頭節點數目
Remaining_En = zeros(1,rmax);
%% 開始
for r = 1:1:rmax
% 如果輪數為一個週期的整數倍, 則將S(i).G 設定為0 ,即所有節點都沒有成為簇頭節點
if( r>=2 )
if ( Remaining_En(r-1) == 0 )
continue;
end
end
r+1;
if( mod(r,round(1/p))==0 )
for i = 1:n
S(i).G = 0;
end
end
hold off; % 每一輪重新繪製圖片
figure(1);
%% 死亡節點標記為紅色
dead = 0;
for i = 1:n
if( S(i).E <= 0 )
plot( S(i).xd, S(i).yd, 'red.' );
S(i).E = 0; % 死亡節點剩餘能量為0
dead = dead +1;
if( dead == 1 && flag_first_dead == 0 ) % 標記第一個死亡節點
first_dead_Round = r;
flag_first_dead = 1;
end
if( dead == (n/2) && flag_half_dead == 0 )
half_dead_Round = r;
flag_half_dead = 1;
end
hold on;
else
S(i).type = 'N';
plot( S(i).xd, S(i).yd, 'o' );
hold on;
end
Remaining_En(r) = Remaining_En(r) + S(i).E; % 第r 輪總剩餘能量
end
Round_Alive_Num(r+1) = n - dead; %記錄第 r 輪 存活節點個數
%% 成簇階段,尋找簇頭節點,並計算簇頭與基站的距離
cluster = 0;% 每一輪開始前 將簇頭數目重置為 0;
for i = 1:n
if( S(i).E > 0 )
if( S(i).G <= 0 )
temp_rand = rand;
if( temp_rand <= (p/(1-p*mod( r, round(1/p)))) )
S(i).type = 'C';
S(i).G = round(1/p) - 1;
cluster = cluster + 1;
C(cluster).xd = S(i).xd;
C(cluster).yd = S(i).yd;
plot(S(i).xd,S(i).yd, 'k*'); % 繪製當前簇頭節點
C(cluster).id = i; %簇頭的 id 記錄
Packet_length( cluster ) = 1;
end
end
end
end
RoundCluster(r) = cluster; % 記錄當前輪 成為簇頭的節點數目
Node_Cluster = zeros(1,n); % 節點i 選擇的簇頭id
Dist = zeros( 1,cluster ); % 節點到簇頭的距離
for i = 1:n
if ( S(i).E > 0 && S(i).type == 'N' )
Min_Dist = sqrt( ( S(i).xd-C(1).xd )^2 + ( S(i).yd-C(1).yd )^2 ); % 節點到簇頭的距離
Min_Dist_Cluster = 1;
for c = 2:1:cluster
Temp_Min_Dist = sqrt( ( S(i).xd-C(c).xd )^2 + ( S(i).yd-C(c).yd )^2 );
if( Temp_Min_Dist < Min_Dist )
Min_Dist = Temp_Min_Dist;
Min_Dist_Cluster = c;
end
end
Node_Cluster(i) = C(Min_Dist_Cluster).id;%節點i 歸屬的簇頭節點的序號
Packet_length( Min_Dist_Cluster ) = Packet_length( Min_Dist_Cluster ) + 1;
Er = Elec * CM * cluster; %簇員節點接收簇頭節點發送的控制資訊時的能耗
% 簇員節點發送資料到簇頭節點時的能耗
if ( Min_Dist < do )
Et = Elec * ( CM + DM ) + Efs * ( CM + DM ) * (Min_Dist)^2;
else
Et = Elec * ( CM + DM ) + Emp * ( CM + DM ) * ( Min_Dist)^4;
end
S(i).E = S(i).E - Et - Er;
end
end
%% 簇頭接收資料的能耗
for c = 1:cluster
CER = Elec * Packet_length( c ) * ( CM + DM );
% 簇頭髮送資料的能耗: 廣播簇頭資訊, 轉發融合資料
% 簇頭廣播成簇資訊的能耗,全網廣播
if( MaxDis_CH_Node < do )
CET1 = Elec * CM + Efs * CM * MaxDis_CH_Node *MaxDis_CH_Node ;
else
CET1 = Elec * CM + Emp * CM * MaxDis_CH_Node *MaxDis_CH_Node *MaxDis_CH_Node *MaxDis_CH_Node;
end
% 簇頭將資料融合後轉發的能耗
Dis_CH_Sink = min ( MinDist_Node_Sink( C(c).id ) );
if( Dis_CH_Sink < do )
CET2 = Elec * DM * cc * Packet_length( c ) + Efs * DM * cc * Packet_length( c ) * Dis_CH_Sink * Dis_CH_Sink;
else
CET2 = Elec * DM * cc *Packet_length( c ) + Emp * DM * cc * Packet_length( c ) * Dis_CH_Sink * Dis_CH_Sink * Dis_CH_Sink * Dis_CH_Sink;
end
% 簇頭節點的剩餘能量計算
S( C(c).id ).E = S( C( c ).id ).E -CET1 - CET2 - CER;
end
end
figure(2);
plot(Round_Alive_Num);
figure(3);
plot(RoundCluster);
figure(4);
plot(Remaining_En);