Leach算法分析
无线传感器网络LEACH路由协议的改进算法

近年来,由于无线技术、计算机技术与传感器技术的迅猛发展和快速融合,无线传感器网络应运而生。
无线传感器网络技术作为一种新型网络技术受到研究者的普遍重视和广泛研究[1]。
但传感器网络也有一些固有的缺点如:能量利用率低、生存周期短、抗干扰能力差。
而通过良好的分簇算法不仅可以减少传感器节点的能耗,还可以降低通讯干扰、提高M A C 协议和路由协议的效率。
因此,提出一个高效稳定合理的算法便成为迫切需要解决的问题[2]。
本文在L EA CH 算法的基础上,综合考虑了各个节点的剩余能量,提出了一种更为高效、更为合理的低开销自适应分层的E -L E A C H 算法。
1 LEACH 算法分析LEACH协议是由Wendi等人提出的,其基本思想是:提出了“轮(round)”的概念,通过每一轮的循环随机选择簇头节点,然后再对簇头节点进行轮换,从而达到平衡和降低能耗、延长网络的生存周期的目的。
在L E A C H 协议中,每一轮由两部分构成。
第一部分是构建簇阶段,第二部分为稳定工作阶段。
在实际的无线传感器网络中,经过多轮选举后,各个节点的剩余能量将会有很大的不同,靠近簇头的节点剩余的能量多,而远离簇头的节点剩余的能量少。
但是在传统的LE AC H算法中,所有的节点成为簇首节点的概率是相同的。
因此,若在以后的多轮数据传播中都选取远离基站的节点做簇头,则该节点的能量将很快被耗尽,最终无线传感器网络L E A C H 路由协议的改进算法周志强1 刘森2 王允臣2(1.江苏省徐州市东方人民医院 江苏徐州 221004; 2.中国矿业大学计算机学院 江苏徐州 221116)摘 要:针对无线传感器网络簇头节点选取难、网络生存周期短、能量消耗大等问题,本文在传统的LEACH算法基础上,设计了E-LEACH 算法,E-LEACH算法引入了能量阈值的概念。
能量阈值是判断该节点是否可以作为簇头节点的先决条件,同时引入距离因子的概念,在每轮选取簇头时,都会考虑到和基站的距离。
基于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路由协议技术的分析及改进

计算机与现代化 2009年第9期J I S UANJ I Y U X I A NDA I HUA总第169期文章编号:100622475(2009)0920081203收稿日期:2008209210作者简介:单晓娜(19822),女,山东日照人,南昌大学信息工程学院硕士研究生,研究方向:计算机网络;李力(19582),男,江西上高人,副教授,研究方向:计算机网络应用与安全,传感器网络。
LE ACH 路由协议技术的分析及改进单晓娜,李 力(南昌大学信息工程学院,江西南昌330031)摘要:无线传感器网络作为计算、通信和传感器三项技术相结合的产物,是一种全新的信息获取和处理技术。
本文在简要介绍无线传感器网络的基础上,分析了LE ACH 分级路由协议存在的一些问题以及如何解决这些问题。
关键词:无线传感器网络;网络层;层次路由协议;LACHS 协议中图分类号:TP393 文献标识码:A do i:10.3969/j .issn .100622475.2009.09.023Ana lysis and I m prove m en t of L EACH Routi n g Protocol TechnologySHAN Xiao 2na,L IL i(School of I nf or mati on Engineering,Nanchang University,Nanchang 330031,China )Abstract:A s a result of combinati on of m icr osens or technol ogy,l ow power computing and wireless net w orking,wireless sens or net w ork is a novel technol ogy about acquiring and p r ocessing inf or mati on .This paper briefly intr oduces the architecture of wireless sens or net w ork,analyzs s o me p r oble m s of the LE ACH r outing p r ot ocol and how t o s olve these p r oble m s .Key words:wireless sens or net w ork;net w ork layer;grading r outing p r ot ocol;LACHS p r ot ocol0 引 言无线传感器网络是由一组传感器节点以自组织的方式构成的无线网络,其目的是协作的感知、采集和处理网络覆盖区域中感知对象的信息,并将信息发送给观察者。
LEACH算法的学习摘要

