ns-leach.tcl 分析2

原创 2012年03月24日 14:36:53

在start中调用下面这个方法。

Application/LEACH instproc decideClusterHead {} {

  global ns_ chan opt node_

  $self instvar alive_ TDMAschedule_
  $self instvar begin_idle_ begin_sleep_

  # 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_]
  if {$alive_ == 1} {
    if {$ISalive == 0} {
      puts "Node [$self nodeID] is DEAD!!!!"
      $chan removeif [[$self node] set netif_(0)]
      set alive_ 0
      set opt(nn_) [expr $opt(nn_) - 1]

  set ISalive [[[$self node] set netif_(0)] set alive_] #从网络接口netif中查看当前节点状 况

如果节点存活,但是节点能量耗光,则$chan removeif [[$self node] set netif_(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] 
  }

上面是对thresh的计算,当(N - k mod(r,N/k))<1,则将thresh设置为1,否则节点thresh=k / (N - k mod(r,N/k))

每个节点在一个1/p中都要成为簇头节点一次。p=簇头节点占所有节点的比例,在r=0的时候每个节点都有机会吃呢更为簇头节点。如果节点成为过簇头节点则thresh=0,则这个节点在1/p轮后才可以成为簇头节点。

  if {[$self getRandomNumber 0 1] < $thresh} {
    puts "$nodeID: *******************************************"
    puts "$nodeID: Is a cluster head at time [$ns_ now]"
    $self setClusterHead
    set random_access [$self getRandomNumber 0 $opt(ra_adv)]     #opt(ra_adv) in leach.tcl
    
    $ns_ at [expr $now_ + $random_access] "$self advertiseClusterHead"
  } else {
    puts "$nodeID: *******************************************"
    $self unsetClusterHead
  }

如果thresh>getRandomNumber,则节点成为簇头节点。然后调用advertiseClusterHead方法。

set next_change_time_ [expr $now_ + $opt(ch_change)] 
  $ns_ at $next_change_time_ "$self decideClusterHead"
  $ns_ at [expr $now_ + $opt(ra_adv_total)] "$self findBestCluster"

当节点成为簇头节点,则节点调用  advertiseClusterHead方法。


  set chID [$self nodeID]
  set currentCH_ $chID
  pp "Cluster Head $currentCH_ broadcasting ADV at time [$ns_ now]"
  set mac_dst $MAC_BROADCAST
  set link_dst $LINK_BROADCAST
  set msg [list $currentCH_]
  set datasize [expr $BYTES_ID * [llength $msg]]


  # Send beacons opt(max_dist) meters so all nodes can hear.
  $self send $mac_dst $link_dst $ADV_CH $msg $datasize $opt(max_dist) $code_

将该节点设置为簇头节点,设置当前节点所处的簇号。然后发送数据,广播该节点为簇头信息到全局网络。

$ns_ at [expr $now_ + $opt(ra_adv_total)] "$self findBestCluster"调用findBestCluster方法。

ns-leach.tcl 分析1

由leach 分析3可知,一般节点的应用为Application/LEACH。则现在就是如何选择簇头节点和设置门槛值。 我们接下来分析leach 分析4中红色的方法。在leach 分析3中创建一个A...
  • chenkai619
  • chenkai619
  • 2012年03月22日 11:52
  • 1098

ns-leach.tcl 分析3

当簇头发出了一个ADV类型的包时,其他的节点会接收这个包,并会将发送这个包的簇头的节点号按顺序先后记录在clusterChoices_中,还会计算每个簇头到接收节点的距离并记录在clusterDist...
  • chenkai619
  • chenkai619
  • 2012年03月24日 17:04
  • 1068

ns-leach.tcl

leach的仿真部分,有bug,每个节点所带能量2J,100个节点,最后能量大于200J,需要修改ns-leach.tcl部分, 183行: 655行: 修改之后总能量不会超过200J,不过怎么看...
  • tianshide851049708
  • tianshide851049708
  • 2014年03月12日 19:45
  • 676

Chi-squared test(卡方检验/χ2检验)

1. Chi-squared test(卡方检验/χ2检验) 1.1 概念 χ2检验是对分类数据的频数进行分析的统计方法。(统计学第六版 中国人女大学出版社 P216) 卡方检验是用途非常广的一种假设...
  • liuwei063608
  • liuwei063608
  • 2017年06月16日 18:33
  • 791

寒战2II 观后感

在看电影的时候我一直提示自己,把香港电影的野心设置成匹敌好莱坞的视野,用这样的视角来看画面、表演和情节。 结果寒战2这个电影超出我的预设,人家建立在一个完全坦然,虽然有一点说教但是十分让人佩服的角度。...
  • charliefromkansas
  • charliefromkansas
  • 2016年07月10日 13:24
  • 989

Apache源代码全景分析第二卷——体系结构和核心模块 目录

目前Apache源代码全景分析第二卷——体系结构和核心模块已经算是基本完成了,只剩余少量后续工作,现在把第二卷的目录先放出来。书上市的时间估计是 明年三月中旬。 第1章  Web服务器概述.. 11....
  • tingya
  • tingya
  • 2008年12月30日 17:31
  • 6928

扩增子分析QIIME2. 3粪便菌群移植FMT分析实战

声明:本文为QIIME2官方帮助文档的中文版,由中科院遗传发育所刘永鑫博士翻译并亲测有效,文档翻译己获QIIME2团队官方授权。由于QIIME2更新频繁,如使用中遇到问题请访问QIIME2官方论坛阅读...
  • woodcorpse
  • woodcorpse
  • 2017年07月26日 14:51
  • 617

软件工程导论第三章作业3.4

分析习题2第3题所述的机票预订系统。试用实体-联系图描绘本系统中的数据对象并用数据流图描绘本系统的功能...
  • TYPYDEF
  • TYPYDEF
  • 2017年10月08日 23:03
  • 257

流量的秘密—Google Analytics网站分析与优化技巧(第2版)

本文转自蓝鲸的网站分析笔记 文章地址http://bluewhale.cc/2012-05-07/advanced-web-metrics-with-google-analytics-2...
  • weixxrp
  • weixxrp
  • 2012年09月12日 15:59
  • 409

《用例分析技术》第2版学习(一)

《用例分析技术》介绍    用例技术通过用例。执行者和用例以及用例之间的关系来描绘系统外在可见的需求情况,它是用户和开发者共同剖析系统功能需求的起点。随着用例作为UML的一种重要表示法,用例分析开始在...
  • misaiya
  • misaiya
  • 2004年09月27日 13:33
  • 1363
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ns-leach.tcl 分析2
举报原因:
原因补充:

(最多只允许输入30个字)