This commit is contained in:
Jakub Adamski 2021-05-23 13:11:45 +02:00
parent 93066b3398
commit a59be95770
15 changed files with 1652 additions and 1 deletions

View File

@ -2,4 +2,17 @@
Zadania z ćwiczeń.
## Temat A
Zadania rozwiązane.
Zadania rozwiązane.
## Temat B
Zadania rozwiązane.
### TODO
- Zadanie 11
- Zadanie 19 **ok**
- Zadanie 21 **ok**
- Zadanie 30 **ok**
- Zadanie 31 **ok**
Liczba punktów: 8p

1008
TEMAT_B/Temat-B.txt Normal file

File diff suppressed because it is too large Load Diff

57
TEMAT_B/zad11.tcl Normal file
View File

@ -0,0 +1,57 @@
load ./q3.so
source symul_lib.tcl
# tworzenie kraty k x k
set k 3
set liczbaWierz [expr $k*$k]
iterate i $liczbaWierz {
set sasiedzi($i) {}
}
set k1 [expr $k-1]
proc nr {x y} {global k; expr $x*$k+$y}
iterate x $k1 {
iterate y $k1 {
set i [nr $x $y]; DodajKraw $i [expr {$i+1}]; DodajKraw $i [expr {$i+$k}]
}
}
iterate x $k1 {
set i [nr $x $k1]; DodajKraw $i [expr $i+$k]
}
iterate y $k1 {
set i [nr $k1 $y]; DodajKraw $i [expr $i+1]
}
# efekt
array get sasiedzi
# definicja wierzchołka
fiber create $liczbaWierz {
set list $id
while {$run} {
for {set i 0} {$i < $stopien} {incr i} {
if {$kom($i)!=""} {
set list "$list$kom($i)"
while {[regsub -all {(.)(.*)\1+} $list {\1\2} list]} {}
}
}
for {set i 0} {$i < $stopien} {incr i} {
wyslij $i $list
}
fiber yield
}
}
Inicjalizacja;
proc wizualizacja {} {
fiber_iterate {_puts "id: $id, lista: $list"}
}
fiber yield; runda; wizualizacja

81
TEMAT_B/zad19.tcl Normal file
View File

@ -0,0 +1,81 @@
load ./q3.so
source symul_lib.tcl
# tworzę wierzchołki
set liczbaWierz 5
iterate i $liczbaWierz {
let ipierwsze $i-1;
if {$ipierwsze==-1} {let ipierwsze $liczbaWierz-1}
let idrugie $i+1;
if {$idrugie==$liczbaWierz} {let idrugie 0}
set sasiedzi($i) "$ipierwsze $idrugie"
}
# definiuję wierzchołki
fiber create $liczbaWierz {
# te zmienne są wymagane do wizualizacji
set lider {};
set minimalneId {};
fiber yield;
# Cykl zorientowany - wysyłam połączeniem 0, odbieram połączeniem 1
dostarcz 0 "LE $id";
while {$run} {
set msg [lindex [czytaj 1] 1];
if {$msg!=""} {
if {$msg<$id} {
dostarcz 0 "LE $msg";
set minimalneId $msg;
} elseif {$msg==$id} {
set lider 1;
set minimalneId $msg;
dostarcz 0 "LE false";
} elseif {$msg=="false" && $lider=={}} {
set lider 0;
dostarcz 0 "LE false";
}
}
#koniec wykonywania procedury danego wierzchołka
fiber switchto main;
}
}
InicjalizacjaAsynch
#procedura wizualizacji
proc wizualizacja {} {
fiber_iterate {_puts "id: $id, lider: $lider, minimalneId: $minimalneId, kom0: $kom0, kom1: $kom1"}
}
#licznik
set licz 0;
proc egzekucja {liczbaWierz licz args} {
#losowanie
set random [expr {int(rand()*[expr $liczbaWierz+1])}];
for {set i 0} {$i < $liczbaWierz} {incr i} {
if {$i!=$random && $licz!=0} {
_puts "Działa wierzchołek: $i"
fiber switchto $i;
} elseif {$licz==0} {
_puts "Działa wierzchołek: $i"
fiber switchto $i;
}
}
set licz [expr $licz + 1];
}
#wykonanie
egzekucja $liczbaWierz $licz; set licz 1; wizualizacja;

81
TEMAT_B/zad30.tcl Normal file
View File

