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。
- 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文件。