42
PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY BAKALÁŘSKÁ PRÁCE Vybrané grafové algoritmy 2014 Petr Pavelčík

Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHOKATEDRA INFORMATIKY

BAKALÁŘSKÁ PRÁCE

Vybrané grafové algoritmy

2014 Petr Pavelčík

Page 2: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Anotace

V této práci se budeme zabývat vybranými kapitolami z teorie grafů. Z grafovýchalgoritmů vybereme algoritmy hledání nejkratších cest v grafu, minimální kostragrafu, a vrcholové barvení grafů. Pro demonstraci jednotlivých algoritmů byla vy-tvořena aplikace přiložená k této práci.

Page 3: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Děkuji RNDr. Arnoštu Večerkovi za konzultace a trpělivé vedení při tvorbě tétopráce. Dále děkuji za podporu své rodině a přátelům, jmenovitě Petru Hrbkoviza neocenitelnou pomoc při tiskařských službách.

Page 4: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Obsah1. Úvod 8

2. Definice užitých pojmů 9

3. Algoritmy 123.1. Dijskrův algoritmus . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.1.1. Popis algoritmu . . . . . . . . . . . . . . . . . . . . . . . . 123.1.2. Pseudokód . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.1.3. Shrnutí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.2. Floyd-Warshallův algoritmus . . . . . . . . . . . . . . . . . . . . . 143.2.1. Popis algoritmu . . . . . . . . . . . . . . . . . . . . . . . . 143.2.2. Pseudokód . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.2.3. Shrnutí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.3. Kruskalův algoritmus . . . . . . . . . . . . . . . . . . . . . . . . . 183.3.1. Popis algoritmu . . . . . . . . . . . . . . . . . . . . . . . . 183.3.2. Pseudokód, část I. . . . . . . . . . . . . . . . . . . . . . . 193.3.3. Pseudokód, část II. . . . . . . . . . . . . . . . . . . . . . . 203.3.4. Shrnutí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.4. Algoritmy pro vrcholové barvení grafu . . . . . . . . . . . . . . . 233.5. Sousedské barvení vrcholů . . . . . . . . . . . . . . . . . . . . . . 24

3.5.1. Popis algoritmu . . . . . . . . . . . . . . . . . . . . . . . . 243.5.2. Pseudokód . . . . . . . . . . . . . . . . . . . . . . . . . . . 243.5.3. Shrnutí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.6. Barvení pomocí nezávislých množin . . . . . . . . . . . . . . . . . 263.6.1. Popis algoritmu, část I. . . . . . . . . . . . . . . . . . . . . 263.6.2. Popis algoritmu, část II. . . . . . . . . . . . . . . . . . . . 273.6.3. Pseudokód . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.6.4. Shrnutí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3.7. Barvení slepováním vrcholů . . . . . . . . . . . . . . . . . . . . . 293.7.1. Popis algoritmu . . . . . . . . . . . . . . . . . . . . . . . . 293.7.2. Pseudokód . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.7.3. Shrnutí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.8. Exaktní barvení . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.8.1. Popis algoritmu . . . . . . . . . . . . . . . . . . . . . . . . 313.8.2. Pseudokód . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.8.3. Shrnutí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4. Uživatelská příručka 344.1. Spuštění . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344.2. Okno Aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.2.1. Komponenta grafu . . . . . . . . . . . . . . . . . . . . . . 34

4

Page 5: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

4.2.2. Menu Soubor . . . . . . . . . . . . . . . . . . . . . . . . . 344.2.3. Menu Úpravy . . . . . . . . . . . . . . . . . . . . . . . . . 344.2.4. Menu Nápověda . . . . . . . . . . . . . . . . . . . . . . . . 354.2.5. Ovládací panel demonstrace . . . . . . . . . . . . . . . . . 354.2.6. Možnosti sekce Zobrazit . . . . . . . . . . . . . . . . . . . 354.2.7. Sekce Algoritmus . . . . . . . . . . . . . . . . . . . . . . . 354.2.8. Ovládací tlačítka . . . . . . . . . . . . . . . . . . . . . . . 364.2.9. Zpoždění . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.2.10. Postup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

4.3. Okno Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.3.1. Menu Soubor . . . . . . . . . . . . . . . . . . . . . . . . . 374.3.2. Menu Úpravy . . . . . . . . . . . . . . . . . . . . . . . . . 374.3.3. Ovládací panel editoru . . . . . . . . . . . . . . . . . . . . 374.3.4. Informační panel editoru . . . . . . . . . . . . . . . . . . . 374.3.5. Dialog Náhodný graf . . . . . . . . . . . . . . . . . . . . . 37

4.4. Prográmatorská část . . . . . . . . . . . . . . . . . . . . . . . . . 384.4.1. Tvorba aplikace . . . . . . . . . . . . . . . . . . . . . . . . 384.4.2. Třídy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

Závěr 40

Reference 41

A. Obsah přiloženého CD 42

5

Page 6: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Seznam obrázků1. Hranově ohodnocený graf. . . . . . . . . . . . . . . . . . . . . . . 92. Nezávislá množina vrcholů. . . . . . . . . . . . . . . . . . . . . . . 103. Kořen stromu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114. Demonstrace Dijskrova algoritmu. . . . . . . . . . . . . . . . . . . 135. Informace v postupu. . . . . . . . . . . . . . . . . . . . . . . . . . 136. Demonstrace Floyd-Warshallova algoritmu. . . . . . . . . . . . . . 167. Nejkratší cesta z vrcholu 7 do vrcholu 8. . . . . . . . . . . . . . . 178. Tabulka nejkratších cest. . . . . . . . . . . . . . . . . . . . . . . . 179. Kruskalův algoritmus, výchozí graf. . . . . . . . . . . . . . . . . . 2110. Kruskalův algoritmus, výpočet dokončen. . . . . . . . . . . . . . . 2211. Vrcholově obarvený graf. . . . . . . . . . . . . . . . . . . . . . . . 2312. Vrcholově barvený graf. . . . . . . . . . . . . . . . . . . . . . . . . 2613. Barvení slepováním vrcholů, postup. . . . . . . . . . . . . . . . . 3014. Okno aplikace, výpočet dokončen. . . . . . . . . . . . . . . . . . . 3515. Okno editoru, úprava grafu. . . . . . . . . . . . . . . . . . . . . . 36

6

Page 7: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Seznam tabulek

7

Page 8: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

1. ÚvodCílem této práce je vytvořit aplikaci, která bude demonstrovat průběh

