LEACH与LEACH-C、LEACH-E、LEACH-ED的仿真与比较

LEACH与LEACH-C、LEACH-E、LEACH-ED的仿真与比较


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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信