Leach代码分析
ns-leach.tcl 分析1
分类:ns2012-03-22 11:52 284人阅读评论(0) 收藏举报由leach 分析3可知,一般节点的应用为Application/LEACH。
则现在就是如何选择簇头节点和设置门槛值。
我们接下来分析leach 分析4中红色的方法。
在leach 分析3中创建一个Application/LEACH对象则就会自动调用start方法。
Application/LEACH instproc start {} {[$self mac] set node_num_ [$self nodeID]$self decideClusterHead$self checkAlive}在这个方法中会调用decideClusterHead和checkAlive方法。
Application/LEACH instproc GoToSleep {} {global opt ns_$self instvar begin_idle_ begin_sleep_[[$self node] set netif_(0)] set sleep_ 1# If node has been awake, remove idle energy (e.g., the amount of energy # dissipated while the node is in the idle state). Otherwise, the node# has been asleep and must remove sleep energy (e.g., the amount of# energy dissipated while the node is in the sleep state).if {$begin_idle_ > $begin_sleep_} {set idle_energy [expr $opt(Pidle) * [expr [$ns_ now] - $begin_idle_]] [$self getER] remove $idle_energy$self instvar alive_ TDMAschedule_$self instvar begin_idle_ begin_sleep_# Check the alive status of the node. If the node has run out of # energy, it no longer functions in the network.set ISalive [[[$self node] set netif_(0)] set alive_]if {$alive_ == 1} {if {$ISalive == 0} {puts "Node [$self nodeID] is DEAD!!!!"$chan removeif [[$self node] set netif_(0)]set alive_ 0set opt(nn_) [expr $opt(nn_) - 1]set ISalive [[[$self node] set netif_(0)] set alive_] #从网络接口netif中查看当前节点状况如果节点存活,但是节点能量耗光,则$chan removeif [[$self node] set netif_(0)]将节点信道中移出,并将节点设置为死亡。
基于LEACH路由的分簇算法研究
• 73•作为无线传感器网络的重要技术,WSN 路由协议是学术研究的热门话题。
LEACH 协议作为典型的的分簇算法它有很多的优点,但也有不足之处。
本文首先分析了原始的LEACH 算法。
缺点是没有考虑节点的剩余能量和位置。
在本文中,改进了缺陷,并将剩余的能量添加到考虑标准中,并且还增加了簇头之间的距离以避免形成热区域和簇头分布太密集。
通过Matlab 仿真,验证了改进的LEACH 算法可以使簇头分布更均匀,更能节省能耗,提高了网络生命周期。
1 LEACH协议LEACH (Low Energy Adaptive Clustering Hierarchy )全称是“低能耗自适应分簇型路由算法”,它是一种基于LEACH 协议的算法,因此被称作LEACH 算法,它作为层次型分簇路由算法,是无线传感器中很典型的代表(柳丽娜,无线传感器网络中LEACH 算法的研究和改进:吉林大学,2012)。
第一步,节点的初始化;第二步,选出网络中的簇头节点;第三步,正常部分成为簇头之后的初始化(基站的初始化,公共传感器节点的能量等),属于网络的建立阶段,并且选择簇头是在随机过程中生成的。
然后网络稳定来进行数据传输。
这属于一个循环,然后来回循环直到能量耗尽。
其中在选择簇头的过程中,首先会产生0到1的随机数值,如果产生的此数值比T(n)大,那么该节点就被选为簇首,T(n)就作为能否当选为簇头的标准。
T(n)的表达式为:(1)其中:P 是选举的簇头比例;r 是此时正在进行的轮数;G 是此时还没当选簇头的节点集合。
2 LEACH协议不足在分析了经典的LEACH 分簇算法过程中,虽然优点很多,但也存在一些缺点(唐甲东,蔡明,无线传感器网络路由协议研究-LEACH 路由协议的改进:计算机工程,2013):(1)簇头很容易产生在一些能量很低的节点上,从而会大大降低网络的寿命。
(2)簇头节点分布不均匀,有些过于集中,因此能量不能达到均衡状态。
LEACH算法讲解
LEACH算法讲解LEACH(low energy adaptive clustering hierarchy)算法是⼀种⾃适应分簇拓扑算法,它的执⾏过程是周期性的,其中定义了“轮”(round)的概念来实现周期性。
每轮循环分为族的建⽴阶段和稳定的数据通信阶段。
1、在簇的建⽴阶段,相邻节点动态地形成簇,随机产⽣簇头;2、在数据通信阶段,簇内节点把数据发送给簇头,簇头进⾏数据融合并把结果发送给汇聚节点。
由于族头需要完成数据融合、与汇聚节点通信等⼯作,所以能量消耗⼤。
LEACH算法能够保证各节点等概率地担任簇头,使得⽹络中的节点相对均衡地消耗能量。
1、簇头选举⽅法LEACH算法选举簇头的过程如下:节点产⽣⼀个0~1之间的随机数,如果这个数⼩于阀值T(n),则发布⾃⼰是簇头的公告消息。
在每轮循环中,如果节点已经当选过簇头,则把T(n)设置为0,这样该节点不会再次当选为簇头。
对于未当选过簇头的节点,则将以T(n)的概率当选;随着当选过簇头的节点数⽬增加,剩余节点当选簇头的阀值T(n)随之增⼤,节点产⽣⼩于T(n)的随机数的概率随之增⼤,所以节点当选簇头的概率增⼤。
当只剩下⼀个节点未当选时,T(n)=1,表⽰这个节点⼀定当选。
T(n)可表⽰为:其中,P是簇头数量占全部节点数量的百分⽐(⼀般会设为⼀个固定值,如 0.05 ),r是选举轮数,r mod (1/P)代表这⼀轮循环中当选过簇头的节点个数,G是在最后1/P轮中没有成为簇头的节点集。
2、数据通信当簇头选定之后,簇头节点主动向⽹络中节点⼴播⾃⼰成为簇头的消息。
接收到此消息的节点,依据接收信号的强度,选择它所要加⼊的簇,并发消息通知相应的簇头。
基于时分多址(Time Division Multiple Address,简称TDMA)的⽅式,簇头节点为其中的每个成员分配通信时隙,并以⼴播的形式通知所有的簇内节点。
这样保证了簇内每个节点在指定的传输时隙进⾏数据传输,⽽在其他时间进⼊休眠状态,减少了能量消耗。
leach低功耗自适应分簇算法
改进结果
随着时间的变化,节点存活的个数图。采用LEACH 算法,节点从第420 s 开始死亡,570 s 后所有节点死亡。采用改进的算法,第一个死亡节点出现 的时间推迟到了第 550s,到595 s 所有节点死亡全部死亡,改进的算法将第一 个节点死亡的时间向后推迟,因此延长了网络生存时间。这是因为簇头的 均匀分布可以避免各节点与簇头之间距离差异而引起的耗能的差距,并且 选取簇头时,依据节点的剩余能量水平,这样可以避免能量少的节点当选 为簇头。
E 34 26 22 16
显然,采用LEACH算法时,整个网络的生命周期将小于4轮。从 上面的分析不难看出,LEACH算法进行第四轮簇头选取时,没有 考虑到节点的剩余能量及其工作能耗,导致剩余能量小于工作能 耗的节点D当选为簇头,使节点D的能量过早衰竭,网络的生命周 期也随之结束。若结合考虑节点的位置信息,使靠近簇结构中心 位置且剩余能量较多的节点有更多机会成为簇头,无疑将有效延 长网络的生命周期。在改进方面我们考虑到能量的问题并作出了改进。
2 .未考虑节点分布密度时存在的问题
基站
应尽可能使密集分布区域中的节点比稀疏分布区域中的 节点具有更大当选为簇头的概率,使得密集分布区域比 稀疏分布区域产生更多簇头,并且每个簇中成员节点数 目大致相同,从而保证各簇头的工作能耗也相对均衡。
BACK
LEACH算法的改进
考虑了节点的剩余能量,为了避免节点在剩余能量 很小时也会被选为簇头节点。 1.簇头之间最优距离D 的计算 首先假设探测区域 A 是边长为L 的正方形区域,理想状态下k 个簇首节点应当完全覆盖区域A,则应该kπ(D/2)2 = C*L2。 其中C>=1 是一个常数,是为了充分保证群首节点能覆盖区域 A而设置的。由此得出平均意义下每个群首覆盖的区域半径应 该为
简述LEACH算法的基本原理。
简述LEACH算法的基本原理。
LEACH(Low Energy Adaptive Clustering Hierarchy)算法是一种无线传感器网络中常用的能量有效的数据聚集协议。
其基本原理是将传感器节点分为若干个簇,每个簇有一个簇头节点,簇头节点负责收集和汇总本簇内的数据并将其传输到基站,从而减少无线传输的能量消耗,延长网络寿命。
LEACH算法的具体实现步骤如下:
1. 初始阶段:每个节点随机选择一个数值作为阈值,若节点的能量水平高于该阈值,则该节点有可能成为簇头节点。
2. 簇头节点选择阶段:每个节点通过计算与其距离的平方和来确定与其最近的簇头节点,并将自己加入该簇头节点所在的簇中。
每个簇头节点根据自己的能量水平计算出一个概率值,该概率值与其他节点的能量水平成反比,能量水平越高的节点成为簇头节点的概率越小。
簇头节点将自己的概率值广播给其他节点,每个节点通过比较自己的概率值和簇头节点的概率值来决定是否成为簇头节点。
3. 簇内通信阶段:每个节点将数据发送给其所在的簇头节点,簇头节点负责汇总和压缩数据,并将数据传输到基站。
4. 轮换阶段:为了平衡能量消耗,每个簇头节点轮流充当簇头节点,其他节点
重新选择簇头节点。
LEACH算法的优点是能够有效地减少能量消耗,延长网络寿命,同时具有良好的可扩展性和自适应性。
但是由于其随机性较强,可能导致网络中出现簇头节点密集或稀疏的情况,从而影响网络性能。
LEACH分簇算法实现和能量控制算法实现
一:题目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’。
LEACH算法仿真结果
仿真一:在100*100 的区域内随机生成100 个节点 ( matlab 仿真代码:clear;xm=100;%x 轴范围ym=100;%y 轴范围sink.x=0.5*xm;% 基站x 轴50sink.y=0.5*ym;% 基站y 轴50n=100;E0=0.02;for i=1:1:nS(i).xd=rand(1,1)*xm;S(i).yd=rand(1,1)*ym;S(i).G=0;% 每一周期结束此变量为0 S(i).E=E0;% 设置初始能量为E0 S(i).type='N';% 节点类型为普通plot(S(i).xd,S(i).yd,'o');hold on;end%设置SINK 节点的坐标S(n+1).xd=sink.x;S(n+1).yd=sink.y;plot(S(n+1).xd,S(n+1).yd,'*');% 绘制基站节点仿真结果图片:‘ O'代表随机散布的节点,’* '代表SINK节点)100. CJ ■-1H I L IL L L L* Q-O90 L r-.门 c ° 0』亠1E 小■-80 —0 QC O Q70 1”o o o QC0°C Q60 O J」u「一A o50 -• *oO o □oo o40 —0 oo O30O ccP c 」。
° % 020 = c C |2 7 Co o c W10Q_ v? O0 Q n0 i J. Qn L f r i f r r0 10 20 30 40 50 60 70 80 90 100仿真二:LEACH分簇效果图(matlab代码见附件)仿真结果:(p=0.1)1、簇头个数14.100905I ctJ_ oE £L*1 L1(g80 K J*QQ o70 一o-60 -辛-50 -如宀七—**0 Q r-h.40 一土7 o一30 ”•=t=-■o o <b l' l20 --*10 k-/-1r J i r r 1 t〕1! 一r0 10 20 30 40 50 60 70 80 90 100100 2、簇头个数:113、簇头个数:12100厂 1I [1L.1 IIr c奋L90 -卡Q- 80■*却o■70 「4oQQO 160 po+ oQ0 OQO50■40 -Q0 Q QJ|O Q-Q+- 30 --ooi 內 co ◎o20l' wQ10 一_ j-c0 ■ ( L i(JLj rr t L10 2030405060 70 80 90 1004、簇头个数:10100£ L ■ L O*OoI Q IcO- **oJ 0"皓 + jgo o l;.°5Q Q*4=-c O「■■--* r ?,-Xf )r~j%QOJi『1LJTr Lf L1009080 70 60 5040 30 20 1010 20 30 405060708090(p=0.05) 1、簇头=6100 90 80 70 60 50 40 30 20 102、簇头=7L.1七L B 1 1*lL L--o o*fjftzjC0Q*—*)°如-■-*一* o cP!. iex-tr r I rr r rr 90 80 70 6050 4030 20 1010 20 30 40 5060 70809010010 20 30 40 50 60 70 80 90 10010006 08 0Z 09 09 017OSOSOL4-OLOSOS0170909OZ0806 00 L 06 08 OZ 09 09 017 OS 0 乙OL 010203040506070 8090100xLEACH分簇算法成簇效果图 100 — __ Q2 Q90一fj__fj-簇头~^宰80 — 普通节点一尸 O 话70 —G + 苇广Q X )QOQOocW-o 60Q辛 0-oy50 —SINK 节点—>七> *40 PoO30C51f °。
leach协议matlab仿真代码
leach协议matlab仿真代码LEACH協議clear;%清除內存變量xm=100;%x軸範圍ym=100;%y軸範圍sink.x=0.5*xm;%基站x軸sink.y=0.5*ym;%基站y軸n=100;%節點總數p=0.1;%簇頭概率E0=0.02;%初始能量ETX=50*0.000000000001;%傳輸能量,每bitERX=50*0.000000000001;%接收能量,每bitEfs=10*0.000000000001;%耗散能量,每bitEDA=5*0.000000000001;%融合能耗,每bitcc=0.6;%融合率rmax=1000;%總輪數CM=32;%控制信息⼤⼩DM=4000;%數據信息⼤⼩figure(1);%顯⽰圖⽚for i=1:1:nS(i).xd=rand(1,1)*xm;S(i).yd=rand(1,1)*ym;S(i).G=0;%每⼀週期結束此變量為0S(i).E=E0;%設置初始能量為E0S(i).type='N';%節點類型為普通plot(S(i).xd,S(i).yd,'o');hold on;%保持所畫的圖像end%為每個節點隨機分配坐標,並設置初始能量為E0,節點類型為普通S(n+1).xd=sink.x;S(n+1).yd=sink.y;plot(S(n+1).xd,S(n+1).yd,'x');%繪製基站節點flag_first_dead=0;%第⼀個死亡節點的標誌變量for r=1:1:rmax%開始每輪循環r+1%顯⽰輪數if(mod(r,round(1/p))==0)for i=1:1:nS(i).G=0;endend%如何輪數正好是⼀個週期的整數倍,則設置S(i).E為0hold off;%每輪圖⽚重新繪製cluster=0;%初始簇頭數為0dead=0;%初始死亡節點數為0figure(1);for i=1:1:nif(S(i).E<=0)plot(S(i).xd,S(i).yd,'red .');dead=dead+1;%將能量⼩於等於0的節點繪製成紅⾊,並將死亡節點數增加1if(dead==1)if(flag_first_dead==0)first_dead=r %第⼀個節點的死亡輪數save ltest, first_dead;flag_first_dead=1;endend%將能量⼩於等於0的節點繪製成紅⾊,並將死亡節點數增加1hold on;elseS(i).type='N';plot(S(i).xd,S(i).yd,'o');%繪製其他節點hold on;endendplot(S(n+1).xd,S(n+1).yd,'x');%繪製基站Dead(r+1)=dead; %每輪有死亡節點數save ltest, Dead(r+1);%將此數據存⼊ltest⽂件for i=1:1:nif(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;%S(i).G設置為⼤於0,此週期不能再被選擇為簇頭cluster=cluster+1;%簇頭數加1C(cluster).xd=S(i).xd;C(cluster).yd=S(i).yd;%將此節點標誌為簇頭plot(S(i).xd,S(i).yd,'k*');%繪製此簇頭distance=sqrt((S(i).xd-(S(n+1).xd))^2+(S(i).yd-(S(n+1).yd))^2);%簇頭到基站的距離C(cluster).distance=distance;%標誌為此簇頭的距離C(cluster).id=i; %此簇頭的節點idpacket_To_BS(cluster)=1;%發送到基站的數據包數為1endendendendCH_Num(r+1)=cluster; %每輪的簇頭數save ltest,CH_Num(r+1);%保存每輪簇頭數到ltestfor i=1:1:nif(S(i).type=='N'&&S(i).E>0)%對每個能量⼤於0且⾮簇頭節點min_dis=sqrt((S(i).xd-(C(1).xd))^2+(S(i).yd-(C(1).yd))^2);%計算此節點到簇頭1的距離min_dis_cluster=1;for c=2:1:clustertemp=sqrt((S(i).xd-(C(c).xd))^2+(S(i).yd-(C(c).yd))^2);if(temp<min_dis)min_dis=temp;min_dis_cluster=c;endend%選擇此幾點到哪個簇頭的距離最⼩packet_To_BS(min_dis_cluster)=packet_To_BS(min_dis_cluster)+1;%將此節點加⼊的簇 %頭節點數據包數加1Er1=ERX*CM*(cluster+1);%此節點接收各個簇頭的控制信息%此節點加⼊的簇的簇頭時隙控制信息的總接收能耗Et1=ETX*(CM+DM)+Efs*(CM+DM)*min_dis*min_dis;%此節點發送加⼊信息和發送數據信息 %到簇頭的能耗S(i).E=S(i).E-Er1-Et1;%此輪後的剩餘能量endendfor c=1:1:cluster%各個簇頭packet_To_BS(c);%簇頭需發送到基站的數據包個數CEr1=ERX*CM*(packet_To_BS(c)-1);%收到此簇各個節點加⼊信息的能耗CEr2=ERX*DM*(packet_To_BS(c)-1);%收到此簇各個節點數據信息的能耗CEt1=ETX*CM+Efs*CM*(sqrt(xm*ym))*(sqrt(xm*ym));%此簇頭廣播成簇信息的能耗CEt2=(ETX+EDA)*DM*cc*packet_To_BS(c)+Efs*DM*cc*packet_To_BS(c)*C(c).distance*C(c).distance;%簇頭將所以數據融合後發往基站的能耗S(C(c).id).E=S(C(c).id).E-CEr1-CEr2-CEt1-CEt2;%此輪後簇頭的剩餘能量endfor i=1:1:nR(r+1,i)=S(i).E; %每輪每節點的剩餘能量% save ltest,R(r+1,i);%保存此數據到ltestendhold on;end。
简述leach算法的工作流程。
简述leach算法的工作流程。
LEACH算法是一种用于无线传感器网络(WSN)中的分簇协议。
该算法旨在减少能量消耗,延长传感器节点的寿命,增加网络的可靠性和稳定性。
其流程如下:
1. 初始化:每个传感器节点都会随机生成一个浮点数,并用该数与传感器网络的阈值进行比较。
若节点浮点数小于阈值,则节点作为簇头参与到簇头选举中;否则,节点成为普通节点。
2. 簇头选举:各个节点会发送概率性的选举请求给簇头,簇头选择了之后,该节点将组成一个簇并成为簇头,并广播自己是簇头的信息给所有普通节点。
3. 簇头分配:在确定每个簇头之后,簇头将其覆盖范围内的普通节点加入到该簇,并将簇员节点分配到不同时间片进行通信,以减少能量的消耗。
簇成员向簇头发送数据,簇头检查数据并压缩以便传输。
4. 时隙轮换:为了避免节点能量分布不均匀,簇头在各自簇内定期轮换时隙,以保证每个节点都有机会参与到数据传输中。
5. 路由:簇头定期将本簇采集的数据通过路由协议传输到其他位置的基站。
6. 能量检测:当某个节点的能量已经耗尽时,节点不再参与到数据传输中,因此簇内节点需要定期检测其它节点的能量状况,以便取代能量耗尽的节点并保持网络的稳定性。
总的来说,LEACH算法采用了分簇的策略,通过将传感器节点分配到不同时间片实现对其能量的有效管理,并引入时隙轮换的机制,以令能
量在各个节点间平衡分配,从而延长网络寿命,增强网络的可靠性和稳定性。
leach算法的详细信息
翻译英文原文的LEACH算法的详细信息LEACH的运作以“轮”来实现,每一轮开始是簇头的建立阶段,其次传输数据到基站的稳态阶段。
为了尽量减少开销,稳态阶段比簇建立阶段时间长。
5.1簇选举阶段簇头选举初始阶段,每个节点根据所建议网络簇头的百分比(事先确定)和节点已经成为簇头的次数来确定自己是否当选为簇头。
每个节点产生一个0-1的随机数字,如果该数字小于阈值T(N),节点成为当前轮的簇头。
阈值T(n)=⎪⎩⎪⎨⎧∈-其它,0,)]/1mod([*1Gnprpp其中,P为预期的簇头百分比(例如,p= 0.5),r为当前轮数,G是最近1/p轮里没有成为簇头的节点的集合。
使用这个阀值,每个节点会在1/p轮的某一轮成为簇头。
在0轮(r = 0),每个节点都有一个成为簇头的概率P。
当选为簇头的节点不能在未来的1/ P轮当选为簇头。
因此,只有较少的节点有资格当选为簇头节点,剩余节点成为簇头的概率必然增加。
1/p-1回合后对任意还没当选为簇头的节点T(n)=1,可见,1/ P的回合后,所有节点都再次有资格成为簇头。
以后的工作中,我们会考虑到非均匀能量节点的以能量为基础的阀值。
在这种情况下,我们假设所有节点具有相同初始数量的能量,每个簇头也消耗大约相同的能量。
非簇头节点必须保持他们的接收器在此选举阶段听到所有的簇头节点的广告。
这一阶段完成后,每个非簇头节点决定在本轮中加入哪一个簇头节点。
这一决定是基于对广告的接收信号强度。
假设是对称的传播信道,收到发送的广告信号强度最大的簇头就是要加入的簇头,与其通信需要的能量最小。
稳定之后表示簇头的随机选举完成了。
5.2簇建立阶段在每个节点已决定它属于哪个簇之后,它必须告知簇头节点,它将成为该簇的成员节点。
每个节点再次使用CSMA MAC协议发送这个信息反馈给簇头。
在这个阶段,所有的簇头节点必须保持他们的接收器打开。
5.3 时间表的创建簇头节点收到所有想加入该簇的节点的消息。
基于这个簇的节点的数量,簇头节点创建一个TDMA时间表告诉所有节点什么时候能开始传输数据。
Leach算法分析
Leach算法分析leach_mit结构图从wireless.tcl⽂件中分析leach的具体流程在wireless.tcl⽂件中⾸先初始化了很多⽆限仿真的配置。
引⽤了⼀些外部脚本——source tcl/lib/ns-mobilenode.tcl(主要是包含移动节点类Node/MobileNode的⼀些otcl类函数的定义)、source tcl/lib/ns-cmutrace.tcl(trace⽂件的tcl脚本)、 sourcetcl/mobility/$opt(rp).tcl(将⼏种不同的协议的具体应⽤的外部脚本引⽤,$opt(rp)是协议名称)。
当⼀些变量初始化过后,通过elseif { [string compare $opt(rp) "leach"] == 0} {for {set i 0} {$i < $opt(nn) } {incr i} {leach-create-mobile-node $i建⽴我们仿真的节点,最主要的函数是leach-create-mobile-node(这个函数的定义在uamps.tcl中)分析uamps.tcl中是如何定义节点的在uamps.tcl中初始化了bsnode的应⽤类型(Application/BSApp)、定义了⼆个能量传输模型(⾃由信道和多径衰落、Efriss_amp和Etwo_ray_amp)和很多参数。
⽽真正创建节点是在函数leach-create-mobile-node中。
⽽这个函数中调⽤了uamps.tcl中的sens_init,这个函数的功能是清除上⼀次模拟时留下的trace⽂件。
在创建节点时候,sens_init函数调⽤⼀次。
leach-create-mobile-node函数解释如下:1、节点定义:if {$id != $opt(nn_)} {puts -nonewline "$id "set node_($id) [new MobileNode/ResourceAwareNode] #将前opt(nn_)-1个点定义为⼀般节点} else {puts "($opt(nn_) == BS)"set node_($id) [new MobileNode/ResourceAwareNode $BS_NODE] #将第opt(nn_)个节点定义为最终的sink节点$node_($id) label "BS"$node_($id) label-color red}2、初始化能量:if {$id != $opt(nn_)} { #如果节点的能量相等,就将所有普通节点的能量初始化为$opt(init_energy)。
如何使用代码分析器来检查代码中的问题
如何使用代码分析器来检查代码中的问题代码分析器(Code Analyzer)是一种静态代码分析工具,用于检查代码中的问题。
它能够自动分析源代码,识别出潜在的错误、低效的代码、不规范的代码等,帮助开发人员提高代码质量并发现潜在的问题。
在本文中,我们将讨论如何使用代码分析器来检查代码中的问题。
代码分析器可以通过多种方式运行,包括整合到集成开发环境(IDE)中、作为插件运行、通过命令行运行等。
无论是哪种方式,代码分析器通常都可以配置检查规则和代码违规时的操作(例如提供警告、错误或者其他的反馈)。
下面是使用代码分析器进行代码检查的一般步骤:1.安装代码分析器:首先,你需要安装合适的代码分析器。
常见的代码分析器包括SonarQube、PMD、FindBugs、ESLint等,你可以根据你所使用的编程语言来选择合适的工具。
2.配置代码分析器:在安装完代码分析器后,你需要对其进行配置。
你可以定义代码检查规则,包括代码风格、最佳实践、性能问题等。
代码分析器通常有一套默认的规则集,你也可以根据项目的需求进行自定义配置。
3.运行代码分析器:一旦配置完成,你可以开始运行代码分析器来检查代码。
具体的运行方式取决于你所选择的代码分析器。
例如,你可以在IDE中点击“运行代码分析器”按钮,或者在终端中运行命令来启动分析。
分析器会对代码进行静态分析,并根据配置的规则对代码进行检查。
4.查看检查结果:代码分析器通常会生成检查结果报告,用于展示代码中的问题。
这些报告可能包括错误、警告、建议等。
你可以查看这些报告来了解代码中存在的问题,并进行相应的修复。
5.修复代码问题:根据代码分析器提供的建议,在代码中进行相应的修复。
如果代码分析器报告了某个问题,你可以根据报告中提供的详细信息来找到相应的代码位置,并进行修复。
修复后,你可以重新运行代码分析器来确保问题已经得到解决。
使用代码分析器进行代码检查可以带来许多好处,包括但不限于以下几点:1.提高代码质量:代码分析器可以帮助你发现潜在的代码问题,包括错误、漏洞、不规范的代码等。
一种LEACH路由协议算法的改进与分析
一种LEACH路由协议算法的改进与分析白永祥【期刊名称】《通信技术》【年(卷),期】2015(000)009【摘要】Based on the traditional LEACH protocol, an improved LEACH-CND protocol is proposed. The cluster head election of WSN network is optimized and implemented on the basis of residual energy, and the best cluster numbers of the wireless sensor networks is thus calsulated. Meanwhile, based on the ad-vantage of the elliptic curve cryptosystem,the lightweight identity key encryption algorithms for WSN node is explored. Finally, simulation on the optimized protocol in MATLAB environment indicates its feasibility, and that it could prolong survival time of WSN networks.%基于传统的LEACH协议,提出了一种改进协议LEACH-CND。
对无线传感器网络的簇头选举进行了优化,主要依据节点的剩余能量选举簇头,并求出网络的最佳簇头数。
其次,基于椭圆曲线密码体制的优势,针对无线传感器网络节点轻量级身份密钥加密算法进行了探讨。
最后,在MAT-LAB环境下对优化后的协议进行了仿真,证明了其可行性。
达到了延长网络生存时间的目的。
【总页数】6页(P1062-1067)【作者】白永祥【作者单位】渭南职业技术学院,陕西渭南714000【正文语种】中文【中图分类】TP393.06【相关文献】1.基于LEACH的无线传感器网络路由协议改进算法 [J], 翁锦深;秦华标;张宗国2.一种基于LEACH路由协议的改进算法 [J], 蔡悦洁;胡方明3.一种基于遗传算法的无线传感器网络LEACH路由协议的改进算法 [J], 周玉;景博;杨洲4.一种无线传感器网络路由协议LEACH的改进算法 [J], 李兰英;刘昌东5.无线传感器网络LEACH路由协议的改进算法 [J], 周志强;刘森;王允臣因版权原因,仅展示原文概要,查看原文内容请购买。
leach和 heed的matlab实现代码
leach和heed的matlab实现代码
对于这两个词,leach和heed,首先我们需要理解它们的含义和如何应用它们。
然而,目前这两个词没有直接的Matlab实现代码。
Matlab主要用于科学计算、数
据分析、图像处理等领域,通常不会直接用于实现某个具体的单词或短语。
如果你是想在Matlab中实现某种与这两个词相关的功能或算法,你需要提供更多的
上下文信息,例如你想做什么,这两个词在你的问题中是如何应用的等。
这样我才能给出更具体的帮助。
例如,如果你想在Matlab中实现一个名为"leach"的函数,该函数的功能可能是从
数组中提取数据,那么你可以这样写:
matlab
function result = leach(array)
% 在这里实现你的算法
result = array(1); % 假设我们只需要数组的第一个元素
end
这是一个非常基础的示例,你可能需要根据你的具体需求来修改或扩展它。
如果你想实现一个名为"heed"的函数,该函数的功能可能是处理或分析数据,那么
你可以这样写:
matlab
function result = heed(array)
% 在这里实现你的算法
result = sum(array); % 假设我们需要计算数组中所有元素的和
end
同样,这只是一个示例,你可能需要根据你的具体需求来修改或扩展它。
LEACH协议代码(MATLAB)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %% SEP: A Stable Election Protocol for clustered % % heterogeneous wireless sensornetworks %% %% (c) GeorgiosSmaragdakis %% WING group, Computer Science Department, Boston University % % %% You can find full documentation and related information at: % %/sep %% %% To report your comment or any bug please send e-mail to: % %gsmaragd@ %% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %% This is the LEACH [1] code we have used. % % The same code can be used for FAIR if m=1 % % %% [1] W.R.Heinzelman, A.P.Chandrakasan andH.Balakrishnan, %% "An application-specific protocol architecture forwireless %% microsensornetworks" %% IEEE Transactions on Wireless Communications,1(4):660-670,2002 %% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%clear;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%PARAMETERS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%Field Dimensions - x and y maximum (in meters)xm=100;ym=100;%x and y Coordinates of the Sinksink.x=0.5*xm;sink.y=0.5*ym;%Number of Nodes in the fieldn=100%Optimal Election Probability of a node%to become cluster headp=0.1;%Energy Model (all values in Joules)%Initial EnergyEo=0.5;%Eelec=Etx=ErxETX=50*0.000000001;ERX=50*0.000000001;%Transmit Amplifier typesEfs=10*0.000000000001;Emp=0.0013*0.000000000001;%Data Aggregation EnergyEDA=5*0.000000001;%Values for Hetereogeneity%Percentage of nodes than are advancedm=0.1;%\alphaa=1;%maximum number of roundsrmax=9999%%%%%%%%%%%%%%%%%%%%%%%%% END OF PARAMETERS %%%%%%%%%%%%%%%%%%%%%%%%%Computation of dodo=sqrt(Efs/Emp);%Creation of the random Sensor Networkfigure(1);for i=1:1:nS(i).xd=rand(1,1)*xm;XR(i)=S(i).xd;S(i).yd=rand(1,1)*ym;YR(i)=S(i).yd;S(i).G=0;%initially there are no cluster heads only nodesS(i).type='N';temp_rnd0=i;%Random Election of Normal Nodesif (temp_rnd0>=m*n+1)S(i).E=Eo;S(i).ENERGY=0;plot(S(i).xd,S(i).yd,'o');hold on;end%Random Election of Advanced Nodesif (temp_rnd0<m*n+1)S(i).E=Eo*(1+a)S(i).ENERGY=1;plot(S(i).xd,S(i).yd,'+');hold on;endendS(n+1).xd=sink.x;S(n+1).yd=sink.y;plot(S(n+1).xd,S(n+1).yd,'x');%First Iterationfigure(1);%counter for CHscountCHs=0;%counter for CHs per roundrcountCHs=0;cluster=1;countCHs;rcountCHs=rcountCHs+countCHs;flag_first_dead=0;for r=0:1:rmaxr%Operation for epochif(mod(r, round(1/p) )==0)for i=1:1:nS(i).G=0;S(i).cl=0;endendhold off;%Number of dead nodesdead=0;%Number of dead Advanced Nodesdead_a=0;%Number of dead Normal Nodesdead_n=0;%counter for bit transmitted to Bases Station and to Cluster Heads packets_TO_BS=0;packets_TO_CH=0;%counter for bit transmitted to Bases Station and to Cluster Heads %per roundPACKETS_TO_CH(r+1)=0;PACKETS_TO_BS(r+1)=0;figure(1);for i=1:1:n%checking if there is a dead nodeif (S(i).E<=0)plot(S(i).xd,S(i).yd,'red .'); dead=dead+1;if(S(i).ENERGY==1)dead_a=dead_a+1;endif(S(i).ENERGY==0)dead_n=dead_n+1;endhold on;endif S(i).E>0S(i).type='N';if (S(i).ENERGY==0)plot(S(i).xd,S(i).yd,'o');endif (S(i).ENERGY==1)plot(S(i).xd,S(i).yd,'+');endhold on;endendplot(S(n+1).xd,S(n+1).yd,'x');STATISTICS(r+1).DEAD=dead;DEAD(r+1)=dead;DEAD_N(r+1)=dead_n;DEAD_A(r+1)=dead_a;%When the first node diesif (dead==1)if(flag_first_dead==0)first_dead=rflag_first_dead=1;endendcountCHs=0;cluster=1;for i=1:1:nif(S(i).E>0)temp_rand=rand;if ( (S(i).G)<=0)%Election of Cluster Headsif(temp_rand<= (p/(1-p*mod(r,round(1/p)))))countCHs=countCHs+1;packets_TO_BS=packets_TO_BS+1;PACKETS_TO_BS(r+1)=packets_TO_BS;S(i).type='C';S(i).G=round(1/p)-1;C(cluster).xd=S(i).xd;C(cluster).yd=S(i).yd;plot(S(i).xd,S(i).yd,'k*');distance=sqrt( (S(i).xd-(S(n+1).xd) )^2 +(S(i).yd-(S(n+1).yd) )^2 );C(cluster).distance=distance;C(cluster).id=i;X(cluster)=S(i).xd;Y(cluster)=S(i).yd;cluster=cluster+1;%Calculation of Energy dissipateddistance;if (distance>do)S(i).E=S(i).E- ( (ETX+EDA)*(4000) +Emp*4000*( distance*distance*distance*distance ));endif (distance<=do)S(i).E=S(i).E- ( (ETX+EDA)*(4000) +Efs*4000*( distance * distance ));endendendendendSTATISTICS(r+1).CLUSTERHEADS=cluster-1;CLUSTERHS(r+1)=cluster-1;%Election of Associated Cluster Head for Normal Nodesfor i=1:1:nif ( S(i).type=='N' && S(i).E>0 )if(cluster-1>=1)min_dis=sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 );min_dis_cluster=1;for c=1:1:cluster-1temp=min(min_dis,sqrt( (S(i).xd-C(c).xd)^2 +(S(i).yd-C(c).yd)^2 ) );if ( temp<min_dis )min_dis=temp;min_dis_cluster=c;endend%Energy dissipated by associated Cluster Headmin_dis;if (min_dis>do)S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis));endif (min_dis<=do)S(i).E=S(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis));end%Energy dissipatedif(min_dis>0)S(C(min_dis_cluster).id).E = S(C(min_dis_cluster).id).E- ( (ERX + EDA)*4000 );PACKETS_TO_CH(r+1)=n-dead-cluster+1;endS(i).min_dis=min_dis;S(i).min_dis_cluster=min_dis_cluster;endendendhold on;countCHs;rcountCHs=rcountCHs+countCHs;%Code for Voronoi Cells%Unfortynately if there is a small%number of cells, Matlab's voronoi%procedure has some problems%[vx,vy]=voronoi(X,Y);%plot(X,Y,'r*',vx,vy,'b-');% hold on;% voronoi(X,Y);% axis([0 xm 0 ym]);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%STATISTICS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% DEAD : a rmax x 1 array of number of dead nodes/round% DEAD_A : a rmax x 1 array of number of dead Advanced nodes/round % DEAD_N : a rmax x 1 array of number of dead Normal nodes/round% CLUSTERHS : a rmax x 1 array of number of Cluster Heads/round% PACKETS_TO_BS : a rmax x 1 array of number packets send to Base Station/round% PACKETS_TO_CH : a rmax x 1 array of number of packets send to ClusterHeads/round% first_dead: the round where the first node died % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%。
LEACH算法源代码
ev << "BS: got self message type " << msg->getKind() << "\n";//节点开始初始化完(在initialize()函数中)
if (msg->getKind() == SMSG_INIT) {
this->xpos = par("xpos");
this->ypos = par("ypos");
this->nrNodes = parent->par("numNodes");//////////????????????????????????????????????????
this->nrGates = parent->par("numNodes");//////????????????????????????????????????????????
ev << "BS trRange is: " << trRange << "\n";//总的轮数是:
for(i=1;i<=simulation.getLastModuleId();i++)//????????????????????????????????????????????
{
mod=simulation.getModule(i);//????????????????????????????????????????????????????????
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一、Leach协议与NS的关系 (2)二、算法设计思想 (3)三、簇头建立算法流程图 (5)四、难点解决 (6)五、算法运行结果分析 (9)参考文献 (9)一、Leach协议与NS的关系为了实现leach 协议,对ns进行扩展。
在ns中增加了一个事件驱动模拟器支持模拟无线传感器网络协议。
这些扩展包括MAC协议,用于计算和交互的能量分配模型和leach协议的体系结构。
网络拓扑结构可以通过简单的Nodes, Links, Agents和Applications 描述。
Nodes相当于网络中的终端主机,Links 是用于Nodes交互的连接器, Agent 用来实现不同网络协议,是支持分组产生和丢弃的节点。
Applications用来产生数据和实现不同的应用函数。
一旦网络拓扑结构建立起来后,模拟通过启动节点上的Applications运行。
为了在ns中支持无线传感器网络,在ns中增加了mobile nodes, MAC协议和信道传播模型Channel 。
Applications类的头文件用Tcl语言写的,节点中的其他函数功能用C++语言写成的。
数据包的发送过程:Applications创建数据包(data packets),然后发送给Agent. Agent执行协议栈中运输层和网络层的功能,将数据包发送给CMUTrace,。
CMUTrace将packets 的统计数据写到trace 文件,然后将packets发至Connector。
Connector将数据包传送给用于数据链路处理的链路层(LL).经过一小段时间的延迟后,数据包由LL 发送给Queue缓冲队列。
如果是还没有传送过的数据包,Queue将以队列进行存储。
然后Queue将数据包出队列,发送到MAC层。
然后开始运行MAC(媒体访问控制)协议。
最终,packets被发送到网络接口层(Network Interface),网络接口层将packets加上正确的传输能量,然后将packets发送到Channel. Channel将packets进行拷贝,并发往连接信道的每一个节点。
发送过程可参考如下图1数据包的接收过程:数据包被节点的网络接口接收,并被向上传送至MAC层,Link-Layer,Connector, CMUTrace, 和Agent 函数. Agent 对数据包进行判定,并将数据包到达的信息通知给Application.接收过程与发送过程传输的路径相反。
二、算法设计思想Leach协议跨越几个层次实现的协议,Leachapp应用在最高层Application。
它是自适应分簇拓扑算法。
周期执行,每轮循环分为簇头的建立阶段和稳定的数据通信阶段。
(1)簇头建立阶段:初始阶段,每个节点从0和1中随机产生一个数,如果这个数小于阀值T(n),该节点就成为当前轮的簇头。
其中,P是期望的簇头数在所有节点中占的百分比,r是选举轮数,r mod (1/p)代表这一轮循环中当选过簇头的节点个数,G是这一轮循环中未当选过簇头的节点集合。
每个节点自主选择是否成为当前轮的簇头并通过广播的形式报告给其他节点。
簇头通过CSMA MAC协议进行广播,所有的簇头以相同的传输能量进行广播。
簇头建立起来之后,每个非簇头节点要决定在当前轮中自己属于哪个簇头。
非簇头节点根据收到的广播信号强度决定加入哪个簇头。
非簇头节点决定了自己属于哪个簇头后,必须通知簇头节点它是该簇的成员。
非簇头节点同样通过CSMA MAC协议将自己加入该簇的信息报告给簇头节点。
簇头节点收到所有的非簇头节点加入的信息后,基于本簇内加入的节点数目创建TDMA调度,通知每个节点什么时间可以传输数据。
在leach协议中,具体通过calculatePi()函数计算门限值thresh.double LeachApp::calculatePi(){register int n = config_.numberNodes_; //节点个数register int k = config_.desiredClusters_; //期望簇头数double thresh; //阀值if (hasBeenClusterHead())thresh = 0; //已经是簇头,本轮中不再成为簇头else if (n - k * round_ < 1)thresh = 1; //将节点设置为簇头elsethresh = (double) k / (n - k * round_);return thresh;}(2)数据传输阶段:一个簇内的信息传输会影响相邻簇。
为了减少这种信号干扰,各个簇内的信息交互通过不同的CDMA编码。
簇头可以决定本簇中节点所用的CDMA编码。
这个用于当前阶段的CDMA编码在广播簇头的时候发送给簇内节点。
具体在advertiseClusterHead()中实现。
此外,簇头根据本簇内的节点个数创建TDMA调度。
具体的,簇头在findBestCluster()函数中调用createSchedule(),而由createSchedule()函数具体创建TDMA调度。
当簇内节点收到这个消息后,它们会在各自的时间槽内发送数据。
簇头节点收到所有的数据后执行信号处理函数压缩数据为一个信号,并将这个合成的信号发给基站。
三、簇头建立算法流程图簇头的建立是在decideClusterHead()函数实现。
具体流程图如 图1NNN图1 簇头建立算法流程图四、难点解决1. CDMA编码问题Leach协议中不同簇内用不同的CDMA编码,同一个簇内采用同一个CDMA编码进行数据传输。
如果以各个簇头为结点,建立完全图。
为了使各个簇采用不同的编码,利用PCA边着色。
所谓PCA边着色问题,指在完全图中给节点的每条邻接边分配不同的码。
每个节点用一个码在其邻接边(即链路)上进行发送或接收数据。
以下,图2是PCA着色问题的一个示例。
图2 PCA边着色示意图如果记PCA需要的最大可用码数为:#(PCA)根据图论知识:#(PCA)<=2⊿-1 ,其中⊿指图中节点的最大度数例如:在图2中,节点的最大度数为6,故⊿为6在leach协议中,假定期望的簇头数为n,再加上汇聚节点,所以,节点的最大度数⊿为(n+1)。
因此,#(PCA)<=2(n+1)-1=2n+1在程序中,簇头建立后,簇头决定本簇内的CDMA编码。
这是在广播簇头时确定的,即advertiseClusterHead()函数中。
numCodesAvail = 2 * config_.spreading_ - 1; //计算最大可用码clusterCode = (mac_->myADVnum() % numCodesAvail) + 1; //设置CDMA编码在程序中,struct leachConfig中对desiredClusters_(期望的簇头数)和config_.spreading进行了定义。
在initializeConfig()函数中语句:config_.spreading_ = config_.desiredClusters_ + 1在LeachApp的构造函数LeachApp(int nNodes, int nClusters, double maxDist) 中语句:config_.desiredClusters_ = nClusters在TCL脚本中set val(n_common) 10 //普通节点个数可任意设置,此处设为10set val(n_ch) 0 //簇头数初始值为0set val(n_ch) [expr int($val(n_common) * 2 / 10)] //对期望的簇头数进行了设置,为普通节点个数的20%(即上式中的2/10)因此,可以计算得出numCodesAvail在mac-sensor.h中,int myADVnum_;// 收到的广播消息,即邻近的簇头节点的个数inline int & myADVnum() { return myADVnum_; }myADVnum()是在MAC层中计算求得。
启动运行后,计算每个簇头的邻近簇头发来的ADV。
因此,可求得clusterCode2. TDMA调度在findBestCluster()函数中,当判定节点是簇头节点时需要createScheduler。
在createScheduler函数中,如果簇内节点不空,就需要创建TDMA时分复用帧。
frameTime 表示该簇头节点分配的一个时间帧;clusterNodes_.size() 表示一个簇内的节点个数config_.ssSlotTime_ 表示一个时间帧内的小的时隙lstRndDelay 表示缓冲时间xmitTime_ 表示簇内所有节点的数据发送时间createScheduler函数主要语句如下:frameTime_ = (5 + clusterNodes_.size()) * config_.ssSlotTime_; //计算时间帧lstRndDelay_ = Random::uniform(0, 0.01); //随机选取缓冲时间xmitTime_ = config_.ssSlotTime_ * (clusterNodes_.size()) + lstRndDelay_;Scheduler::instance().schedule(eventHandler_,new LeachEvent(&LeachApp::sendDataToBS),xmitTime_);3. clearClusterChoices()由于各个簇头形成和建立起来的时间不同,而簇头建立起来后需要广播ADV, 通知其他节点加入。
簇头广播的ADV会被网络中的所有节点接收到,即簇头和普通节点都能收到先建立起来的簇头发来的ADV。
普通节点收到簇头发来的通知包后都会将该数据包加入自己的一个接收队列。
对后来建立起来的簇头来说,一旦自己成为簇头,就会删除其他簇头发来的广播包;对没有成为簇头的普通节点来说,需要出接收的簇头队列中选出一个距离最近的簇头加入,然后删除接收队列中的广播包。
在decideClusterHead()函数中,当节点成为簇头后,需要执行clearClusterChoices(), 函数clearClusterChoices()主要语句如下:for (CHs::iterator it = clusterChoices_.begin(); it != clusterChoices_.end(); it++){chadv element = (chadv) *it;if (element.object != NULL)delete element.object;}而普通节点则需要在findBestCluster()中找到最优簇头(即距离最近的簇头)后,执行clearClusterChoices()4. 一些定义(1)virtual double TxTime(int n) { return n * 8.0 / 1000000.0; }TxTime指以1 Mbps的速度传输n bit数据所需要的时间(2)double lstRndDelay_; // 上次随机延迟时间int currentCH_; //当前簇头int currentCHMAC_; //当前簇头所用的MAC协议bool listenADV_; // 是否收听ADVbool listenJOINREQ_; // 是否监听加入请求五、算法运行结果分析1.场景介绍用ns模拟每个节点向基站传输数据Basic Configuration:图3 Basic Configuration配置图Access Point:图4 Access Point配置图Common Node:图5 Common Node配置图输出得到TCL文件。