vybraných algoritmů pracujících s daty ve formě grafů. Součástí je editorpro pro sestavení a editaci grafu splňující funkčnost pro potřeby vybranýchalgoritmů (například možnost změny ohodnocení hran pro Dijskrův, Kruskalůva Floyd-Warshallův algoritmus). Graf vytvořený v editoru bude možné uložit azpětně načíst ve vhodném formátu. V aplikaci bude možné řešit vybrané úlohy salgoritmy s polynomiální složitostí (nalezení nejkratší cesty, hledání minimálníkostry) i úlohy obtížnější (barvení grafu).

Nejprve si zadefinujeme pojmy užívané v kapitolách věnujících se algoritmům.Následují konkrétní algoritmy, jejich využití, řešení a výsledky.

V uživatelské příručce si popíšeme význam jednotlivých komponent aplikacea editoru. Prográmátorská část se věnuje užitým technologiím a popisůmjednotlivých tříd.

8

Page 9: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

2. Definice užitých pojmůÚvodem si zavedeme několik pojmů, které budeme používat v dalších částech

této práce. V následujících kapitolách budeme pracovat s neorientovanými grafy.Definice vycházejí ze zdrojů [2] [3].

Definice 2.1. Vrchol v grafu označuje nějaký objekt. Například rodinný stromse dá převést do podoby grafu, kde jednotlivé vrcholy budou představovatrodinné příslušníky. Nejstarší členové rodiny (např. prarodiče) zakreslime donejvyšší části grafu. Potomci se vždy zakreslují pod jejich rodiče (v našempřípadě budeme stromy takto kreslit). Vrcholy budeme v této práci zakreslovatpomocí kružnic.

Definice 2.2. Hrana Vyjadřuje vztah mezi vrcholy. Pokud navážeme na příkladz předhozí definice, hrany mohou vyjadřovat vztah rodič - potomek. Kdyžkreslíme hranu má začátek i konec v nějakém vrcholu.

Definice 2.3. Graf G(V,E) je struktura ⟨V,E⟩ složená z konečné množinyvrcholů V = {v1, v2, . . . , vn} a konečné množiny hran E = {e1, e2...en}. Každouhranu ei tvoří nějaké dva vrcholy u, v ∈ V .

Definice 2.4. Hranově ohodnocený graf je dvojice (G, c), kde G jeneorientovaný graf G(V,E) a c budeme chápat jako zobrazení

c : E → R+

10

9

6

2

5

5

Obrázek 1. Hranově ohodnocený graf.

Definice 2.5. Sled v grafu G(V,E) je posloupnost

v0, e1, v1, e2, . . . , en, vn

vi ∈ V jsou vrcholy, ej ∈ E jsou hrany.Pro hrany platí: ei = {vi−1, vi} pro i ∈ {1, . . . , n}

9

Page 10: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Definice 2.6. Cesta v grafu G(V,E) je sled, ve kterém se neopakuje žádnývrchol.

Definice 2.7. Cena cesty P v hranově ohodnoceném grafu je∑e∈P

c(e)

Definice 2.8. Nejkratší cesta. Je dán graf G(V,E). Víme, že u, v ∈ V . Nejkrašícesta P v grafu G z vrcholu v do vrcholu u je cesta s nejmenší cenou sumyhranového ohodnocení.

Definice 2.9. Kružnice v grafu G(V,E) je cesta, která vede z vrcholu vi přeshranu ei taková, že existuje cesta do vrcholu vi přes hranu ej, přicemž ei ̸= ej.

Definice 2.10. Podgraf grafu G(V,E) je graf G′(V ′, E ′):

V ′ ⊆ V

E ′ ⊆ E

Graf G′ obsahuje jen hrany ei = {u, v} ∈ E, kde u, v ∈ V ′.

Definice 2.11. Souvislý graf G(V,E) označuje strukturu ve které platí, že∀vi ∈ V existuje cesta P do ∀vj ∈ V, tak že vi ̸= vj.

Definice 2.12. Úplný graf. Je dán graf G(V,E). Pokud existuje hrana{u, v} ∈ E pro ∀u, v ∈ V řekneme, že graf G je úplný (u ̸= v).

Definice 2.13. Nezávislá množina vrcholů V ′ ∈ V v grafu G(V,E) je kdyžplatí ∀u, v ∈ V ′, že hrana {u, v} ⊈ E

Obrázek 2. Nezávislá množina vrcholů.

Definice 2.14. Maximální nezávislá množina je nezávislá množina V ′max ⊆ V

ze všech nezávislých množin V ′, které existují v množině vrcholů V největší.Maximální nezávislou množinu můžeme vidět na obrázku 2.

10

Page 11: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

|V ′max| ≥ ∀|V ′| ∈ V

Definice 2.15. Chromatické číslo grafu je číslo označující nejmenší počet barevpotřebných k vrcholovému obarvení grafu.

Definice 2.16. Strom je souvislý neorientovaný graf bez kružnic.

Definice 2.17. Kořen stromu G(V,E) je vrchol r ∈ V , který má v grafuzvlaštní postavení. Nemá žádného předchůdce a nacházi se zde pouze jeden.

Obrázek 3. Kořen stromu.

Definice 2.18. Kořenový strom je dvojice (G, r), kde G = (V,E) je stroma r ∈ V je kořen.

Definice 2.19. Variace bez opakování z n prvků je uspořádaná k-tice složená zprvků n, kde se každý z těchto prvků vyskytuje nejvýše jednou.

Definice 2.20. Variace s opakováním z n prvků je uspořádaná k-tice složená zprvků n, kde dovolujeme, aby se jeden prvek opakoval nejvýše k-krát.

Definice 2.21. Výška stromu odpovídá počtům úrovní od kořene k listům.Úrovně ve stromu odpovídá postupu o jeden uzel níže ve stromové struktuře.Jako list označujeme vrchol, ze kterého nevede žádná hrana.

Definice 2.22. Minimální kostra grafu souvislého grafu G(V,E) je podgrafG′(V,E ′), kde množina vrcholů G′ a G je schodná. Pro množinu hran platíE ′ ⊆ E a |E ′| = |V | − 1, tak že graf zůstane souvislý. Minimální kostra grafumá cenu cesty P ′ ze všech možných cest P v grafu G nejmenší.

U vybraných algoritmů bude zmíněn pojem asymptotická složitost algoritmů.Znalost se u čtenáře předpokládá.

11

Page 12: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3. AlgoritmyV této sekci se budeme zabývat konkrétními algoritmy.

3.1. Dijskrův algoritmus

Tento algoritmus vymyslel nizozemský informatik Edsger Dijkstra v roce 1956.Algorimus nalezne všechny nejkratší cesty z vybraného vrcholu v kladně hranověohodnoceném grafu. [6]

3.1.1. Popis algoritmu

Následující sekce čerpá ze zdroje [5].

Hranové ohodnocení grafu definujeme pomocí následujícího zobrazení