@ -0,0 +1,81 @@
load ./q3.so
source symul_lib.tcl
# inicjalizacja wierzchołków
set liczbaWierz 20
iterate i $liczbaWierz {
let ipierwsze $i-1;
if {$ipierwsze==-1} {let ipierwsze $liczbaWierz-1}
let idrugie $i+1;
if {$idrugie==$liczbaWierz} {let idrugie 0}
set sasiedzi($i) "$ipierwsze $idrugie"
}
# definiuję wierzchołki
fiber create $liczbaWierz {
while {$run} {
set bezpieczny 0;
# do wszystkich sąsiadów wysyłam ID
for {set i 0} {$i < $stopien} {incr i} {
dostarcz $i $id;
}
# koniec wykonania
fiber switchto main;
# potwierdzenie otrzymania komunikatu
for {set i 0} {$i < $stopien} {incr i} {
czytaj $i;
}
# jeśli odebrałem komunikat to wysyłam safe
for {set j 0} {$j < $stopien} {incr j} {
dostarcz $j "SAFE";
}
#koniec wykonania
fiber switchto main;
while {$bezpieczny == 0} {
set licz 0;
for {set i 0} {$i < $stopien} {incr i} {
# zwiększam licz jeśli pierwszy to safe
if {[lindex $kom($i) 0]=="SAFE"} {
incr licz;
}
# otrzymałem safe od każdego sąsiada
if {$licz == $stopien} {
set bezpieczny 1;
# usuwam safe z listy
for {set j 0} {$j < $stopien} {incr j} {
czytaj $j;
}
} else {
set bezpieczny 0;
}
}
fiber switchto main;
}
}
}
InicjalizacjaAsynch
# pokaż komunikaty
fiber switchto 0; pokazKom
fiber switchto 1; pokazKom
fiber switchto 2; pokazKom
fiber switchto 3; pokazKom
fiber switchto 4; pokazKom
fiber switchto 5; pokazKom
fiber switchto 6; pokazKom
fiber switchto 7; pokazKom

105
TEMAT_B/zad31.tcl Normal file
View File

@ -0,0 +1,105 @@
load ./q3.so
source symul_lib.tcl
# inicjalizuję wierzchołki
set sasiedzi(0) {1 2 3}
set sasiedzi(1) {0 4 5}
set sasiedzi(2) {0 6}
set sasiedzi(3) {0 7 8}
set sasiedzi(4) {1}
set sasiedzi(5) {1}
set sasiedzi(6) {2}
set sasiedzi(7) {3}
set sasiedzi(8) {3}
set liczbaWierz 9;
# definiuję wierzchołki
fiber create $liczbaWierz {
#zmienne
set safe 0;
set korzen 0;
set bezpieczneW 0;
while {$run} {
if {$korzen==0 && $stopien==1 && $safe==0} {
set safe 1;
dostarcz 0 "SAFE";
}
#koniec wykonania
fiber switchto main;
while {$safe==0} {
set licz 0;
for {set i 0} {$i < $stopien} {incr i} {
if {[lindex $kom($i) 0]=="SAFE"} {
incr licz;
}
if {$licz == [expr $stopien - 1]} {
set safe 1;
for {set j 0} {$j < $stopien} {incr j} {
czytaj $j;
}
}
}
fiber switchto main;
}
if {$korzen==0 && $safe==1 && $bezpieczneW==0 && $stopien>1} {
dostarcz 0 "SAFE";
set bezpieczneW 1;
} elseif {$korzen==1 && $safe==1} {
for {set i 0} {$i < $stopien} {incr i} {
dostarcz $i "PULSE";
set safe 0;
}
}
fiber switchto main;
if {[lindex $kom(0) 0]=="PULSE"} {
if {$korzen==0 && $stopien>1} {
czytaj 0;
for {set j 1} {$j < $stopien} {incr j} {
dostarcz $j "PULSE";
set bezpieczneW 0;
set safe 0;
}
} else {
czytaj 0;
set bezpieczneW 0;
set safe 0;
}
}
fiber switchto main;
}
}
InicjalizacjaAsynch
proc wizualizacja {} {
fiber_iterate {_puts "Wierzchołek $id, safe: $safe, korzen: $korzen"}
}
wizualizacja
# ustawiamy korzeń po pierwszej egzekucji
fiber_eval 0 {set korzen 1}
fiber switchto 0;
fiber switchto 1;
fiber switchto 2;
fiber switchto 3;
fiber switchto 4;
fiber switchto 5;
fiber switchto 6;
fiber switchto 7;
fiber switchto 8;

154
dodatkowe/21.tcl Normal file
View File