LEACH算法的学习摘要一、LEACH的定义LEACH:低功耗自适应路由算法二、LEACH算法的工作流程1.总述LEACH路由协议主要分为两个阶段:即簇建立阶段(setup phase)和稳定运行阶段(ready phase)。
簇建立阶段和稳定运行阶段所持续的时间总和为一轮(round)。
为减少协议开销,稳定运行阶段的持续时间要长于簇建立阶段。
2.簇建立阶段在簇建立阶段,传感器节点随机生成一个0,1之间的随机数,并且与阈值T(n)做比较,如果小于该阈值,则该节点就会当选为簇头。
T(n)按照下列公式计算:式中:P为节点成为簇头节点的百分数,r为当前轮数,G为在最近的1/p 轮中未当选簇头的节点集合。
簇头节点选定后,广播自己成为簇头的消息,节点根据接收到的消息的强度决定加入哪个簇,并告知相应的簇头,完成簇的建立过程。
然后,簇头节点采用TDMA的方式,为簇内成员分配传送数据的时隙。
3.稳定阶段在稳定阶段,传感器节点将采集的数据传送到簇头节点。
簇头节点对采集的数据进行数据融合后再将信息传送给汇聚节点,汇聚节点将数据传送给监控中心来进行数据的处理。
稳定阶段持续一段时间后,网络重新进入簇的建立阶段,进行下一轮的簇重建,不断循环。
三、LEACH算法的优点1.LEACH算法属于分层路由协议,节点之间反应速度快,簇头进行轮转性选举,能够保证无线传感器网络中各个节点能量均衡的消耗,从而有效地延长无线传感网络的生命周期,低功耗的目的。
2.各个节点之间不再是无序的建立通信路由,数据信息的传递具有一定的规则,普通节点只能向上一级簇头传送数据信息,一级粗托只能向二级簇头传送数据信息。
很大程度上节省了能量,减少了能量的浪费。
3.相近的节点之间接收到的数据信息有可能相同或相近,这就需要簇头进行必要的数据融合。
更好的提升了能量的利用率。
4.每个簇头都要进行数据融合,因为每个簇头接收到的都是局部数据信息,所以数据信息都是比较相关,给数据的融合带来了较快的速度。
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算法改进与分析_余海霞

器被价格低廉的金属谐振器所取代,这不仅满足了产品电性能指标,还实现了产品的低成本化要求,使所设计生产的产品在市场上更能满足客户需求,并且更具竞争力。
参考文献[1]Narrow-band multiple-coupled cavity synthesis.A.E.ATIA,MEMBER,IEEE,A. E.WILLIAMS,AND R.W.NEWCOMB,FELLOW,IEEE[2]General Coupling Matrix Synthesis Methods for Cheby-shev Filtering Functions”Richard J.Cameron,Senior Member,IEEE作者成果:孙尚传,男,一九六三年生,深圳市大富科技股份有限公司董事长兼总裁,安徽机电学院工业电气自动化专业学士,北京大学光华管理学院工商管理硕士,安徽省蚌埠市十佳科技工作者,由其本人或与他人合作共获专利授权80余项。
其中包括:序号专利名称专利号1缓冲装置ZL200910180230.X2螺钉装置及使用该螺钉装置的腔体滤波器ZL200910147645.73一种高能束焊接夹具ZL201120032743.94一种气体加速装置和高能束焊接用装置ZL201120032735.45一种高能束焊接装置ZL201120032733.56腔体滤波器、通信设备以及射频通信装置ZL201020681656.17一种射频通信设备ZL201020675524.88一种射频通信设备ZL201020675532.29腔体滤波器、信号处理模块及通信设备ZL201020695990.210一种腔体滤波器ZL201020696451.011一种射频通信设备ZL201020696454.412腔体滤波器及通信设备以及射频通信装置ZL201020679920.813室内覆盖模块ZL201020664060.014一种腔体四功分器内连接件及腔体四功分器ZL201020667057.415一种腔体三功分器内连接件及腔体三功分器ZL201020667018.416一种腔体二功分器内连接件及腔体二功分器ZL201020667048.517介质滤波器、介质谐振杆安装结构以及通信设备ZL201020646080.518一种功率分配装置及其壳体与盖板ZL201020695911.819一种功率分配装置及其耦合件ZL201020696026.120室内覆盖模块ZL201020692420.8无线传感器网络中LEACH算法改进与分析□余海霞凌永发安坤陈楠云南民族大学电气信息工程学院LEACH算法主要通过循环的方式随机选择簇头(Clusterhead),将整个网络的能量负载平均分配到每个传感器节点中,从而达到降低网络能源消耗、提高整个网络的生存时间的目的。
简述LEACH算法的基本原理。

