Я нахожусь в процессе создания беспроводной сенсорной сети с использованием NS2.Узлы распределены случайным образом по плоскости xy, и с помощью вычисления расстояния найдены соседи.Я использую tcl для построения сети, но я открыт для ответов с других языков, так как я чувствую, что могу перевести - большая часть моей проблемы связана с увязанием в циклах.
Ниже приведен мой скрипт, который вычисляетсоседи.Эта часть работает, и я проверил это в симуляторе.Теперь мне нужно взять узлы и кластеризовать их без перекрытия.Например, начиная с узла 0 в качестве заголовка кластера, мы получим вывод, подобный следующему:
Cluster for Node 0 contains:
1
3
8
Оттуда перейдем к следующему узлу, НЕ содержащемуся в нем, так:
Cluster for Node 2 contains:
5
6
7
Здесьэто то, что я до сих порTcl (по крайней мере, я обнаружил) не поддерживает функции bool, поэтому я возился со стратегией bool=1 or 0
.Я также попробовал несколько 2-мерных массивов.Как я уже сказал, я открыт для решений на других языках или просто для общего описания - я запутался в том, что происходит.
Примечание - nd1 и nd2 являются переменными «идентификатора» - они не содержат фактической информации об узле;Я должен был использовать их, чтобы напечатать фактический номер узла.
global cluster
global bool
set bool 0
proc neighbors {n1 n2 nd1 nd2} {
global bool cluster
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<40} {
if {$nd2!=$nd1} {
puts "$nd1 Neighrbor: $nd2"
# Set the clusters
array set cluster {}
for {set i 0} {$i < 20} {incr i} {
set cluster($i) $nd2
parray cluster
}
}
}}
for {set i 0} {$i < $val(nn)} {incr i} {
for {set j 0} {$j < $val(nn)} {incr j} {
$ns at 0.0 "neighbors $node($i) $node($j) $i $j"
}}