f : E → R+

Na vstupu algoritmu je dán startovní uzel s ∈ V . Algoritmus pracuje s mno-žinou A, která obsahuje doposud nenavštívené vrcholy a množinou N, do kterépřesouvá již navštívené vrcholy.

Na výstupu máme ∀v ∈ V \{s} délku nejkratší cesty z s do v, značíme t(v).

t(v) = minimum{t(u)|u ∈ A}

3.1.2. Pseudokód

Jednotlivé kroky algoritmu můžeme shrnout do následujícího pseudokódu:

1. Přiraď do množiny A všechny vrcholy z množiny vrcholů V

2. t(s) = 0

3. pro v ∈ V \{s} proved d(v) =∞

4. pokud neexistuje žádný vrchol v ∈ V , tak že t(v) ̸=∞ skonči

5. najdi nejmenší t(v) z vrcholů v ∈ A a ulož jej do m

6. N = {∀v ∈ A|t(v) = m}, odeber tyto vrcholy z A

7. ∀v ∈ N, ∀u ∈ A takové, že hrana {v, u} ∈ E provedeme:

jestliže t(v) + f(v, u) < t(u) potom:t(u) = t(v) + f(v, u), pokračuj bodem 4.

12

Page 13: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3.1.3. Shrnutí

Pro daný vrchol s ∈ V jsem schopni nalézt nejkratší cesty do všech jehovrcholů ∀v ∈ V \{s}. S použitím prioritní fronty vrcholů dosáhneme časové slo-žitosti O(|V |2). Ke třídění můžeme použít třídící algoritmus quicksort s časovousložitostí v nejhorším případě O(n2), kde n = |V |.

Obrázek 4. Demonstrace Dijskrova algoritmu.

Na obrázku je modrou hranicí zvýrazněn startovní vrchol. Doposud nenavští-vené vrcholy mají hodnotu ∞.

Obrázek 5. Informace v postupu.

13

Page 14: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3.2. Floyd-Warshallův algoritmus

Slouží k nalezení nejkratší cesty mezi libovolnými dvěma vrcholy grafu,tzv. „All shortesht path“ algoritmus. Budeme vycházet ze zdroje [4].

3.2.1. Popis algoritmu

Vstupen algoritmu je neorientovaný graf G(V,E) a hranové ohodnocení c:

c : E → Q

které je zobrazením přiřazující hranám grafu racionální hodnotu.1 Na začátku sivytvoříme dvě dvojrozměrné pole D,P o velikosti

|V | × |V |

Pro každé dva indexy vrcholů i, j ∈ {0 . . . |V | − 1} provedeme

D[i, j] =∞

P [i, j] =∞

Pro ∀{i, j} ∈ E uložíme hranové ohodnocení c({i, j}) na pozici i, j v poli Duchovávajícím délku nejkratší cesty z vrcholu i do j.

D[i, j] = c({i, j})

Při nalezení kratší cesty z vrcholu i do j přes nějaký vrchol h ∈ E ukládámehodnotu nejkratší cesty na pozici i, j v poli D.

D[i, j] = D[i, h] +D[h, j]

Zároveň si ukládáme do pole P informaci, přes který vrchol vede aktuální nejkratšícesta z vrcholu i do j.

P [i, j] = h

3.2.2. Pseudokód

Průběh algoritmu shrnuje následující pseudokód.

1Algoritmus nefunguje pro grafy se zápornými cykly. Záporný cyklus v grafu poznáme podlezáporné sumy hranového ohodnocení.

14

Page 15: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Algorithm 3.1. Floyd-Warshallův algoritmus, hledaní nejkratší cesty mezi libo-volnými dvěma vrcholy1: procedure FloydWarshall(G(V,E), c)2: Vytvoř dvojrozměrné pole D,P o velikosti n× n, kde n = |V |3: ∀i, j ∈ {0...n− 1} proveď D[i, j] =∞, P [i, j] =∞4: for all {u, v} ∈ E do5: D[i, j]← c({i, j})6: end for7: for k ← 0 to n− 1 do8: for i← 0 to n− 1 do9: for j ← 0 to n− 1 do

10: x← D[i, k] +D[k, j]11: if x < D[i, j] then12: D[i, j]← x13: P [i, j]← k14: end if15: end for16: end for17: end forreturn18: ⟨D,P ⟩19: end procedure

K sestavení nejkratší cesty mezi libovolnými dvěma vrcholy potřebujeme po-mocnou rekurzivní funkci:

Algorithm 3.2. Procedura FindPath z pole P zřetězí vrcholy vi, . . . , vj přeskteré vede nejkratší cesta z u do v

1: procedure FindPath(P, i, j)2: conn = P [i, j] ▷ spojující vrchol přes který povede cesta3: if conn =∞ then ▷ pokud cesta neexistuje4: return []5: else6: return FindPath(P, i, conn) + ⟨conn⟩ + FindPath(P, conn, j)7: end if8: end procedure

3.2.3. Shrnutí

Algoritmus ve třech vnořených cyklech porovná délku všech cest mezikaždými dvěma vrcholy grafu. Postupným zkoušením všech cest přes různévrcholy dochází ke zlepšování výsledků doposud nejkratší nalezené cesty.

15

Page 16: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Pro ukládání informací o nějlepší nalazené cestě (s nejmenší cenou hran) vy-užíváme dvě dvojrozměrná pole P,D. Jejich velikost je |V |2. Paměťová složivostalgoritmu je O(|V |2). Ze třech vnořených cyklů algoritmu 3.1 můžeme odvodit ko-nečnou složitost O(|V |3). Algoritmus je výhodné použít pro malé vstupy (řádovětisíce).

Obrázek 6. Demonstrace Floyd-Warshallova algoritmu.

Na obrázku jsou zeleně vrcholy, mezi kterými se hledá cesta. Oranžově jevybarven spojující vrchol, přes který cestu hledáme.

16

Page 17: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Obrázek 7. Nejkratší cesta z vrcholu 7 do vrcholu 8.

Jiný příklad. V tabulce na diagonále porujeme červeně zvýrazněná pole se zá-pornými hodnotami. Tyto vrcholy jsou v záporném cyklu (zjistíme podle sloupcenebo řádku). Pokud přes ně povede cesta, procedura FindPath nedokáže skončit(cena cesty se opětovným průchodem přes vrchol neustále zlepšuje).

Obrázek 8. Tabulka nejkratších cest.

17

Page 18: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3.3. Kruskalův algoritmus

Nalezne minimální kostru hranově ohodnoceného grafu jak je definovaná včásti 2.22. Budeme vycházet ze zdroje [4].

3.3.1. Popis algoritmu

