Pages: [1]   Go Down
Print
Author Topic: Aiuto prova in itinere  (Read 2660 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Joe
Apprendista Forumista
**
Offline Offline

Posts: 492


« on: 16-03-2010, 11:00:33 »

Qualcuno può aiutarmi a svolgere una prova in itinere? Ecco il testo:

1) Generare in automatico una rete con 20 nodi interconnessi tra loro, ciascuno con 3-4 link verso gli altri. I nodi saranno identificati da un numero random di tipo intero positivo (16 bit).

2) Usando la classe Agent/Message implementare il seguente algoritmo di elezione:
   a) Ogni nodo ha un proprio ID e una variabile IDmax, inizialmente pari al proprio ID.
   b) Ogni nodo manda in broadcast ai propri vicini l'ultimo valore noto per IDmax.
   c) Se un nodo riceve ID maggiore del proprio valore IDmax, lo aggiorna con quello ricevuto e rimanda i messaggi ai       vicini.
   d) Dopo un tempo prefissato il nodo che ha il suo ID coincidente con IDmax viene eletto nodo radice. Il nodo stampa un       messaggio a video.

3) L'algoritmo viene eseguito ad intervalli regolari.

Note:- I link sono bidirezionali con perdita (1% di pacchetti errati).


Ho provato con questo codice (è sintatticamente corretto ma non restituisce nulla):

set IDmax ""

##########################################################################

Class Sender -superclass Agent/Message

Sender instproc sendId {id} {
   global IDmax   
   set IDmax $id   
   $self send $IDmax
}

Sender instproc recvId {id} {
   global IDmax   
   if {$id > $IDmax} {
     set IDmax $id     
     [Simulator info instances] after 0.1 "$self sendId $IDmax"   
   } elseif {$id == $IDmax} {       
       puts "$IDmax è il nodo radice"
     }


#########################################################################

Class Receiver -superclass Agent/Message

Receiver instproc recvId {id} {   
   global IDmax   
   if {$id > $IDmax} {     
     set IDmax $id     
     $self send $IDmax   
   } elseif {$id == $IDmax} {       
       puts "$IDmax è il nodo radice"     
     }
}

##########################################################################

set ns [new Simulator]

set fd [open "/home/joe/Esercizi-NS/Itinere.tr" "w"]
$ns trace-all $fd

proc finish {} {
   global ns fd 
   $ns flush-trace 
   close $fd
   exit 0
}

proc setErrorModel {src dst} {
   global ns
   set em [new ErrorModel]   
   $em set rate_ 0.01   
   $em unit pkt   
   $em ranvar [new RandomVariable/Uniform]   
   $em drop-target [new Agent/Null]   
   $ns lossmodel $em $src $dst   
   $ns lossmodel $em $dst $src
}

proc setAgents {src dst} {
   global ns   
   set snd [new Sender]
   $ns attach-agent $src $snd   
   set rcv [new Receiver]
   $ns attach-agent $dst $rcv
   $ns connect $snd $rcv   
   set id [$src set id]   
   $ns at 1.1 "$snd sendId $id"
}

for {set i 0} {$i < 20} {incr i} {
   set N($i) [$ns node]
   $N($i) set id [expr int([expr 1+rand()*100])]
}

for {set i 0} {$i < 20} {incr i} {
  if {$i == 17} {
     set links 2     
     for {set j 1} {$j <= $links} {incr j} {
       set next [expr $i+$j]
       $ns duplex-link $N($i) $N($next) 5Mb 10ms DropTail
       setErrorModel $N($i) $N($next)
       setAgents $N($i) $N($next)
     }
  } elseif {$i == 18} {
       set links 1
       for {set j 1} {$j <= $links} {incr j} {
           set next [expr $i+$j]
           $ns duplex-link $N($i) $N($next) 5Mb 10ms DropTail
           setErrorModel $N($i) $N($next)
           setAgents $N($i) $N($next)
       }     
    } elseif {$i < 19} {
         set links 3
         for {set j 1} {$j <= $links} {incr j} {
            set next [expr $i+$j]
            $ns duplex-link $N($i) $N($next) 5Mb 10ms DropTail
            setErrorModel $N($i) $N($next)
            setAgents $N($i) $N($next)
         }     
      }
}

$ns at 3.0 "finish"
$ns run



Cosa e come devo correggere? Grazie infinite 
Logged
Pages: [1]   Go Up
Print
Jump to: