Mat-.34 Lineaarinen ohjelmointi 9..7 Luento Kokonaislukuoptimoinnin algoritmeja (kirja.-.) Lineaarinen ohjelmointi - Syksy 7 /
Luentorunko Gomoryn leikkaava taso Branch & Bound Branch & Cut Muita menetelmiä Yhteenveto Lineaarinen ohjelmointi - Syksy 7 /
Kokonaislukualgoritmit (/) Kokonaislukutehtävien ratkaisu hankalaa ei yleispäteviä, tehokkaita algoritmeja Algoritmien jako: Eksaktit takaavat optimiratkaisun mutta eksponentiaaliaikaisia Approksimatiiviset polynomiaikaisuus, mutta suboptimaalisuuden mahdollisuus määrätyissä rajoissa Heuristiset suboptimaalisuus, rajoista ei tietoa. Käytännössä usein nopeita ja hyviä. Lineaarinen ohjelmointi - Syksy 7 / 3
Kokonaislukualgoritmit (/) Tällä kurssilla keskitytään eksakteihin algoritmeihin: Leikkaava taso Branch & Bound Branch & Cut Lineaarinen ohjelmointi - Syksy 7 / 4
Leikkaava taso (Cutting plane) Idea:. Relaksoidaan tehtävä ja ratkaistaan *. Jos * kokonaisluku, ollaan optimissa. 3. Jos ei, lisätään rajoite (leikkaava taso), jonka alkup. tehtävän kokonaislukuratkaisut täyttävät mutta * ei palaa askeleesen. * Leikkaava taso Lineaarinen ohjelmointi - Syksy 7 / 5
Leikkaava taso: Gomoryn algortimi (/8) Mistä leikkaavan tason yhtälö? Gomoryn leikkaavan tason menetelmä (958) ensimmäinen äärellisessä ajassa terminoituva kokonaislukualgoritmi Käytännössä ei kovinkaan tehokas Lineaarinen ohjelmointi - Syksy 7 / 6
Leikkaava taso: Gomoryn algoritmi (/8) Käytetään hyväksi Simple-taulukkoa: - c B ' B B - b - b c' c B B - 'B A - A Erotetaan kantamuuttujat B ja ei-kantamuuttujat N sekä niitä vastaavat A:n sarakkeet toisistaan, jolloin: B + B A = B N N b Lineaarinen ohjelmointi - Syksy 7 / 7
Leikkaava taso: Gomoryn algoritmi (3/8) Merkitään a ij = ( B A j ) i ja a i = ( B b) i Valitaan optimiratkaisua * vastaavasta taulukosta rivi i s.e. (vastaava kantamuuttuja) on murtoluku: a i Tällöin: i a = i j N + j N ij a + a = a ij, missä = :ta lähin pienempi kokonaisluku j a ij j i ij j i i + a ij j N a Lineaarinen ohjelmointi - Syksy 7 / 8
Leikkaava taso: Gomoryn algoritmi (4/8) Koska muuttujien tulee olla kokonaislukuja, pätee: i + a ij j ai j N Yllä siis epäyhtälö, jonka alkup. tehtävän kokonaislukuratkaisut toteuttavat, mutta * ei, sillä * = i ai, j* = j N a i < ai => leikkaava taso! Lineaarinen ohjelmointi - Syksy 7 / 9
Lineaarinen ohjelmointi - Syksy 7 / Leikkaava taso: Leikkaava taso: Gomoryn algoritmi (5/8) Gomoryn algoritmi (5/8) Esimerkki: Ζ + +,, 4 9 6 4.. min s e Ζ = + + = + +,...,,..., 4 9 6 4.. min 4 4 4 3 s e
Optimitaulukko: = = 7/ 5/ 3/ Leikkaava taso: Gomoryn algortimi (6/8) 3/ / -/ /5 /5 3/5 * + 3 + 5 4 + = 5 = 5 Uusi ey-rajoite; optimikannan päivitys ks. luento 7 Lineaarinen ohjelmointi - Syksy 7 /
Optimitaulukko: = = 4 = 3/4 3/4 5/4 Leikkaava taso: Gomoryn algoritmi (7/8) /4 -/4 /4 / 3/ -5/ * 3 3 3+ 5 = 4 4 + 3 3 3 + 5 5 + 6 = 7 + 5 7 Lineaarinen ohjelmointi - Syksy 7 /
Optimitaulukko: Leikkaava taso: Gomoryn algoritmi (8/8) 3 /3 /6 = * = 5/3 -/3 4 = -8/3 /3 3 = /3-4/3 Kaikki muuttujat ovat kokonaislukuja, eli ollaan alkup. tehtävän optimissa! Joka kierroksella uusi muuttuja ja duaalisimple... Argh. Lineaarinen ohjelmointi - Syksy 7 / 3
Branch & Bound (/7) Idea: Hajotetaan käypä alue osiin, jotka taas hajotetaan pienempiin osiin jne. Käytetään hyväksi jo löydettyjä kustannuksen ala- ja ylärajoja kertomaan, kannattaako tietyn osaalueen tutkimista enää jatkaa Alkup. min c' s. e. F F min s. e. F F F 3 F 4 F 5 i. osatehtävä c' F i = F... F k Lineaarinen ohjelmointi - Syksy 7 / 4
Branch & Bound (/7) Tutkittavalle osatehtävälle lasketaan kustannuksen alaraja jollakin funktiolla b() b( F ) min c' i Ylläpidetään myös pienintä löydettyä kokonaislukuratkaisun antamaa kustannusta U, joka antaa siis optimikustannuksen ylärajan Jos jollekin osatehtävälle i pätee b(f i ) U, ei kyseistä haaraa kannata enää tutkia F i Lineaarinen ohjelmointi - Syksy 7 / 5
Branch & Bound (3/7) Menetelmä on geneerinen, eli sitä voidaan varioida erilaisilla valinnoilla koskien seuraavan tutkittavan osatehtävän valintaa (depth first, breadth first ym.) alarajojen laskutekniikkaa (tällä kurssilla LPrelaksaatiolla) tapaa jakaa tehtävät osatehtäviksi (tällä kurssilla eristämällä murtolukuratkaisut) Lineaarinen ohjelmointi - Syksy 7 / 6
Branch & Bound (4/7) Aktiivisten lista = määritetyt, muttei vielä tutkitut osatehtävät Menetelmä:. Alussa U=, aktiivisten lista = {F}. Valitse listasta aktiivinen osatehtävä F i. Jos F i ei ole käypä, poista se listasta muuten, laske alaraja b(f i )= F i :n relaksaation optimikustannus 3. Jos b(f i ) U, poista osatehtävä listasta 4. Jos b(f i )<U: Joko F i :n relaksaatiolla kokonaislukuratkaisu => päivitä U ja poista osatehtävä listasta Tai murtolukuratkaisu => jaa uusiin osatehtäviin Lineaarinen ohjelmointi - Syksy 7 / 7
Esimerkki: min s. e. 4 Branch & Bound (5/7) + 6 +,, 9 4 Ζ F : 3 F : Relaksaation ratkaisu *=(.5,.5); jaetaan alue :n suhteen ko. murtoluvun poissulkeviin alueisiin F ja F aktiivisten osatehtävien lista {F, F } * LP-relaksaation kustannus = -3.5, joten koko alueen alarajaksi b(f)=-3.5 Ei löydettyjä kok.lukuratkaisuja, joten U= Lineaarinen ohjelmointi - Syksy 7 / 8
Branch & Bound (6/7) Osatehtävä F ei ole käypä poistetaan listasta Ratkaistaan osatehtävän F relaksaatio, josta saadaan alarajaksi b(f )=-3.5 (tiukempi) poistetaan F listasta F 4 : F : * F 3 : F :n relaksaation optimi *=(.75, ), joten jaetaan edelleen :n suhteen osatehtäviksi F 3 ja F 4 aktiivisten osatehtävien lista {F 3, F 4 } Lineaarinen ohjelmointi - Syksy 7 / 9
Branch & Bound (7/7) Osatehtävän F 3 relaksaation ratkaisu *=(,), eli kokonaislukuratkaisu! Kustannus -3, joten U:=-3. F 3 tutkittu eli pois aktiivisten listasta 3 * Osatehtävän F 4 relaksaation ratkaisu (,3/) ja optimikustannus -3, eli b(f 4 ) U => poistetaan F 4 listasta 4 * Lista on tyhjä, eli alkup. tehtävän optimiratkaisu löydetty! *=(,), c *=-3. Lineaarinen ohjelmointi - Syksy 7 /
Branch & Cut (/3) Branch & Boundin tehokkuus riippuu suuresti siitä, kuinka tiukkoja alarajoja optimikustannukselle pysytään määrittämään Branch & Cut menetelmä muuntaa osatehtäviä lisäleikkauksilla, ts. pienentää osatehtävien käypiä alueita lähemmäs kokonaislukuratkasuja Lineaarinen ohjelmointi - Syksy 7 /
Esimerkki: min s. e. 4 Branch & Cut (/3) + 6 +,, 9 4 Ζ F : 3 F : - + Relaksaation optimiratkaisu (.5,.5) jaetaan osatehtäviin F ja F Tehtävä F ei käypä=> poistetaan listasta. Lisätään tehtävään F rajoite - +, jonka kaikki F :n kokonaislukuratkaisut toteuttavat Lineaarinen ohjelmointi - Syksy 7 /
Branch & Cut (3/3) Relaksoidun tehtävän ratkaisu (,) = kokonaislukuja, eli myös alkuperäisen tehtävän ratkaisu! Mitä syvemmät leikkaukset, sitä nopeammin ratkaisu löytyy valitettavasti hankalaa puuhaa... F : 3 F : * - + Lineaarinen ohjelmointi - Syksy 7 / 3
Muita menetelmiä (/) Dynaaminen ohjelmointi (eksakti): Käypä ratkaisu nähdään sarjana päätöksiä kokonaiskustannus = yksittäisten päätösten kustannusten summa Esim. kauppamatkustajan ongelma: kauppias valitsee aina kaupungista lähtiessään seuraavan kohteen Esim. kapsäkkitehtävä: murtovaras valitsee ensin yhden tavaran ja miettii sitten seuraavaa Kurssi Mat-.348 Lineaarinen ohjelmointi - Syksy 7 / 4
Muita menetelmiä (/) Approksimoivat algoritmit: Pyritään lyhyempään ratkaisuaikaan tehtävän parametreja poikkeuttamalla Suboptimaalisuus vs. ratkaisuaika trade-off Heuristiset menetelmät: Lokaali haku tyydytään lokaaliin optimiin Simuloitu jäähdytys (simulated annealing) parannus lokaaliin hakuun; sallitaan ajoittaiset kustannusfunktion kasvut Lineaarinen ohjelmointi - Syksy 7 / 5
Yhteenveto Kokonaislukutehtävien ratkaiseminen hankalaa Eksakteja algoritmeja: Gomoryn leikkaava taso Branch & Bound, Branch & Cut Suurissa tehtävissä tyydytään usein hyvään (ei välttämättä optimaaliseen) ratkaisuun Käytännössä menetelmillä etsitäänkin usein mahdollisimman tiukkaa ylärajaa kustannukselle Lineaarinen ohjelmointi - Syksy 7 / 6