1. 程式人生 > 其它 >LEACH協議MATLAB模擬程式碼

LEACH協議MATLAB模擬程式碼

技術標籤:物聯網資訊保安網路協議matlab

相關英文縮寫 :

無線感測網路 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;% 每一輪開始前 將簇頭數目重置為 0for 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);