Harjoitus 4 (7.4.2014) Tehtävä 1 Tarkastellaan Harjoituksen 1 nopeimman reitin ongelmaa ja etsitään sille lyhin virittävä puu käyttämällä kahta eri algoritmia. a) (Primin algoritmi) Lähtemällä solmusta 1 (Turku) lyhimpään virittävään puuhun liitetään ensin solmu 3 (Helsinki), koska olemassa olevasta solmusta päästään sinne 2 tunnissa. Tämän jälkeen lisätään solmu 2 (Tampere). Nyt vapaita solmuja on jäljellä kaksi (Kuopio ja Joensuu), jotka kumpikin ovat 4 tunnin ajomatkan päässä puussa jo olevista solmuista. Voidaan siis valita kumpi tahansa. Jos valitaan ensin solmu 4, niin solmu 5 on vain 2 tunnin päässä somusta 4. Näin virittävään puuhun saadaan kaaret (1,3), (3,2), (2,4) ja (4,5), jotka vastaavat reittiä 1 3 2 4 5. Kyseisen reitin pituus on 10 h. b) (Kruskalin algoritmi) Lyhimpään virittävään puuhun valitaan kaaria lyhimmästä alkaen. Ensin valitaan kaaret (1,3), (3,2) ja (4,5), joiden kaikkien pituus on 2h. Nyt kaari (1,2) olisi seuraavaksi lyhin, mutta se tuottaisi syklin, eikä siten ole sallittu. Valitaan 4h:n pituisista kaarista (joita on siis kaksi vaihtoehtoista) (2, 4). Tampereen ja Helsingin välinen ajomatka saa hidastua 1 h ilman välttämätöntä muutosta lyhimmässä virittävässä puussa. Mikäli ajomatka hidastuu 1h, niin syntyy vaihtoehtoinen puu. Jos matka hidastuu 2 h, niin saadaan virittävä puu muuttuu välttämättä. Tehtävä 2 Harjoituksen 2 Tehtävä 5 voidaan muotoilla selkäreppuongelmaksi seuraavasti: max 35x 1 +20x 2 +25x 3 +10x 4 s.t. 4x 1 +2x 2 +3x 3 +x 4 7 x 1,x 2,x 3,x 4 {0,1}. Laskemalla hyötysuhteet kaavasta h i = u i w i saadaan h 1 = 35 4 = 83 4 h 2 = 20 2 = 10 h 3 = 25 3 = 81 3 h 4 = 10 1 = 10. Valitaan esineitä mukaan yksitellen parhaan hyötysuhteen mukaan, jolloin saadaan taulukko 1
esine kokonaispaino paino 7 hyöty x 2 2 kyllä 20 x 4 3 kyllä 30 x 1 7 kyllä 65 x 3 10 ei (90) Esinettä x 3 ei voida enää ottaa mukaan, koska painorajoitus ylittyy. Ratkaisuna on valita esineet x 1, x 2 ja x 4, jolloin saatava hyöty on 65. Jos vaaditaan, että hyödyn on oltava vähintään 70, niin alkuperäisen tehtävän painorajoitus ei enää voi olla voimassa koska tällöin saisimme optimointitehtävän jolla ei ole sallittuja ratkaisuja. Jos taas meillä on ainoana rajoitteena että hyödyn on oltava vähintään 70, niin alkuperäinen hyötyä maksimoiva kohdefunktio kasvaisi rajatta eikä optimointitehtävällä siis olisi rajoitettua ratkaisua. Optimointitehtävästä saa hyvin määritellyn esimerkiksi siten, että hyödyn maksimoinnin sijaan pyrimme minimoimaan mukaan otettavien esineiden kokonaispainon. Kun muutamme optimointitehtävän kohdefunktiota ja rajoitteita yllä kuvatulla tavalla, niin saamme optimointitehtävän min 4x 1 +2x 2 +3x 3 +x 4 s.t. 35x 1 +20x 2 +25x 3 +10x 4 70. Valitaan aluksi mukaan kaikki esineet, jolloin hyöty on 90 ja paino 10. Sen jälkeen pudotetaan pois esineitä hyötysuhteen mukaan siten, että ensin pudotetaan esine, jolla on heikoin hyötysuhde. esine kokonaishyöty hyöty 70 x 3 65 ei x 1 55 ei x 2 70 kyllä Huonoimman hyötysuhteen omaavaa esinettä x 3 ei voida pudottaa, koska silloin hyöty olisi vähemmän kuin on vaadittu. Jos pudotetaan esine x 2, jolla on toiseksi heikoin hyötysuhde, niin saadaan sallittu ratkaisu. Ratkaisuna on siis valita esineet x 1, x 3 ja x 4, joiden yhteispaino on 8. Tehtävä 3 Muodostetaan ensin maksimivirtausongelma, jossa mahdollisten tanssiparien lukumäärä vastaa virtauksen suuruutta. Merkitään miehiä numeroilla 2,..., 6 ja naisia numeroilla 7,...,11 allaoleva taulukon mukaisesti: Juhani Kimmo Mikko Tommi Vesa Heidi Katja Laura Mia Jonna 2 3 4 5 6 7 8 9 10 11 2
Piirretään graafi, jossa aloitussolmua merkitään numerolla 1. Aloitussolmusta lähtee nuolet kutakin miestä vastaavaan solmuun. Kunkin miehen solmusta taas lähtee nuolet niiden naisten solmuihin, joiden kanssa kyseiset miehet voivat muodostaa tanssiparin. Jokaisen naisen solmusta lähtee lopuksi nuoli lopetussolmuun, jota on merkitty numerolla 12. Koska tanssiparit ovat samanarvoisia, asetetaan kaikkien nuolten painoksi c ij = 1. Koska kukin mies voi muodostaa tanssiparin vain yhden naisen kanssa, asetetaan nuolten kapasiteeteiksi u ij = 1. Koska maksimivirtausongelmassa kunhunkin solmuun tuleva virtaus on yhtä suuri kuin lähtevä virtaus (aloitus- ja lopetussolmua lukuunottamatta), saamme optimointitehtävän joka on muotoa max c ij x ij s.t. j (i,j) E j (k,j) E x kj i (i,k) E missä E on kuvassa 1 esitetyn graafin nuolijoukko. x ik = 0, i = 2,3,...,11, (1a) (1b) 0 x ij u ij = 1, (i,j) E, (1c) 2 7 3 8 1 4 9 12 5 10 6 11 Figure 1: Tehtävän 3 graafi. Tehtävän voi muuttaa minimikustannusvirtausongelmaksi merkitsemällä edellä piirrettyjen nuolten painoiksi 0 ja lisäämällä lopetussolmusta 12 aloitussolmuun 1 menevä nuoli, jonka paino on c 12,1 = 1 ja kapasiteetti u 12,1 =. Tällöin kohdefunktioksi saadaan min x 12,1 = maxx 12,1. Minimoinnin edestä voidaan jättää pois koska se ei muuta tehtävän optimaalisen ratkaisun muuttujia x ij. Lisäksi rajoite (1b) asetetaan myös aloitus- ja lopetussolmulle (i = 1 ja i = 12), koska nuolen (12,1) lisäämisestä johtuen ne ovat nyt kauttakulkusolmuja. Lisättyä nuolta varten tulee myös rajoite x 12,1 0. Näin saatu optimointitehtävä on minimikustannusvirtausongelma, joka on samaa muotoa kuin luentomonisteen sivulla 42 esitetty. 3
Tehtävä 4 Päätösmuuttuja x ij kuvaa paljonko rapuja kuljetetaan ravustajalta i ravintolaan j. Verkosto-ongelmasta saadaan optimointitehtävä min 7x 11 +7x 12 +8x 21 +8x 22 +5x 31 +5x 32 s.t. x 11 +x 12 300 x 21 +x 22 300 x 31 +x 32 300 0,7x 11 +0,8x 21 +0,6x 31 350 0,6x 12 +0,8x 22 +0,7x 32 275 x ij 0, jonka (yksi) ratkaisu on x 11 = 250 (elävänä perille 175) x 12 = 0 x 21 = 218,75 (elävänä perille 175) x 22 = 81,25 (elävänä perille 65) x 31 = 0 x 32 = 300 (elävänä perille 210). Koska 175 + 175 = 350 ja 65 + 210 = 275, niin kumpikin ravintola sai tarvitsemansa määrän rapuja. Kokille tulevat kustannukset ovat 5 650 euroa. Jos vaaditaan, että toimitettavien rapujen määrät ovat kokonaislukuja, toisin sanoen x ij N, niin tehtävän ratkaisuksi LINDOlla saadaan x 11 = 296 (elävänä perille 207,2) x 12 = 0 x 21 = 177 (elävänä perille 141,6) x 22 = 83 (elävänä perille 66,4) x 31 = 2 (elävänä perille 1,2) x 32 = 298 (elävänä perille 208,6). Nyt 207,2+161,6 + 1,2 = 350 ja 66,4+208,6 = 275, joten rapuja on jälleen toimitettu oikea määrä (tarkalleen ottaen tässä pitäisi ottaa huomioon että elävinä toimitettujen rapujen määrät ovat kokonaislukuja). Kokille tulevat kustannukset ovat 5 652 euroa. 4
CPLEXillä saadaan vaihtoehtoinen (eri, mutta yhtä hyvä) ratkaisu: x 11 = 256 x 12 = 0 x 21 = 212 x 22 = 83 x 31 = 2 x 32 = 298 Tehtävä 5 Otetaan käyttöön binääriset kokonaislukumuuttujat 1, jos rehua i valmistetaan (eli x i > 0) y i = 0, jos rehua i ei valmisteta (eli x i = 0), missä i = 1,..., 8. Muotoillaan sitten tuotannolle asetetut vaatimukset rajoitteiksi. a) Kutakin lajiketta i ei joko valmisteta tai sitten valmistetaan vähintään määrä l i ja enintään määrä u j. Tarvittava ehto on l i y i x i u i y i, i = 1,...,8. b) Jos samanaikaisesti saa valmistaa korkeintaan kuutta eri lajiketta, niin kirjoitetaan ehto y 1 +y 2 +y 3 +y 4 +y 5 +y 6 +y 7 +y 8 6. c) Jos valmistetaan lajiketta 1 tai lajiketta 2 tai molempia, niin tulee valmistaa myös lajikkeita 3 ja 4. Tätä vastaavat ehdot ovat esimerkiksi y 1 +y 2 2y 3 y 1 +y 2 2y 4 tai y 1 y 3 y 1 y 4 y 2 y 3 y 2 y 4. d) Jos ei valmisteta lajiketta 5 eikä lajiketta 6, niin myöskään lajikkeita 7 ja 8 ei valmisteta. Tällöin tarvitaan ehtoa y 5 +y 6 y 7 y 5 +y 6 y 8. 5
04/07/15 demo4_4.lp 1 Minimize 7x1 + 7x2 + 8x3 + 8x4 + 5x5 + 5x6 subject to x1 + x2 <= 300 x3 + x4 <= 300 x5 + x6 <= 300-0.7x1-0.8x3-0.6x5 <= -350-0.6x2-0.8x4-0.7x6 <= -275 x1 >= 0 x2 >= 0 x3 >= 0 x4 >= 0 x5 >= 0 x6 >= 0 general x1 x2 x3 x4 x5 x6 end /home/anmheik/opetus/optimointi/cplex_demot/demo4_4.lp
04/07/15 demo4_teht4_ratk.txt 1 CPLEX> read demo4_4.lp Problem 'demo4_4.lp' read. Read time = 0.00 sec. (0.00 ticks) CPLEX> display problem all Minimize obj: 7 x1 + 7 x2 + 8 x3 + 8 x4 + 5 x5 + 5 x6 Subject To c1: x1 + x2 <= 300 c2: x3 + x4 <= 300 c3: x5 + x6 <= 300 c4: - 0.7 x1-0.8 x3-0.6 x5 <= -350 c5: - 0.6 x2-0.8 x4-0.7 x6 <= -275 c6: x1 >= 0 c7: x2 >= 0 c8: x3 >= 0 c9: x4 >= 0 c10: x5 >= 0 c11: x6 >= 0 Bounds x1 >= 0 x2 >= 0 x3 >= 0 x4 >= 0 x5 >= 0 x6 >= 0 Generals x1 x2 x3 x4 x5 x6 %%(voit ratkaista ongelman esim. optimize tai mipopt komennolla, ks help) CPLEX> optimize Tried aggregator 1 time. MIP Presolve eliminated 6 rows and 0 columns. MIP Presolve modified 2 coefficients. Reduced MIP has 5 rows, 6 columns, and 12 nonzeros. Reduced MIP has 0 binaries, 6 generals, 0 SOSs, and 0 indicators. Presolve time = 0.00 sec. (0.01 ticks) Found incumbent of value 6000.000000 after 0.01 sec. (0.05 ticks) Tried aggregator 1 time. Reduced MIP has 5 rows, 6 columns, and 12 nonzeros. Reduced MIP has 0 binaries, 6 generals, 0 SOSs, and 0 indicators. Presolve time = 0.00 sec. (0.01 ticks) MIP emphasis: balance optimality and feasibility. MIP search method: dynamic search. Parallel mode: deterministic, using up to 8 threads. Root relaxation solution time = 0.00 sec. (0.01 ticks) Nodes Cuts/ Node Left Objective IInf Best Integer Best Bound ItCnt Gap * 0+ 0 6000.0000 0.0000 100.00% * 0+ 0 5750.0000 0.0000 100.00% 0 0 5650.0000 2 5750.0000 5650.0000 5 1.74% * 0+ 0 5653.0000 5650.0000 0.05% 0 0 5652.0000 1 5653.0000 MIRcuts: 1 6 0.02% * 0 0 integral 0 5652.0000 MIRcuts: 2 8 0.00% 0 0 cutoff 5652.0000 5652.0000 8 0.00% Elapsed time = 0.02 sec. (0.14 ticks, tree = 0.00 MB, solutions = 4) Mixed integer rounding cuts applied: 2 Root node processing (before b&c): Real time = 0.02 sec. (0.14 ticks) Parallel b&c, 8 threads: Real time = 0.00 sec. (0.00 ticks) Sync time (average) = 0.00 sec. Wait time (average) = 0.00 sec. ------------ Total (root+branch&cut) = 0.02 sec. (0.14 ticks) /home/anmheik/opetus/optimointi/cplex_demot/demo4_teht4_ratk.txt
04/07/15 demo4_teht4_ratk.txt 2 Solution pool: 4 solutions saved. MIP - Integer optimal solution: Objective = 5.6520000000e+03 Solution time = 0.02 sec. Iterations = 8 Nodes = 0 Deterministic time = 0.14 ticks (7.69 ticks/sec) CPLEX> display solution variables 1- Incumbent solution Variable Name Solution Value x1 256.000000 x3 212.000000 x4 83.000000 x5 2.000000 x6 298.000000 All other variables in the range 1-6 are 0. /home/anmheik/opetus/optimointi/cplex_demot/demo4_teht4_ratk.txt