poprawa zad2

This commit is contained in:
Jakub Adamski 2021-04-04 12:15:18 +02:00
parent 0005f531f9
commit 46dc61e655
2 changed files with 233 additions and 63 deletions

View File

@ -3,15 +3,15 @@
<sprawozdanie przedmiot="Algorytmy rozproszone" temat="A"> <sprawozdanie przedmiot="Algorytmy rozproszone" temat="A">
<imie_nazwisko>Jakub Adamski</imie_nazwisko> <imie_nazwisko>Jakub Adamski</imie_nazwisko>
<nr_indeksu>444341</nr_indeksu> <nr_indeksu>444341</nr_indeksu>
<liczba_pkt>9</liczba_pkt> <liczba_pkt>10.5</liczba_pkt>
<zadanie nr="0.1" pkt="0.5"></zadanie> <zadanie nr="0.1" pkt="0.5"></zadanie>
<zadanie nr="0.2" pkt="0.5"></zadanie> <zadanie nr="0.2" pkt="0.5"></zadanie>
<zadanie nr="1" pkt="1"></zadanie> <zadanie nr="1" pkt="1"></zadanie>
<zadanie nr="1a" pkt="1"></zadanie> <zadanie nr="1a" pkt="1"></zadanie>
<zadanie nr="1b" pkt="0.5"></zadanie> <zadanie nr="1b" pkt="0.5"></zadanie>
<zadanie nr="2" pkt="1"></zadanie> <zadanie nr="2" pkt="1.5"></zadanie>
<zadanie nr="0.3" pkt="0.5"></zadanie> <zadanie nr="0.3" pkt="0.5"></zadanie>
<zadanie nr="3" pkt="1"></zadanie> <zadanie nr="3" pkt="2"></zadanie>
<zadanie nr="5" pkt="1"></zadanie> <zadanie nr="5" pkt="1"></zadanie>
<zadanie nr="5a" pkt="1"></zadanie> <zadanie nr="5a" pkt="1"></zadanie>
<zadanie nr="8" pkt="1"></zadanie> <zadanie nr="8" pkt="1"></zadanie>
@ -406,12 +406,14 @@ id: 4: lider: 1, kom0: , kom1:
Zadanie 1b ------------------------------------- Zadanie 1b -------------------------------------
Wybór lidera, więcej niz 1 lider. Wybór lidera, więcej niz 1 lider.
Dodatkowy warunek na istnienie lidera, lider pośredni. Dodatkowy warunek na istnienie lidera, lider pośredni.
Nie udało mi się zrobić tego zadania w 100%
/// kod /// kod
#inicjalizacja
load ./q3.so load ./q3.so
source symul_lib.tcl; source symul_lib.tcl;
#wierzchołki
set liczbaWierz 5 set liczbaWierz 5
set sasiedzi(0) {4 1} set sasiedzi(0) {4 1}
set sasiedzi(1) {0 2} set sasiedzi(1) {0 2}
@ -488,27 +490,24 @@ id: 4, lider: 0, 0
Zadanie 2 ------------------------------------- Zadanie 2 -------------------------------------
8-kolorowanie wierzchołkowe drzewa ukorzenionego. 8-kolorowanie wierzchołkowe drzewa ukorzenionego.
Mam problem z finalnym algorytmu.
/// kod /// kod
#inicjalizacja
load ./q3.so load ./q3.so
source symul_lib.tcl; source symul_lib.tcl;
# drzewo ukorzenione
set liczbaWierz 7
set sasiedzi(0) {0 1 2}
set sasiedzi(1) {0 3 4}
set sasiedzi(2) {0 5}
set sasiedzi(3) {1}
set sasiedzi(4) {1 6}
set sasiedzi(5) {2}
set sasiedzi(6) {4}
# tworzę graf, drzewo #przydatny kod do obsługi bitów
set liczbaWierz 9
set sasiedzi(0) {1 2 3}
set sasiedzi(1) {0}
set sasiedzi(2) {0 4 5 6}
set sasiedzi(3) {0}
set sasiedzi(4) {2}
set sasiedzi(5) {2 7 8}
set sasiedzi(6) {2}
set sasiedzi(7) {6}
set sasiedzi(8) {6}
set obslugaBitow { set obslugaBitow {
proc bity x { # postac binarna liczby proc bity x { # postac binarna liczby
usun0 [binary scan [binary format I $x] B* x; set x] usun0 [binary scan [binary format I $x] B* x; set x]
@ -556,63 +555,110 @@ set obslugaBitow {
} }
} }
fiber create $liczbaWierz { fiber create $liczbaWierz {
set c $id;
wyslij 0 c; #zmienne
set new 0
set wielkosc 50
set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]]
set kolor_drugi 0
set b 0
set por 0
set c 0
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
fiber yield; fiber yield;
while {$run} {
if {$kom(0)!=kom(1)} { #główna pętla
set c [expr kom(0) + kom(1)]; # pozycja bitu while {$run} {
set bity [expr c * 2]; # razy 2 #warunek 1
set lk c; # liczba bitów if {$kom(0)!=""} {
if{c < 3}{
wyslij 1 c; set kolor_drugi $kom(0)
} set por [porownanieC $kolor_pierwszy $kolor_drugi]
set c [lindex $por 1]
set b [lindex $por 0]
set nowy [wyrownaj $wielkosc "[bity $b]$c"]
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 } {
set kolor_drugi [wyrownaj $wielkosc [bity 0]]
set por [porownanieC $kolor_pierwszy $kolor_drugi]
set c [lindex $por 1]
set b [lindex $por 0]
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) +1)}]
set nowy [wyrownaj $wielkosc "[bity $b]$c"]
set kolor_pierwszy $nowy
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
} }
fiber yield; fiber yield;
} }
} }
Inicjalizacja; fiber_iterate $obslugaBitow
proc wizualizacja {} {
fiber_iterate {_puts "id: $id, c: $c, $kom(0)"}
}
Inicjalizacja;
proc wizualizacja {} {
fiber_iterate {_puts "id: $id, kolor: $kolor_pierwszy"}
}
fiber yield; runda; wizualizacja fiber yield; runda; wizualizacja
/// koniec kodu /// koniec kodu
/// wydruk /// wydruk
id: 0, c: 0, c id: 0, kolor: 00000000000000000000000000000000000000001100010010
id: 1, c: 1, c id: 1, kolor: 00000000000000000000000000000000000000000010101001
id: 2, c: 2, id: 2, kolor: 00000000000000000000000000000000000000001101011010
id: 3, c: 3, id: 3, kolor: 00000000000000000000000000000000000000000100001010
id: 4, c: 4, id: 4, kolor: 00000000000000000000000000000000000000000010111010
id: 5, c: 5, id: 5, kolor: 00000000000000000000000000000000000000001010100000
id: 6, c: 6, id: 6, kolor: 00000000000000000000000000000000000000001111011000
id: 7, c: 7,
id: 8, c: 8,
id: 0, c: 0, id: 0, kolor: 0000011
id: 1, c: 1, id: 1, kolor: 00000000000000000000000000000000000000000000000001
id: 2, c: 2, id: 2, kolor: 00000000000000000000000000000000000000000000000111
id: 3, c: 3, id: 3, kolor: 00000000000000000000000000000000000000000000000000
id: 4, c: 4, id: 4, kolor: 00000000000000000000000000000000000000000000000000
id: 5, c: 5, id: 5, kolor: 00000000000000000000000000000000000000000000000010
id: 6, c: 6, id: 6, kolor: 00000000000000000000000000000000000000000000000010
id: 7, c: 7,
id: 8, c: 8,
id: 0, c: 0, id: 0, kolor: 0001
id: 1, c: 1, id: 1, kolor: 0000010
id: 2, c: 2, id: 2, kolor: 0000101
id: 3, c: 3, id: 3, kolor: 0000000
id: 4, c: 4, id: 4, kolor: 0000000
id: 5, c: 5, id: 5, kolor: 0000000
id: 6, c: 6, id: 6, kolor: 0000011
id: 7, c: 7,
id: 8, c: 8, id: 0, kolor: 001
id: 1, kolor: 0000
id: 2, kolor: 0101
id: 3, kolor: 0010
id: 4, kolor: 0010
id: 5, kolor: 0000
id: 6, kolor: 0001
id: 0, kolor: 001
id: 1, kolor: 000
id: 2, kolor: 101
id: 3, kolor: 011
id: 4, kolor: 011
id: 5, kolor: 000
id: 6, kolor: 001
/// koniec wydruku /// koniec wydruku
@ -670,7 +716,7 @@ proc tc_pol {id pol} {
Zadanie 3 ------------------------------------- Zadanie 3 -------------------------------------
Algorytm asynchroniczny wyboru lidera, uzywający O(n logn) komunikatów, dla ringu zorientowanego. Algorytm asynchroniczny wyboru lidera, uzywający O(n logn) komunikatów, dla ringu zorientowanego.
Nie udało mi się wykonać zadania, załączam częściowo rozwiązane. Nie udało mi się wykonać zadania, załączam rozwiązane w połowie.
/// kod /// kod

124
TEMAT_A/zad2.tcl Normal file
View File

@ -0,0 +1,124 @@
#inicjalizacja
load ./q3.so
source symul_lib.tcl;
# drzewo ukorzenione
set liczbaWierz 7
set sasiedzi(0) {0 1 2}
set sasiedzi(1) {0 3 4}
set sasiedzi(2) {0 5}
set sasiedzi(3) {1}
set sasiedzi(4) {1 6}
set sasiedzi(5) {2}
set sasiedzi(6) {4}
#przydatny kod do obsługi bitów
set obslugaBitow {
proc bity x { # postac binarna liczby
usun0 [binary scan [binary format I $x] B* x; set x]
}
proc usun0 x { # usuwa zera poczatkowe z repr bin liczby
set x [string trimleft $x 0]
if {$x==""} {set x 0}
set x
}
proc porownanieC {cv cu} { # porownuje 2 kolory, zwraca indeks oraz 2 bity...
set dlcu [string len $cu]
set dlcv [string len $cv]
if {$dlcu<$dlcv} {
set cu "[string repeat 0 [expr {$dlcv-$dlcu}]]$cu"
}
if {$dlcu>$dlcv} {
set cv "[string repeat 0 [expr {$dlcu-$dlcv}]]$cv"
}
set dl [string len $cu]
iterate i $dl {
set i1 [expr {$dl-$i-1}]
# KONIECZNIE trzeba numerowac bity od prawej gdyz
# dopisuje sie 0 z lewej i wtedy indeksy by sie zmienialy!
set bu [string index $cu $i1]
set bv [string index $cv $i1]
if {$bu != $bv} {return "$i $bv $bu"}
}
return {-1 ? ?}
}
proc wyrownaj {L x} { # dodaje 0 z lewej do L-bitow
set dl [string len $x]
if {$dl>$L} {error "wyrownaj"}
return "[string repeat "0" [expr {$L-$dl}]]$x"
}
proc bin2dec x { # do 32-bitow
binary scan [binary form B* [wyrownaj 32 $x]] I y
set y
}
proc iterate {zm liIter kod} { # wygodna petla
upvar $zm i
for {set i 0} {$i<$liIter} {incr i} {
set e [catch {uplevel $kod} x]
if {$e!=0} {return -code $e $x}
}
}
}
fiber create $liczbaWierz {
#zmienne
set new 0
set wielkosc 50
set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]]
set kolor_drugi 0
set b 0
set por 0
set c 0
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)!=""} {
set kolor_drugi $kom(0)
set por [porownanieC $kolor_pierwszy $kolor_drugi]
set c [lindex $por 1]
set b [lindex $por 0]
set nowy [wyrownaj $wielkosc "[bity $b]$c"]
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 } {
set kolor_drugi [wyrownaj $wielkosc [bity 0]]
set por [porownanieC $kolor_pierwszy $kolor_drugi]
set c [lindex $por 1]
set b [lindex $por 0]
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) +1)}]
set nowy [wyrownaj $wielkosc "[bity $b]$c"]
set kolor_pierwszy $nowy
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
}
fiber yield;
}
}
fiber_iterate $obslugaBitow
Inicjalizacja;
proc wizualizacja {} {
fiber_iterate {_puts "id: $id, kolor: $kolor_pierwszy"}
}
fiber yield; runda; wizualizacja