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脚本)、 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