zad 5
This commit is contained in:
parent
7a73ab0e9b
commit
0005f531f9
@ -3,15 +3,17 @@
|
||||
<sprawozdanie przedmiot="Algorytmy rozproszone" temat="A">
|
||||
<imie_nazwisko>Jakub Adamski</imie_nazwisko>
|
||||
<nr_indeksu>444341</nr_indeksu>
|
||||
<liczba_pkt>6.5</liczba_pkt>
|
||||
<liczba_pkt>9</liczba_pkt>
|
||||
<zadanie nr="0.1" pkt="0.5"></zadanie>
|
||||
<zadanie nr="0.2" pkt="0.5"></zadanie>
|
||||
<zadanie nr="1" pkt="1"></zadanie>
|
||||
<zadanie nr="1a" pkt="1"></zadanie>
|
||||
<zadanie nr="1b" pkt="0.5"></zadanie>
|
||||
<zadanie nr="2" pkt="0.5"></zadanie>
|
||||
<zadanie nr="2" pkt="1"></zadanie>
|
||||
<zadanie nr="0.3" pkt="0.5"></zadanie>
|
||||
<zadanie nr="3" pkt="1"></zadanie>
|
||||
<zadanie nr="5" pkt="1"></zadanie>
|
||||
<zadanie nr="5a" pkt="1"></zadanie>
|
||||
<zadanie nr="8" pkt="1"></zadanie>
|
||||
</sprawozdanie>
|
||||
|
||||
@ -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.
|
||||
|
111
TEMAT_A/zad5a.tcl
Normal file
111
TEMAT_A/zad5a.tcl
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user