Mat-.40 Lineaarinen ohjelmointi 5..007 Luento 9 Verkkotehtävän erikoistapauksia (kirja 7., 7.5, 7.9, 7.0) Lineaarinen ohjelmointi - Syksy 007 /
Luentorunko (/) Verkkotehtävän ominaisuuksia Kuljetustehtävä Töiden järjestely Lyhyimmän polun tehtävä Bellman-Ford Dijkstra Lineaarinen ohjelmointi - Syksy 007 /
Luentorunko (/) Maksimivirtaustehtävä Ford-Fulkerson Minimivirityspuu Yhteenveto Lineaarinen ohjelmointi - Syksy 007 /
Verkkotehtävän ominaisuuksia (/) a) Jokainen verkkotehtävä voidaan muuttaa tehtäväksi, jossa yksi lähde ja yksi nielu b 4 b 4 s b t 5 b 5 + b b b + b 4 5 b + u = b, l = si i it b i b) Jokainen verkkotehtävä voidaan muuttaa lähteettömäksi ja nieluttomaksi (kiertokulku) b s u ts = b, c ts = M t b Lineaarinen ohjelmointi - Syksy 007 / 4
Verkkotehtävän ominaisuuksia (/) c) Mahdollinen solmun kapasiteettirajoite voidaan eliminoida d) Kaarien kapasiteettien alarajat voidaan yleistää nolliksi (viime kerran kotitehtävä) b i bi i i g i u ' = ii g i i Lineaarinen ohjelmointi - Syksy 007 / 5
Kuljetustehtävä (/ Kuljetustehtävä: lähteistä i tarjonnat s i minimikustannuksella nieluihin j kysynnöin d j Erikoistapaus yleisestä tehtävästä kaikki solmut joko lähteitä tai nieluja: min s. e. m i= f n j= ij c ij ( i, j) A f f ij ij f ij = = 0, d s i j,, j=,..., n i=,..., m i, j Lineaarinen ohjelmointi - Syksy 007 / 6
Kuljetustehtävä (/) Kaikki verkkotehtävät voidaan muuttaa kuljetustehtävämuotoon Idea: Solmuilla kysyntää niistä lähtevän tavaran kuljetuksen hoitamiseen. Kaarilla tarjontaa kapasiteettinsa verran. Tavaran kotiin jättäminen ei maksa mitään, kuljetus toiseen solmuun kaarikustannuksen verran Kuljtetustehtävälle kehitettyjä algoritmeja voi siis hyödyntää yleisemmissä tehtävissä! Lineaarinen ohjelmointi - Syksy 007 / 7
Töiden järjestely (/) Työt ja tekijät halutaan yhdistää kustannusoptimaalisella tavalla Myös nimellä parinmuodostus (assignment problem) Erikoistapaus kuljetustehtävästä: nieluilla ja lähteillä yksikkötarjonnat/-kysynnät Leipuri Kitaristi Kampaaja 4 4 4 Häävalssin säestys Morsiamen kampaus Hääkakku Lineaarinen ohjelmointi - Syksy 007 / 8
Töiden järjestely (/) Ratkaisu esim. huutokauppa-algoritmilla Ei käsitellä; ideana huutokaupata työt tekijöille Kuljetustehtävästä töiden järjestelyksi jakamalla lähteet ja nielut yksiköiksi Huutokauppa-algoritmin voi yleistää kuljetustehtävälle ja sitä kautta yleiselle verkkotehtävälle! Huutokauppa-algoritmi onkin yleisin kuljetustehtävän ratkaisutapa Lineaarinen ohjelmointi - Syksy 007 / 9
Lyhyimmän polun tehtävä (/4) Etsitään lyhyintä mahdollista reittiä kahden solmun välillä (kaaren pituus = kaaren kustannus) Esim. datapakettien reititys: Tukiasema Internet Palvelin Analogia Kytkimet ja verkkolaitteet = solmut Tukiasema Palvelin Palvelin Datayhteydet Minimipolku = kaaret = nopein yhteys Tukiasema Palvelin Lineaarinen ohjelmointi - Syksy 007 / 0
Lyhyimmän polun tehtävä (/4) Toinen esim. projektin hallinta: Aloitus Projekti koostuu töistä, joista jotkin pitää olla suoritettu ennen kuin toiset voi aloittaa. Halutaan minimoida projektin kokonaiskestoa. Etsitään pisintä polkua eli -(lyhyintä polkua) Materiaalien tilaus Minimipolku ja projektit Pisin polku Pisimmän polun pituus Kaaret Pisimmän polun kaaret 4 5 Henkilöstön palkkaus Koulutus Materiaalien kuljetus Koulutus Rakentaminen4 = kriittinen polku = projektin kesto = tehtävät = kriittiset tehtävät Tällainen tehtävä laskareissa! Lineaarinen ohjelmointi - Syksy 007 /
Lyhyimmän polun tehtävä (/4) Useita nimikettä korjaavia (label correcting) ratkaisualgoritmeja Bellman-Ford (käsitellään) Lisäksi mm. D Esopo-Pape, Floyd, SLF, LLL, Kynnysalgoritmi... Vaihtoehtona Dijkstran algoritmi, joka on nimikkeen asettava menetelmä (label setting method). Lineaarinen ohjelmointi - Syksy 007 /
Lyhyimmän polun tehtävä (4/4) Kullekin solmulle i määritelty nimike (label) p i (skalaari tai ääretön) Tulkinta nimikkeelle p i : solmun i etäisyys lähtösolmusta jotakin löydettyä polkua pitkin (vrt. duaalimuuttuja!) Algoritmi etsii polkuja solmujen välillä ja päivittää nimikkeitä vastaavasti Lineaarinen ohjelmointi - Syksy 007 /
Lyhyimmän polun tehtävä: Optimaalisuusehdot Olkoon p, p,, p N solmujen nimikkeet, joille: p j p i + c ij, ( i, j) Α () ja olkoon P polku, joka alkaa solmusta i ja päättyy solmuun i k. Jos p j = p i + c ij, () kaikille P:n kaarille (i,j), P on lyhyin polku i :stä i k :hon. Ratkaisualgoritmit perustuvat näihin ehtoihin. Lineaarinen ohjelmointi - Syksy 007 / 4
Lyhyimmän polun tehtävä: Bellman-Ford (/). Alustus: p n =0, muille solmuille ääretön. Tutkittavien lista S={n}. Iteraatio: poista jokin solmu j S:stä. Tutki kaaret (i,j) ja aseta p i :=min{p i,c ij +p j }. Jos p i muuttuu, lisää solmu i S:ään.. Jos S on tyhjä, algoritmi terminoituu. Muuten, palaa askeleeseen. 4. Lyhyimmät polut saadaan tarkastelemalla mitä solmua tutkittaessa (poistettaessa) mikin solmu sai lopullisen nimikkeensä Lineaarinen ohjelmointi - Syksy 007 / 5
Lyhyimmän polun tehtävä Bellman-Ford (/) Bellman-Ford korjaa nimikkeitä aina lyhyemmän polun löytyessä Solmut saattavat siis tulla tutkittavien listaan useampaan kertaan Löytää lyhyimmät polut kaikista solmuista loppusolmuun Sallii negatiiviset kaaren pituudet hyödyllistä projektinhallintatehtävässä (laskarit!) Lineaarinen ohjelmointi - Syksy 007 / 6
7 Esimerkki: Iteraatiot ja 9 Alustus: p = {,,, 0}, S={4} 9 8 8 7 7 4 4 0 0 Poistetaan solmu 4 S:stä Kaari (,4): p := p 4 + c 4 =, solmu S:ään Kaari (,4): p := p 4 + c 4 = 7, solmu S:ään Nimikkeet: p = {, 7,, 0}, S={,} Poistetaan solmu S:stä Kaari (,): p := p + c = 9, solmu S:ään Lineaarinen ohjelmointi - Syksy 007 / 7
9 9 9 9 8 8 7 7 7 7 Esimerkki: Iteraatiot ja 4 4 4 0 0 Nimikkeet: p = {9, 7,, 0}, S={,} Poistetaan solmu S:stä Kaari (,): p + c = 0 > p Nimikkeet: p = {9, 7,, 0}, S={} Poistetaan solmu S:stä Ei tutkittavia kaaria! S tyhjä, eli algoritmi terminoituu Mitä solmua poistettaessa lopulliset nimikkeet saatiin? Lineaarinen ohjelmointi - Syksy 007 / 8
Lyhyimmän polun tehtävä: Dijkstra (/). Alustus: p =0, muille solmuille ääretön. Tutkittavien lista S={}.. Iteraatio: poista S:stä pienintä nimikettä vastaava solmu i. Tutki kaaret (i,j) ja aseta p j :=min{p j,c ij +p i }. Jos p j muuttuu, lisää j S:ään.. Jos S on tyhjä, algoritmi terminoituu. Muuten palaa askeleeseen. 4. Lyhyimmät polut löydetään tarkastelemalla mitä solmua tutkittaessa (poistettaessa) mikin solmu sai lopullisen nimikkeensä Lineaarinen ohjelmointi - Syksy 007 / 9
Lyhyimmän polun tehtävä: Dijkstra (/) Algoritmi asettaa solmuille lopulliset nimikkeet niiden poistuessa tutkittavien listalta S Tämän jälkeen solmu ei enää palaa S:ään Löytää lyhyimmät polut alkusolmusta kaikkiin muihin solmuihin Algoritmi kuitenkin vaatii, että kaarten kustannukset (pituudet) ei-negatiivisia Lineaarinen ohjelmointi - Syksy 007 / 0
Esimerkki:. iteraatiokierros S= {} Nimikkeet p = {0,,,, } p i min p = 0, poistettava solmu i = = j j S 0 0 4 0 5 Kaari (, ): p := p + c =. Solmu tutkittavien listaan Kaari (, ): p := p + c =. Solmu tutkittavien listaan Lineaarinen ohjelmointi - Syksy 007 /
= j j S. iteraatiokierros 0 0 4 5 0 S = {, } Nimikkeet p = {0,,,, } p i min p =, poistettava solmu i = Kaari (, ): p + c = = p Kaari (, 4): p 4 := p + c 4 = 4. Solmu 4 tutkittavien listaan Lineaarinen ohjelmointi - Syksy 007 /
. iteraatiokierros S = {, 4} Nimikkeet p = {0,,, 4, } p i = min p =, poistettava solmu i = j S j 0 0 4 5 0 4 Kaari (, ): p + c = > p Kaari (, 4): p + c 4 = < p 4, asetetaan p 4 := Kaari (, 5): p 5 := p + c 5 =. Solmu 5 tutkittavien listaan Lineaarinen ohjelmointi - Syksy 007 /
S = {4, 5} Nimikkeet p = {0,,,, } 4. iteraatiokierros p i = min p =, poistettava solmu i = 5 ei tutkittavia kaaria j S j 0 0 4 5 0 Lineaarinen ohjelmointi - Syksy 007 / 4
5. iteraatiokierros 0 0 4 5 0 Lopullisen nimikkeen S = {4} saanut solmu Nimikkeet p = {0,,,, } p i = min p j =, poistettava solmu i = 4 j S Kaari (4, 5): p 4 + c 45 = > p 5 S on nyt tyhjä, joten algoritmi päättyy 4 5 Mitä solmua tutkittiin? Lineaarinen ohjelmointi - Syksy 007 / 5
Maksimivirtaustehtävä (/) Verkko, jossa on yksi lähde ja yksi nielu kustannuksia ei huomioida Tehtävänä kuljettaa mahdollisimman paljon virtausta lähteestä nieluun kaarien kapasiteettien [0,u ij ] rajoissa (esim. logistiikka) Lineaarinen ohjelmointi - Syksy 007 / 6
Maksimivirtaustehtävä (/) Kunkin kaaren virtaus ja maksimikapasiteetti kertovat kuljetusverkon pullonkauloista ja turhista reiteistä 7/7 L /5 / A /0 Bo 0/0 4/6 Br 0/0 W Pa 4/4 0/0 Pr 8/8 Be 4/ Lineaarinen ohjelmointi - Syksy 007 / 7
Maksimivirtaustehtävä (/) Määritelmä 7.: Olk. f käypä virtaus verkossa. Polku lähteestä s nieluun t on täydentävä polku (augmenting path), jos f ij <u ij kaikilla polun eteenpäin suunnatuilla ja f ij >0 taaksepäin suunnatuilla kaarilla Ts. täydentävää polkua P pitkin on mahdollista työntää lisää virtausta, kuitenkin enintään δ ( P) = min{ min ( u ( i, j) F ij f ij ), min ( i, j) B f ij } Lineaarinen ohjelmointi - Syksy 007 / 8
Maksimivirtaustehtävä: Ford-Fulkerson Fulkerson (/4) Ford-Fulkerson algoritmi: ) Alussa käypä virtaus f ) Etsitään täydentävä polku ) Jos täyd. polkua ei löydy, maksimivirtaus on löydetty 4) Jos täyd. polku P löytyy: a) Jos δ (P) < työnnetään δ (P) yksikköä virtausta polkua pitkin ja palataan askeleeseen b) Jos δ (P) =, tehtävä on rajoittamaton Lineaarinen ohjelmointi - Syksy 007 / 9
Maksimivirtaustehtävä: Ford-Fulkerson Fulkerson (/4) Miten täydentävä polku löydetään? Nimikkeet avuksi! Idea: Aloitetaan lähdesolmusta s tutkitaan lähteekö solmusta/tuleeko solmuun kaaria, joihin voi työntää lisää virtausta. Tutkitaan samaan tapaan tällaisten kaarten maalisolmut jne, kunnes joko moisia kaaria ei enää löydy tai ollaan päästy nielusolmuun t, jolloin vastaava polku on täydentävä. Lineaarinen ohjelmointi - Syksy 007 / 0
Maksimivirtaustehtävä: Ford-Fulkerson Fulkerson (/4) Nimikealgoritmi täydentävän polun etsintään:. Alustus: joukko I={s}. Iteraatio: I:ssä nimikkeelliset solmut, joista lähteviä kaaria ei vielä tutkittu. Jos t I tai jos I =, algoritmi terminoituu. Muuten valitaan solmu i I poistettavaksi I:stä. Tutkitaan kaaret (i,j) ja (j,i). Jos ( i, j) A, f ij < u ij, annetaan j:lle nimike (jos sillä ei vielä ole) ja lisätään se joukkoon I 4. Jos ( j, i) A, f > 0, tehdään kuten edellä. ji Lineaarinen ohjelmointi - Syksy 007 /
Maksimivirtaustehtävä: Ford-Fulkerson Fulkerson (4/4) Jos täydentäviä polkuja löytyy useita, valitaan niistä se, jossa vähiten kaaria Tällöin Ford-Fulkerson ratkaisee maksimivirtaustehtävän polynomiajassa Pienissä tehtävissä (käsin väännettävissä) kannattaa kuitenkin tyytyä ensin löydettyyn Lineaarinen ohjelmointi - Syksy 007 /
Esimerkki (/) Alkutilanne: s 5/6 / / / /4 / / /5 Täyd. polku P saadaan tutkimalla miltä solmulta t sai nimikkeensä, miltä tämä omansa jne. Täten P={s,,,t}. 4 / t Täydentävän polun haku:. I={s}. Tutkitaan solmu s. Nimikkeet solmuille ja. I={,}. Tutkitaan solmu. Nimike solmulle 4.. I={,4}. Tutkitaan solmu 4. Ei nimikkeitä. 4. I={}. Tutkitaan solmu. Nimike solmulle. 5. I={}. Tutkitaan solmu. Nimike solmulle t => täydentävä polku löydetty Lineaarinen ohjelmointi - Syksy 007 /
s 5/6 / / / /4 Esimerkki (/) / / /5 4 / t P:tä pitkin työnnettävä lisävirtaus: δ ( P) = min{ min ( u ( i, j) F ij ), min ( i, j) B = min{min{( ),(5 )},} = min{,} = f ij f ij } s 5/6 / 0/ / /4 / / 4/5 4 / Päivitetään verkko t Lineaarinen ohjelmointi - Syksy 007 / 4
Esimerkki (/) s 5/6 / / 0/ /4 / 4/5 / 4 / t Täydentävän polun haku:. I={s}. Tutkitaan solmu s. Nimike solmulle.. I={}. Tutkitaan solmu. Nimike solmulle 4. Pullonkaulat punaisella, turha reitti katkoviivalla. I={4}. Tutkitaan solmu 4. Ei nimikkeitä. 4. I tyhjä ei täydentävää polkua. Maksimivirtaus löydetty. Lineaarinen ohjelmointi - Syksy 007 / 5
Minimivirityspuu (/4) Puu: yhtenäinen verkko, joka ei sisällä syklejä Verkon virityspuu: puu, joka sisältää kaikki ko. verkon solmut Minimivirityspuutehtävä: etsitään verkolle sellainen virityspuu, että sen kaarien kustannusten summa on minimissä Lineaarinen ohjelmointi - Syksy 007 / 6
Minimivirityspuu (/4) Esim. Espooseen rakennettava mahdollisimman halvalla pyörätieverkosto siten, että kaikkiin oleellisiin paikkoihin päästään (ei välttämättä pyöräilijän kannalta kovinkaan järkevästi) Kirjasto Kauppa Ostari %&# @$!!! Teatteri Uimahalli Kiska Otaniemi Otaniemeläinen pyöräilijä halajaa ostarille Lineaarinen ohjelmointi - Syksy 007 / 7
Minimivirityspuu (/4) Ratkaisualgoritmi:. Olk. suuntaamaton verkko (N,A) jonka kaarille määrätty kustannukset. Alustus puulla (N,A ), jossa yksi solmu eikä yhtään kaarta (A tyhjä). Askeleella k<n puu (N k,a k ). Tutkitaan kaikki kaaret ( i, j) A joille i Nk, j Nk. Valitaan puuhun pienintä kustannusta vastaava kaari ja sen maalisolmu => (N k+,a k+ ).. Jatketaan kunnes k=n. Ts. kierroksen k puulle etsitään lyhyintä lisättävää oksaa, joka vie johonkin puuhun kuulumattomaan solmuun Lineaarinen ohjelmointi - Syksy 007 / 8
Kirjasto 7 Teatteri 5 6 Kauppa Ostari Minimivirityspuu (4/4) 4 Uimahalli Kiska Otaniemi. N ={}, A tyhjä. Tutkitaan :ä sivuavat kaaret, joista (,) lyhyin.. N ={,}, A ={(,)}. Tutkitaan solmuja ja sivuavat kaaret, joiden toinen pää ei N :ssa eli {(,4), (,),(,)}. Lyhyin kaari (,).. N ={,,}, A ={(,),(,)}. Tutkittavat kaaret {(,4),(,4),(,5),(,6)}. 4. N 4 ={,,,6}, A 4 ={A,(,6)}. Tutkittavat kaaret {(,4),(,4),(,5),(6,5),(6,7)}. 5. N 5 ={,,,5,6}, A 5 ={A 4,(6,5)}. Tutkittavat kaaret {(,4),(,4),(5,4),(5,7),(6,4),(6,7)}. 6. N 6 ={,,,4,5,6}, A 6 ={A 5,(5,4)}. Tutkittavat kaaret {(5,7),(6,7)}. Lineaarinen ohjelmointi - Syksy 007 / 9
Yhteenveto Verkkotehtävällä useita ekvivalentteja muotoja: Yleinen tehtävä Kuljetustehtävä Töiden järjestely Lyhyimmän polun tehtävän ratkaisualgoritmit perustuvat nimikkeisiin Bellman-Ford, Dijkstra Maksimivirtaustehtävän ratkaisualgoritmit etsivät täydentävää polkua Ford-Fulkerson Minimivirityspuu rakennetaan etsimällä aina lyhyintä oksaa senhetkiselle puulle Lineaarinen ohjelmointi - Syksy 007 / 40