Vstupem algoritmu je ohodnocený neorientovaný graf G(V,E). Je dánohranové ohodnocení c : E → R+. Na výstupu je graf G′(V,E ′), který mámnožinu vrcholů stejnou jako graf G. Suma ohodnocení hran E ′ ⊆ E, odpovídápožadavkům na minimální kostru grafu.

V každém iteraci algoritmu tedy budeme do množiny E ′ přidávat hranu snejmenším ohodnocením c(e) a zároveň bude platit, že přidání této hrany domnožiny E ′ nevytvoří kružnici. 2.9.

Před spuštěním samotného algoritmu je vhodné provést následující:

• hrany nejprve setřídíme vzestupně2

• zvolíme efektivní způsob hledání k ružnice v grafu vytvořenímtzv. disjoint set structure.3

Kolekci disjunktních množin označíme S = {S1, S2 . . . Sn}, kde S1, S2 . . . Sn

jsou disjunktní množiny jednoznačně rozpoznatelné (nějakým) vybraným zá-stupcem. Jednotlivé množiny tvoří kořenové stromy. 2.18. Každý uzel uchováváukazatel na svého předka (parent) ve stromu. Kořenový uzel stromu odkazujesám na sebe. Hodnotou rank označujeme horní výšku podstromu generovanéhodaným vrcholem.

Nad disjoint set structure provádíme následující operace4:

MakeSet(x) přidá do kolekce novou množinu, jejímž prvkem je x

Union(x, y) v kolekci množin sjednotí množunu obsahující prvek x a množinuobsahující prvek y. Původní množiny obsahující prvky x, y jsou z kolekcemnožin osatraněny.

FindSet(x) vrací zástupce množiny obsahující prvek x z kolekce množin.

2Kvůli efektivitě můžeme zvolíme algoritmus s časovou složitostí O(n log n) např. Quicksort,Mergesort.

3Označuje kolekci disjunktních množin, z nichž je každou možné jednoznačně určit dle vy-braného zástupce (prvku) z této množiny. V případě Kruskalova algoritmu je můžeme zvolitlibovolný prvek. Volba zástupce je vždy jednoznačná, pokud jej nějaká operace nad disjoint setstructure nezmění.

4Argumenty operací označují vrcholy stromu.

18

Page 19: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Pseudokódem bychom mohli procedury zapsat takto:

3.3.2. Pseudokód, část I.

V této části si představíme práci se strukturou pro ukládání disjunktníchmnožin.

Algorithm 3.3. Procedury pracující se strukturou disjoint set1: procedure makeSet(x)2: x.parent← x3: x.rank ← 04: end procedure

5: procedure findSet(x)6: if x ̸= x.parent then7: x.parent← findSet(x.parent)8: end if9: return x.parent

10: end procedure

11: procedure union(x,z)12: rx ← findSet(x)13: ry ← findSet(y)14: if rx.rank > ry.rank then15: ry.parent← rx16: else17: rx.parent← ry18: if ry.rank = rx.rank then19: ry.rank ← ry.rank + 120: end if21: end if22: end procedure

V proceduře findSet hledáme kořen směřem od vrcholu ke kořenu. Její šloži-tost je tedy v nejhorším případě O(n), kde n označuje velikost množiny vrcholůprocházeného stromu. Procedura findSet je nejsložitější operací, která budenad strukturou disjoint set structure prováděna. V jednotlivých proceduráchprovádíme operace, které zajistí, že strom nebude příliš vysoký.

Procedura findSet nalezne kořen stromu do kterého patří prvek x, který jejjejím argumentem. Zároveň procedura findSet sníží výšku stromu změnou rodičevšech procházených vrcholů na nalezený kořen stromu.

19

Page 20: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Procedura union sjednotí dvě množiny připojením nižšího stromu jakopotomka vyššího stromu. Procedura mění rank stromu pouze tehdy, když majístromy stejnou výšku. Můžeme pozorovat, že po připojení takového stromu podkořen stromu se stejnou výškou bude výška nově vzniklého stromu o jedna větší.

Na začátku Kruskalova algoritmu vytvoříme kolekci jednoprvkových množin,kde prvky představují vrcholy grafu. Přidání hrany do řešení, v průběhu algo-ritmu znamená sjednocení dvou množin obsahující vrcholy, které tvoří vybranouhranu.K testování vzniku kružnice voláme proceduru findSet na oba vrcholy tvo-řící hranu. Pokud se kořenové vrcholy vrácené procedurou findSet liší, hrana patřído řešení.

3.3.3. Pseudokód, část II.

Popíšeme si kroky algoritmu.

1. Vytvoříme prioritní frontu hran Q. Frontu můžeme reprezentovat jako se-třízené pole. Hrany jsou podle jejich ohodnocení c(e) setříděny vzestupně.

2. Vytvoříme si pole A jehož velikost je rovna |V |. Každý prvek pole obsahujepoložky rank a parent. Položka rank v sobě nese informaci o maximálníhloubce podstromu vrcholu. Položka parent nese odkaz na předchůdce (vr-cholu ve stromové struktuře). Prvek A[i] odpovídá vrcholu i.

3. Inicializujeme jednoprvkové komponenty grafu zavoláním makeSet(A[i])pro i ∈ {0, 1...|V − 1|}

4. Vytvoříme prázdnou množinu E ′.

5. Dokud nemáme kostru grafu, tedy |E ′| < |V | − 1 provedeme v cyklu:

odebrat z Q hranu {u, v}pokud findSet(A[u]) ̸= findSet(A[v]) potom

sjednotit E ′ ∪ {{u, v}}provést union(A[u], A[v])

6. konec cyklu

7. vrátit minimální kostru grafu (V,E ′)

20

Page 21: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3.3.4. Shrnutí

Složitost setřídění množiny hran je O(|E| log |E|), vytvoření pole A má slo-žitost O(|V |). Počet operací prováděných nad disjoint set structure je v nej-horším případě lineární vzhledem k |E|. Operace představují činnost procedurymakeSet jsou zanedbatelné. Algoritmus vyžaduje souvislý graf, pro který platí|E| >= |V | − 1. Výsledná složitost algoritmu je O(|E|log|E|).

Před spuštěním vypadá graf v sekci demonstrace následovně:

Obrázek 9. Kruskalův algoritmus, výchozí graf.

Po skončení výpočtu Kruskalova algoritmu dostáváme minimální kostru grafu.

21

Page 22: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Obrázek 10. Kruskalův algoritmus, výpočet dokončen.

22

Page 23: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3.4. Algoritmy pro vrcholové barvení grafu

Barvení vrcholů grafu se používá při přidělování omezeného množstvíprostředků. V informatice vrcholové barvení můžeme využít k řešení problémuvyhýbání se uváznutí (deadlock). Jiným příkladem je přidělování vzdušnéhoprostoru při dodržení pravidel letového provozu aerolinií. Barvení grafu lze takévyužít k řešení hry Sudoku.

V následujících kapitoly čerpají ze zdrojů [3][2].

Vrcholové barvení pro graf G(V,E) můžeme zavést jako následující zobrazení:

col : V → C takové, že pro všechny hrany {v, u} ∈ E platí col(v) ̸= col(u)

kde množina C představuje kolekci barev.

Obrázek 11. Vrcholově obarvený graf.

Vrcholové baverní je NP-úplný problém.2 V praxi se k barvení grafu použivajíheuristické algoritmy, které nemusejí ve všech připadech vracet optimalní řešení.Představíme si rovněž exaktní algoritmus pro barvení grafu v kapitole 3.8.

2NP označuje třídu problému, jejichž časová složitost není polynom (např. n!). Další třídouproblému je P, která označuje prakticky řešitelné problémy s polynominální složitostí.

23

Page 24: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3.5. Sousedské barvení vrcholů

Představíme si první heuristický algoritmus barvení vrcholů grafu. Tento al-goritmus obarvuje vrcholy na základě informací o počtu a aktuálním obarvenísousedů.

3.5.1. Popis algoritmu

Na počátku nastavíme aktuální použitou barvu na nula color = 0. Následujícíkroky provádíme v cyklu:

Vytvoříme množinu doposud neobarvených vrcholů. Pokud tato množina ob-sahuje více než jeden uzel, provedeme následující filtraci:

1. Vytvoříme množinu vrcholů, pro které platí, že mají množinu sousedníchvrcholů obarvenou co největším počtem různých barev (toto číslo označmer). Pokud není množina jednoprvková, tedy více vrcholů je obarveno různýmpočetem barev r, pokračujeme ve filtraci 2.

2. Vytvoříme množinu vrcholů, které mají největší počet neobarvených sou-sedů (označme jako číslo w). Pokud tato množina není jednoprvková, zvo-líme libovolný vrchol.

Předchozími kriterii prošel jen jeden uzel, označíme jej u.

V další části algoritmu najdeme nejnižší barvu c, kterou obarvíme vrchol u.Barvou c nesmí být obarven žádný ze sousedů vrcholu u. Vrchol u obarvíme:col(u) = c. Pokud jseme vybrali doposud nepoužitou barvu, aktualizujemehodnotu color = c.

Pokračujeme v cyklu, dokud neobarvíme všechny vrcholy grafu. Hodnota colorje po skončení algoritmu rovna početu barev, kterými je graf obarven.

3.5.2. Pseudokód

24

Page 25: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Algorithm 3.4. Sousedské barvení grafu1: procedure neighbourColoring(graph)2: color = 03: while uncoloredV ertices(graph) > 0 do ▷ dokud není obarven graf4: H ← getUncoloredV ertices(graph) ▷ vybereme neobarvené vrcholy5: u← filterUncoloredV ertices(H) ▷ vyfiltrujeme uzel pro barvení6: c = selectColor(color) ▷ vybereme nejmenší možnou barvu7: col(u) = c ▷ obarvíme uzel8: if c > color then9: color ← c ▷ nová barva, aktualizujeme hodnotu color

10: end if11: end while12: end procedure

3.5.3. Shrnutí

Z popisu filtrace vyplývá, že způsob jakým vybírame vrcholy u povedena vrcholové obarvení grafu jak je uvedeno v kapitole 3.4. Část algoritmuzodpovědná za výběr nejmenší barvy pro vrchol u (snaží se vrchol obarvitnějakou již použitou barvou, pokud jí není obarvený žádný ze sousedních vrcholůu) obarvý „úsporně“ vrcholy grafu.

Testy algoritmů ukázaly, že z uvedených heuristických algoritmů v této práci,se vždy nejvíce přiblížil chromatickému číslu vybraného grafu.

25

Page 26: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Obrázek 12. Vrcholově barvený graf.

3.6. Barvení pomocí nezávislých množin

Zde si rozebereme další heuristický algoritmus pro vrcholové barvení. Víme,že množina vrcholů, které mohou být obarveny stejnou barvou tvoří nezávisloumnožinu vrcholů. 2.13.

V algoritmu budeme používat heuristiku pro hledání maximální nezávislémnožiny.3

3.6.1. Popis algoritmu, část I.

Heuristický algoritmus pro nalezení maximální nezávislé množiny. Víme, žemůžeme sestavit „velkou“ nezávislou množinu vrcholů z vrcholů, které mají málosousedů.[3] Přidáním vrcholu do nezávislé podmnožiny vrcholů zajistíme, že zdenemohou být jeho sousedé. V každé iteraci tedy bereme vrchol s nejmenšímpočtem sousedů (zároveň i všechny vrcholy se kterými je spojen hranou).

3Hledání maximální nezávislé množiny v grafu je NP-uplný problém.

26

Page 27: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Následuje postup pro hledání maximální nezávislé množiny vrcholů. Maxi-mální nezávislou množinu si označíme N = {}.

Podgraf G′ grafu G bude obsahovat vrcholy, které můžeme do množiny Npřidat.

V cyklu provedeme:

1. Nalezneme u ∈ G′ s nejmenším počtem sousedních vrcholů. (Pro více tako-vých vrcholů vybereme náhodný)

2. Provedeme N ∪ {u}

3. Označíme si množinu K = {u a všechny jeho sousední vrcholy}

4. Odstraníme z G′ vrcholy z K.

5. Pokračujeme v cyklu dokud G′ není prázdný.

3.6.2. Popis algoritmu, část II.

Na začátku barvení nastavíme první užitou barvu color = 0. Dále budemepracovat s podgrafem G′ grafu G, v tomto momentě shodným s G.

V cyklu provedeme:

1. Najdeme v G′ maximání nezávislou množinu vrcholů viz. 3.6.1.

2. Provedeme col(v) = color, pro všechny nalezené vrcholy maximální nezá-vislé množiny, odstraníme je z G′.

3. Pokračujeme v cyklu krokem 1. dokud pro V ∈ G′ platí V ̸= ∅.

Při každé iteraci zvyšujeme počet užitých barev color = color + 1

27

Page 28: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3.6.3. Pseudokód

Algorithm 3.5. Barvení pomocí nezávislých množin1: procedure independentSetColoring(graph)2: color = 03: G′ = copyof(graph)4: while V ∈ G′(V,E) ̸= ∅ do5: L← findMaxIndependentSet(G′)6: for all v ∈ L do7: col(v) = color8: removeV ertexFromGraph(v,G′)9: end for

10: color = color + 111: end while12: end procedure

