資源簡介
用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(11)*xm;
????????S(i).yd=rand(11)*ym;
????????S(i).G=0;%每一個周期結束后,重新設置為0
????????S(i).E=E0;%節點的初始能量
????????S(i).type=‘N‘;%節點的類型為普通
????????plot(S(i).xdS(i).yd‘o‘);
???????hold?on;%保持所畫的圖像
????end
%%?計算網關節點與其他節點的距離,?找出節點與網關的最小距離
????MinDist_Node_Sink?=?zeros(1n);
????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(14);
????????????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(?1rmax+1?);?%每輪存活節點數目記錄
????RoundCluster?=?zeros(?1rmax?);?%記錄每輪簇頭節點數目
????Remaining_En?=?zeros(1rmax);
%%?開始
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(rround(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
評論
共有 條評論