一、前言
1、在給定WSN的節點數目(100)前提下,節點隨機分布,按照LEACH算法,實現每一輪對WSN的分簇。記錄前K輪(k=10)時,網絡的分簇情況,即每個節點的角色(簇頭或簇成員)。標記節點之間的關系,標記其所屬的簇頭。
2、在1的基礎上,增加能量有效性控制:給定的所有節點具有相同的能量,考察第一個節點能量耗盡出現在第幾輪。節點的能量消耗僅考慮關鍵的幾次通信過程,其他能量消耗不計。通信過程能量消耗規則如下:
Setup:簇成元:每次收到候選簇頭信息-1,每個候選簇頭僅被收集一次;通知簇頭成為其成員,發送信息-2。候選簇頭:被簇成元接收信息,即發送信息,能量-2;被通知成為簇頭,接收信息能量-1。
Steady:每個簇成員每輪向簇頭發送10次數據,每次成員能量-2,簇頭能量-1。
二、目的
(1)在固定節點個數的前提下,仿真LEACH算法的分簇過程。
(2)在上述節點個數和分簇算法的前提下,計算節點的能量消耗,判斷能量消耗到0的節點出現在第幾輪。
三、方法描述
(1)LEACH分簇
簇頭選舉初始階段,每個節點根據所建議網絡簇頭的百分比(事先確定)和節點已經成為簇頭的次數來確定自己是否當選為簇頭。每個節點產生一個0-1的隨機數字,如果該數字小於閾值,節點成為當前輪的簇頭。閾值
其中,P為預期的簇頭百分比,r為當前輪數,G是最近1/p輪里沒有成為簇頭的節點的集合。
首先確定傳感器網絡中的節點個數為100個,並對所有節點初始化其三個屬性,分別有type(節點類型),selected(是否當選過簇頭)和temp_rand(隨機數)。設定簇頭產生概率p=0.08。
算法步驟如下:
Step1:隨機生成100個節點位置,並賦值隨機數temp_rand,設置type和selected為’N’。
Step2:將所有selected為’N’的節點隨機值與做比較,若temp_rand小於等於則轉向Step3,否則轉向Step4。
Step3:表明節點當選為簇頭節點,將type賦值’C’, selected賦值’O’。
Step4:表明節點為普通節點,將type扔賦值’N’, selected不改變賦值。
Step5:遍歷所有節點,若節點type為’C’,將節點在圖上標記’*’,並標上節點數目。否則將節點在圖上標記為’o’,同時標記上節點數目。
Step6:如果節點為普通節點,則計算其與所有簇頭的歐式距離,形成距離矩陣。
Step7:利用min函數,找到與普通節點相距最近的簇頭,並將其相連接。
Step8:一輪分簇結束,返回Step1開始下一輪分簇過程。
所以在試驗中通過計算每個普通節點到所有簇頭的距離,並將該普通節點與相距最近的簇頭節點相連,並將簇頭節點的selected屬性標記,保證當過簇頭的節點在之后的分簇過程中不會再當選為簇頭節點。在10輪的分簇試驗中選取4張分簇網絡圖,具體分簇情況分別如下:
(2)節點能量消耗
試驗中通過對能量消耗規律的分析可以得出:假設某輪分簇中第i個簇頭的簇成員有a個,所以在這一輪中的通信過程中簇頭消耗的能量為2+11*a,簇成員消耗的能量為22。所以增加節點的一個屬性為S(i).power,從而到達能量消耗監測的目的。設置標志位,當發現第一個節點能量耗盡情況出現時,則結束程序,並用黑色標記。而已做過簇頭的節點用紅色標記。
在一次實驗中,第一次能量耗盡出現在第5輪。前5輪的圖像如下:
三、結論
在本次實驗中首先通過對LEACH算法的分析研究,學習了其進行傳感器節點網絡分簇的步驟,同時在P=0.08和節點數目為100的前提下通過MATLAB仿真在節點數目不變的情況下10輪的分簇結果。在能量的消耗試驗中,首先通過對簇頭以及簇成員在一輪分簇通信過程中的能量消耗規律統計,簡化了實驗步驟。通過仿真,第一個節點能量耗盡的情況出現在第5輪。
四、程序代碼
(1)Leach分簇:
close all clear all; clc; pm=100; %概率范圍 xm=100; %x軸范圍 ym=100; %y軸范圍 line=10; %連線距離初始值 sink.x=0.5*xm; %基站x軸 50 sink.y=0.5*ym; %基站y軸 50 n=100; p=0.08; for i=1:1:n %隨機產生100個點 S(i).xd=rand(1,1)*xm; S(i).yd=rand(1,1)*ym; S(i).temp_rand=rand; S(i).type='N'; %進行選舉簇頭前先將所有節點設為普通節點 S(i).selected='N'; S(i).power=300; hold on; end num11=0; num12=0; flag=1; while(flag) for r=1:1:10 figure(r); for i=1:1:n %隨機產生100個點 S(i).temp_rand=rand; end for i=1:1:n if S(i).selected=='N' %if S(i).type=='N' %只對普通節點進行選舉,即已經當選簇頭的節點不進行再選舉 if ( S(i).temp_rand<=(p/(1-p*mod(r,round(1/p))))) S(i).type='C'; %節點類型為蔟頭 S(i).selected='O'; plot(S(i).xd,S(i).yd,'*'); text(S(i).xd,S(i).yd,num2str(i)); num11=num11+1; else S(i).type='N'; %節點類型為普通 plot(S(i).xd,S(i).yd,'o'); text(S(i).xd,S(i).yd,num2str(i)); num12=num12+1; end end if S(i).type=='C' plot(S(i).xd,S(i).yd,'*'); %蔟頭節點以*標記 text(S(i).xd,S(i).yd,num2str(i)); else plot(S(i).xd,S(i).yd,'o'); %普通節點以o標記 text(S(i).xd,S(i).yd,num2str(i)); end hold on; end %判斷最近的簇頭結點,如何去判斷,采用距離矩陣 yy=zeros(n); for a=1:1:n if S(a).type=='N' for b=1:1:n if S(b).type=='C' length(a,b)=sqrt((S(a).xd-S(b).xd)^2+(S(a).yd-S(b).yd)^2); %簇頭與每個普通節點的距離 else length(a,b)=10000; end end [val,b]=min(length(a,:)); plot([S(b).xd;S(a).xd],[S(b).yd;S(a).yd]) %將節點與簇頭連起來,即加入簇頭集合 yy(a,b)=1; hold on else length(a,:)=10000; end end for i=1:1:n if S(i).type=='C' number=sum(yy(:,i)) S(i).power=S(i).power-(2+11*number); else S(i).power=S(i).power-22; end end for i=1:1:n S(i).type='N'; end end for i=1:1:n if (S(i).power)<0 text(S(i).xd,S(i).yd,num2str(i)); flag=0; end end if flag==0 break end end
(2)能量
clear clc close all xm=100; ym=100; line=10; sink.x=0.5*xm; sink.y=0.5*ym; n=100; p=0.05; send_dissipation=2; receive_dissipation=1; for i=1:1:n S(i).xd=rand(1,1)*xm; S(i).yd=rand(1,1)*ym; S(i).temp_rand=rand; S(i).energy=500; S(i).signal='L'; S(i).type='N'; S(i).selected='N'; hold on; end r=1; flag=1; while(flag) for i=1:n if S(i).selected=='N'&(S(i).temp_rand<=(p/(1-p*mod(r,round(1/p)))))&S(i).signal=='L' flag=1; break; end if i==n if S(i).selected=='Y'|(S(i).temp_rand>=(p/(1-p*mod(r,round(1/p)))))|S(i).signal=='D' flag=0; end end end if flag==0 break; end figure(r); for i=1:n if S(i).signal=='L' if S(i).selected=='N' if ( S(i).temp_rand<=(p/(1-p*mod(r,round(1/p))))) S(i).type='C'; S(i).selected='Y'; S(i).energy=S(i).energy-send_dissipation; plot(S(i).xd,S(i).yd,'r*'); text(S(i).xd,S(i).yd,num2str(i)); else S(i).type='N'; plot(S(i).xd,S(i).yd,'bo'); text(S(i).xd,S(i).yd,num2str(i)); end else plot(S(i).xd,S(i).yd,'r.','markersize',20); text(S(i).xd,S(i).yd,num2str(i)); end hold on; end end distance=zeros(1,100); num_cluster=zeros(1,100); for i=1:100 distance(1,i)=100000; end for a=1:1:n if S(a).signal=='L'&S(a).type=='N' for b=1:1:n if S(b).signal=='L'&S(b).type=='C' distance(1,b)=sqrt((S(a).xd-S(b).xd)^2+(S(a).yd-S(b).yd)^2); S(a).energy=S(a).energy-receive_dissipation; end end min=100000; for i=1:n if distance(1,i)<min; min=distance(1,i); nearest_cluster=i; end end if min~=100000; plot([S(nearest_cluster).xd;S(a).xd],[S(nearest_cluster).yd;S(a).yd],'b'); hold on; S(a).energy=S(a).energy-send_dissipation; S(nearest_cluster).energy=S(nearest_cluster).energy-receive_dissipation; S(a).energy=S(a).energy-10*send_dissipation; S(nearest_cluster).energy=S(nearest_cluster).energy-10*receive_dissipation; end end end energy=zeros(1,100); energy1=zeros(1,100); for i=1:n energy(1,i)=S(i).energy; end energy1=sort(energy); for i=1:n if S(i).energy<=0 S(i).signal='D'; plot(S(i).xd,S(i).yd,'k.','markersize',20); text(S(i).xd,S(i).yd,num2str(i)); hold on; end end for i=1:n S(i).type='N'; if S(i).selected=='N' S(i).temp_rand=rand; end end r=r+1; end
君子有三畏:畏天命,畏大人,畏聖人之言。小人不知天命而不畏也,狎大人,侮聖人之言。
轉載需說明出處,筆者總結之前的知識,與大家分享,有問題的可以留給我哦~