@ -0,0 +1,154 @@
source symul_lib.tcl
# 8 wierzchołków
set liczbaWierz 8
#tworzę graf pełny
iterate i $liczbaWierz {
set check 0
# przechodzę przez wszystkie wierzchołki
# {start} {test} {next}
for {set j 0} {$j < $liczbaWierz} {incr j} {
# jeśli dany wierzchołek nie jest równy sprawdzanemu
if {$i!=$j} {
# jeśli check = 0
if {$check==0} {
set s "$j"
set check 1
# jeśli nie
} else {
set x1 $s
set x2 $j
set s "$x1 $x2"
}
}
}
set sasiedzi($i) "$s"
}
#definicja wierzchołka
fiber create $liczbaWierz {
set king 1;
set K $id_los;
set KS 1;
set waiting "";
dostarcz 0 "Collect $id_los";
while {$run} {
for {set i 0} {$i < $stopien} {incr i} {
#lindex pobiera indeks z listy
set x [lindex $kom($i) 0]
#jeśli x[0] == Collect
if {[lindex $x 0]=="Collect"} {
if {$K==""} {
set K $i
set KS 1
set king 0
dostarcz $i "Join";
czytaj $i
} elseif {$king==1} {
if {$K<[lindex $x 1]} {
set king 0
set K $i
set KS 1
dostarcz $i "Join";
}
czytaj $i
} elseif {$waiting==""} {
if {$id_los < [lindex $x 1]} {
set waiting $i
dostarcz $K "Check [lindex $x 1]"
}
czytaj $i
}
}
#jeśli x[0] = Check
if {[lindex $x 0]=="Check"} {
if {$K < [lindex $x 1]} {
set K ""
set KS 1
dostarcz $i "Ack"
} else {
dostarcz $i "Ref"
}
czytaj $i
}
# jeśli x[0] = Ack
if {[lindex $x 0]=="Ack"} {
set KS 1
dostarcz $waiting "Join";
set waiting ""
czytaj $i
}
#jeśli x[0] = Ref
if {[lindex $x 0]=="Ref"} {
set waiting ""
czytaj $i
}
#jeśli x[0] = Join
if {[lindex $x 0]=="Join"} {
if {$king==1} {
if {$KS < $stopien} {
dostarcz $KS "Collect $id_los";
} else {
_puts "wybrano lidera: $id_los"
}
incr KS
}
czytaj $i
}
}
fiber switchto main;
}
}
InicjalizacjaAsynch
#procedura wizalizacji
proc wizualizacja {} {
fiber_iterate {_puts "$id,$id_los, $KS, $kom0, $kom1, $kom2, $kom3, $kom4, $kom5, $kom6"}
}
#główna egzekucja
set check 0;
proc egzekucja {liczbaWierz check} {
set s ""
#expr - wylicz wartość wyrazenia
set rand [expr {int(rand()*[expr $liczbaWierz+1])}];
for {set i 0} {$i < $liczbaWierz} {incr i} {
if {$check==0} {
set x1 $s
set x2 $i
set s "$x1 $x2"
fiber switchto $i;
} elseif {$i!=$rand} {
set x1 $s
set x2 $i
set s "$x1 $x2"
fiber switchto $i;
}
}
_puts "Wierzchołki: {$s }"
}
egzekucja $liczbaWierz $check;set check 1;wizualizacja;
#5. symulacja modelu asynchronicznego:
# + generujemy "zdarzenie obliczeniowe" z konsoli przy pomocy
# fiber switchto $id
# a zdarzenie to kończy się w kodzie algorytmu przez
# fiber switchto main
# + istnieje procedura "dostarcz" działająca tak jak "wyslij"
# z tą różnicą, że komunikaty są od razu dostarczane

BIN
dodatkowe/Graf_pelny.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

52
dodatkowe/README.md Normal file
View File

@ -0,0 +1,52 @@
# Zadanie 21
Opis dzialania
## Wstep
Tworze graf pelny o 8 wierzcholkach.
Glowna idea - kazdy wierzcholek probuje dodac do swojego zbioru jak najwieksza ilosc innych wierzcholkow.
Wierzcholek probujacy dodac inny porownuje najpierw czy jego zbior jest wiekszy niz wierzcholka ktorego probuje przejac. Tylko w takim wypadu moze to zrobic. Liderem zostaje ten o najwiekszym zbiorze.
## Wysylane komunikaty
- Collect - dolacz sie do mnie
- Join - dolaczam sie do ciebie
- Ack - moj zbior jest wiekszy od twojego
- Ref - moj zbior jest mniejszy od twojego
- Check - sprawdź ten zbior czy jest wiekszy od twojego
## Dzialanie wierzcholka
Na poczatku wysylam sygnal collect do dowolnego sasiada.
System odbioru komunikatow:
- Jesli dostane collect i moj zbior jest pusty lub mniejszy od wierzcholka wysylajacego to wysylam do niego komunikat join, w przeciwnym wypadku wyslij check do "posiadacza zbioru"
- Jesli dostane check i moj zbior jest wiekszy niz wierzcholka wysylajacego to wysylam do niego ack, w przeciwnym wypadku wysylam ref
- Jesli dostane ack to wysylam join do wierzcholka wysylajacego.
- Jesli dostane ref to nie robie nic.
- Jesli dostane join to powiekszam swoj zbior i wysylam collect do innego losowego wierzcholka.
## Program
Kroki:
1. Startuje od check = 0.
2. Wykonuje procedure egzekucja.
3. Wierzcholek 0 uruchomi swoje dzialanie jako pierwszy.
4. Ustawiam check = 1. Uruchamiam wizualizacje.
5. Wykonuje procedure egzekucja.
6. Uruchomi sie dzialanie losowo wybranego wierzcholka.
7. Wracam do kroku 4. Program dziala az nie znajde lidera.

