From 46dc61e655325c61b0ff0e3f8d39b59ec22b70ac Mon Sep 17 00:00:00 2001 From: Jakub Adamski Date: Sun, 4 Apr 2021 12:15:18 +0200 Subject: [PATCH] poprawa zad2 --- TEMAT_A/Temat A.txt | 172 ++++++++++++++++++++++++++++---------------- TEMAT_A/zad2.tcl | 124 ++++++++++++++++++++++++++++++++ 2 files changed, 233 insertions(+), 63 deletions(-) create mode 100644 TEMAT_A/zad2.tcl diff --git a/TEMAT_A/Temat A.txt b/TEMAT_A/Temat A.txt index 0e7357a..db1defa 100644 --- a/TEMAT_A/Temat A.txt +++ b/TEMAT_A/Temat A.txt @@ -3,15 +3,15 @@ Jakub Adamski 444341 -9 +10.5 - + - + @@ -406,12 +406,14 @@ id: 4: lider: 1, kom0: , kom1: Zadanie 1b ------------------------------------- Wybór lidera, więcej niz 1 lider. Dodatkowy warunek na istnienie lidera, lider pośredni. +Nie udało mi się zrobić tego zadania w 100% /// kod +#inicjalizacja load ./q3.so - source symul_lib.tcl; +#wierzchołki set liczbaWierz 5 set sasiedzi(0) {4 1} set sasiedzi(1) {0 2} @@ -488,27 +490,24 @@ id: 4, lider: 0, 0 Zadanie 2 ------------------------------------- 8-kolorowanie wierzchołkowe drzewa ukorzenionego. -Mam problem z finalnym algorytmu. - /// kod + +#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} -# tworzę graf, drzewo - -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} - +#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] @@ -556,63 +555,110 @@ set obslugaBitow { } } + + 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; - while {$run} { - if {$kom(0)!=kom(1)} { - set c [expr kom(0) + kom(1)]; # pozycja bitu -set bity [expr c * 2]; # razy 2 - set lk c; # liczba bitów - if{c < 3}{ - wyslij 1 c; -} + + #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; + } } -Inicjalizacja; - -proc wizualizacja {} { - fiber_iterate {_puts "id: $id, c: $c, $kom(0)"} -} +fiber_iterate $obslugaBitow +Inicjalizacja; + +proc wizualizacja {} { + fiber_iterate {_puts "id: $id, kolor: $kolor_pierwszy"} +} + fiber yield; runda; wizualizacja /// koniec kodu /// wydruk -id: 0, c: 0, c -id: 1, c: 1, c -id: 2, c: 2, -id: 3, c: 3, -id: 4, c: 4, -id: 5, c: 5, -id: 6, c: 6, -id: 7, c: 7, -id: 8, c: 8, +id: 0, kolor: 00000000000000000000000000000000000000001100010010 +id: 1, kolor: 00000000000000000000000000000000000000000010101001 +id: 2, kolor: 00000000000000000000000000000000000000001101011010 +id: 3, kolor: 00000000000000000000000000000000000000000100001010 +id: 4, kolor: 00000000000000000000000000000000000000000010111010 +id: 5, kolor: 00000000000000000000000000000000000000001010100000 +id: 6, kolor: 00000000000000000000000000000000000000001111011000 -id: 0, c: 0, -id: 1, c: 1, -id: 2, c: 2, -id: 3, c: 3, -id: 4, c: 4, -id: 5, c: 5, -id: 6, c: 6, -id: 7, c: 7, -id: 8, c: 8, +id: 0, kolor: 0000011 +id: 1, kolor: 00000000000000000000000000000000000000000000000001 +id: 2, kolor: 00000000000000000000000000000000000000000000000111 +id: 3, kolor: 00000000000000000000000000000000000000000000000000 +id: 4, kolor: 00000000000000000000000000000000000000000000000000 +id: 5, kolor: 00000000000000000000000000000000000000000000000010 +id: 6, kolor: 00000000000000000000000000000000000000000000000010 -id: 0, c: 0, -id: 1, c: 1, -id: 2, c: 2, -id: 3, c: 3, -id: 4, c: 4, -id: 5, c: 5, -id: 6, c: 6, -id: 7, c: 7, -id: 8, c: 8, +id: 0, kolor: 0001 +id: 1, kolor: 0000010 +id: 2, kolor: 0000101 +id: 3, kolor: 0000000 +id: 4, kolor: 0000000 +id: 5, kolor: 0000000 +id: 6, kolor: 0000011 + +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 @@ -670,7 +716,7 @@ proc tc_pol {id pol} { Zadanie 3 ------------------------------------- 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 diff --git a/TEMAT_A/zad2.tcl b/TEMAT_A/zad2.tcl new file mode 100644 index 0000000..d7b63bc --- /dev/null +++ b/TEMAT_A/zad2.tcl @@ -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 \ No newline at end of file