2017-06-21 5 views
1

以下のコードはNS2で2つのノード間の距離を計算し、リスト "nbr"に入れます。そのリストを値 "d"のように昇順に並べ替えて、それをさらに使用するためにリストに格納したいのですが、それはlsortコマンドを使用しましたが、同じリストを私に与えています。 助けてくださいtclのリストをソートすることができません

コード:。

proc distance { n1 n2 nd1 nd2} { 
    set x1 [expr int([$n1 set X_])] 
    set y1 [expr int([$n1 set Y_])] 
    set x2 [expr int([$n2 set X_])] 
    set y2 [expr int([$n2 set Y_])] 
    set d [expr int(sqrt(pow(($x2-$x1),2)+pow(($y2-$y1),2)))] 
    if {$d<300} { 
     if {$nd2!=$nd1 && $nd2 == 11} { 
      set nbr "{$nd1 $nd2 $x1 $y1 $d}" 
      set m [lsort -increasing -index 4 $nbr] 
      puts $m 
     } 
    } 
} 

for {set i 1} {$i < $val(nn)} {incr i} { 
    for {set j 1} {$j < $val(nn)} {incr j} { 
     $ns at 5.5 "distance $node_($i) $node_($j) $i $j" 
    } 
} 

出力:

{1 11 305 455 273} 
{4 11 308 386 208} 
{5 11 378 426 274} 
{7 11 403 377 249} 
{8 11 244 405 215} 
{9 11 256 343 154} 
{10 11 342 328 172} 
{12 11 319 192 81} 
{13 11 395 196 157} 
{14 11 469 191 231} 
{15 11 443 140 211} 
{16 11 363 115 145} 
{17 11 290 135 75} 
{18 11 234 121 69} 
{19 11 263 60 132} 
{20 11 347 60 169} 

答えて

1

今、あなたは個別に各距離を計算しているが、実際にソートすることができ、リストにそれらのすべてを収集していません。

のは、最初のdistanceだけの距離計算そのものを行うに書き換えることで、この問題を修正しましょう:次に

proc distance {n1 n2 nd1 nd2} { 
    set x1 [expr int([$n1 set X_])] 
    set y1 [expr int([$n1 set Y_])] 
    set x2 [expr int([$n2 set X_])] 
    set y2 [expr int([$n2 set Y_])] 

    set d [expr int(sqrt(pow(($x2-$x1),2)+pow(($y2-$y1),2)))] 
    # Why not: set d [expr hypot($x2-$x1,$y2-$y1)] 

    # I'm keeping *everything* we know at this point 
    return [list $nd1 $nd2 $n1 $n2 $d $x1 $y1 $x2 $y2] 
} 

、我々は(シミュレータがそれを呼び出す時)をコレクション全体を処理する別の手順を必要としませんソート。その情報をまとめたので、個々のレコードを取得するにはdistanceに電話します。

proc processDistances {count threshold {filter ""}} { 
    global node_ 
    set distances {} 
    for {set i 1} {$i < $count} {incr i} { 
     for {set j 1} {$j < $count} {incr j} { 
      # Skip self comparisons 
      if {$i == $j} continue 

      # Apply target filter 
      if {$filter ne "" && $j != $filter} continue 

      # Get the distance information 
      set thisDistance [distance $node_($i) $node_($j) $i $j] 

      # Check that the nodes are close enough 
      if {[lindex $thisDistance 4] < $threshold} { 
       lappend distances $thisDistance 
      } 
     } 
    } 

    # Sort the pairs, by distances 
    set distances [lsort -real -increasing -index 4 $distances] 

    # Print the sorted list 
    foreach tuple $distances { 
     puts "{$tuple}" 
    } 
} 

その後、我々は適切なタイミングで呼び出されるその全体の手順を手配:

# We recommend building callbacks using [list], not double quotes 
$ns at 5.5 [list processDistances $val(nn) 300 11] 
+0

はhelp.Iのためにあなたをとても感謝1以上question.Iがプロシージャの外に、このソートされたリストにアクセスしたいしています私は '$ ledex $ sortedfile 0 2] a''lassignを" $ sortedfile "の代わりに呼び出さなければなりません。 –

+0

私は距離ファイルを使用しようとしました。私は 'set distance 'の後にもう一つの変数を作成しました。それをグローバルにして、その変数に距離ファイルを割り当てました。しかし、そのファイルをプロシージャのエラーの外で使うと、' file "を読むことができません。 –

関連する問題