komentarze
This commit is contained in:
parent
46dc61e655
commit
93066b3398
@ -149,21 +149,31 @@ fiber create $liczbaWierz {
|
||||
wyslij 0 $id;
|
||||
fiber yield;
|
||||
while {$run} {
|
||||
if {$kom(1)!=""} {
|
||||
set x $kom(1);
|
||||
if {$lider==1} {
|
||||
|
||||
} elseif {$x>$id} {
|
||||
wyslij 0 $x;
|
||||
} elseif {$x==0} {
|
||||
wyslij 0 $x;
|
||||
set lider 0; # nie jest liderem
|
||||
} elseif {$x==$id} { # tutaj ustawiam lidera
|
||||
set lider 1;
|
||||
wyslij 0 0;
|
||||
} elseif {$x < $id} {
|
||||
|
||||
#jesli mamy komunikat
|
||||
if {$kom(1)!=""} {
|
||||
set x $kom(1);
|
||||
|
||||
}
|
||||
if {$lider==1} {
|
||||
#jest juz liderem
|
||||
|
||||
} elseif {$x>$id} {
|
||||
#przesylam wartosc dalej
|
||||
wyslij 0 $x;
|
||||
|
||||
} elseif {$x==0} {
|
||||
#nie jest liderem
|
||||
wyslij 0 $x;
|
||||
set lider 0;
|
||||
|
||||
} elseif {$x==$id} {
|
||||
#jest liderem
|
||||
set lider 1;
|
||||
wyslij 0 0;
|
||||
|
||||
} elseif {$x < $id} {
|
||||
|
||||
}
|
||||
}
|
||||
fiber yield;
|
||||
}
|
||||
@ -234,32 +244,44 @@ set sasiedzi(0) {4 1}
|
||||
set sasiedzi(1) {0 2}
|
||||
set sasiedzi(2) {1 3}
|
||||
set sasiedzi(3) {2 4}
|
||||
|
||||
set sasiedzi(4) {3 0}
|
||||
|
||||
fiber create $liczbaWierz {
|
||||
|
||||
set lider ?;
|
||||
wyslij 0 $id; # wysyłam w jedną stronę
|
||||
wyslij 1 $id; # wysyłam w drugą stronę
|
||||
|
||||
# wysyłam w jedną stronę
|
||||
wyslij 0 $id;
|
||||
|
||||
# wysyłam w drugą stronę
|
||||
wyslij 1 $id;
|
||||
|
||||
fiber yield;
|
||||
|
||||
while {$run} {
|
||||
|
||||
if {$kom(0)!="" && $kom(1)!=""} {
|
||||
#jesli obydwa komunikaty nie są puste
|
||||
set x ?;
|
||||
if {$kom(0) > $kom(1)} { # warunek 1
|
||||
|
||||
if {$kom(0) > $kom(1)} {
|
||||
#komunikat 1 jest wiekszy od drugiego
|
||||
set x $kom(0);
|
||||
|
||||
if {$lider==1} {
|
||||
#jest juz lider
|
||||
|
||||
} elseif {$x==0} {
|
||||
#nie jest liderem
|
||||
wyslij 1 0;
|
||||
set lider 0;
|
||||
|
||||
} elseif {$x>$id} {
|
||||
#przeslij dalej
|
||||
wyslij 1 $x;
|
||||
|
||||
} elseif {$x==$id} { #lider
|
||||
} elseif {$x==$id} {
|
||||
#jest liderem
|
||||
set lider 1;
|
||||
wyslij 0 0;
|
||||
wyslij 1 0;
|
||||
@ -270,20 +292,25 @@ fiber create $liczbaWierz {
|
||||
|
||||
fiber yield;
|
||||
|
||||
} else { # warunek przeciwny
|
||||
|
||||
} else {
|
||||
#jesli komunikat 2 jest wiekszy od pierwszego
|
||||
set x $kom(1);
|
||||
|
||||
if {$lider==1} {
|
||||
#jest juz lider
|
||||
|
||||
} elseif {$x==0} {
|
||||
#nie jest liderem
|
||||
wyslij 0 $x;
|
||||
set lider 0;
|
||||
|
||||
} elseif {$x>$id} {
|
||||
#przeslij dalej
|
||||
wyslij 0 $x;
|
||||
|
||||
} elseif {$x==$id} {
|
||||
set lider 1; # lider
|
||||
#jest liderem
|
||||
set lider 1;
|
||||
wyslij 0 0;
|
||||
wyslij 1 0;
|
||||
|
||||
@ -293,20 +320,25 @@ fiber create $liczbaWierz {
|
||||
fiber yield;
|
||||
}
|
||||
|
||||
} elseif {$kom(0)!=""} { # następny warunek
|
||||
|
||||
} elseif {$kom(0)!=""} {
|
||||
#jesli tylko komunikat pierwszy nie jest pusty
|
||||
set x $kom(0);
|
||||
|
||||
if {$lider==1} {
|
||||
#jest juz lider
|
||||
|
||||
} elseif {$x==0} {
|
||||
#nie jest liderem
|
||||
wyslij 1 0;
|
||||
set lider 0;
|
||||
|
||||
} elseif {$x>$id} {
|
||||
#przeslij dalej
|
||||
wyslij 1 $x;
|
||||
|
||||
} elseif {$x==$id} {
|
||||
set lider 1; # lider
|
||||
#jest liderem
|
||||
set lider 1;
|
||||
wyslij 0 0;
|
||||
wyslij 1 0;
|
||||
|
||||
@ -315,18 +347,24 @@ fiber create $liczbaWierz {
|
||||
}
|
||||
fiber yield;
|
||||
|
||||
} else { # ostatni warunek
|
||||
} else {
|
||||
#w przeciwnym wypadku
|
||||
set x $kom(1);
|
||||
|
||||
if {$lider==1} {
|
||||
#jest juz lider
|
||||
|
||||
} elseif {$x==0} {
|
||||
#nie jest liderem
|
||||
wyslij 0 $x;
|
||||
set lider 0;
|
||||
|
||||
} elseif {$x>$id} {
|
||||
#przeslij dalej
|
||||
wyslij 0 $x;
|
||||
|
||||
} elseif {$x==$id} {
|
||||
#jest liderem
|
||||
set lider 1;
|
||||
wyslij 0 0;
|
||||
wyslij 1 0;
|
||||
@ -562,43 +600,57 @@ fiber create $liczbaWierz {
|
||||
#zmienne
|
||||
set new 0
|
||||
set wielkosc 50
|
||||
|
||||
#tworze kolory
|
||||
set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]]
|
||||
set kolor_drugi 0
|
||||
|
||||
set b 0
|
||||
set por 0
|
||||
set c 0
|
||||
|
||||
#wyslij kolor pierwszy do lisci
|
||||
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
||||
fiber yield;
|
||||
|
||||
#główna pętla
|
||||
while {$run} {
|
||||
#warunek 1
|
||||
if {$kom(0)!=""} {
|
||||
#komunikat pierwszy nie jest pusty
|
||||
|
||||
#ustawiam jako kolor drugi i porównuję z pierwszym
|
||||
set kolor_drugi $kom(0)
|
||||
set por [porownanieC $kolor_pierwszy $kolor_drugi]
|
||||
|
||||
#wynik porównania
|
||||
set c [lindex $por 1]
|
||||
set b [lindex $por 0]
|
||||
|
||||
#ustawiam nowy kolor
|
||||
set nowy [wyrownaj $wielkosc "[bity $b]$c"]
|
||||
set kolor_pierwszy $nowy
|
||||
|
||||
#wysyłam do liści
|
||||
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) + 1)}]
|
||||
set kolor_pierwszy $nowy
|
||||
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
||||
|
||||
}
|
||||
if { $id == 0 } {
|
||||
|
||||
#jeśli pierwszy wierzchołek, ustalam kolor, porównuję
|
||||
set kolor_drugi [wyrownaj $wielkosc [bity 0]]
|
||||
set por [porownanieC $kolor_pierwszy $kolor_drugi]
|
||||
|
||||
#wynik porównania
|
||||
set c [lindex $por 1]
|
||||
set b [lindex $por 0]
|
||||
|
||||
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) +1)}]
|
||||
#ustalam nowy kolor
|
||||
set nowy [wyrownaj $wielkosc "[bity $b]$c"]
|
||||
set kolor_pierwszy $nowy
|
||||
|
||||
#wysyłam komunikat do liści
|
||||
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) +1)}]
|
||||
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
||||
|
||||
}
|
||||
@ -741,14 +793,20 @@ proc reverse li {
|
||||
|
||||
|
||||
fiber create $liczbaWierz {
|
||||
set lider ?
|
||||
wyslij 0 "$id_los 0 0"
|
||||
wyslij 1 "$id_los 0 0"
|
||||
fiber yield
|
||||
while {$run} {
|
||||
algorytm [czytaj 0] [czytaj 1]
|
||||
|
||||
set lider ?
|
||||
|
||||
#wysyłam id dalej
|
||||
wyslij 0 "$id_los 0 0"
|
||||
wyslij 1 "$id_los 0 0"
|
||||
|
||||
fiber yield
|
||||
}
|
||||
|
||||
while {$run} {
|
||||
#wykonuje algorytm ponizej
|
||||
algorytm [czytaj 0] [czytaj 1]
|
||||
fiber yield
|
||||
}
|
||||
}
|
||||
|
||||
Inicjalizacja;
|
||||
@ -759,24 +817,35 @@ proc wizualizacja {} {
|
||||
}
|
||||
|
||||
fiber_iterate {
|
||||
# + ta procedura jedynie przekazuje komunikaty...
|
||||
proc algorytm {m0 m1} {
|
||||
global id id_los stopien lider
|
||||
if {$m0!=""} {
|
||||
foreach {id0 i0 l0} $m0 break
|
||||
incr i0
|
||||
wyslij 1 "$id0 $i0 0";
|
||||
|
||||
#to ma przekazac komunikaty
|
||||
proc algorytm {m0 m1} {
|
||||
#ustwiamy zmienne globalny
|
||||
global id id_los stopien lider
|
||||
|
||||
if {$m0!=""} {
|
||||
#jesli pierwsza wartość nie jest pusta
|
||||
foreach {id0 i0 l0} $m0 break
|
||||
|
||||
#zwiększam i przekazuje
|
||||
incr i0
|
||||
wyslij 1 "$id0 $i0 0";
|
||||
}
|
||||
if {$m1!=""} {
|
||||
#jesli druga zmienna nie jest pusta
|
||||
foreach {id1 i1 l1} $m1 break
|
||||
|
||||
#zwiększam i ustawiam
|
||||
incr i1
|
||||
set i1 [expr {$i1+1}]
|
||||
|
||||
if {$m1==$id}{
|
||||
#jest lider
|
||||
set lider 1;
|
||||
}
|
||||
wyslij 0 "$id1 $i1 0"
|
||||
}
|
||||
}
|
||||
if {$m1!=""} {
|
||||
foreach {id1 i1 l1} $m1 break
|
||||
incr i1
|
||||
set i1 [expr {$i1+1}]
|
||||
if {$m1==$id}{
|
||||
set lider 1;
|
||||
}
|
||||
wyslij 0 "$id1 $i1 0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fiber yield; runda; wizualizacja; set licznikKom
|
||||
@ -852,32 +921,42 @@ fiber create $liczbaWierz {
|
||||
set wielkosc 50
|
||||
set por 0
|
||||
set new 0
|
||||
|
||||
#ustawiam kolory
|
||||
set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]]
|
||||
set kolor_drugi 0
|
||||
|
||||
set b 0
|
||||
set c 0
|
||||
|
||||
#wysyłam kolor pierwszy
|
||||
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
||||
fiber yield;
|
||||
|
||||
#główna pętla
|
||||
while {$run} {
|
||||
|
||||
if {$kom(0)!=""} {
|
||||
#jesli komunikat pierwszy nie jest pusty
|
||||
set kolor_drugi $kom(0)
|
||||
|
||||
} else {
|
||||
#jesli jest pusty
|
||||
set kolor_drugi [wyrownaj $wielkosc [bity 0]]
|
||||
}
|
||||
|
||||
#porownanie koloru drugiego z pierwszym
|
||||
set por [porownanieC $kolor_pierwszy $kolor_drugi]
|
||||
|
||||
#wynik porownania
|
||||
set c [lindex $por 1]
|
||||
set b [lindex $por 0]
|
||||
|
||||
#ustawiamy nowy kolor
|
||||
set new [wyrownaj $wielkosc "[bity $b]$c"]
|
||||
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) + 1)}]
|
||||
set kolor_pierwszy $new
|
||||
|
||||
#przesylamy dalej
|
||||
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) + 1)}]
|
||||
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
||||
|
||||
fiber yield;
|
||||
@ -1001,28 +1080,37 @@ set sasiedzi(5) {4 0}
|
||||
|
||||
fiber create $liczbaWierz {
|
||||
|
||||
set suma $id_los # losowanie wartości
|
||||
# losowanie wartości
|
||||
set suma $id_los
|
||||
|
||||
set licz [expr $liczbaWierz - 1] # zmienna licz
|
||||
set wynik ""
|
||||
wyslij 1 $suma # wysyłam w jedną stronę
|
||||
fiber yield;
|
||||
#zmienna okreslajaca czy moge liczyc
|
||||
set licz [expr $liczbaWierz - 1]
|
||||
set wynik ""
|
||||
|
||||
while {$run} {
|
||||
if {$wynik!="end" && $kom(0)!=""} { # warunek konieczny
|
||||
# wysyłam w jedną stronę
|
||||
wyslij 1 $suma
|
||||
fiber yield;
|
||||
|
||||
if {$licz>0} { # jeśli nadal mogę liczyć
|
||||
set k $kom(0)
|
||||
set suma [expr $id_los + $k]
|
||||
set licz [expr $licz - 1]
|
||||
wyslij 1 $suma
|
||||
while {$run} {
|
||||
if {$wynik!="end" && $kom(0)!=""} {
|
||||
#jesli nie mam jeszcze wyniku i mam komunikat pierwszy
|
||||
|
||||
} else {
|
||||
set wynik "end"
|
||||
}
|
||||
if {$licz>0} {
|
||||
# jeśli nadal mogę liczyć
|
||||
set k $kom(0)
|
||||
|
||||
#obliczam sume
|
||||
set suma [expr $id_los + $k]
|
||||
set licz [expr $licz - 1]
|
||||
wyslij 1 $suma
|
||||
|
||||
} else {
|
||||
#ustawiam wynik
|
||||
set wynik "end"
|
||||
}
|
||||
}
|
||||
fiber yield;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Inicjalizacja;
|
Loading…
Reference in New Issue
Block a user