Harjoitus 1 (20.3.2014) Tehtävä 1 Piirretään tilanteesta verkko, jossa kaupungeille on annetttu seuraavat numerot: 1 = Turku 2 = Tampere 3 = Hämeenlinna 4 = Imatra 5 = Jyväskylä. 5 2 149(5) 190(4) 113(1) 1 157(2) 75(1) 142(4) 3 4 199(2) Kuva 1: Tehtävän 1 graafi. a) Tehtävänä on ratkaista Bellman Ford-algoritmilla lyhimmät reitit Turusta muihin kaupunkeihin sekä lyhin reitti Turusta Jyväskylään. Bellman Ford-algoritmi määritellään kaavoilla 0, k = s v 0 [k] =, muulloin v t [k] = min {v t 1 [i] + c ik (i, k) E} = v t 1 [l] + c lk, d[k] l, missä k = 1, 2, 3, 4, 5. Algoritmin perusteella saadaan taulukot t v t [1] v t [2] v t [3] v t [4] v t [5] t d[1] d[2] d[3] d[4] [d5] 0 0 1 0 157 142 1 1 1 2 0 157 142 341 306 2 1 1 3 2 3 0 157 142 341 306 3 1 1 3 2 Vasemmassa taulukossa ei enää tapahdu muutosta sarakkeessa v t [5], kun verrataan kahta alinta riviä. Lyhin reitti Turusta Jyväskylään on d[5] = 2, d[2] = 1 eli Turku Tampere Jyväskylä. Reitin pituus on 306 km. 1
b) Tehtävänä on ratkaista Dijkstran algoritmilla nopeimmat reitit Turusta muihin kaupunkeihin sekä nopein reitti Turusta Jyväskylään. Dijkstran algoritmi määritellään kaavoilla 0, i = s v[i] =, muuten v[i] = min {v[i], v[p] + c pi }, d[i] p. Algoritmin perusteella saadaan taulukot p v[1] v[2] v[3] v[4] v[5] p d[1] d[2] d[3] d[4] d[5] 0 1 0 2 4 1 1 1 2 0 2 3 7 2 1 2 2 3 0 2 3 5 7 3 1 2 3 2 4 0 2 3 5 6 4 1 2 3 4 5 0 2 3 5 6 5 1 2 3 4 Nopein reitti Turusta Jyväskylään on d[5] = 4, d[4] = 3, d[3] = 2, d[2] = 1 eli Turku Tampere Hämeenlinna Imatra Jyväskylä. Tämän reitin kesto on 6 h. Tehtävä 2 Muotoillaan edellisen tehtävän nopeimman reitin ongelma Turusta (solmu 1) Jyväskylään (solmu 5) lineaariseksi optimointitehtäväksi, joka on muotoa min c ij x ij s.t. (i,j) E (i,l) E x il (l,j) E x ij 0, (i, j) E. 1, kun l = k x lj = 1, kun l = s 0, muulloin Ajosuunnat määräytyvät taulukon yläkolmion mukaan. Toisin sanoen Turusta ajetaan Tampereelle ja Hämeenlinnaan, Tampereelta Hämeenlinnaan ja Jyväskylään, Hämeenlinnasta Imatralle ja Jyväskylään sekä Imatralta Jyväskylään. Näin valitsemalla sijoittaen graafin nuolijoukko E, painot c ij sekä aloitussolmu s = 1 ja lopetussolmu k = 5 (1) 2
optimointitehtävään (1), saadaan optimointitehtävä min 2x 12 + 4x 13 + x 23 + 5x 25 + 2x 34 + 4x 35 + x 45 s. t. x 12 x 13 = 1 x 12 x 23 x 25 = 0 x 13 + x 23 x 34 x 35 = 0 (2) x 34 x 45 = 0 x 25 + x 35 + x 45 = 1 x 12, x 13, x 23, x 25, x 34, x 35, x 45 0. Tehtävän (1) duaali on max v k v s s.t. v j v i c ij, (i, j) E, joka sijoittamalla s, k ja E saadaan muotoon max v 5 v 1 s. t. v 2 v 1 2 v 3 v 1 4 v 3 v 2 1 v 5 v 2 5 v 4 v 3 2 v 5 v 3 4 v 5 v 4 1. Duaalissa voidaan valita v 1 = 0, jolloin saadaan max v 5 s. t. v 2 2 v 3 4 v 3 v 2 1 v 5 v 2 5 v 4 v 3 2 v 5 v 3 4 v 5 v 4 1. (3) Ratkaistaan duaalitehtävä (3) CPLEXillä, jolloin vastaukseksi tulee v 1 = 0, v 2 = 2, v 3 = 3, v 4 = 5 ja v 5 = 6. CPLEX antaa myös duaalitehtävän duaalin, eli primaalitehtävän (2) ratkaisun. Primaalitehtävän ratkaisuksi saamme x 12 = x 23 = x 34 = x 45 = 1, ja kohdefunktion arvoksi 6 joka on myös duaalitehtävän optimaalinen kohdefunktion arvo. Kyseessä on reitti Turku Tampere Hämeenlinna Imatra Jyväskylä ja sen pituus on 6 h. 3
Tehtävä 3 Lasketaan Floyd Warshall-algoritmilla Tehtävän 1 aineistoa käyttäen nopeimmat reitit kaupunkien välille ja selvitetään jälleen nopein reitti Turusta Jyväskylään. Jos kaupunkien välillä on yhteys, niin v 0 [k, l] c kl d[k, l] k. Jos taas kaupunkien välillä ei ole yhteyttä, niin 0, k = l v 0 [k, l], muulloin. Floyd Warshall-algoritmi määritellään kaavoilla v t [k, l] = min {v t 1 [k, l], v t 1 [k, t] + v t 1 [t, l]} d[k, l] d[t, l]. Seuraavissa taulukoissa on listattu lyhyimpien reittien pituudet v t [k, l] kunkin kierroksen t jälkeen. Edellisestä kierroksesta muuttuneet arvot on rengastettu. Vaiheessa t = 0 saadaan v 0 [k, l] l = 1 l = 2 l = 3 l = 4 l = 5 d[k, l] l = 1 l = 2 l = 3 l = 4 l = 5 k = 1 0 2 4 k = 1 1 1 k = 2 2 0 1 5 k = 2 2 2 2 k = 3 4 1 0 2 4 k = 3 3 3 3 3 k = 4 2 0 1 k = 4 4 4 k = 5 5 4 1 0 k = 5 5 5 5 Vaiheessa t = 1 saadaan v 1 [k, l] l = 1 l = 2 l = 3 l = 4 l = 5 d[k, l] l = 1 l = 2 l = 3 l = 4 l = 5 k = 1 0 2 4 k = 1 1 1 k = 2 2 0 1 5 k = 2 2 2 2 k = 3 4 1 0 2 4 k = 3 3 3 3 3 k = 4 2 0 1 k = 4 4 4 k = 5 5 4 1 0 k = 5 5 5 5 Vaiheessa t = 2 saadaan v 2 [k, l] l = 1 l = 2 l = 3 l = 4 l = 5 d[k, l] l = 1 l = 2 l = 3 l = 4 l = 5 k = 1 0 2 3 7 k = 1 1 2 2 k = 2 2 0 1 5 k = 2 2 2 2 k = 3 3 1 0 2 4 k = 3 2 3 3 3 k = 4 2 0 1 k = 4 4 4 k = 5 7 5 4 1 0 k = 5 2 5 5 5 4
Vaiheessa t = 3 saadaan v 3 [k, l] l = 1 l = 2 l = 3 l = 4 l = 5 d[k, l] l = 1 l = 2 l = 3 l = 4 l = 5 k = 1 0 2 3 5 7 k = 1 1 2 3 2 k = 2 2 0 1 3 5 k = 2 2 2 3 2 k = 3 3 1 0 2 4 k = 3 2 3 3 3 k = 4 5 3 2 0 1 k = 4 2 3 4 4 k = 5 7 5 4 1 0 k = 5 2 5 5 5 Vaiheessa t = 4 saadaan v 4 [k, l] l = 1 l = 2 l = 3 l = 4 l = 5 d[k, l] l = 1 l = 2 l = 3 l = 4 l = 5 k = 1 0 2 3 5 6 k = 1 1 2 3 4 k = 2 2 0 1 3 4 k = 2 2 2 3 4 k = 3 3 1 0 2 3 k = 3 2 3 3 4 k = 4 5 3 2 0 1 k = 4 2 3 4 4 k = 5 6 4 3 1 0 k = 5 2 3 4 5 Vaiheessa t = 5 saadaan v 5 [k, l] l = 1 l = 2 l = 3 l = 4 l = 5 d[k, l] l = 1 l = 2 l = 3 l = 4 l = 5 k = 1 0 2 3 5 6 k = 1 1 2 3 4 k = 2 2 0 1 3 4 k = 2 2 2 3 4 k = 3 3 1 0 2 3 k = 3 2 3 3 4 k = 4 5 3 2 0 1 k = 4 2 3 4 4 k = 5 6 4 3 1 0 k = 5 2 3 4 5 Nopein reitti Turusta Jyväskylään on nytkin d[1, 5] = 4, d[1, 4] = 3, d[1, 3] = 2, d[1, 2] = 1. Reittiä voidaan merkitä myös 1 2 3 4 5. Kyseinen reitti on Turku Tampere Hämeenlinna Imatra Jyväskylä, ja sen kesto on 6 h. Tehtävä 4 Tulostimen ostohinta on 200 euroa. Käyttökustannukset vuosina 1 5 ovat 100, 150, 200, ja 350 euroa. Olkoon solmu i päätöstilanne vuoden i alussa. Piirretään graafi, jossa on solmut 1, 2, 3, 4, 5 ja 6. Nuolten painoiksi asetetaan c i,i+1 = 200 + 100 = c i,i+2 = 200 + 100 + 150 = c i,i+3 = 200 + 100 + 150 + 200 = 650 c i,i+4 = 200 + 100 + 150 + 200 + = 950 c i,i+5 = 200 + 100 + 150 + 200 + + 350 = 1. Tehtävänä on etsiä lyhin reitti solmusta 1 solmuun 6. 5
2 3 1 950 650 650 4 1 950 650 6 5 Kuva 2: Tehtävän 4 graafi. Tehtävä 5 Edellinen tehtävä voidaan ratkaista mm. Bellman-Fordin, Floyd-Warshallin tai Dijkstran algoritmilla. Kyseessä on syklitön suunnattu verkko, joten algoritmi 1.17 (lyhimmät tiet syklittömässä verkossa) on myös mahdollinen ja vaihtoehdoista myös tehokkain. Vertailun vuoksi alla on listattu niiden taulukoiden koot joiden laskemisen kunkin luentomonisteen algoritmin suoritus vaatii. 1.8 (Bellman Ford) Yksi kokoa 6 6 oleva taulukko ja edeltäjätaulukko. 1.11 (Floyd Warshall) 7 kappaletta kokoa 6 6 olevia taulukoita ja edeltäjätaulukot. 1.14 (Dijkstra) Yksi kokoa 7 6 oleva taulukko ja edeltäjätaulukko. 1.17 (Lyhimmät tiet syklittömässä verkossa) Yksi kokoa 2 6 oleva taulukko sisältäen edeltäjätaulukon. Algoritmi 1.17 määritellään kaavoilla v[s] 0 v[p] = min i d[p] l. Algoritmia käyttäen saadaan {v[i] + c ip (i, p) E} = v[l] + c ip v[i] d[i] v[1] = 0 v[2] = d[2] = 1 v[3] = min {, + } = d[3] = 1 v[4] = min {650, +, + } = 650 d[4] = 1 v[5] = min {950, + 650, +, 650 + } = 900 d[5] = 3 v[6] = min {1, + 950, + 650, 650 +, 900 + } = 1100 d[6] = 3 tai d[6] = 4 Ossi Opiskelijan kannattaa ostaa uusi tulostin kolmannen tai neljännen opiskeluvuoden alussa. 6