Leach算法分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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脚本)、 source

tcl/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、否则赋0

eval $self next [lreplace $args 0 0] #这是调用它的父类Node/MobileNode初始化函数,初始化一般移动节点的功能,所以我们定义的节点也含有一般节点的功能

# Set up the resource manager

set 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 $agent

set entry_point_ $rcvT

# Add a Log Target

相关文档
最新文档