This shows you the differences between two versions of the page.
sda-aa:laboratoare:10 [2021/02/28 23:31] 127.0.0.1 external edit |
sda-aa:laboratoare:10 [2021/05/23 21:21] (current) cristian.rusu [7. Referințe] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 9: Grafuri - Drumuri de cost minim ===== | + | ===== Laboratorul 9: Arbori minimi de acoperire ===== |
+ | ==== 1. Obiectivele laboratorului ==== | ||
+ | |||
+ | * Înțelegerea conceptului de arbore minim de acoperire | ||
+ | * Înțelegerea implementării algoritmilor care determină acest arbore | ||
+ | * Înțelegere aplicațiilor practice în: | ||
+ | * rețele de calculatoare: obținerea unui cost redus la interconectarea mai multor stații (ex: protocolul STP folosit în LAN-uri) | ||
+ | * prelucrarea de imagine: segmentarea cadrelor (ex: folosită în analiza medicală) | ||
+ | * în clustere: determinarea unei topologii de comunicare, în cazul în care topologia nu era una regulată(arbore, inel) | ||
+ | |||
+ | ==== 2. Introducere ==== | ||
+ | |||
+ | === 2.1 Conexitate în grafuri === | ||
+ | |||
+ | **Componentă conexă** | ||
+ | O componentă conexă a unui graf neorientat este un subgraf cu următoarele proprietăţi: | ||
+ | |||
+ | - oricare două noduri din acest subgraf sunt conectate(există un lanţ între ele) | ||
+ | - orice nod din acest subgraf NU este conectat cu niciun nod din afara subgrafului(nodurile din componentă fac muchii numai cu alte noduri din componentă) | ||
+ | |||
+ | <note important>Orice graf neorientat are cel puţin o componentă conexă.</note> | ||
+ | |||
+ | **Graf neorientat conex** | ||
+ | |||
+ | Un graf neorientat este numit conex dacă are o singură componentă conexă. | ||
+ | |||
+ | <note tip>Putem explora toate nodurile dintr-un graf neorientat conex dintr-o singură parcurgere a grafului(DFS sau BFS).</note> | ||
+ | |||
+ | **Graf orientat slab conex** | ||
+ | |||
+ | Fie graful neorientat asociat unui graf orientat obţinut prin înlocuirea tuturor arcelor cu muchii. Atunci un graf orientat este slab conex dacă graful neorientat asociat acestuia este conex. | ||
+ | |||
+ | **Graf orientat tare conex** | ||
+ | |||
+ | Un graf orientat este tare conex dacă există drum între oricare două noduri, atât într-un sens, cât şi în celelalt. | ||
+ | |||
+ | Se pot defini similar componentele slab conexă şi tare conexă. | ||
+ | |||
+ | |||
+ | === 2.2 Arborele văzut ca graf === | ||
+ | |||
+ | Folosind noţiunile de mai sus, putem spune că un arbore este un graf(pentru simplitate, fie neorientat) conex şi cu număr minim de muchii, prin urmare, aciclic. | ||
+ | |||
+ | |||
+ | === 2.3 Arbore vs. pădure de acoperire === | ||
+ | |||
+ | Pentru un graf neorientat, construirea unui arbore de acoperire(nu neapărat de cost minim) presupune construirea unui arbore care să fie graf parţial(să acopere toate nodurile). | ||
+ | |||
+ | Acest lucru este posibil numai dacă graful este conex. În caz contrar, se poate construi câte un arbore de acoperire pentru fiecare componentă conexă a grafului, spunând că se construieşte o pădure de acoperire pentru graf. | ||
+ | |||
+ | === 2.4 Arbore de cost minim === | ||
+ | |||
+ | Dacă fiecare muchie dintr-un arbore are un cost(o pondere), atunci costul arborelui este dat de suma costurilor muchiilor ce formează arborele. | ||
+ | |||
+ | Dacă, pe acelaşi principiu, fiecare muchie dintr-un graf are un cost, atunci alegerea unui arbore minim de acoperire presupune alegerea unui arbore care să acopere toate nodurile şi care să folosească muchiile ce dau suma costurilor minimă. | ||
+ | |||
+ | |||
+ | ==== 3. Algoritmul lui Kruskal ==== | ||
+ | |||
+ | Algoritmul lui Kruskal este un algoritm în teoria grafurilor care găsește arborele parțial de cost minim pentru un graf conex ponderat. | ||
+ | |||
+ | Cu alte cuvinte, găsește submulțimea muchiilor care formează un arbore care include toate vârfurile și care este minimizat din punct de vedere al costului. | ||
+ | |||
+ | Dacă graful nu este conex, atunci algoritmul găsește o pădure parțială de cost minim (un arbore parțial de cost minim pentru fiecare componentă conexă). Algoritmul lui Kruskal este un exemplu de algoritm greedy. | ||
+ | |||
+ | |||
+ | <note tip>Algoritmul funcționează în felul următor: | ||
+ | * creează o pădure F (o mulțime de arbori), unde fiecare vârf din graf este un arbore separat | ||
+ | * creează o mulțime S care conține toate muchiile din graf | ||
+ | * atât timp cât S este nevidă | ||
+ | * elimină o muchie de cost minim din S | ||
+ | * dacă acea muchie conectează doi arbori distincți, atunci adaugă muchia în pădure, combinând cei doi arbori într-unul singur | ||
+ | * altfel, ignoră muchia | ||
+ | </note> | ||
+ | |||
+ | |||
+ | {{:sda-aa:laboratoare:kruskal.gif?600|}} | ||
+ | |||
+ | ==== 4. Exerciții laborator ==== | ||
+ | |||
+ | - Vi s-a asignat rolul de nou coordonator al departamentul de rețelistică al companiei Koka Kola (Pebsi petru cei cărora nu le place Kola). Sediul companiei are arondate N-1 sucursale, iar voi trebuie să asigurați conectivitate între toate locațiile folosind o lungime minimă de fibră optică, lucru care duce implicit la reducerea costurilor totale.<code> | ||
+ | # explicatii format | ||
+ | # n=numar varfuri m=numar muchii | ||
+ | # m randuri, cate unul pentru fiecare muchie: start end cost | ||
+ | 8 13 | ||
+ | 1 2 4 | ||
+ | 1 3 9 | ||
+ | 1 4 1 | ||
+ | 1 6 7 | ||
+ | 2 3 12 | ||
+ | 2 4 4 | ||
+ | 3 8 13 | ||
+ | 4 5 7 | ||
+ | 4 6 8 | ||
+ | 5 6 3 | ||
+ | 5 7 6 | ||
+ | 5 8 5 | ||
+ | 7 8 2 | ||
+ | </code> | ||
+ | - Rulați algoritmul Kruskal pe graful cu trenuri. | ||
+ | |||
+ | ==== 5. Probleme opționale, de interviu ==== | ||
+ | |||
+ | - Se dă un graf care coincide cu un arbore minim de acoperire. Verificaţi dacă, introducând o nouă muchie în graf, costul arborelui minim de acoperire se schimbă şi, dacă da, găsiţi muchia ce va fi scoasă. | ||
+ | - Se dă un graf care coincide cu un arbore minim de acoperire şi un vector(V) cu K noduri din graf. Care este costul minim al muchiilor pe care trebuie să le eliminaţi din graf pentru ca fiecare nod din vectorul V să se afle în altă componentă conexă. (Să nu existe drum între oricare două noduri din vectorul V). | ||
+ | - Se dă un graf care coincide cu un arbore minim de acoperire şi un nod auxiliar care formează doar două muchii. Verificaţi dacă folosirea nodului auxiliar pentru a conecta nodurile duce la un arbore de acoperire cu un cost mai mic. | ||
+ | |||
+ | ==== 6. Referințe ==== | ||
+ | |||
+ | - https://en.wikipedia.org/wiki/Minimum_spanning_tree | ||
+ | - https://en.wikipedia.org/wiki/Kruskal%27s_algorithm | ||
+ | - http://www.bogdanturcanu.ro/spanning-tree-protocol-stp/ | ||
+ | - https://en.wikipedia.org/wiki/Image_segmentation | ||