Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Kruskalův algoritmus - implementace

1,297 views

Published on

Kruskalův algoritmus pracuje na principu spojování hran s nejmenším ohodnocením, dokud tyto hrany nespojí všechny vrcholy v grafu. Takto vzniklý podgraf nazýváme kostrou grafu.

Implementace Kruskalova algoritmu včetně dokumentace a hlavně teoretického rozboru.

Published in: Science
  • Be the first to comment

  • Be the first to like this

Kruskalův algoritmus - implementace

  1. 1. Ivo Kostecký, kos0148 projekt předmětu Matematika pro zpracování znalostí na VŠB-TUO Implementace: Kruskalův algoritmus
  2. 2. V ohodnocených grafech určete všechny nejlevnější kostry grafu pomocí Kruskalova algoritmu. Zadání
  3. 3. Neumím si přečíst zadání… V ohodnocených grafech určete všechny nejlevnější kostry grafu pomocí Kruskalova algoritmu. …zpracoval jsem: V ohodnocených grafech jsem určil první nejlevnější kostru grafu pomocí Kruskalova algoritmu. Problém
  4. 4. Kostra grafu V teorii grafů je kostra souvislého grafu G takový podgraf souvislého grafu G na množině všech jeho vrcholů, který je stromem. Pojmy
  5. 5. Kdy má smysl hledat kostru? • Graf je souvislý (projekt umí najít i více koster ve více grafech, pokud je zdroj nespojitý) • Graf je neorientovaný (případnou orientaci zahazuje) • Graf je vážený (hrany mají kladné ohodnocení) Pojmy
  6. 6. Proč hledat minimální kostru v grafových úlohách? Motivace Návrh elektrické sítě Máme k dispozici seznam odběrných míst a chceme je propojit tak, abychom využili co nejmenší množství drátů.
  7. 7. Proč hledat minimální kostru v grafových úlohách? Motivace Smyčky v počítačových sítích Spanning Tree Protocol (v překladu protokol kostry grafu) je v informatice název pro síťový protokol, který v ethernetových sítích odstraňuje smyčky na druhé vrstvě ISO/OSI modelu.
  8. 8. Princip algoritmu
  9. 9. Myšlenka implementace algoritmu 1.Seřadit hrany podle ceny od nejmenší po největší 2.Nastavit všem vrcholům stejnou doménu značící nezařazenost 3.Procházet všechny hrany a u jejich vrcholů sledovat, zda splňují podmínky a zpracovat je (viz dále) • pokud jsou oba vrcholy nové • pokud je první vrchol nový a druhý již existuje • pokud je druhý vrchol nový a první již existuje • pokud již existují oba dva a mají stejné domény • pokud již existují oba dva a mají různé domény Výsledkem je • seznam hran splňující podmínku acykličnosti a nejmenší metriky • seznam vrcholů s doménami podle grafových souvislostí C#
  10. 10. Datové struktury 1 C# Vrchol Hrana Graf
  11. 11. Implementace algoritmu public List<Graph> Kruskal() { List<Graph> grafy = new List<Graph>(); //seznam koster nalezených v grafech List<Vertex> pouzitevrcholy = new List<Vertex>(); //pouzite vrcholy jednotlivych grafu List<Edge> pouzitehrany = new List<Edge>(); //pouzite hrany jednotlivych grafu Dictionary<int, List<Vertex>> domains = new Dictionary<int, List<Vertex>>(); //seznam vrcholů roztřízený podle domén Seznamhran.Sort(new EdgeComparer()); //serazeni hran podle ceny foreach (Vertex v in Seznamvrcholu) //reset domén při opakovaném běhu { v.Domain = -1; } int domainCounter = 0; //čítač nesouvislých domén foreach (Edge hrana in Seznamhran) //pridavani hran do komponent { //viz podmínky dříve, viz implementace dále } … C#
  12. 12. Všimněte si využití existujících struktur: List<Edge> pouzitehrany = new List<Edge>(); Dictionary<int, List<Vertex>> domains = new Dictionary<int, List<Vertex>>(); Seznam má časovou složitost O(n) – lineární Slovník má časovou složitost O(1) - konstatní Výhodné pro rychlý běh programu! Datové struktury 2
  13. 13. „kruskalizace“ hran a vrcholů C# pokud ani jeden vrchol ještě nebyl zpracován *Pardon, momentálně trpím obdobím psaním komentářů ve dvou jazycích.
  14. 14. „kruskalizace“ hran a vrcholů C# pokud byl dosud zpracován pouze jeden vrchol z hrany
  15. 15. „kruskalizace“ hran a vrcholů C# pokud již existují oba dva a mají stejné domény pokud již existují oba dva a mají různé domény Dochází ke spojování dvou domén do sebe Hrana je duplicitní nebo by vytvořila cyklus, proto se nepřidá int domainSmaller = (domains[1.].Count < domains[2.].Count) ? 1. : 2.; //určí ve které doméně je méně vrcholů int domainGreater = (domains[1.].Count >= domains[2.].Count) ? 1. : 2.; //určí ve které doméně je více vrcholů foreach (Vertex bod in domains[domainSmaller]) { bod.Domain = domainGreater; } //rename domain in transfered vertexes domains[domainGreater].AddRange(domains[domainSmaller]); //move domains[domainSmaller].Clear(); //remove unused pouzitehrany.Add(hrana); //finally add edge
  16. 16. Pokračování implementace algoritmu … //pro graf potřebuji mít seznamy hran a vrcholů v samostatných listech, vytvořím si předobraz (zatím je mám všechny Dictionary<int, List<Vertex>> domenovevrcholy = new Dictionary<int, List<Vertex>>(); Dictionary<int, List<Edge>> domenovehrany = new Dictionary<int, List<Edge>>(); //inicialializace seznamů podle příslušnosti k doménám foreach (int i in domains.Keys) { if (domains[i].Count == 0) { continue; } domenovevrcholy.Add(i, new List<Vertex>()); domenovehrany.Add(i, new List<Edge>()); } //rozřazení vrcholů podle domén do slovníku, klíčem je ID domény foreach (Vertex vrchol in pouzitevrcholy) { domenovevrcholy[vrchol.Domain].Add(vrchol); } … C#
  17. 17. Dokončení implementace algoritmu … //rozřazení hran podle domén do slovníku, klíčem je ID domény prvního vrcholu foreach (Edge hrana in pouzitehrany) { if (hrana.Vertex1.Domain != hrana.Vertex2.Domain) //pouze pokud by něco dříve selhalo { continue; } domenovehrany[hrana.Vertex1.Domain].Add(hrana); } //podle toho, kolik skupin vrcholů je, tolik je nesouvislých grafů, ty je třeba vytvořit foreach (int i in domenovevrcholy.Keys) { grafy.Add(new Graph(domenovevrcholy[i], domenovehrany[i])); } return grafy; //konec kruskalova algoritmu } C#
  18. 18. Výsledné GUI
  19. 19. Vyhodnocení • Algoritmus již dle mého nelze jednoduše urychlit • Metoda má na délku běhu celé úlohy minimální význam (načítání vstupních dat je mnohem pomalejší)
  20. 20. • CSV ve formátu, který popisuje tabulka • Očekáván velký rozsah (zbytečně) • Nedefinovány platné vstupy Způsob vyhodnocení Zdroj dat • Korektnost výstupu (nedosažena) • délka běhu v závislosti na vstupních datech
  21. 21. Možnost opravy 1 Najde další nejlevnější kostry pomocí Kruskalova algoritmu Nový proces (fork) si zkopíruje obsah paměti, proto si graf dále „žije vlastním životem“
  22. 22. Možnost opravy 2 Zcela nezávislá možnost je implementace Jarníkova algoritmu
  23. 23. Děkuji za pozornost Text této prezentace na blog.kostecky.cz Zdrojový kód na www.kostecky.cz/archiv/mpzz-kruscal-source.zip

×