3.6.4. Shrnutí

Z výše popsaného víme, že nezávislé množiny jsou skupiny nesousedních vr-cholů (netvoří v grafu hranu). Opět dostáváme vrcholové obarvení grafu podledefinice v předchozí kapitole 3.4. Hledáním maximálních nezávislých množin po-vede rozvěž na řešení vrcholové obarvení grafu s možností užití menšího počtubarev.

28

Page 29: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3.7. Barvení slepováním vrcholů

Poslední heurictický algoritmus provádí „slepování“ vrcholů, které nejsou sou-sední. Slepením můžeme chápat například uložení vrcholů do seznamu.

3.7.1. Popis algoritmu

Na začátku algoritmu vytvoříme úplný graf G podle definice 2.12.:

• Začneme spojováním libovolných dvou nesousedních vrcholů u a v v grafuG.

• Tyto vrcholy slepíme dohromady, budou tvořit jeden uzel uv.

• Uzel uv spojíme hranami se všemi sousedy vrcholů u a v. Vybrané vrcholybudou z grafu odstraněny.

Slepujeme tak dlouho, dokud je možné spojovat nějaké dvojice vrcholů. Provýsledný úplný graf obarvýme každý vrchol jinou barvou. Poté vrcholy rozbalímedo původního grafu.

3.7.2. Pseudokód

Algorithm 3.6. Barvení slepováním vrcholů1: procedure glueVertexColoring(graph)2: G′ ← copyof(graph)3: while canGlueSomeV ertices(G′) do4: {u, v} ← selectSomeV ertices(G′) ▷ u, v nesousední vrcholy5: d = glueV ertices(u, v) ▷ spojí vrcholy u, v6: addToGraph(d,G′) ▷ vloží d do hran namísto u, v7: removeFromGraph({u, v}, G′) ▷ odebere vrcholy u, v z grafu8: end while9: return G′ ▷ úplný graf

10: end procedure

29

Page 30: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

1: procedure colorGlueVertices(G′)2: vybereme množinu vrcholů V z G′

3: color = 0 ▷ aktuální index použité barvy4: for all v ∈ V do5: col(v) = color ▷ obarvíme všechny vrchol obsažené ve v6: color = color + 17: end for8: return splitToOriginalGraph(G′) ▷ původní již obarvený graf9: end procedure

3.7.3. Shrnutí

Výběrem vrcholů jak je popsán v části 1. splňujeme definici na vrcholovéobarvení grafu z kapitoly 3.4. Počet barev, kterým bude možné graf obarvit jejasně určen výběrem slepovaných vrcholů. Výběr je náhodný, pro stejný graf Gbudeme při opakovaném užití algoritmu dostávat různé vysledky.

Obrázek níže popisuje průběh výpočtu algoritmu.

Obrázek 13. Barvení slepováním vrcholů, postup.

30

Page 31: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3.8. Exaktní barvení

V poslední části sekce algoritmů si posíšeme exaktní (přesné) vrcholové bar-vení grafu. Nejlepší řešení vrcholového barvení grafu bude nalezeno vyzkoušenímvšech možností obarvení vrcholů grafu.

3.8.1. Popis algoritmu

Činnost algoritmu můžeme rozdělit do tří částí (pracujeme se souvislýmgrafem G(V,E)):

I. Vygenerujeme si množinu všech možných skupinek vrcholů. Budeme tedyvytvářet n-tice, kde součet jejich prvků bude roveni n (n představuje velikostmnožiny vrcholů V ∈ G(V,E)). N-tice tedy budou složené s čísel 1− |V |.(Variace s opakováním délky 1− |V | o součtu prvků rovno |V |)

II. Vygenerujeme si množinu vrcholů. Vytváříme variace bez opakování z vr-cholů v ∈ V dle definice 2.19.

III. Hledáme vrcholové obarvení grafu G s nejmenším počtem použitých barev c.

Počáteční nejlepší řešení Solbest na počátku algoritmu představuje řešení smnožství použitých barev c = |V |. Pro nalezení vrcholového obarvení grafu G snějnižším počtem barev můžeme postupovat následovně:

1. V cyklu pro každou n-tici (představující rozdělení vrcholů do množin) z I.kroku a pro každou množinu vrcholů z II. kroku.

2. Zjistíme jestli se jedná o vrcholové barvení grafu G.

3. Pokud se jedná o vrcholové barvení, porovnáme jej s doposud nejlepšímnalezeným řešením Solbest.

4. Pokud současné řešení Sol dokáže obarvit graf G menším počtem barev nežSolbest, potom Solbest = Sol.

3.8.2. Pseudokód

31

Page 32: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Algorithm 3.7. Exaktní vrcholové bavení grafu1: procedure doExactColoring(graph)2: tupleList← generateTuples() ▷ množina n-tic, rozdělení do skupin3: verticeListSet← generateV erticeLists() ▷ množina seznamů vrcholů4: minColorCount← getV erticeCount()5: Solbest ← ∅

6: for all tuple ∈ tupleList do7: for all verticeList ∈ verticeListSet do8: if isIndependentSet(verticeList, tuple) then9: nowColors← getColorsCount(verticeList, tuple)

10: if nowColors < minColorCount then11: Solbest ← solution(verticeList, tuple)12: minColorCount← nowColors13: end if14: end if15: end for16: end for17: return Solbest18: end procedure

Přístup užitý pro generování, t ∈ {1, . . . , |V |}1: procedure generateTuples(size, resultList)2: if size = getV erticeCount() then3: return resultList4: else5: validTuples← filterBigger(size) ▷ odebere čísla {t|t+ size > |V |}6: moreTuples← ∅7: for all tuple ∈ validTuples do8: newList← copyOf(resultList)9: moreTuples ∪ generateTuples(size+ tuple, newList)

10: end for11: return moreTuples12: end if13: end procedure=0

32

Page 33: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

3.8.3. Shrnutí

Na začátku si vygenerovali množinu n-tic tupleList, které budou reprezen-tovat libovolné uspořádání vrcholů v ∈ V do množin. 4 Součet prvků každén-tice je roven počtu vrcholů, tedy |V |. Složitost tohoto výpočtu je O(2n−1), kden = |V |.

Množinu verticeListSet tvoří variace bez opakování z vrcholů v ∈ V . Zevzorce n!

(n−k)! , po úpravě dostáváme složitost O(n!).5 Pro každou z těchto variacíjsme rozdělovali do podmnožin vrcholů V1, V2 . . . Vn tak, že

∪ni=1 Vi = V . Pro

každou takto rozdělenou množinu vrcholů z verticeListSet jsme ověřili, že každáz podmnožin vrcholů V1, V2 . . . Vn je nezávislá podle definice 2.13.

