Upload
callia
View
76
Download
0
Embed Size (px)
DESCRIPTION
Grafov é algoritmy: minimálna kostra, najkratšie cesty. Čo máme v pláne ?. 2 problémy a algoritmy na ich riešenie: boli motivované potrebami praxe formulácia v „reči“ ohodnotených grafov jednoduché riešenia zložitejšie dôkazy , že algoritmy naozaj fungujú Problém minimálnej kostry - PowerPoint PPT Presentation
Citation preview
GrafovGrafové algoritmy:é algoritmy:minimálna kostra, najkratšie cestyminimálna kostra, najkratšie cesty
22
Čo máme v pláne Čo máme v pláne ??
2 problémy a algoritmy na ich riešenie:2 problémy a algoritmy na ich riešenie:
boli motivované boli motivované potrebami praxepotrebami praxe
formulácia v „reči“ ohodnotených formulácia v „reči“ ohodnotených grafovgrafov
jednoduchéjednoduché riešenia riešenia
zložitejšie zložitejšie dôkazydôkazy, že algoritmy naozaj , že algoritmy naozaj fungujúfungujú
Problém minimálnej kostryProblém minimálnej kostry
Nájdenie najkratších ciest v grafeNájdenie najkratších ciest v grafe
33
S čím budeme pracovať S čím budeme pracovať ??
Neorientovaný Neorientovaný graf bez násobných hrán a graf bez násobných hrán a slučiekslučiek
Ku každej hrane Ku každej hrane ee grafu bude priradené kladné grafu bude priradené kladné čísločíslo w(e)w(e): : váha hranyváha hrany (cena hrany, ohodnotenie (cena hrany, ohodnotenie hrany) hrany)
Graf je Graf je súvislýsúvislý
““AlternatAlternatívny pohľadívny pohľad””::
““guliguličky a čiaryčky a čiary”, nad”, nad čiarami budú napísané čísla čiarami budú napísané čísla
nneorientovaný eorientovaný = budeme pou= budeme používať čiary a nie šípkyžívať čiary a nie šípky (tak ako na minulej predn(tak ako na minulej prednáškeáške))
44
PrPríklad íklad (a mo(a možné interpretáciežné interpretácie))
55
Interpretácie v reálnom sveteInterpretácie v reálnom svete
Príklad 1:Príklad 1:
Vrcholy Vrcholy = mest= mestáá
Hrany Hrany = priame cesty medzi mestami= priame cesty medzi mestami
VVáha hrany áha hrany = d= dĺžka priamej cestyĺžka priamej cesty
Príklad 2:Príklad 2:
Vrcholy Vrcholy = elektrick= elektrické rozvodneé rozvodne
Hrany Hrany = elektrick= elektrické vedenie medzi rozvodňamié vedenie medzi rozvodňami
Váha hrany Váha hrany = cena za rekon= cena za rekonštrukciu vedeniaštrukciu vedenia
66
Ako reprezentovaAko reprezentovať ť ohodnotenohodnotený graf ý graf ??
Zoznam hrZoznam hránán + ku ka+ ku každej hrane pridáme váhu:ždej hrane pridáme váhu:
[A, B, 7], [B, C, 8], ….[A, B, 7], [B, C, 8], ….
Matica susednostiMatica susednosti::
22-rozmern-rozmerné pole é pole intovintov (resp. (resp. doublovdoublov): ): mapamapa
nn x x nn, kde , kde nn je počet vrcholov grafu je počet vrcholov grafu ((““miest”)miest”)
polpolíčko íčko mapamapa[X][Y][X][Y] obsahuje obsahuje
vváhu hrany medzi vrcholmi áhu hrany medzi vrcholmi XX a a YY
-1-1 ak hrana neexistuje ak hrana neexistuje
mapa[A][B] = 7mapa[A][B] = 7, mapa, mapa[B][A] = 7, mapa[B][C] = 8, …[B][A] = 7, mapa[B][C] = 8, …
A A veľaveľa iných spôsobov ... iných spôsobov ...
77
Graf v poliGraf v poli ((matica susednostimatica susednosti) …) …AA BB CC DD EE FF GG
AA -1-1 77 -1-1 55 -1-1 -1-1 -1-1
BB 77 -1-1 88 99 77 -1-1 -1-1
CC -1-1 88 -1-1 -1-1 55 -1-1 -1-1
DD 55 99 -1-1 -1-1 1515 66 -1-1
EE -1-1 77 55 1515 -1-1 88 99
FF -1-1 -1-1 -1-1 66 88 -1-1 1111
GG -1-1 -1-1 -1-1 -1-1 99 1111 -1-1
V reálnom programe vrcholy nebude označovať písmenami, ale číslami, aby sme označenie vrcholu použili ako indexy do poľa
88
Graf ako objektGraf ako objekt
Ako znalAko znalý objektového programovania v Jave a ý objektového programovania v Jave a kolekckolekciií, si môžeme vytvoriť triedu í, si môžeme vytvoriť triedu GraphGraph, ktorá , ktorá by reprezentovala graf by reprezentovala graf (mno(množina vrcholov žina vrcholov + + mnomnožina žina hrhránán))
VrcholVrchol reprezentovan reprezentovaný ako objekt triedy ý ako objekt triedy VertexVertex
HranaHrana reprezentovaná ako objekt triedy reprezentovaná ako objekt triedy EdgeEdge
Očakávané Očakávané metódymetódy triedy triedy GraphGraph::
public Setpublic Set<Vertex> getVertices()<Vertex> getVertices()
vvrráti množinu vrcholov, ktoré tvoria grafáti množinu vrcholov, ktoré tvoria graf
public Set<Edge> getEdges()public Set<Edge> getEdges()
vráti množinu hrán, ktoré tvoria grafvráti množinu hrán, ktoré tvoria graf
99
Problém minimálnej Problém minimálnej kostry kostry – motiv– motiváciaácia
Uvažujme Uvažujme dopravnú sieťdopravnú sieť
Máme nejaké Máme nejaké peniazepeniaze z EÚ na z EÚ na výstavbu diaľnícvýstavbu diaľníc
KtoréKtoré cesty máme prerobiť na diaľnice, cesty máme prerobiť na diaľnice, aby existovalo aby existovalo (nie nutne priame) (nie nutne priame) spojeniespojenie medzi medzi kakaždými 2 mestamiždými 2 mestami výhradne po diaľniciach výhradne po diaľniciach a pritom aby a pritom aby sme minuli, sme minuli, čo čo najmenejnajmenej
Vstup:Vstup: pre každý úsek spájajúci 2 pre každý úsek spájajúci 2 mestá náklady na jeho prestavbu na mestá náklady na jeho prestavbu na diaľnicudiaľnicu
1010
Iné praktické motivácieIné praktické motivácie
Telefónna sieť:Telefónna sieť: ktoré linky prebudovať na ktoré linky prebudovať na optické, aby bolo možné presmerovať všetky optické, aby bolo možné presmerovať všetky hovory po optických linkách a chceme pritom hovory po optických linkách a chceme pritom minúť čo najmenej minúť čo najmenej ??
Algoritmus na riešenie ako prvý navrhol Algoritmus na riešenie ako prvý navrhol v roku v roku 19261926 Otakar Bor Otakar Borůvkaůvka, ke, keď riešil ď riešil problémproblém efektívnejefektívnej konštrukcie konštrukcie elektrickej sieteelektrickej siete na na MoraveMorave
1111
Čo je kostra grafu Čo je kostra grafu ??
Kostra grafuKostra grafu je tak je taká á podmnožinapodmnožina T T hránhrán grafu G, že platí:grafu G, že platí:
1.1. Medzi každými 2 vrcholmi grafu Medzi každými 2 vrcholmi grafu existuje existuje cestacesta využívajúca len hrany kostry T využívajúca len hrany kostry T
2.2. OdobratímOdobratím ľu ľubbovoľnej hrany kostry už ovoľnej hrany kostry už vlastnosť 1 vlastnosť 1 nebude platiťnebude platiť
„„Kostra“ sú hrany, ktoré graf „držia po Kostra“ sú hrany, ktoré graf „držia po kope“kope“
1212
Vlastnosti kostier Vlastnosti kostier (bez d(bez dôkazuôkazu))Graf môže mať Graf môže mať veľa kostierveľa kostier
Každá kostra grafu s Každá kostra grafu s nn vrcholmi má práve vrcholmi má práve n-1n-1 hrhránán
Hrany kostry Hrany kostry nevytvnevytvárajú cyklusárajú cyklus
PridaniePridanie ľubovoľnej nekostrovej hrany ku kostre ľubovoľnej nekostrovej hrany ku kostre vytvorí cyklusvytvorí cyklus
Medzi každými 2 vrcholmi grafu existuje Medzi každými 2 vrcholmi grafu existuje jediná jediná cestacesta využívajúca len kostrové hrany využívajúca len kostrové hrany
Minimálna kostra:Minimálna kostra: taká kostra, taká kostra, v v ktorej súčet ktorej súčet ohodnotení ohodnotení (v(váháh)) hrán je hrán je minimálnyminimálny spomedzi spomedzi všetkých všetkých momožných kostieržných kostier grafu grafu
1313
Algoritmus na nájdenie minimálnej Algoritmus na nájdenie minimálnej kostry: Kruskalov algoritmuskostry: Kruskalov algoritmus
1.1. UtriedimeUtriedime vzostupne hrany grafu podľa váhy: vzostupne hrany grafu podľa váhy:
ee11, e, e22, e, e33, …, e, …, emm
tak, tak, že wže w(e(e11) <= w(e) <= w(e22) <= w(e) <= w(e33) <= …, <= w(e) <= …, <= w(emm))
2.2. Množina hrán kostry T Množina hrán kostry T = {}= {}
3.3. Postupne skPostupne skúšameúšame hranu e hranu eii pre i pre i = 1..m= 1..m
Ak T + Ak T + eeii neobsahuje cyklusneobsahuje cyklus, tak do, tak do množiny hrán množiny hrán
kostrykostry T T pridpridámeáme hranu hranu eeii
1414
BC
E
GF
D
A
5
7
9
15
8
11
7 5
96
8
Červené sú hrany vybrané do vytváranej kostry.
1515
Ako to naprogramovať Ako to naprogramovať ??ProblProblémy:émy:
Utriediť hrany podľa váh Utriediť hrany podľa váh (QuickSort, HeapSort)(QuickSort, HeapSort)
Zistiť, či po pridaní hrany eZistiť, či po pridaní hrany eii k aktuálne vybraným k aktuálne vybraným
hranám kostry T vznikne cyklushranám kostry T vznikne cyklus
Pozorovanie:Pozorovanie:
CyklusCyklus po pridan po pridaní hrany eí hrany eii = {X, Y} = {X, Y} vzniknevznikne práve práve
vtedyvtedy, , keďkeď medzi vrcholmi X a Y medzi vrcholmi X a Y už už existuje cestaexistuje cesta po vybranpo vybraných kostrových hranáchých kostrových hranách
Počas algoritmu vznikajú Počas algoritmu vznikajú skupiny skupiny vrcholovvrcholov, ktor, ktoré é ssú ú prepojené kostrovými hranami: „ostrovčeky prepojené kostrovými hranami: „ostrovčeky súvislostisúvislosti” ” (komponenty) (komponenty) vzhvzhľadom na hrany ľadom na hrany vytváranej kostry Tvytváranej kostry T
1616
““Komponenty súvislostiKomponenty súvislosti””
PozorovaniePozorovanie vlastností komponentov: vlastností komponentov:
Medzi Medzi vrcholmi vrcholmi X a Y X a Y existuje cestaexistuje cesta po aktuálnych po aktuálnych kostrových hranáchkostrových hranách, ak , ak patria rovnakpatria rovnakýmým komponentomkomponentom
PridanímPridaním hrany e hrany eii = {X, Y}= {X, Y}, kde , kde X a Y sX a Y sú v rôznych ú v rôznych
komponentoch, sa tieto komponenty „komponentoch, sa tieto komponenty „zlúčiazlúčia““
Ako efektívne zistiť, že vrcholy sú v rovnakom Ako efektívne zistiť, že vrcholy sú v rovnakom komponente komponente ??
1717
““Komponenty súvislostiKomponenty súvislosti” 2” 2
Pre každý vrchol budeme udržiavať Pre každý vrchol budeme udržiavať ““identifikidentifikátorátor“ komponentu, do ktorého patrí“ komponentu, do ktorého patrí
PorovnanímPorovnaním „identifikátorov“ vieme rýchlo „identifikátorov“ vieme rýchlo zistiťzistiť, , či sú v rovnakom alebo rôznom komponenteči sú v rovnakom alebo rôznom komponente
Na začiatku je vrchol Na začiatku je vrchol ii v komponente s v komponente s identifikátorom identifikátorom ii
Ak sa 2 komponenty Ak sa 2 komponenty (pridan(pridaním hranyím hrany) ) zlzlúčiaúčia, tak , tak všetkýmvšetkým vrcholom vrcholom jednéhojedného z komponentom z komponentom nastavímnastavímee identifikátor identifikátor druhéhodruhého komponentu komponentu
1818
Programujeme ...Programujeme ...
1919
Prečo to funguje Prečo to funguje ? (D? (Dôkaz sporomôkaz sporom))Nech Nech TT je kostra vypočítaná algoritmom a je kostra vypočítaná algoritmom a YY je nejaká je nejaká minimálna kostraminimálna kostra, ktorá má s kostrou , ktorá má s kostrou TT najviac najviac spoločnýchspoločných hrán hrán
Keďže Keďže TT je rôzne od je rôzne od YY existuje taká hrana z existuje taká hrana z TT, , ktorktorá á nepatrí do nepatrí do YY a naopak (preto a naopak (pretože že TT aj aj YY majú presne majú presne nn-1-1 hrhránán))
Nech Nech ee je je prvá hranaprvá hrana vybraná algoritmo vybraná algoritmomm do kostry do kostry TT, , ktorá ktorá nie jenie je v v YY
Y+eY+e vytv vytvára cyklus ára cyklus (v(viď tvrdeniiď tvrdeniaa o kostrách o kostrách), ktor), ktorý ý musí musí obsahovaťobsahovať nejakú hranu f, ktorá nie je z nejakú hranu f, ktorá nie je z TT (inak by (inak by cyklus ucyklus už existoval v ž existoval v TT, čo nie je možné, čo nie je možné))
Y+e–f Y+e–f je opje opäť kostra, ale keďže äť kostra, ale keďže YY je najlacnejšia, musí je najlacnejšia, musí platiť, že platiť, že ww(e) > w(f)(e) > w(f)
w(e) = w(f)w(e) = w(f) nemnemôže platiťôže platiť, lebo potom , lebo potom Y+e-f Y+e-f by bola by bola kostra s minimkostra s minimálnou cenou, ktorá má viac spoločných álnou cenou, ktorá má viac spoločných hrán s hrán s TT ako ako YY
2020
Prečo to funguje Prečo to funguje ? (? (PokraPokračovaniečovanie))
Keďže wKeďže w(e) > w(f) v algoritme sme spracovali (e) > w(f) v algoritme sme spracovali hranu hranu f predf pred hranou hranou ee
Pripomenutie: Pripomenutie:
e je prvá hrana zaradená do T, ktorá nie je v Ye je prvá hrana zaradená do T, ktorá nie je v Y
f je hrana okrem iného hrana z Y, ktorá nie je v Tf je hrana okrem iného hrana z Y, ktorá nie je v T
KeKeďže sme f nezaradili do T musela vytvárať ďže sme f nezaradili do T musela vytvárať cyklus s hranami, ktoré boli dovtedy vybrané do cyklus s hranami, ktoré boli dovtedy vybrané do T, čo sú T, čo sú zároveňzároveň hrany z Y (vihrany z Y (viď pripomď pripomenutie)enutie)
Teda Teda už časť hrán z Y spolu s f vytvára cyklus, už časť hrán z Y spolu s f vytvára cyklus, čo je čo je sporspor s tým, že Y je kostra s tým, že Y je kostra (t.j. neobsahuje (t.j. neobsahuje žiaden cyklusžiaden cyklus))
2121
ZloZložité otázky o zložitosti ...žité otázky o zložitosti ...
m hrán, n vrcholovm hrán, n vrcholov
Utriedenie hránUtriedenie hrán: O: O(m log m)(m log m)
NNájdenie kostryájdenie kostry: O: O(m) + O(n(m) + O(n22))
Spracovanie jednej z m hrán stojí čas OSpracovanie jednej z m hrán stojí čas O(1)(1)
ZlZlúčenie komponentov stojí čas Oúčenie komponentov stojí čas O(n), ale to (n), ale to vykonvykonávame iba návame iba n-1 kr-1 krátát
Celková časová zložitosť Celková časová zložitosť O(nO(n2 2 + m log m)+ m log m)
ChytreChytrejjšie implementácie: Ošie implementácie: O(m log n)(m log n)
2222
NajkratNajkratšie cesty v grafe šie cesty v grafe – motiv– motiváciaácia
MapaMapa s informáciami o s informáciami o priamych cestách priamych cestách (spojniciach)(spojniciach) medzi medzi mestamimestami
Hľadáme Hľadáme najkratšiunajkratšiu (najr(najrýchlejšiu, ýchlejšiu, najlacnejšiunajlacnejšiu) ) cestucestu medzi medzi 2 mestami2 mestami
Aplikácie: GoogleMaps, Aplikácie: GoogleMaps, GPS GPS + navig+ navigátor, ...átor, ...
2323
Mať orientáciu sa oplatíMať orientáciu sa oplatí
Orientované grafyOrientované grafy sú niekedy sú niekedy lepšielepšie na na modelovanie reálnej situácie:modelovanie reálnej situácie:
Cesta z A do B Cesta z A do B (do kopca) (do kopca) trvá 1 hodinytrvá 1 hodiny
CCesta z B do A esta z B do A (z kopca) (z kopca) trvá 45 minúttrvá 45 minút
Orientovaný ohodnotený grafOrientovaný ohodnotený graf: :
HranyHrany majú svoj majú svoj smer smer
Medzi Medzi 2 vrcholmi najviac 2 hrany: ka2 vrcholmi najviac 2 hrany: každá má iný ždá má iný smersmer
„„guliguličky čky + + šípky, nad ktorými sú čísla“šípky, nad ktorými sú čísla“
Reprezentácia: Reprezentácia: Matica susednostiMatica susednosti nemusínemusí byť byť symetrická symetrická ((mapa[A][B] = 60, mapa[B][A] = 45mapa[A][B] = 60, mapa[B][A] = 45))
2424
Dijkstrov algoritmusDijkstrov algoritmus
1959, Edsger Dijkstra (Holandsko)1959, Edsger Dijkstra (Holandsko)
Vstup: Vstup:
ohodnotenohodnotený ý orientovanorientovanýý/neorientovan/neorientovaný graf G s ý graf G s kladnými ohodnoteniami hránkladnými ohodnoteniami hrán
vrchol vrchol vv grafu G grafu G
Výstup:Výstup:
pre každý vrchol pre každý vrchol ww dĺžka najkratšej cestydĺžka najkratšej cesty z vrcholu z vrcholu vv do vrcholu do vrcholu ww
informinformácia na zrekonštruovanie ácia na zrekonštruovanie najkratnajkratších ších ciestciest
2525
Princíp algoritmuPrincíp algoritmu
Počas výpočtu si Počas výpočtu si udržiavameudržiavame::
Množinu vrcholov Množinu vrcholov SS, do ktorých sa podarilo , do ktorých sa podarilo definitívnedefinitívne vypočítaťvypočítať dĺžku najkratšej cesty zo dĺžku najkratšej cesty zo štartovacieho vrcholuštartovacieho vrcholu vv
Pre každý vrchol Pre každý vrchol ww dĺžku najkratšej cesty dĺžku najkratšej cesty dd[w][w] z z vrcholu vrcholu vv do vrcholu do vrcholu ww, ktorá vedie len cez vrcholy z , ktorá vedie len cez vrcholy z množiny množiny SS
Iniciálne:Iniciálne:
SS = = prázdna množinaprázdna množina
d[w] =d[w] = nekone nekonečno čno (budeme reprezentova(budeme reprezentovať ako ť ako zápornú hodnotuzápornú hodnotu), pre v), pre všetkyšetky ww z z V-{v}V-{v}
d[v] = 0d[v] = 0
2626
Dijkstrov algoritmusDijkstrov algoritmus
KKým existuje vrchol ým existuje vrchol xx z z VV-S-S tak taký, že ý, že dd[x][x] nie je nie je nekonenekonečno:čno:
1.1. Vyber vrchol Vyber vrchol uu z z VV-S-S taký, že taký, že dd[u][u] je je minimminimálneálne
2.2. Pridaj Pridaj uu do mno do množinyžiny SS
3.3. Pre každý vrchol Pre každý vrchol ww z z VV-S-S skúsime zlepšiťskúsime zlepšiť dd[w][w] pomocou cesty prichpomocou cesty pricháádzajdzajúcej z úcej z uu::
Ak Ak dd[w] > d[u] + w((u, w)),[w] > d[u] + w((u, w)), tak tak
d[w] = d[u] + w((u, w))d[w] = d[u] + w((u, w))
2727
Simulácie a vizualizácie algoritmuSimulácie a vizualizácie algoritmu
http://cam.zcu.cz/~rkuzel/aplety/Dijkstra/Dijkstra.http://cam.zcu.cz/~rkuzel/aplety/Dijkstra/Dijkstra.htmlhtml
http://http://www.cs.auckland.ac.nzwww.cs.auckland.ac.nz/software//software/AlgAnimAlgAnim//dijkstra.htmldijkstra.html
http://www.unf.edu/~wkloster/foundations/Dijkstrhttp://www.unf.edu/~wkloster/foundations/DijkstraApplet/DijkstraApplet.htmaApplet/DijkstraApplet.htm
2828
Programujeme ...Programujeme ...
2929
PrePrečo to funguje čo to funguje ? (N? (Náznakáznak/Bonus)/Bonus)
KKľúčové pozorovanieľúčové pozorovanie::
Ak Ak (v, v(v, v11, v, v22, v, v33, …, x, …, w), …, x, …, w) je najkrat je najkratšia cesta z šia cesta z vv
do do ww, potom , potom (v, v(v, v11, v, v22, v, v33, …, x), …, x) je najkrat je najkratšia cesta z šia cesta z
vv do do xx
Pre formálny dôkaz treba ukázať:Pre formálny dôkaz treba ukázať:
Ak zaradíme nejaký vrchol Ak zaradíme nejaký vrchol uu dodo S S, tak naozaj , tak naozaj hodnota hodnota dd[u][u] obsahuje obsahuje dĺžku najkratšej cesty z dĺžku najkratšej cesty z vrcholu vrcholu vv do vrcholu do vrcholu uu
Platnosť Platnosť invariantovinvariantov (tvrdenia platiace v(tvrdenia platiace vždy keďždy keď prechprechádzame istým miestom programuádzame istým miestom programu))
3030
Zložitosť algoritmuZložitosť algoritmu
KaKaždý vrchol ždý vrchol (z (z nn vrcholov) vrcholov) je zaradený do je zaradený do SS najviac raznajviac raz::
Výber prvku Výber prvku uu z minimálnym z minimálnym dd[u][u] : O(n) : O(n)
ZlepZlepšenie šenie dd[w][w] cez vrchol cez vrchol uu: : O(n)O(n)
CelkovCelková časová zložitosť: á časová zložitosť: OO(n(n22))
Úloha na cvičenia:Úloha na cvičenia: Algoritmus nájde dĺžku Algoritmus nájde dĺžku najkratšej cesty z vrcholu najkratšej cesty z vrcholu vv do ostatných do ostatných vrcholov. Ako zistíme, ako vrcholov. Ako zistíme, ako najkratšia cesta najkratšia cesta vyzerávyzerá ??
3131
Ďakujem za pozornosť
Otázky ???