100
dodatkowe/konsola.txt Normal file
View File

@ -0,0 +1,100 @@
Wierzchołki: { 0 1 2 3 4 5 6 7 }
0,507, 1, {Collect 210} Join, {Collect 36}, {Collect 272}, {Collect 756}, {Collect 442}, {Collect 696}, {Collect 664}
1,210, 1, , , , , , ,
2,36, 1, , , , , , ,
3,272, 1, , , , , , ,
4,756, 1, , , , , , ,
5,442, 1, , , , , , ,
6,696, 1, , , , , , ,
7,664, 1, , , , , , ,
Wierzchołki: { 0 1 2 3 4 5 7 }
0,507, 1, Join, , , , , , {Collect 664}
1,210, 1, , , , {Collect 756}, , ,
2,36, 1, , , , , , ,
3,272, 1, , , , , , ,
4,756, 2, {Check 696}, , , , , ,
5,442, 1, , , , , , ,
6,696, 1, , , , , , ,
7,664, 1, , , , , , ,
Wierzchołki: { 1 2 3 4 5 6 7 }
0,507, 1, Join {Check 756}, , , Ref, , , {Collect 664}
1,210, 1, , , , , , ,
2,36, 1, , , , , , ,
3,272, 1, , , , , , ,
4,756, 2, , , , , , ,
5,442, 1, , , , , , ,
6,696, 1, , , , , , ,
7,664, 1, , , , , , ,
Wierzchołki: { 0 1 2 4 5 6 7 }
0,507, 1, {Check 756}, , , Ref, , ,
1,210, 1, , , , , , ,
2,36, 1, , , , , , ,
3,272, 1, , , , , , ,
4,756, 2, , , , , , ,
5,442, 1, , , , , , ,
6,696, 1, , , , , , ,
7,664, 1, , , , , , ,
Wierzchołki: { 0 1 2 3 4 5 6 }
0,507, 1, , , , , , ,
1,210, 1, , , , , , ,
2,36, 1, , , , {Collect 756}, , ,
3,272, 1, , , , , , ,
4,756, 3, , , , , , ,
5,442, 1, , , , , , ,
6,696, 1, , , , , , ,
7,664, 1, , , , , , ,
Wierzchołki: { 0 1 2 3 4 5 6 }
0,507, 1, , , , , , ,
1,210, 1, , , , , , ,
2,36, 1, , , , , , ,
3,272, 1, , , , {Collect 756}, , ,
4,756, 4, , , , , , ,
5,442, 1, , , , , , ,
6,696, 1, , , , , , ,
7,664, 1, , , , , , ,
Wierzchołki: { 0 1 3 4 5 6 7 }
0,507, 1, , , , , , ,
1,210, 1, , , , , , ,
2,36, 1, , , , , , ,
3,272, 1, , , , , , ,
4,756, 5, , , , , Join, ,
5,442, 1, , , , , , ,
6,696, 1, , , , , , ,
7,664, 1, , , , , , ,
Wierzchołki: { 0 1 3 4 5 6 7 }
0,507, 1, , , , , , ,
1,210, 1, , , , , , ,
2,36, 1, , , , , , ,
3,272, 1, , , , , , ,
4,756, 6, , , , , , Join,
5,442, 1, , , , , , ,
6,696, 1, , , , , , ,
7,664, 1, , , , , , ,
Wierzchołki: { 0 1 2 3 4 5 7 }
0,507, 1, , , , , , ,
1,210, 1, , , , , , ,
2,36, 1, , , , , , ,
3,272, 1, , , , , , ,
4,756, 7, , , , , , , Join
5,442, 1, , , , , , ,
6,696, 1, , , , , , ,
7,664, 1, , , , , , ,
wybrano lidera: 756
Wierzchołki: { 0 1 2 4 5 6 7 }
0,507, 1, , , , , , ,
1,210, 1, , , , , , ,
2,36, 1, , , , , , ,
3,272, 1, , , , , , ,
4,756, 8, , , , , , ,
5,442, 1, , , , , , ,
6,696, 1, , , , , , ,
7,664, 1, , , , , , ,

BIN
dodatkowe/krok1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
dodatkowe/krok2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
dodatkowe/krok3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
dodatkowe/krok4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
dodatkowe/krok5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB