2024年3月15日发(作者:)
信息与电脑
2016年第4期
China Computer&Communication
算法语言
LEACH与LEACH-C、LEACH-E、LEACH-ED的
仿真与比较
曹 行
1
张立增
1
底京浩
2
(1.河北农业大学,河北 保定 071001;2.河北工业大学,天津 300401)
摘 要:
笔者详细介绍了簇头的选举是随机的LEACH算法,在选择簇头的过程中,考虑节点的能量消耗情况的
LEACH-E算法,基于网络总的能量消耗最小的优化目标,得出所有节点分簇方案的LEACH-C算法以及进一步考虑到
节点位置的LEACH-ED算法。仿真后,分别从程序层面介绍了这几种算法的不同之处,分析了基站位置的对LEACH、
LEACH-C、LEACH-E以及LEACH-ED的影响。
关键词:
LEACH;LEACH-C;LEACH-E;LEACH-ED;仿真
中图分类
号:TP212.9 文献标识码:A 文章编号:1003-9767(2016)04-091-03
1 按步骤描述LEACH协议仿真过程
1.3 仿真结束后,提取数据
LEACH算法的基本思想:每一轮节点都在[0,1]之
awk-f >alive/#提取出存活节点数目
间选取一个随机数,设定一个阈值,当节点的随机数小于阈
的信息
值时,节点被选举为簇首。由于簇首负责信息的收集与交换,
awk-f >data/#提取出数据包的信息
所以簇首的能量消耗过快,每一轮都会选取新的簇首,从而
>energy/#提取出节点能量
达到能量消耗相对均匀。最终降低网络能源消耗、提高网络
的信息
整体生存时间。
1.4 根据提取出的数据作图
1.1 安装LEACH协议
gnuplot /#开始绘图
将LEACH协议压缩包的文件直接覆盖并替换ns-2.35
set terminal gif /#设置类型为gif
里面的文件。
set output"" /#输出图像名称为alive
1.2 改变环境变量gedit ~/.bashrc
set xlabel"time(sec)" /#设置横坐标为时间
编辑环境变量后保存,关闭终端,重新打开后在终端执
set ylabel"alive node" /#设置纵坐标为存活节点数
行操作如下:
plot'alive'with linespoints /#将点连成线
;让环境变量起效,
q /#退出
make clean,make;然后进行编译。
此时已生成"剩余存活节点"、"运行时间"、"能量"
运行位于ns-2.35目录下的仿真脚本:
的图片。
(1)cd ~/ns-allinone-2.35/ns-2.35/
2 分析基站位置对LEACH、LEACH-C、LEACH-E与
./test
LEACH-ED这四种协议仿真结果的不同影响
(2)测试leach_test脚本
2.1 当基站的位置位于(50,175)
cd ~/ns-allinone-2.35/ns-2.35/
存活节点数如图1所示:
./leach_test
分析图1得到的结论如下:LEACH-ED的生存时间最长,
分别运行这8个脚本:
LEACH与LEACH-E的生存时间相近,LEACH-C的网络生
leach_test,leach_test2,leach_c_test,leach_c2_test,
存时间最短。但是改进算法LEACH-E结合能量消耗情况选
leach_e_test,leach_e2_test,leach_ed_test,leach_ed2_test。
择簇头时,尽量选择剩余能量多的节点充当簇头,这样能进
对应leach、leach-c、leach-e、leach-ed这四个协议的仿
一步延长网络生存周期。
真脚本,8个仿真脚本生成的路径在mit/leach_sims目录下面。
数据量发送量如图2所示:
leach_sims/leach目录下生成一系列文
分析图2得到的结论如下:从仿真结果来看,LEACH-E
件,直到不再生成文件,说明仿真过程结束。
传输的数据包最多,LEACH-C传输的数据包次之,紧接着
作者简介:
曹行(1995-),男,河北石家庄人,本科在读。研究方向:物联网工程。
张立增(1994-),男,河北邢台人,本科在读。研究方向:电子信息科学与技术。
底京浩(1993-),男,河北石家庄人,本科在读。研究方向:电子科学与技术。
— 91 —
算法语言
信息与电脑
China Computer&Communication
2016年第4期
图1 存活节点数
(LEACH与LEACH2)
图2 数据发送量
是LEACH,LEACH-ED传输的数据包最少。
节点总消耗的能量如图3所示:
(LEACH-C与LEACH-C2)
图3 节点总消耗的能量
分析图3得到的结论如下:从仿真结果来看,LEACH-
ED传输剩余能量经历的时间最长,LEACH与LEACH-E的
时间次之,LEACH-C经历的时间最短,消耗的最快。
2.2 当基站的位置位于(0,0)
四种协议输出存活节点数对比如图4所示:
(LEACH-E与LEACH-E2)
— 92 —
信息与电脑
2016年第4期
China Computer&Communication
算法语言
Application/LEACH instproc setClusterHead {}
$self instvar isch_ hasbeench_
set isch_ 1
set hasbeench_ 1
return
解除簇头(簇重组时运行此程序):
Application/LEACH instproc unsetClusterHead {} {
$self instvar isch_
set isch_ 0
return
(3)设定阈值与随机数
if {[$self getRandomNumber 0 1] < $thresh}{
puts "$nodeID:
puts "$nodeID: Is a cluster head at time [$ns_ now]"
(LEACH-ED与LEACH-ED2)
$self setClusterHead
图4 LEACH-ED与LEACH-ED2输出存活节点数
set random_access [$self getRandomNumber 0 $opt(ra_
从仿真结果来看,将基站放到(0,0)后,LEACH协
adv)]
议、LEACH-C协议、LEACH-E协议节点存活的时间延长。
3.2 LEACH-E
与LEACH协议不同,LEACH-E在选择簇头的过程中,
而LEACH-ED协议的生存节点数受到了抑制,这是因为
还考虑节点的能量消耗情况。若节点剩余能量大于网络总的
LEACH-ED算法进一步考虑到节点的位置,当基站位置位于
平均能量,就可以当选为簇头,从而使能耗分布更加均匀,
网络的质心位置时,之前没有充当过簇头的节点更易充当,
避免节点过早死亡,从而延长节点寿命。
所以使得能量消耗过多,生存节点数下降。
其不同之处在于:
当基站位于(50,175)时,LEACH协议优于
set Etotal 0
LEACH-C协议。当基站位于(0,0)时,LEACH-C协议优
for {set id 0} {$id < [expr $opt(nn)-1]} {incr id} {
于LEACH协议。可以看出LEACH-C协议对LEACH的改
set app [$node_($id) set rca_app_]
进有限,基站位置对仿真结果影响比较大。
set E [[$app getER] query] /#计算网络中每个节点的能量
当基站在不同位置时,对LEACH-E协议的仿真结果影
set Etotal [expr $Etotal + $E] /#求剩余能量之和
响不大,而对LEACH、LEACH-C这两个协议影响较大。说
set aveE [expr $Etotal / $opt(nn)]
明LEACH-E协议的改进之后基站位置的改变对它影响不大,
set E [[$self getER] query] /#求网络中的平均能量
改进程度很好。
if {[$self getRandomNumber 0 1] < $thresh
&& $E >= $aveE}
3 从代码层面分析LEACH与LEACH-E协议簇头选
在接受数据时,也有不同之处:
取方面的原理不同点
Receiving Functions
3.1 LEACH
# if {$msg_type == $ADV_CH && ![$self
LEACH采用了轮的概念,在每一轮中采用随机的方式
isClusterHead?]} {
为每个簇选择簇头节点,然后由簇内节点收集信息,并汇聚
$self recvADV_CH $msg /#宣布本节点采集数据的描述
到簇首,最后再由簇首节点直接发往基站节点BS。
信息
(1)首先判断节点是否为簇头,程序如下:
} elseif {$msg_type == $JOIN_REQ &&
Application/LEACH instproc isClusterHead? {}
$nodeID == $chID} {$self recvJOIN_REQ $msg /#请求希望
$self instvar isch_
接受的数据
return $isch_
} elseif {$msg_type == $ADV_SCH && $chID
当节点已为簇头时:
== $currentCH_} {
Application/LEACH instproc hasbeenClusterHead? {}
$self recvADV_SCH $msg
$self instvar hasbeench_
} elseif {$msg_type == $DATA && $nodeID ==
return $hasbeench_
$chID} {
当节点不是簇头时:
$self recvDATA $msg /#接受数据包
Application/LEACH instproc hasnotbeenClusterHead {} {
$self instvar hasbeench_
4 结 语
set hasbeench_ 0
本文详细介绍了LEACH协议仿真步骤,分析了基站位
(2)当确定节点是否为簇头后,设定簇头状态:
置对LEACH、LEACH-C、LEACH-E协议仿真结果的不同
设定簇头:
影响,并从代码层面分析LEACH、LEACH-C、LEACH-E
协议簇头选取方面的原理不同点。
— 93 —
发布者:admin,转转请注明出处:http://www.yc00.com/news/1710474663a1763071.html
评论列表(0条)