algo-route-proto.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:4k
源码类别:

通讯编程

开发平台:

Visual C++

  1. Class Agent/rtProto/Algorithmic -superclass Agent/rtProto
  2. #Agent/rtProto/Algorithmic proc pre-init-all args {
  3. #    [Simulator instance] set routingTable_ [new RouteLogic/Algorithmic]
  4. #}
  5. Agent/rtProto/Algorithmic proc init-all args {
  6.     [Simulator instance] compute-algo-routes
  7. }
  8. Agent/rtProto/Algorithmic proc compute-all {} {
  9.     [Simulator instance] compute-algo-routes
  10. }
  11. RouteLogic/Algorithmic instproc BFS {} {
  12.     $self instvar ns_ children_ root_ rank_
  13.     set ns_ [Simulator instance]
  14.     if {[$ns_ info class] == "Simulator"} {
  15. $ns_ instvar link_
  16. foreach ln [array names link_] {
  17.     set L [split $ln :]
  18.     set srcID [lindex $L 0]
  19.     set dstID [lindex $L 1]
  20.     if ![info exist adj($srcID)] {
  21. set adj($srcID) ""
  22.     }
  23.     if ![info exist adj($dstID)] {
  24. set adj($dstID) ""
  25.     }
  26.     if {[lsearch $adj($srcID) $dstID] < 0} {
  27. lappend adj($srcID) $dstID
  28.     }
  29.     if {[lsearch $adj($dstID) $srcID] < 0} {
  30. lappend adj($dstID) $srcID
  31.     }
  32. }
  33.     } elseif {[$ns_ info class] == "SessionSim"} {
  34. $ns_ instvar delay_
  35. foreach ln [array names delay_] {
  36.     set L [split $ln :]
  37.     set srcID [lindex $L 0]
  38.     set dstID [lindex $L 1]
  39.     if ![info exist adj($srcID)] {
  40. set adj($srcID) ""
  41.     }
  42.     if ![info exist adj($dstID)] {
  43. set adj($dstID) ""
  44.     }
  45.     if {[lsearch $adj($srcID) $dstID] < 0} {
  46. lappend adj($srcID) $dstID
  47.     }
  48.     if {[lsearch $adj($dstID) $srcID] < 0} {
  49. lappend adj($dstID) $srcID
  50.     }
  51. }
  52.     }
  53. #    foreach index [array names adj] {
  54. # puts "$index: $adj($index)"
  55. #    }
  56.     set rank_ 0
  57.     set root_ 0
  58.     set traversed($root_) 1
  59.     set queue "$root_"
  60.     while {[llength $queue] > 0} {
  61. # puts "queue: $queue, queue-length: [llength $queue]"
  62. set parent [lindex $queue 0]
  63. set queue [lreplace $queue 0 0]
  64. # puts "parent: $parent, queue: $queue, queue-length: [llength $queue]"
  65. if ![info exist children_($parent)] {
  66.     set children_($parent) ""
  67. }
  68. # puts "adj: $adj($parent)"
  69. foreach nd $adj($parent) {
  70.     if ![info exist traversed($nd)] {
  71. set traversed($nd) 0
  72.     }
  73.     if !$traversed($nd) {
  74. set traversed($nd) 1
  75. lappend children_($parent) $nd
  76. lappend queue $nd
  77.     }
  78. }
  79. set num_children [llength $children_($parent)]
  80. if {$rank_ < $num_children} {
  81.     set rank_ $num_children
  82. }
  83. # puts "rank: $rank_, queue: $queue, queue-length: [llength $queue]"
  84.     }
  85. }
  86. RouteLogic/Algorithmic instproc compute {} {
  87.     $self instvar root_ children_ rank_ id_ algoAdd_
  88.     # set queue "$root_"
  89.     # while {[llength $queue] > 0} {
  90. # set parent [lindex $queue 0]
  91. # set queue [lreplace $queue 0 0]
  92. # puts "$parent: $children_($parent)"
  93. # foreach child $children_($parent) {
  94.     # lappend queue $child
  95. # }
  96.     # }
  97.     set queue [list [list $root_ 0]]
  98.     while {[llength $queue] > 0} {
  99. # puts $queue
  100. set parent [lindex $queue 0]
  101. set queue [lreplace $queue 0 0]
  102. set id [lindex $parent 0]
  103. set algoAdd [lindex $parent 1]
  104. set id_($algoAdd) $id
  105. set algoAdd_($id) $algoAdd
  106. set i 0
  107. foreach child $children_($id) {
  108.     incr i
  109.     lappend queue [list $child [expr [expr $algoAdd * $rank_] + $i]]
  110. }
  111.     }
  112. }
  113. RouteLogic/Algorithmic instproc lookup {src dst} {
  114.     $self instvar id_ algoAdd_
  115.     set algosrc $algoAdd_($src)
  116.     set algodst $algoAdd_($dst)
  117.     set algonxt [$self algo-lookup $algosrc $algodst]
  118. #    puts "lookup: $algosrc $algodst $algonxt $id_($algonxt)"
  119.     return $id_($algonxt)
  120. }
  121. RouteLogic/Algorithmic instproc algo-lookup {src dst} {
  122.     $self instvar rank_
  123.     if {$src == $dst} {
  124. return $src
  125.     }
  126.     set a $src
  127.     set b $dst
  128.     set offset 0
  129.     
  130.     while {$b > $a} {
  131. set offset [expr $b % $rank_]
  132. set b [expr $b / $rank_]
  133. if {$offset == 0} {
  134.     set offset $rank_
  135.     set b [expr $b - 1]
  136. }
  137.     }
  138.     if {$b == $a} {
  139. return [expr [expr $a * $rank_] + $offset]
  140.     } else {
  141. return [expr [expr $a - 1] / $rank_]
  142.     }
  143. }