Graateorian maksimivirtausalgoritmi LuK-tutkielma Visa Vallivaara 800283 Matemaattisten tieteiden laitos Oulun yliopisto Kevät 203
Sisältö Johdanto 2 Peruskäsitteitä 3 2 Graateoriaa 6 2. Suunnattu graa......................... 6 2.2 Virtausverkosto.......................... 6 3 Verkkoteoriaa 8 3. Jäännösverkosto.......................... 8 3.2 Lisäyspolku............................ 0 4 Maksimivirtaus Lähdeluettelo 4
Johdanto Graateoria tutkii graaen eli verkkojen ominaisuuksia. Graat ovat matemaattinen tapa kuvata eri asioiden suhteita. Niiden avulla voidaan kätevästi havainnollistaa ja ratkoa monia käytännön ongelmia, esimerkiksi aikataulujen tekeminen, tiedonsiirto internetissä tai optimaalisten kuljetusreittien valinta. Tässä tutkielmassa käydään läpi graateorian perusteita ja esitellään maksivirtausalgoritmi, jolla etsitään graasta mahdollisimman suuri määrä polkuja. Lisäksi esitellään ja todistetaan lauseita, jotka ovat tarpeellisia maksimivirtausalgoritmin kannalta. Ensimmäisessä luvussa määritellään itse graa ja sekä siihen liittyviä peruskäsitteitä. Toisessa luvussa esitellään suunnattu graa ja virtausverkosto, jotka ovat erikoistapauksia graafeista. Kolmannessa luvussa käsitellään virtausverkostossa kulkevaa virtausta sekä siihen liittyviä polkuja ja jäännösverkostoa. Viimeisessä luvussa esitään kuinka maksivirtausalgoritmi toimii ja ratkaistaan sillä tutkielman tärkein esimerkkiongelma. Eli kuinka saa kätevästi muodostettua yhdentoista hengen hallituksen neljäntoista halukkaan joukosta, josta kukin henkilö pystyy suorittamaan vain muutamaa hallitustehtävää. Tutkielmassa on käytetty pääasiassa teosta A First Course in Mathematical Modeling[]. 2
Peruskäsitteitä Kuva : Könisbergin seitsemän siltaa.[2] Historiallisesti graateorian katsotaan saaneen alkunsa sveitsiläisen Leonhard Eulerin ratkaisemasta Könisbergin siltaongelmasta vuodelta 736, joka näkyy kuvassa. Könisbergin asukkaat esittivät Eulerille seuraavanlaisen kysymyksen: Onko mahdollista tehdä kävelyretki niin, että ylittää tasan kerran jokaisen Könisbergin seitsemästä sillasta ja päätyy aloituspaikkaansa? Euler havaitsi, että tämän ongelman havainnollistamiseen ja ratkaisemiseen graa on erinomainen työkalu. Graa G koostuu kahdesta joukosta: solmujoukosta V (G) ja kaarijoukosta E(G). Jokainen kaarijoukon E(G) alkio muodostuu solmujoukon V (G) alkioparista. Esimerkiksi kuvassa V (G) = {A, B, C, D} ja E(G) = {a, b, c, d, e, f}. Kaari a voitaisiin merkitä myös solmujen avulla a = AB. Määritelmä.. Jos on olemassa kaari solmujen i ja j välissä, sanotaan että: solmut i ja j ovat viereiset. Esimerkiksi kuvassa solmut A ja B ovat viereiset. Määritelmä.2. Jos solmu i on kaaren ij päätepisteessä, sanotaan että: kaari ij on kytketty solmun i kanssa. Esimerkiksi kuvassa kaari a on kytketty solmun A kanssa. Määritelmä.3. Solmun i aste eli deg(i), on solmun i kytköksien määrä kaariin. Esimerkiksi kuvassa deg(a) = 5. Esimerkki.4. Eulerin siltaongelman yleistys: Milloin voi annetulle graalle muodostaa syklin joka kulkee tasan kerran jokaisen kaaren kautta? Ainakin graan on oltava yhtenäinen eli kaikkien solmujen tulee olla yhteydessä toisiinsa. Lisäksi jokaisen solmuun astutaan yhtä monesti kuin sieltä poistutaan, eli jokaisen solmun aste on oltava parillinen. Nämä ominaisuudet omaavaa graaa kutsutaankin Eulerin graaksi. Vastaus siltaongelmaan: Haluttua kävelyretkeä on mahdoton tehdä, koska kaikki siltojen muodostamat solmut ovat parittomia. 3
a b c d e f g h i j k l m n 2 3 4 5 6 7 8 9 0 Kuva 2: Hallitusesimerkistä muodostettu kaksijakoinen graa. Määritelmä.5. Graa G = (V, E) on kaksijakoinen, jos pistejoukolla V on sellainen ositus [X, Y ], että jokaisen kaaren ij E toinen päätepiste on joukon X ja toinen päätepiste joukon Y piste. Esimerkki.6. Muodostetaan Sigma-killan hallitus. Hallitus sisältää yksitoista numeroitua hallituspaikkaa: PJ (), VPJ (2), Sihteeri (3), Rahastonhoitaja (4), Tiedottaja (5), Excuvastaava (6), Isäntä (7), Emäntä (8), Matikan opintovastaava (9), Fysiikan opintovastaava (0) ja Liikuntavastaava (). Hallitukseen on tarjolla 4 ehdokasta, mutta kaikki eivät pysty hoitamaan kaikkia hallituspestejä. Kandidaatin perään on merkattu numeroilla mitä hallituspestiä hän pystyy tekemään. Anni(2, 8), Bernelle(, 5, 7), Camilla(2, 3), Daria(, 4, 5, 6, 7), Erkki(3, 8), Fanni(0, ), Gabriel(3, 8, ), Heli(2, 9), Ilpo(8, 9, 0), Johanna(, 5, 6, 7), Kari(8, 9), Leevi(3, 9, ), Miro(, 4, 6, 7) ja Niina(9, 0). Hallitukseen on siis 4 ehdokasta X = {a, b,..., n} ja paikkaa täytettävänä Y = {, 2,..., }. Solmuista V (G) = [X, Y ] voidaan muodostaa kaksijakoinen graa pistämällä X solmut vasemmalle ja Y solmut oikealla ja yhdistämällä ne kaarilla, jotka vastaavat kunkin ehdokkaan mahdollista hallituspaikkaa. 4
Määritelmä.7. Graalle G = (V, E), osajoukkoa M E(G) kutsutaan sovitukseksi, jos ei ole kahta osajoukon M alkiota, jotka ovat kytköksissä samaan solmuun. Maksimisovitus on suurin mahdollinen sovitus. Kaksijakoiselle graalle jaolla [X, Y ] ei voi olla sovitusta, joka on suurempi kuin X tai Y. Esimerkkitehtävään.6 liittyvästä graasta saadaan erilaisia sovituksia poistamalla kaaria siten, että jokaisesta pestistä lähtee korkeintaan yksi ja jokaiseen nimeen tulee korkeintaan yksi kaari. Nähdään myös että voidaan muodostaa täysi hallitus, jos ja vain jos siitä tehdylle graalle löytyy sovitus, jossa on kaarta eli hallituspaikkojen määrä. Tämä nähdään myös esimerkissä tehdystä kaksijakoisessa kuvassa 2. Maksimisovituksen sijaan voimme etsiä graan maksivirtauksen, joka on myös sen maksimisovitus. 5
2 Graateoriaa Suunnattu graa ja virtausverkosto ovat graaen erikoistapauksia. Suunnatuissa graafeissa jokaisella kaarella on jokin suunta ja virtausverkostossa myös kapasiteetti. Virtausverkostoissa voi solmujen välillä kulkea virtaus joka kertoo kuinka paljon kapasiteettia on käytetty. 2. Suunnattu graa Suunnatun graan G = (V, A) määrittää solmujoukko V (G) ja nuolijoukko A(G). Jokainen joukon A(G) alkio on määrätty pari joukon V (G) alkioista. Käytetään notaatiota (i, j) kuvaamaan nuolta solmusta i solmuun j. 2.2 Virtausverkosto Virtausverkosto G = (V, A) on suunnattu graa, jossa jokaisella nuolella (i, j) A on epänegatiivinen kapasiteetti c(i, j) 0. Jos nuoli (i, j) ei kuulu joukkoon A, on sen kapasiteetti c(i, j) = 0. Jos nuoli (i, j) kuuluu joukkoon A, niin nuoli (j, i) ei kuulu joukkoon A. Virtausverkosto alkaa lähtösolmusta s ja päättyy maalisolmuun t. Jokaiselle solmulle j V on olemassa polku {s j t} virtausverkostossa. Määritelmä 2.. Olkoon G = (V, A) sellainen virtausverkosto, jolla on kapasiteettifunktio c, sekä lähtösolmu s ja maalisolmu t. Virtaus joukossa G on reaalilukuarvoinen kuvaus f : V V R seuraavilla ominaisuuksilla: Kapasiteettirajoitus: i, j V, 0 f(i, j) c(i, j) Virtauksen säilyvyys: i V {s, t}, f(j, i) = j V j V f(i, j) Kutsutaan epänegatiivistä suuretta f(i, j) virtaukseksi solmusta i solmuun j. Virtauksen f arvo määritellään seuraavasti: f = j V f(s, j) j V f(j, s) 6
Nuolen kautta ei siis voi kulkea sen kapasiteettia isompaa virtausta. Solmuun tuleva virtaus on yhtäsuuri kuin siitä lähtevä virtaus, lukuunottamatta lähdettä s ja maalia t. Virtauksen arvo f on summa kaikesta lähteestä s lähtevästä virtauksesta miinus lähteeseen kulkeva virtaus, joka on yleensä nolla. Esimerkki 2.2. Oulun tehdas on lähde s ja Helsinki on maali t. Firma kuljettaa tuotteita virtausverkon kaupunkien kautta, mutta vain c(u, v) konttia per päivä voi mennä kaupungista u kaupunkiin v. Jokaisella kaarella on oma kapasiteetti c. Kyseinen virtausverkko kapasiteetteineen on esitetty kuvassa 3. Kokkola Tampere v 2 v 3 6 20 Oulu s 4 9 7 t Helsinki 3 v 2 Kuopio 4 v 4 Lahti Kuva 3: Esimerkki virtausverkosta G = (V, E) 4 Tehdasesimerkistä muodostettu virtaus kuvassa 4 on 9, joka ei välttämättä ole maksimivirtaus. Kokkola Tampere v 2/2 v 3 /6 5/20 Oulu s /4 4/9 7/7 t Helsinki 8/3 v 2 /4 Kuopio v 4 Lahti Kuva 4: Virtausverkon G = (V, E) eräs virtaus on f =9. Nuolille on merkattu siitä kulkeva virtaus sekä kapasitetti. 4/4 7
3 Verkkoteoriaa 3. Jäännösverkosto Kappaleessa 2.2 määriteltiin virtausverkosto G ja virtaus f. Jäännösverkosto G f = (V, A f ) koostuu virtausverkoston nuolista A(G), joilla on kapasiteettia jäljellä sekä jo käytettyjen nuolien vastanuolista, joilla voidaan purkaa virtauksia. Määritelmä 3.. Jäännöskapasiteetti: c(i, j) f(i, j), (i, j) A c f (i, j) = f(j, i), (j, i) A 0, muuten. Jäännöskapasiteetti määrittelee virtausverkoston nuolten kapasiteetin lisäksi myös vastanuolten kapasiteetin, joka on siis nuolista jo kulkeneen virtauksen arvoinen mutta vastakkaiseen suuntaan. Määritelmä 3.2. Jäännösverkoston nuolijoukko: A f (G) = {(i, j) A A : c f (i, j) > 0} Virtausverkostossa virtaus voi kulkea nuolia pitkin vain eteenpäin. Jäännösverkostossa voi virtaus myös peruuttaa eli kulkea taaksepäin nuolia pitkin käyttäen tähän vastanuolia, joiden kapasiteetti on nuolesta kulkeneen virtauksen arvoinen. Määritelmä 3.3. Jos f on virtaus verkossa G ja f virtaus vastaavassa jäännösverkostossa G f, määritetään kuvaus f f virtauksen f lisäämiseksi virtaukseen f, eli funktioksi V V R { (f f f(i, j) + f (i, j) f (j, i), (i, j) A )(i, j) = 0, muuten. Jos jäännösverkostossa perutetaan, eli kuljetaan pitkin vastanuolia, niin se laskee niiden virtauksen arvoa. 8
Lemma 3.4. Suure f f virtaus joukossa G arvolla f f = f + f. Osoitetaan, että f f noudattaa kapasiteettirajoitusta jokaiselle nuolelle joukossa A ja virtauksen säilyvyyttä jokaisessa solmussa (V {s, t}). Todistus. Kapasiteettirajoitus: Jos (i, j) A, niin c f (j, i) = f(i, j) ja f (j, i) c f (j, i) = f(i, j), arvioidaan lausetta alaspäin, (f f )(i, j) = f(i, j) + f (i, j) f (j, i) (määritelmä 3.3) f(i, j) + f (i, j) f(i, j) = f (i, j) 0. sekä ylöspäin, (koska f (j, i) f(i, j)) (f f )(i, j) = f(i, j) + f (i, j) f (j, i) (määritelmä 3.3) f(i, j) + f (i, j) f(i, j) f(i, j) + c f (i, j) (virtaukset ovat epänegatiivisia) (kapasiteettirajoitus) f(i, j) + c(i, j) f(i, j) (määritelmä 3.) = c(i, j) Virtauksen säilyvyys: Koska f ja f noudattavat virtauksen säilyvyyttä, saadaan että kaikille i V {s, t}, (f f )(i, j) = (f(i, j) + f (i, j) f (j, i)) j V j V = j V (f(i, j)) + j V (f (i, j)) j V (f (j, i)) = (f(j, i)) + (f (j, i)) (f (i, j)) j V j V j V = j V (f(j, i) + f (j, i) f (i, j)) = j V (f f )(j, i) 9
3.2 Lisäyspolku Lisäyspolku p on yksinkertainen polku lähteestä s maaliin t jäännösverkostossa G f. Jäännösverkoston määritelmän mukaan (3.), voi nuolen (i, j) virtausta polulla lisätä maksimissaan sen jäännöskapasiteetin c f (i, j) verran. Määritelmä 3.5. Lisäyspolun p kapasiteetti: c f (p) = min{c f (i, j) : (i, j) p} Lemma 3.6. Määritetään funktio f p : V V R seuraavasti { c f (p), (i, j) p f p (i, j) = 0, muuten. Siten funktio f p on virtaus joukossa G f arvolla f p = c f (p) > 0 Seuraus 3.7. Lemmoista 3.4 ja 3.6 saadaan: f f p = f + f p > f Jos jäännösverkostosta G f löytyy lisäyspolku p, sen lisäys kasvattaa aina virtausta f arvolla f p. Kun jäännösverkostosta ei löydy enää uusia polkuja lähteestä s maaliin t, on löydetty maksimivirtaus. Esimerkin 2.2 kuvan 4 eräästä virtauksesta muodostettu jäännösverkosto on nähtävissä kuvassa 5. Kuvasta nähdään, että virtauksen f =9 arvoa voidaan vielä kasvattaa. Jäännösverkostosta löytyy lisäyspolku p = {s v 2 v 3 t}, jolla on kapasiteetti c f (p) = 4. Solmusta v 2 solmuun v 3 kuljetaan vastanuolta pitkin, eli siinä puretaan alkuperäisiä virtauksia. Kokkola Tampere v 2 v 3 5 5 4 5 Oulu s 3 t Helsinki 5 7 8 5 7 v 2 3 v 4 4 Kuopio Lahti Kuva 5: Jäännösverkoston G f vastanuolet on merkitty katkoviivoilla. 0
4 Maksimivirtaus Jäännösverkoston ja lisäyspolun määrittelyn jälkeen voidaan vihdoin tutustua algoritmiin, jolla pystyy laskemaan virtausverkon maksimivirtauksen. Ford-Fulkerson(G, s, t) algoritmi[3]. for each arrow(i, j) A(G) 2. f(i, j) = 0 3. while there exist a path p from s to t in the residual network G f 4. c f (p) = min{c f (i, j) : (i, j) p} 5. for each arrow(i, j) in p 6. if (i, j) A 7. f(i, j) = f(i, j) + c f (p) 8. else f(j, i) = f(j, i) c f (p) Algoritmin toistorakenne jatkuu niin kauan kuin jäännösverkostossa löytyy polkuja lähteestä maaliin. Toiston alussa polun kapasiteetiksi määräytyy pienin polulla olevista jäännöskapasiteeteista. Sen jälkeen polun nuolista vähennetään se kapasiteetti ja polun vastanuoliin lisätään se kapasiteetti. Kun polkuja ei enää löydy, algoritmi päättyy. Jos algoritmilla haetaan esimerkin 2.2 maksimivirtaus, niin saadaan vastaukseksi f = 23, joka näkyy kuvassa 6. Kokkola Tampere v 2/2 v 3 /6 9/20 Oulu s /4 0/9 7/7 t Helsinki 2/3 v 2 /4 Kuopio v 4 Lahti 4/4 Kuva 6: Esimerkin 2.2 maksimivirtaus f = 23.
Kaksijakoisen graan pystyy helposti muuttamaan virtausverkoksi lisäämällä siihen lähteen s ja maalin t, sekä antamalla jokaiselle kaarelle saman suunnan ja kapasiteetin. Jatkoa esimerkkiin.6 Palataan tutkielman alussa esitettyyn hallituksen muodostamisongelmaan. Koska siitä on jo muodostettu kaksijakoinen graa (kuva 2), voidaan siitä muodostaa virtausverkko, joka näkyy kuvassa 7. Seuraavaksi voidaan laskea sen maksimivirtaus, joka on siis myös suurin sovitus. s a b c 2 d 3 e 4 f g 5 6 t h i j k l 7 8 9 0 m n Kuva 7: Hallitusesimerkistä muodostettu virtausverkko. 2
Kun Ford-Fulkerson algoritmi on ajetettu läpi, niin saamme maksivirtaukseksi 0. Eli alkuperäisen graan maksimisovitus on 0, joka tarkoittaa että saamme täytettyä vain kymmenen hallituspaikkaa yhdestätoista. Kuvasta 8 näemme, että tilanne korjaantuisi jos esimerkiksi Anni, Camilla, Fanni, Gabriel, Heli, Erkki, Ilpo, Kari tai Niina suostuisi isännäksi(7). a / / b c 2 / / / d e 3 4 / / / s / / f g 5 6 / / t / h 7 / i 8 / / j 9 / / / k l m 0 / n Kuva 8: Esimerkin.6 maksimisovitus on 0. Käyttämättömät nuolet on merkitty katkoviivoilla. 3
Viitteet [] Frank R. Giordano, William P. Fox, Steven B. Horton, Maurice D. Weir: A First Course in Mathematical Modeling; Fourth Edition. Brooks/Cole, Canada, 2009. [2] R. R. Kadesch: Problem Solving Across the Disciplines. Prentice Hall, United States, 997. [3] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: Intoduction to Algorithms; Third Edition. The MIT Press, England, 2009. 4