Každou z podmnožin V1, V2 . . . Vn jsme obarvili jednou barvou a hledali jsmetu nejmenší možnou.6 Hledání tohoto řešení má složitost O(n!×2n−1). Výsledkemje číslo χ, chromatické číslo grafu G podle definice 2.15.

Z praktických důvodů jsou tupleList a verticeListSet v aplikaci reprezento-vány jako seznamy čísel, ve kterých se jednotlivé n-tice (nebo seznamy vrcholů)rozlišují podle indexů.

4Sjednocením těchto množin dostáváme původní množinu vrcholů V .5Víme, že n = k, kde k představuje délku variace bez opakování (vždy pracujeme se všemi

vrcholy grafu).6Obarvením je zde myšlen počet podmnožin V1, V2 . . . Vn.

33

Page 34: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

4. Uživatelská příručkaNásledující část shrnuje použití aplikace přiložené k této práci.

4.1. Spuštění

Aplikace je k dispozici ve spustitelném balíku JAR ve kterém jsou přiloženyi potřebné knihovny.

Spuštění aplikace provedeme příkazem:

java -jar graphAlgorithms.jar

Pro přidělení větší paměťového prostoru, pro potřeby exaktního barvení mů-žeme rozšířit příkazem:

java -Xmx2048M -jar graphAlgorithms.jar

V tomto případě přepínač -Xmx2048M dovolí aplikaci využít prostor nejvýše2048MB.

4.2. Okno Aplikace

Po spuštení souboru se mám zobrazí hlavní okno aplikace. Podstatnou částokna vyplňuje komponenta pro vykreslení grafu. Nad ní se nachází menu umožňu-jící přechod do editoru, otevření souboru grafu a dodatečné informace k ovládání. Vpravo se nachází ovládací panel, kterým uživatel kontroluje vybranou demon-straci grafového algoritmu.

4.2.1. Komponenta grafu

Zobrazuje graf vytvořený ze třídy mxGraph z knihovny JgraphT. Stará se ozměny během během demonstrace vybraného algoritmu.

4.2.2. Menu Soubor

Obsahuje základní ovládací prvky pro načtení grafu ve formátu XML a ukon-čení aplikace.

4.2.3. Menu Úpravy

Položka „upravit graf“ spustí v editoru aktuálně otevřený graf v hlavním okněaplikace. Položka „oteřít editor“ spustí okno editoru nezávisle na tom, jestli mámeotevřený soubor grafu.

34

Page 35: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Obrázek 14. Okno aplikace, výpočet dokončen.

4.2.4. Menu Nápověda

Poskytuje informace k zakladnímu ovládání této aplikace, včetně klávesovýchzkratek.

4.2.5. Ovládací panel demonstrace

Obsahuje ovládací a informační prvky pro demonstaci grafových algoritmů vtéto aplikaci.

4.2.6. Možnosti sekce Zobrazit

V ovládacím panelu aplikace můžeme pomocí komponent JRadioButton vo-lit obsah, který se nám zobrazí v komponentě grafu.Volba Demonstrace předákomponentě graf, na kterém probíhá demonstrace vybraného algoritmu. VolbaPůvodní graf předá komponentě graf ve stavu v jakém byl před spuštěním de-monstrace.

4.2.7. Sekce Algoritmus

V této části si volíme algoritmus, jehož demonstraci spustíme. Po přepnutí senám v dolní části aplikace zobrazí stručný popis algoritmu. Pří výběru Dijskrovaalgoritmu volíme ještě dodatečtě startovní vrchol, odkud budeme hledat nejkratšícesty.

35

Page 36: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

4.2.8. Ovládací tlačítka

Tlačítko Start spustí demonstraci vybraného algoritmu. Tlačítko Stop poza-staví (v nejužšímožný okamžik) průběh algoritmu. Tlačítko Pokračovat navážena následující krok algoritmu před jeho pozastavením. Tlačítko Ukončit Zastavívýpočet a demonstraci algoritmu.

4.2.9. Zpoždění

Komponenta třídy JSlider, umožňuje změnit rychlost průběhu animace.

4.2.10. Postup

Zobrazuje komentáře k auktuálnímu stavu průběhu algoritmu. V případě vr-cholového bravení grafu je možné po kliknutí na barvu otevřít dialog pro změnubarvy vrcholu.

4.3. Okno Editor

Při spuštění editoru se nám zobrazí okno s ovladácími prvky pro manipulacis grafem. Hlavní část okna vyplňujě komponenta grafu (mxGraphComponent).Třídy udalostí v balíku editor ve spolupráci s komponentou grafu umožňují po-hodlnou tvorbu a úpravy grafu ve vizuální podobě. Spodní část tvoři ovládací ainformační panel.

Obrázek 15. Okno editoru, úprava grafu.

36

Page 37: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

4.3.1. Menu Soubor

Obsahuje základní ovládací prvky načtení, uložení grafu, vytvoření novéhografu. Grafy se ukládají ve formátu XML, které zajišťuje třída mxXmlUtils zknihovny JgraphT a ukončení aplikace.

4.3.2. Menu Úpravy

Volba Přidávání vrcholů přepne editor do režimu, ve kterém je možné do oknaeditoru (komponenty grafu) vkládat vrcholy. Volba Přidávání hran přepne editordo řežimu, ve kterém se po kliknutí na dva vrcholy grafu vytvoří hrana (pokud jižneexistuje). Informace o tvorbě hrany se objevuji ve spodní části editoru. VolbaZrušit výběr vrcholu zruší vybraný vrchol v režimu přidávání hran. Volba Vytvořitnáhodný graf vygeneruje graf na základě vybraných parametrů.

4.3.3. Ovládací panel editoru

Tlačítko Přidat vrchol přepne editor do režimu přídávání vrcholů, stejně jakovolba v menu Úpravy. Aktuální režim editoru zvýrazní tlačítko modře. TlačítkoPřidat hranu přepne editor do režimu přidávání hran. Tlačítko Pozicování přepneeditor do režimu, ve kterém je možné pohybovat s vrcholy grafu (případně celýmgrafem pomocí výběru všech vrcholů zkratkou Ctrl+A). V tomto režimu je možnéohodnocovat hrany po kliknutí myší na hranu a stisknutím klávesy ENTER.Tlačítko Ohodnocování hran umožňuje rychlejší ohodnocení hran grafu - pouhýmkliknutím na hranu. Potvrdit úpravy předá upravený graf hlavnímu oknu aplikace.Po tomto kroku je možné spustit demonstaci (v případě validního grafu). Zahoditzměny zavře editor grafů, žádné provedené změny nebudou uloženy.

4.3.4. Informační panel editoru

