ns自带setdest 函 数只能针对所有节点设置移动速度。如果我想让其中的10个节点移动速度较快,而另外40个节点较慢,自带的setdest就无能为力了。
为 了克服这个问题,自己写了个setdest。贴上来大家一起讨论。
# ======================================================================
# default value
# ======================================================================
set opt(nn) 50 ;# number of normal nodes
set opt(fn) 0 ;# number of fast nodes
set opt(ns1) 1.0 ;# min speed of normal nodes
set opt(ns2 ) 3.0 ;# max speed of normal nodes
set opt(fs1) 20.0 ;# min speed of fast nodes
set opt(fs2) 30.0 ;# max speed of fast nodes
set opt(t) 300.0 ;# simulation time
set opt(x) 1000.0 ;# x dimension of space
set opt(y) 1000.0 ;# y dimension of space
set opt(seed) 1.0 ;# seed for random
# ======================================================================
proc getopt {argc argv} { ;# get cmd line opt
global opt
for {set i 0} {$i < $argc} {incr i} {
set arg [lindex $argv $i]
if {[string range $arg 0 0] != "-"} continue
set name [string range $arg 1 end]
set opt($name) [lindex $argv [expr $i+1]]
}
}
proc distance {x1 y1 x2 y2} {
global d
set x1 [expr $x1 - $x2 ]
set x1 [expr pow($x1, 2) ]
set y1 [expr $y1 - $y2 ]
set y1 [expr pow($y1, 2) ]
set x1 [expr $x1 + $x2 ]
set x1 [expr pow($x1, 0.5) ]
set d $x1
}
# ======================================================================
getopt $argc $argv
puts "#/n# normal nodes: $opt(nn), fast nodes: $opt(fn), speed: $opt(ns1)~$opt(ns2), fast speed: $opt(fs1)~$opt(fs2), time: $opt(t), x: $opt(x) y: $opt(y), seed:$opt(seed) /n#"
set rng [new RNG]
$rng seed $opt(seed)
set u [new RandomVariable/Uniform]
# 产生普通节点
for {set i 0} {$i < $opt(nn) } {incr i} {
$u set min_ 0.000001
$u set max_ $opt(x)
$u use-rng $rng
set x [$u value] ;# x coordinate of node
$u set min_ 0.000001
$u set max_ $opt(y)
$u use-rng $rng
set y [$u value] ;# y coordinate of node
puts [format "/$node_(%d) set X_ %f" $i $x ]
puts [format "/$node_(%d) set Y_ %f" $i $y ]
puts [format "/$node_(%d) set Z_ 0.000000" $i ]
set t 0.0
while { $t < $opt(t) } {
$u set min_ 0.000001
$u set max_ $opt(x)
$u use-rng $rng
set xd [$u value] ;# x coordinate of node
$u set min_ 0.000001
$u set max_ $opt(y)
$u use-rng $rng
set yd [$u value] ;# y coordinate of node
$u set min_ [expr $opt(ns1) + 0.000001 ]
$u set max_ $opt(ns2)
$u use-rng $rng
set s [$u value] ;# speed of node
puts [format "/$ns_ at %f /"/$node_(%d) setdest %f %f %f/"" $t $i $xd $yd $s ]
distance $x $y $xd $yd
global d
set t [expr $t + $d/$s]
}
}
# 产生快速节点
for {set i $opt(nn)} {$i < [ expr $opt(nn) + $opt(fn) ] } {incr i} {
$u set min_ 0.000001
$u set max_ $opt(x)
$u use-rng $rng
set x [$u value] ;# x coordinate of node
$u set min_ 0.000001
$u set max_ $opt(y)
$u use-rng $rng
set y [$u value] ;# y coordinate of node
puts [format "/$node_(%d) set X_ %f" $i $x ]
puts [format "/$node_(%d) set Y_ %f" $i $y ]
puts [format "/$node_(%d) set Z_ 0.000000" $i ]
puts [format "/$node_(%d) set nodeType_ 1" $i ]
set t 0.0
while { $t < $opt(t) } {
$u set min_ 0.000001
$u set max_ $opt(x)
$u use-rng $rng
set xd [$u value] ;# x coordinate of node
$u set min_ 0.000001
$u set max_ $opt(y)
$u use-rng $rng
set yd [$u value] ;# y coordinate of node
$u set min_ [expr $opt(fs1) + 0.000001 ]
$u set max_ $opt(fs2)
$u use-rng $rng
set s [$u value] ;# speed of node
puts [format "/$ns_ at %f /"/$node_(%d) setdest %f %f %f/"" $t $i $xd $yd $s ]
distance $x $y $xd $yd
global d
set t [expr $t + $d/$s]
}
}
下 面是我习惯使用 的批量产生场景的脚 本:
#!/bin/sh
#====================================================================================
i=0;
while [ $i -le 15 ]
do
j=`expr 50 - $i`
echo generating secen $i/15
ns my-setdest.tcl -nn $j -fn $i -ns1 1 -ns2 3 -fs1 20 -fs2 30 -t 300 -x 1000 -y 1000 > scene-${j}n-${i}f-300t-1000-1000
i=`expr $i + 1`
done
转自:http://blog.baisi.net/?110511/viewspace-1261