简述LEACH算法的基本原理。
LEACH(Low Energy Adaptive Clustering Hierarchy)算法是一种无线传感器网络中常用的能量有效的数据聚集协议。
其基本原理是将传感器节点分为若干个簇,每个簇有一个簇头节点,簇头节点负责收集和汇总本簇内的数据并将其传输到基站,从而减少无线传输的能量消耗,延长网络寿命。
LEACH算法的具体实现步骤如下:
1. 初始阶段:每个节点随机选择一个数值作为阈值,若节点的能量水平高于该阈值,则该节点有可能成为簇头节点。
2. 簇头节点选择阶段:每个节点通过计算与其距离的平方和来确定与其最近的簇头节点,并将自己加入该簇头节点所在的簇中。
每个簇头节点根据自己的能量水平计算出一个概率值,该概率值与其他节点的能量水平成反比,能量水平越高的节点成为簇头节点的概率越小。
簇头节点将自己的概率值广播给其他节点,每个节点通过比较自己的概率值和簇头节点的概率值来决定是否成为簇头节点。
3. 簇内通信阶段:每个节点将数据发送给其所在的簇头节点,簇头节点负责汇总和压缩数据,并将数据传输到基站。
4. 轮换阶段:为了平衡能量消耗,每个簇头节点轮流充当簇头节点,其他节点
重新选择簇头节点。
LEACH算法的优点是能够有效地减少能量消耗,延长网络寿命,同时具有良好的可扩展性和自适应性。
但是由于其随机性较强,可能导致网络中出现簇头节点密集或稀疏的情况,从而影响网络性能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)。
# Set initial node energy.if {$opt(eq_energy) == 1} {$node set-energy $opt(init_energy) $opt(thresh_energy)} else {#set E [$rng_ uniform $opt(lower_e) $opt(upper_e)]#set rn [$rng_ uniform 0 1]#if {$rn < 0.1} {# set E 200 #如果节点能量不相等,就将97 19 12 87 8 22 83 55#} else { #34 72节点的能量定义为200,其他节点定义为2# set E 2#}set high_e_nodes [list 97 19 12 87 8 22 83 55 34 72]if {[lsearch $high_e_nodes $id] == -1} {set E 2} else {set E 200}$node set-energy $E $opt(thresh_energy)set initf [open "$opt(dirname)/init.energy" a]puts $initf "$id\t$E"close $initf}} else {# Base station has an infinite amount of energy.$node set-energy 50000 $opt(thresh_energy) #将最终sink节点的能量定义} #为50000,就相当于无穷大。
3、配置节点的信道和跟踪文件:# Connect the node to the channel.$node add-interface $chan $prop $opt(ll) $opt(mac) \ #add-interface定义在ns-ranode.tcl中$opt(ifq) $opt(ifqlen) $opt(netif) $opt(ant) \$topo $inerrProc_ $outerrProc_ $FECProc_# Set up the trace target.set T [new Trace/Generic]$T target [$ns_ set nullAgent_]$T attach $tracefd$T set src_ $id$node log-target $T。
这样节点的定义就定义好了。
而在leach-create-mobile-node函数中普通节点是new MobileNode/ResourceAwareNode,最终sink节点是new MobileNode/ResourceAwareNode $BS_NODE但是普通节点和一般节点它们的区别是什么?在ns-ranode.tcl文件中找到了MobileNode/ResourceAwareNode的定义。
MobileNode/ResourceAwareNode类到底是怎么定义的呢??在ns-ranode.tcl中能看到它的初始化函数定义:MobileNode/ResourceAwareNode instproc init args {global ns_ opt wantslist tracefd$self instvar entry_point_$self instvar rca_agent_ rca_app_ ll_ mac_ ifq_ netif_$self instvar ResourceManager_set bs_node [lindex $args 0] #如果是最终sink就更bs_node赋1、否则赋0eval $self next [lreplace $args 0 0] #这是调用它的父类Node/MobileNode初始化函数,初始化一般移动节点的功能,所以我们定义的节点也含有一般节点的功能# Set up the resource managerset ResourceManager_ [new ResourceManager] #这一行是在节点中增加了$ResourceManager_ Register [new Resource/NeighborResource] #ResourceManager set energy [new Resource/Energy] #Resource/NeighborResource 和$ResourceManager_ Register $energy #Resource/Energy三个模块,实现了对节点能量的管理# Create a new agent and attach it to the node #这也正是最终sink节点和普通节点的区别if {$bs_node == 1} {set agent [new Agent/BSAgent] #最终sink节点的Agent是BSAgent} else {set agent [new Agent/RCAgent] #普通节点是RCAgent}set rca_agent_ $agent# Stick a "receive" trace object between the #接下来的代码有些看不懂先放在这# entry point and the agent. #里,这个暂时不影响程序分析set rcvT [cmu-trace Recv "AGT" $self] #?????$rcvT target $agentset entry_point_ $rcvT# Add a Log Targetset T [new Trace/Generic]$T target [$ns_ set nullAgent_]$T attach $tracefd$T set src_ [$self id]$rca_agent_ log-target $T# Attach an application to the agentset haslist [find_haslist [$self id]] #???if {$bs_node == 1} {set rca [new $opt(bsapp)] #这个也是最终节点和普通节点的区别,它们代理上} else { #的应用不同。
最终节点的应用是Application/BSApp,定义在ns-bsapp.tcl 中set rca [new $opt(rcapp) $opt(mtype) $wantslist $haslist] #opt(rcapp)定义在} #leach.tcl中,为Application/LEACH;opt(mtype)定义在leach.tcl中$ns_ attach-agent $self $agent$rca attach-agent $agentset rca_app_ $rca}从以上分析我们知道了簇头和节点的定义,以及它们的一些区别。
其中我们知道了一般节点的应用为Application/LEACH,最终sink节点的应用为Application/BSApp。
而且它们都是otcl的类。
普通节点是过Application/LEACH来进行选簇的。
也是leach协议的一个重要功能。
说明一下,在leach协议的仿真中每个普通节点的mac层都有leach应用,也就是说每个普通节点都会执行ns-leach.tcl中的一些功能(即函数)。
所以,分析ns-leach.tcl才能够明白leach的具体选簇功能的实现。
在ns-leach.tcl中初始化函数初始化了很多变量,这里不说。
Application/LEACH instproc start {} { #当在otcl类定义一个实例时,start函数会[$self mac] set node_num_ [$self nodeID] #自动执行$self decideClusterHead #决定簇头的函数$self checkAlive #检查节点是否存活的函数}1、选簇函数分析:Application/LEACH instproc decideClusterHead {} {global chan ns_ opt node_$self instvar next_change_time_ round_ clusterNodes_$self instvar now_ TDMAschedule_ beginningE_ alive_$self instvar myADVnum_ CHheard_set CHheard_ 0[$self mac] set CHheard_ $CHheard_ #CHheard_ 、myADVnum_在mac层被绑定的数据set myADVnum_ 0 #在mac-sensor.h中的定义#int CHheard_; // Number of other CH ADVs heard#int myADVnum_; // Position of node's ADV among all ADVs[$self mac] set myADVnum_ $ #具体做用没有分析明白?# 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_] #从网络接口netif中查看当前节点状况if {$alive_ == 1 && $ISalive == 0} { #具体调用过程还不清楚?puts "Node [$self nodeID] is DEAD!!!! Energy = [[$self getER] query]"$chan removeif [[$self node] set netif_(0)] #如果一个当前是存活的(alive=1)但是能set alive_ 0 #量消耗完,就从信道中将它移出set opt(nn_) [expr $opt(nn_) - 1]}if {$alive_ == 0} {return}set now_ [$ns_ now]set nodeID [$self nodeID]set beginningE_ [[$self getER] query] #获取当前节点的能量(自己认为的??)$self setCode 0 #对节点mac层的code_进行设置$self WakeUp #对节点处于空闲和休眠状态进行能量消耗的计算set tot_rounds [expr int([expr $opt(nn_) / $opt(num_clusters)])]if {$round_ >= $tot_rounds} {set round_ 0}if {$opt(eq_energy) == 1} {## Pi(t) = k / (N - k mod(r,N/k))# where k is the expected number of clusters per round# N is the total number of sensor nodes in the network# and r is the number of rounds that have already passed.#set nn $opt(nn_)if {[expr $nn - $opt(num_clusters) * $round_] < 1} {set thresh 1} else {set thresh [expr double($opt(num_clusters)) / \[expr $nn - $opt(num_clusters) * $round_]]# Whenever round_ is 0, all nodes are eligible to be cluster-head.if {$round_ == 0} {$self hasnotbeenClusterHead}}# If node has been cluster-head in this group of rounds, it will not# act as a cluster-head for this round.if {[$self hasbeenClusterHead?]} {set thresh 0}} else {## Pi(t) = Ei(t) / Etotal(t) * k# where k is the expected number of clusters per round,# Ei(t) is the node's current energy, and Etotal(t) is the total# energy from all nodes in the network.#set Etotal 0# Note! In a real network, would need a routing protocol to get this# information. Alternatively, each node could estimate Etotal(t) from # the energy of nodes in its cluster.for {set id 0} {$id < [expr $opt(nn)-1]} {incr id} {set app [$node_($id) set rca_app_]set E [[$app getER] query]set Etotal [expr $Etotal + $E]}set E [[$self getER] query]set thresh [expr double([expr $E * $opt(num_clusters)]) / $Etotal]}puts "THRESH = $thresh" #以上部分为计算thresh的过程。