LEACH分簇算法实现和能量控制算法实现
一、前言
? ? ?? 1、在給定WSN的節(jié)點數(shù)目(100)前提下,節(jié)點隨機分布,按照LEACH算法,實現(xiàn)每一輪對WSN的分簇。記錄前K輪(k=10)時,網(wǎng)絡(luò)的分簇情況,即每個節(jié)點的角色(簇頭或簇成員)。標記節(jié)點之間的關(guān)系,標記其所屬的簇頭。
? ? ?? 2、在1的基礎(chǔ)上,增加能量有效性控制:給定的所有節(jié)點具有相同的能量,考察第一個節(jié)點能量耗盡出現(xiàn)在第幾輪。節(jié)點的能量消耗僅考慮關(guān)鍵的幾次通信過程,其他能量消耗不計。通信過程能量消耗規(guī)則如下:
? ? ?? Setup:簇成元:每次收到候選簇頭信息-1,每個候選簇頭僅被收集一次;通知簇頭成為其成員,發(fā)送信息-2。候選簇頭:被簇成元接收信息,即發(fā)送信息,能量-2;被通知成為簇頭,接收信息能量-1。
? ? ?? Steady:每個簇成員每輪向簇頭發(fā)送10次數(shù)據(jù),每次成員能量-2,簇頭能量-1。
二、目的
? ? (1)在固定節(jié)點個數(shù)的前提下,仿真LEACH算法的分簇過程。
? ? (2)在上述節(jié)點個數(shù)和分簇算法的前提下,計算節(jié)點的能量消耗,判斷能量消耗到0的節(jié)點出現(xiàn)在第幾輪。
三、方法描述
? ? (1)LEACH分簇
? ? ?? 簇頭選舉初始階段,每個節(jié)點根據(jù)所建議網(wǎng)絡(luò)簇頭的百分比(事先確定)和節(jié)點已經(jīng)成為簇頭的次數(shù)來確定自己是否當選為簇頭。每個節(jié)點產(chǎn)生一個0-1的隨機數(shù)字,如果該數(shù)字小于閾值,節(jié)點成為當前輪的簇頭。閾值
? ? ?? 其中,P為預(yù)期的簇頭百分比,r為當前輪數(shù),G是最近1/p輪里沒有成為簇頭的節(jié)點的集合。
首先確定傳感器網(wǎng)絡(luò)中的節(jié)點個數(shù)為100個,并對所有節(jié)點初始化其三個屬性,分別有type(節(jié)點類型),selected(是否當選過簇頭)和temp_rand(隨機數(shù))。設(shè)定簇頭產(chǎn)生概率p=0.08。
算法步驟如下:
??????Step1:隨機生成100個節(jié)點位置,并賦值隨機數(shù)temp_rand,設(shè)置type和selected為’N’。
??????Step2:將所有selected為’N’的節(jié)點隨機值與做比較,若temp_rand小于等于則轉(zhuǎn)向Step3,否則轉(zhuǎn)向Step4。
??????Step3:表明節(jié)點當選為簇頭節(jié)點,將type賦值’C’, selected賦值’O’。
??????Step4:表明節(jié)點為普通節(jié)點,將type扔賦值’N’, selected不改變賦值。
??????Step5:遍歷所有節(jié)點,若節(jié)點type為’C’,將節(jié)點在圖上標記’*’,并標上節(jié)點數(shù)目。否則將節(jié)點在圖上標記為’o’,同時標記上節(jié)點數(shù)目。
??????Step6:如果節(jié)點為普通節(jié)點,則計算其與所有簇頭的歐式距離,形成距離矩陣。
??????Step7:利用min函數(shù),找到與普通節(jié)點相距最近的簇頭,并將其相連接。
??????Step8:一輪分簇結(jié)束,返回Step1開始下一輪分簇過程。
??????所以在試驗中通過計算每個普通節(jié)點到所有簇頭的距離,并將該普通節(jié)點與相距最近的簇頭節(jié)點相連,并將簇頭節(jié)點的selected屬性標記,保證當過簇頭的節(jié)點在之后的分簇過程中不會再當選為簇頭節(jié)點。在10輪的分簇試驗中選取4張分簇網(wǎng)絡(luò)圖,具體分簇情況分別如下:
? ? ?? (2)節(jié)點能量消耗
??????試驗中通過對能量消耗規(guī)律的分析可以得出:假設(shè)某輪分簇中第i個簇頭的簇成員有a個,所以在這一輪中的通信過程中簇頭消耗的能量為2+11*a,簇成員消耗的能量為22。所以增加節(jié)點的一個屬性為S(i).power,從而到達能量消耗監(jiān)測的目的。設(shè)置標志位,當發(fā)現(xiàn)第一個節(jié)點能量耗盡情況出現(xiàn)時,則結(jié)束程序,并用黑色標記。而已做過簇頭的節(jié)點用紅色標記。
??????在一次實驗中,第一次能量耗盡出現(xiàn)在第5輪。前5輪的圖像如下:
三、結(jié)論
? ? ?? 在本次實驗中首先通過對LEACH算法的分析研究,學習了其進行傳感器節(jié)點網(wǎng)絡(luò)分簇的步驟,同時在P=0.08和節(jié)點數(shù)目為100的前提下通過MATLAB仿真在節(jié)點數(shù)目不變的情況下10輪的分簇結(jié)果。在能量的消耗試驗中,首先通過對簇頭以及簇成員在一輪分簇通信過程中的能量消耗規(guī)律統(tǒng)計,簡化了實驗步驟。通過仿真,第一個節(jié)點能量耗盡的情況出現(xiàn)在第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 %隨機產(chǎ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'; %進行選舉簇頭前先將所有節(jié)點設(shè)為普通節(jié)點S(i).selected='N';S(i).power=300;hold on; end num11=0; num12=0; flag=1; while(flag) for r=1:1:10figure(r);for i=1:1:n %隨機產(chǎn)生100個點S(i).temp_rand=rand; endfor i=1:1:n if S(i).selected=='N'%if S(i).type=='N' %只對普通節(jié)點進行選舉,即已經(jīng)當選簇頭的節(jié)點不進行再選舉if ( S(i).temp_rand<=(p/(1-p*mod(r,round(1/p)))))S(i).type='C'; %節(jié)點類型為蔟頭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'; %節(jié)點類型為普通 plot(S(i).xd,S(i).yd,'o'); text(S(i).xd,S(i).yd,num2str(i));num12=num12+1;endendif S(i).type=='C'plot(S(i).xd,S(i).yd,'*'); %蔟頭節(jié)點以*標記text(S(i).xd,S(i).yd,num2str(i));elseplot(S(i).xd,S(i).yd,'o'); %普通節(jié)點以o標記text(S(i).xd,S(i).yd,num2str(i));endhold on;end %判斷最近的簇頭結(jié)點,如何去判斷,采用距離矩陣 yy=zeros(n); for a=1:1:nif S(a).type=='N'for b=1:1:nif S(b).type=='C'length(a,b)=sqrt((S(a).xd-S(b).xd)^2+(S(a).yd-S(b).yd)^2); %簇頭與每個普通節(jié)點的距離elselength(a,b)=10000; endend[val,b]=min(length(a,:));plot([S(b).xd;S(a).xd],[S(b).yd;S(a).yd]) %將節(jié)點與簇頭連起來,即加入簇頭集合yy(a,b)=1;hold on elselength(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);elseS(i).power=S(i).power-22; end endfor i=1:1:n S(i).type='N'; end end for i=1:1:n if (S(i).power)<0text(S(i).xd,S(i).yd,num2str(i)); flag=0;endend if flag==0breakend 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:nS(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:nif S(i).selected=='N'&(S(i).temp_rand<=(p/(1-p*mod(r,round(1/p)))))&S(i).signal=='L'flag=1;break;endif i==nif S(i).selected=='Y'|(S(i).temp_rand>=(p/(1-p*mod(r,round(1/p)))))|S(i).signal=='D'flag=0;endendendif flag==0break;endfigure(r);for i=1:nif 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));elseS(i).type='N';plot(S(i).xd,S(i).yd,'bo');text(S(i).xd,S(i).yd,num2str(i));endelseplot(S(i).xd,S(i).yd,'r.','markersize',20);text(S(i).xd,S(i).yd,num2str(i));endhold on;endenddistance=zeros(1,100);num_cluster=zeros(1,100);for i=1:100distance(1,i)=100000;endfor a=1:1:nif S(a).signal=='L'&S(a).type=='N'for b=1:1:nif 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;endendmin=100000;for i=1:nif distance(1,i)<min;min=distance(1,i);nearest_cluster=i;endendif 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;endendendenergy=zeros(1,100);energy1=zeros(1,100);for i=1:nenergy(1,i)=S(i).energy;endenergy1=sort(energy);for i=1:nif S(i).energy<=0S(i).signal='D';plot(S(i).xd,S(i).yd,'k.','markersize',20);text(S(i).xd,S(i).yd,num2str(i));hold on;endendfor i=1:nS(i).type='N';if S(i).selected=='N'S(i).temp_rand=rand;endendr=r+1; end君子有三畏:畏天命,畏大人,畏圣人之言。小人不知天命而不畏也,狎大人,侮圣人之言。
?轉(zhuǎn)載需說明出處,筆者總結(jié)之前的知識,與大家分享,有問題的可以留給我哦~
?
轉(zhuǎn)載于:https://www.cnblogs.com/lemonzhang/p/9254435.html
總結(jié)
以上是生活随笔為你收集整理的LEACH分簇算法实现和能量控制算法实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django框架详细介绍---cooki
- 下一篇: 微信小程序左到右联动