Ve spodní části editoru se nám zobrazují informace o aktuální grafu. V pravéčásti počet vrcholů, počet hran. V levé části se nám budou zobrazovat informacepři tvorbě hran.

4.3.5. Dialog Náhodný graf

Vygeneruje náhodný graf o počtu vrcholů v uzavřeném intervalu 1− 75. Mů-žeme si zvolit hranově ohodnocený graf nebo graf bez ohodnocení pro potřebyalgoritmů pro vrcholové barvení.

37

Page 38: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

4.4. Prográmatorská část

Nyní si představíme řešení přiložené aplikace. Začtene s jazykem, vývojovýmprostředím a skončíme detaily použitých tříd.

4.4.1. Tvorba aplikace

Pro napsání aplikace byl použit jakyk Java, verze 7. Uživatelské prostředíaplikace je vytvořeno pomocí knihovny Java Swing, vybrané části knihovnouJgraphT. Vývoj aplikace probíhal na operačním systému Windows 7 a Linux(distribuce Fedora) ve vyvojovém prostředí Eclipse (Kepler, Luna).

4.4.2. Třídy

Hlavní třídou aplikace je třída Application, která užívá všechny třídy a po-skytuje ovládací prvky uživatelského rozhraní. Uživatelské rozhraní je realizovánopomocí knihovny Swing. Z této knihovny byla použita třída GroupLayout prouspořádání jednotlivých komponent uživatelského prostření do okna aplikace.Aplikace pro realizaci výpočtu algoritmů využívá třídy z balíku algorithms. Jed-notlivé výpočty poté probíhají v samostatném vlákně GraphWorkThread dědící ztřídy SwingWorker7. Další třídou pro práci s vlákny, kterou jsem využil je Recur-siveAction, která je určená pro výpočet rekurzivních algoritmů ve více vláknech.Třídu používám ke generování variací bez opakování v kapitole 3.8. V balíku edi-tor jsou třídy pro grafickou manipulaci s grafem, umožňující vytvořit, editovatohodnotit a uložit graf ve formátu XML. Aplikace využívá pro ukládání, vizuálníreprezentaci grafu a jeho součástí některých tříd z knihovny JGraphT.

Application Kombinuje dohramody všechny třídy, dává uživateli pomocí gra-fického rozhraní kontrolu na probíhajícím výpočtem.

Algorithm Obsahuje jména a popisy užitých algoritmů.

CellManager vytváří indexy pro objekty grafu z knihovny JGraphT, které vy-užívá aplikace.

GUIManager usnadňuje práci s uživatelským rozhraním mezi třídami.

VisualGraph rozšiřuje třídu mxGraph z knihovny JgraphT o nové metody.

FileUtils rozšiřuje třídu z knihovny JgraphT, zajištuje ukládání a načtení sou-boru grafu ve formátu XML.

PlainEdge třída obsahující základní informace o hraně grafu.

PlainVertex třída obsahující základní informace o vrcholu grafu.7Třída která provádí náročný výpočet na pozadí aplikace s uživatelským rozhraním.

38

Page 39: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

PlainGraph třída tvořící graf ze tříd PlainVertex a PlainEdge.

SimpleColorChooser třída poskytující uživatelské rozhraní pro změnu barvyvrcholu grafu třídy mxGraph z knihovny JGraphT.

MatrixViewer třída pro zobrazení dat z Floyd-Warshallova algoritmu.

Editor třída kompletující uživatelské rozhraní pro práci z vizuální podobougrafu.

EditorCellValueDialog rozhraní pro změnu hodnoty hrany grafu.

EditorKeyBoardManager třída pro zpracování událostí z klávesnice.

EditorMouseAction třída pro zpracování událostí z myši.

EditorRandomGraphDialog generátor náhodných grafů.

DijskraAlgorithm Třída pro výpočet Dijskrova algoritmu.

ExactColoring Třída řešící problém barvení grafu hrubou silou.

FloydWarshall Třída vykonavající výpočet Floyd–Warshallova algoritmu.

KruskalAlgorithm Třída vykonavající výpočet Kruskalova algoritmu.

NeighbourColoring Třída řešící problém barvení grafu pomocí informace oaktuálním obarvení sousedních vrcholů daného vrcholu.

GlueColoring Třída řešící problém barvení grafu pomocí slepování vrcholů.

IndependentSetColoring Třída řešící problém barvení grafu hledáním maxi-málních nezávislých množin.

39

Page 40: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Závěr

Cílém bakalářské práce bylo vytvořit aplikaci demonstrující grafové algoritmy:úlohy nalezení nejkratší cesty, hledání minimální kostry grafu a úlohy barvenígrafu. Zárověň měla aplikace obsahovat i editor grafů pro splnění těchto úloh.Přiložená aplikace tyto požadavky splňuje. Při vytváření této aplikace jsem vyu-žíval knihovny JGraphT. Někdy jsem narazil na překážky (např. způsob jakýmknihovna indexuje části grafu), ale podařilo se mi je vyřešit. Získal jsem zkuše-nosti s používáním externí knihovny. Do budoucna plánuji aplikaci rozšířit o novéfunkce a více algoritmů.

40

Page 41: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

Reference

[1] Bělohlávek, Radim; Vychodil Vilém. Diskrétní matematika pro informa-tiky II Elektronická publikace, 2006.

[2] Even, Shimon; Even Guy. Graph Algorithms, 2nd Edition.Cambridge University Press, 2012. 189s. ISBN 978-0-521-51718-8.

[3] Večerka, Arnošt. Grafy a grafové algoritmy Elektronická publikace, 2007.

[4] Osička, Petr. Algoritmická matematika 3 Elektronická publikace, 2014.

[5] Sedgewick, Robert. Algorithms in C: Part 5, graph algorithms. Addison-Wesley, 2001. ISBN: 0201361183.

[6] Wikipedia Edsger W. Dijkstra Elektronická encyklopedie

41

Page 42: Vybrane grafove algoritmy - Thesesě RNDr. Arnoštu Včovi za konzultace a trpěé vedení ř tvorbě této práce. Dále ě za podporu své roě a řů jmenoě Petru Hrbkovi za neocenitelnou

A. Obsah přiloženého CD

bin/Obsahuje kompletní aplikaci ve formátu JAR s přibalenou knihovnou prospuštění přímo z CD.

doc/Dokumentace práce ve formátu PDF, zdrojový text dokumentace ve for-mátu TEX, vložené obrázky.

src/Kompletní zdrojové texty programu se všemi potřebnými (převzatými)zdrojovými texty, knihovnami.

readme.txtInstrukce pro instalaci a spuštění programu včetně požadavků pro jeho pro-voz.

data/Ukázková a testovací data použitá v práci a pro potřeby obhajoby práce.

42