From 0005f531f95eb2e000a401d28876e10b7955c89c Mon Sep 17 00:00:00 2001 From: Jakub Adamski Date: Sat, 3 Apr 2021 22:11:56 +0200 Subject: [PATCH] zad 5 --- TEMAT_A/Temat A.txt | 223 ++++++++++++++++++++++++++++++++++++++++++-- TEMAT_A/zad5a.tcl | 111 ++++++++++++++++++++++ 2 files changed, 327 insertions(+), 7 deletions(-) create mode 100644 TEMAT_A/zad5a.tcl diff --git a/TEMAT_A/Temat A.txt b/TEMAT_A/Temat A.txt index 7177762..0e7357a 100644 --- a/TEMAT_A/Temat A.txt +++ b/TEMAT_A/Temat A.txt @@ -3,15 +3,17 @@ Jakub Adamski 444341 -6.5 +9 - + + + @@ -486,7 +488,7 @@ id: 4, lider: 0, 0 Zadanie 2 ------------------------------------- 8-kolorowanie wierzchołkowe drzewa ukorzenionego. -Mam problem z zaimplementowaniem algorytmu. +Mam problem z finalnym algorytmu. /// kod @@ -508,10 +510,50 @@ set sasiedzi(7) {6} set sasiedzi(8) {6} set obslugaBitow { - # postać binarna -proc bity x { -usun0 [binary scan [binary format I $x] B* x; set x] -} + 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 { @@ -725,6 +767,173 @@ id: 4, wartosc: 207, lider: ?; , +Zadanie 5 ------------------------------------- +Algorytm kolorujący wierzchołkowo, stałą liczbą kolorów, grafy stałego stopnia, +działający w czasie O(log^*n). + +Algorytm +1) Najpierw generujemy kolor. +2) Powtarzamy w pętli: + 2a) Pobranie koloru. + 2b) Otrzymujemy kolor sąsiadującego wierzchoka. + 2c) Skracamy długość koloru. + 2d) Odczytujemy ilość zer i jedynek. + 2e) Generujemy zera i jedynki na podstawie otrzymanego koloru. + + + +Zadanie 5a ------------------------------------- +Algortym z zadania 5 dla ringu. + +/// kod + +#inicjalizacja +load ./q3.so; +source symul_lib.tcl; + +# ring +set liczbaWierz 5 +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 { + + #zmienne + set wielkosc 50 + set por 0 + set new 0 + set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]] + set kolor_drugi 0 + set b 0 + set c 0 + + for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy} + fiber yield; + + #główna pętla + while {$run} { + + if {$kom(0)!=""} { + set kolor_drugi $kom(0) + + } else { + 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 new [wyrownaj $wielkosc "[bity $b]$c"] + set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) + 1)}] + set kolor_pierwszy $new + + for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy} + + fiber yield; + } +} + +#obsługa 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_iterate $obslugaBitow + +Inicjalizacja; + +#wizualizaca +proc wizualizacja {} { + fiber_iterate {_puts "$id : $kolor_pierwszy"} +} + +#wykonanie +fiber yield; runda; wizualizacja +/// koniec kodu + + +/// wydruk +0 : 00000000000000000000000000000000000000001101100101 +1 : 00000000000000000000000000000000000000000100110011 +2 : 00000000000000000000000000000000000000000111110111 +3 : 00000000000000000000000000000000000000001110100110 +4 : 00000000000000000000000000000000000000000000000110 + +0 : 00000000000000000000000000000000000000000000000001 +1 : 00000000000000000000000000000000000000000000000011 +2 : 00000000000000000000000000000000000000000000000101 +3 : 00000000000000000000000000000000000000000000000000 +4 : 00000000000000000000000000000000000000000000001010 + +0 : 0000001 +1 : 0000011 +2 : 0000010 +3 : 0000000 +4 : 0000011 + +0 : 0010 +1 : 0011 +2 : 0000 +3 : 0010 +4 : 0001 + +0 : 000 +1 : 001 +2 : 000 +3 : 011 +4 : 001 +/// koniec wydruku + + + Zadanie 8 ------------------------------------- Suma ID w ringu. Zliczam sumę ID w ringu, losuję wartości wierzchołków. diff --git a/TEMAT_A/zad5a.tcl b/TEMAT_A/zad5a.tcl new file mode 100644 index 0000000..195852e --- /dev/null +++ b/TEMAT_A/zad5a.tcl @@ -0,0 +1,111 @@ + +#inicjalizacja +load ./q3.so; +source symul_lib.tcl; + +# ring +set liczbaWierz 5 +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 { + + #zmienne + set wielkosc 50 + set por 0 + set new 0 + set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]] + set kolor_drugi 0 + set b 0 + set c 0 + + for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy} + fiber yield; + + #główna pętla + while {$run} { + + if {$kom(0)!=""} { + set kolor_drugi $kom(0) + + } else { + 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 new [wyrownaj $wielkosc "[bity $b]$c"] + set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) + 1)}] + set kolor_pierwszy $new + + for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy} + + fiber yield; + } +} + +#obsługa 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_iterate $obslugaBitow + +Inicjalizacja; + +#wizualizaca +proc wizualizacja {} { + fiber_iterate {_puts "$id : $kolor_pierwszy"} +} + +#wykonanie +fiber yield; runda; wizualizacja \ No newline at end of file