Harjoitus (..05) Tehtävä Olkoon kaaren paino c ij suurin sallittu korkeus tieosuudella (i,j). Etsitään reitti solmusta s solmuun t siten, että reitin suurin sallittu korkeus pienimmillään olisi mahdollisimman suuri. Kohdefunktioksi saadaan nyt max P min (i,j) P {c ij } reitillä P solmusta s solmuun t. Dynaamisen optimoinnin rekursioyhtälöt ovat ja kaaren paino c ij 0. y = y j = max i (i,j) E {min {c ij,y i }}, j =,...,n Tehtävän ratkaisemiseksi tarvittava modifioitu Dijkstran algoritmi on seuraava: 0 Olkoon Kiinnitetään solmu p = s., jos i = s v[i] = 0, jos i s. Merkitään solmu p kiinnitetyksi ja jokaiselle siitä kiinnittämättömään solmuun i lähtevälle kaarelle (p, i) päivitetään v[i] max {v[i],min {v[p],c pi }}. Jos v[i]:n arvo muuttui, niin asetetaan d[i] p. Lopetus samoin kuin alkuperäisessä algoritmissa. Kiinnitetään seuraavaksi solmu p, jonka väliaikainen maksimikorkeus on suurin. Tehtävä Muotoillaan Harjoituksen Tehtävä nopeimman reitin ongelma minimikustannusvirtausongelmaksi suunnatulla verkolla. Virtausongelmassa oleellista on suunta, joten alkuperäinen suuntaamaton verkko pitää suunnata. Virtaus kulkee aina nuolen suuntaan (positiivisuusehto), joten jokaista kahden kaupungin välistä reittiä vastaa kaksi nuolta. (Vrt. Esimerkki. kuvat ja 5.) Turku on lähde (tarjonta ), Joensuu nielu (kysyntä ) ja muut solmut ovat kauttakulkusolmuja. Koska verkossa on vain yksi lähde, voidaan Turkuun tulevat nuolet
5 7 Figure : Tehtävän graafi. jättää huomioimatta. Koska verkossa on vain yksi nielu, voidaan Joensuusta lähtevät nuolet myös jättää huomioimatta. Huom. tämä ei ole yleisesti mahdollista (vrt. verkko, jossa useita lähteitä, ja vaikkapa kahden lähteen välillä nuolet). Olkoon x ij virtaus nuolella (i,j). Silloin saadaan optimointitehtävä min x +x +x +x +x +x +x +x +x 5 +7x 5 +x 5 s.t. x +x = x +x +x 5 x x x = 0 x +x +x 5 x x x = 0 x +x +x 5 x x = 0 x 5 x 5 x 5 = x ij 0, (i,j) E. () Tehtävää vastaava insidenssimatriisi on solmu (,) (,) (,) (,) (,5) (,) (,) (,5) (,) (,) (,5) + + 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 + + 0 0 0 0 0 0 0 0 + + + 5 0 0 0 0 0 0 0 0 Koska u ij = kaikilla i,j ja vektorin b = (,0,0,0, ) komponentit ovat kokonaislukuja, niin tehtävällä on kokonaislukuratkaisu. Tämä seuraa luentomonisteen kohdassa. esitetyistä perusteluista (ottaen huomioon että u ij = ).
Vaihtoehtoinen perustelu sille että tehtävällä on kokonaisratkaisu olisi että insidenssimatriisi on unimodulaarinen ja vektorin b alkiot ovat kokonaislukuja. Kuten luentomonisteessa on todettu, tästä seuraa että simpleksialgoritmin tuottamat ratkaisut ovat kokonaislukuja (ks.. Minimikustannusvirtausongelman ratkaisujen jaollisuus). Tehtävä 5 7 0 Figure : Tehtävän aputehtävää varten täydennetty graafi. Ratkaistaan edellisen tehtävän optimointiongelma () kaksivaihemenetelmällä käyttäen luentomonisteen algoritmia.. Lähdemme ratkaisemaan tehtävää käyttäen alkuarvausta x 0 = (0,0,0,0,0,0,0,0,0,0,0). Alkuarvaus ei ole sallittu, koska ensimmäinen ja viimeinen rajoiteyhtälö eivät toteudu. Tästä johtuen muodostamme edellisen tehtävän optimointiongelmasta aputehtävän lisäämällä apumuuttujat x 0 ja x 05. Aputehtävää vastaavassa graafissa (kuva ) on lisätty ylimääräinen 0-solmu, johon on nuoli solmusta ja nuoli solmuun 5, ja kummankin nuolen paino on. Alkuperäisen
optimointiongelman nuolia vastaaville nuolille asetetaan paino 0. Aputehtäväksi saadaan min x 0 +x 05 s.t. x +x +x 0 = x +x +x 5 x x x = 0 x +x +x 5 x x x = 0 x +x +x 5 x x = 0 x 5 x 5 x 5 x 05 = x 0 x 05 = 0 x ij 0, (i,j) Ẽ, () missä Ẽ tarkoittaa kuvan graafin nuolijoukkoa. Koska luentomonisteen algoritmissa. optimoidaan vektorimuuttujan suhteen, otamme käyttöön vektorin x jonka alkiot vastaavat optimointiongelmissa () ja () esiintyviä kaksi-indeksisiä muuttujia taulukon x x x x x 5 x x x 5 x x x 5 x 0 x 05 x x x x x 5 x x 7 x 8 x 9 x 0 x x x mukaisesti. Vaihe I Vaiheessa I ratkaisemme aputehtävän, josta saamme sallitun aloitusvirtauksen varsinaiselle optimointiongelmalle. Merkitkäämme aputehtävästä haettavaa virtausta muuttujalla x. Luentomonisteen algoritmi. sovellettuna aputehtävään koostuu seuraavista vaiheista: 0 Koska virtaus x 0 = (0,0,0,0,0,0,0,0,0,0,0,,) on selvästi sallittu, valitsemme sen aloitusvirtaukseksi. ja Löytyy sallittu parantava lenkki, kuten esimerkiksi 5 0. Käyttäen luentomonisteen sivulla olevaa kaavaa lenkkiä vastaavalle suunnalle saamme suunnan x = (,0,0,0,,0,0,0,0,0,0,, ). Suunta x sallittu, koska lenkin suuntaisilla nuolilla (,) ja (,5) virtaukset x = x 5 = 0 < ovat alle kapasiteetin ja lenkkiä vastakkaisilla nuolilla (0,5) ja (,0) virtaukset x 0 = x 05 = > 0. Suunta on myös parantava, sillä ongelman () kohdefunktiolle c(x) = x 0 x 05 saadaan c( x) = =. Käyttäen luentomonisteen sivulla esitettyjä kaavoja askelpituudelle λ saamme min {, 0} λ = min = min {,}
Päivitetään virtaus kaavalla x = x 0 +λ x, jolloin saamme x = (,0,0,0,,0,0,0,0,0,0,0,0). Algoritmin. suoritus voidaan päättää ensimmäisen iteraation jälkeen, koska apumuuttujia x 8 ja x 9 vastaavat vektorin x komponentit ovat nollia. Vertaamalla optimointitehtävien () ja () rajoitteita havaitsemme että vektorista x saatu vektori x 0 = (,0,0,0,,0,0,0,0,0,0) on vaiheen II optimointitehtävän () sallittu aloitusvirtaus. Tämä tieto riittää meille vaihetta II varten. Vaihe II Vaiheessa II ratkaisemme alkuperäisen optimointitehtävän () käyttäen vaiheessa I saatua aloitusvirtausta. 0 Aloitusvirtaukseksi valitaan vaiheessa I saatu x 0 = (,0,0,0,,0,0,0,0,0,0). ja Voidaan valita esimerkiksi lenkki 5. Luentomonisteen sivulla olevaa kaavaa käyttämällä saamme lenkkiä vastaavaksi suunnaksi x = (,,0,0,,0,,0,0,0,). Suunta on sallittu, koska lenkin suuntaisilla nuolilla (,), (,) ja (,5) virtaukset ovat alle kapasiteetin joka on ja lenkkiä vastakkaisilla nuolilla (,5) ja (,) on voimassa x 0 5 = x0 5 = > 0 ja x0 = x0 = > 0. Suunta x on myös parantava, koska kohdefunktiolle c(x) = x +x +x +x +x +x +x +x +x 5 +7x 5 +x 5 = x +x +x +x +x +x 9 +x 7 +x 0 +x 5 +7x 8 +x saamme c( x) = + ++ =. Käyttäen luentomonisteen sivulla esitettyjä kaavoja askelpituudelle λ saamme min {, } λ = min = min {,min{,}} Päivitetään virtaus kaavalla x = x 0 + λ x, jolloin saamme x = (0,,0,0,0,0,,0,0,0,). Ensimmäisen iteraation jälkeen ei löydy enää sallittua ja parantavaa lenkkiä, joten optimiratkaisuksi saadaan x = (0,,0,0,0,0,,0,0,0,). Alkuperäisen optimointitehtävän kaksi-indeksisillä merkinnöillä tämä voidaan kirjoittaa muotoon x =, x =, x 5 = ja muut 0. Tämä tarkoittaa reittiä Turku Helsinki Kuopio Joensuu. 5
Tehtävä Älytaulujen tarjonta Kajaanissa ja Vaasassa on kummassakin 50 kpl/vuosi, ja kysyntä Helsingissä 0 ja Turussa 0 taulua/vuosi. Annetaan kaupungeille numerot seuraavasti: = Kajaani = Vaasa = Jyväskylä = Turku 5 = Helsinki. Muodostetaan minimikustannusvirtausongelma (ks. luentomoniste s. ). Solmut ja ovat lähteitä, joiden nettotarjonta on 50 kummassakin. Solmu on kauttakulkusolmu, ja solmut ja 5 ovat nieluja. Koska osa tuotannosta jää yli, muodostetaan lisäksi apusolmu nro. Apusolmu on nielu, jonka kysynnäksi asetetaan 50 (0+0) = 0 taulua/vuosi. Kuva esittää näillä tiedoilla piirrettyä graafia, jonka nuolten painoiksi huomioidaan sekä kuljetus- että yksikkötuotantokustannukset. 5 Figure : Tehtävän graafi.
Olkoon x ij virtauksen määrä nuolta (i,j) pitkin. Saadaan optimointitehtävä min 90x +00x +080x 5 +000x +0x +50x 5 +80x +90x 5 +800x +900x s.t. x +x 5 +x +x = 50 x +x +x 5 +x = 50 x x +x +x 5 = 0 x x x = 0 x 5 x 5 x 5 = 0 x x = 0 x ij 0, (i,j) E. Jos Jyväskylän kautta voidaan kuljettaa korkeintaan 0 taulua, niin muutetaan tehtävää jakamalla Jyväskylää kuvaava solmu solmuiksi a ja b. Näistä ensimmäiseen suunnataan Jyväskylään tulevat nuolet ja jälkimmäisestä laitetaan lähtemään Jyväskylästä lähtevät nuolet. Solmusta a solmuun b lisätään vielä nuoli, jonka paino on 0, ja virtauksen ylärajaksi nuolella asetetaan u a,b = 0. b 5 Figure : Tehtävän graafi kun Jyväskylän kautta voidaan kuljettaa korkeintaan 0 tietokonetta. 7
min 90x +00x +080x 5 +000x +0x +50x 5 +80x +90x 5 +800x +900x s.t. x +x 5 +x,a +x = 50 x,a +x +x 5 +x = 50 x,a x,a +x a,b +x a,b = 0 x a,b x a,b +x b, +x b,5 = 0 x x x b, = 0 x 5 x 5 x b,5 = 0 x x = 0 0 x a,b 0 x ij 0, (i,j) E. Tehtävä 5 Muotoillaan annetuista tiedoista kuljetusongelma. Lähteitä ostetut liinat sekä päivinä i (i =,...,) käytetyt ja pestyt liinat. Nieluja puolestaan ovat liinojen tarpeet päivinä i (i =,...,5). Tehtävässä annetuista tiedoista saadaan taulukko. päivä. päivä. päivä. päivä 5. päivä ylimääräiset tarjonta ostetut 5 5 5 5 5 0 70. pv pestyt M,5,5,5,5 0 0. pv pestyt M M,5,5,5 0 0. pv pestyt M M M,5,5 0 90. pv pestyt M M M M,5 0 0 kysyntä 0 0 90 0 00 0 Ostettavien liinojen tarjonta on saatu laskemalla 0 + 0 + 90 + 0 + 00 = 70. Ylläolevassa taulukossa on myös sarake ylimääräiset ylijäämäliinoja varten. Koska varastoon ei osteta liinoja ja kaikki saatavilla olevat liinat käytetään, tähän sarakkeeseen tulevat luvut ovat viimeistä riviä lukuunottamatta nollia. Ylimääräiset-sarakkeen viimeiselle riville tulee sen nielun tarve, jonne ohjataan kokonaistarjonnasta yli jäävä osa, kun kokonaistarjonnasta on vähennetty kokonaiskysyntä. Kyseinen luku 0 on siis saaatu vähentämällä tarjontojen (oikea sarake) summasta, joka on 0, kysyntöjen (alin rivi) summa päiviltä.-5., joka on 70. Ylläolevassa taulukossa olevat luvut ovat kustannuksia, alarivillä olevat luvut ovat nielujen tarpeet, ja oikeanpuoleisessa sarakkeessa olevat luvut ovat lähteiden tarjonnat. Kun merkitään näitä muuttujilla c ij, d j ja s i, missä i =,,...,5 ja j =,,...,, 8
ylläolevasta taulukosta saadaan optimointitehtävä, joka on samaa muotoa kuin luentomonisteen sivulla 5 esitetty. 9