75 9. Lokaali haku Edellä on tarkasteltu luettelointimenetelmiä, jotka ainakin periaatteessa (jos laskenta-aikaa vain riittää) voivat löytää kaikkein parhaimman ratkaisun eli globaalin optimin. Toisenlainen lähtökohta on menetelmissä, joissa aina tutkitaan olemassa olevan käyvän ratkaisun lähiympäristössä olevia ratkaisuja ja etsitään niiden joukosta parempaa, jonne sitten siirrytään. Näin ei useinkaan löydetä, edes periaatteessa, globaalia optimia, mutta voidaan kuitenkin päätyä riittävän hyvään ratkaisuun. Tarkastellaan optimointiprobleemaa muodossa max z = f(x), x S X, missä X on ratkaisuavaruus ja S probleeman käypä joukko, joka oletetaan nyt äärelliseksi. Tässä X voi olla yleisempi kombinatorisen n optimoinnin tehtävän ratkaisuavaruus kuin. Toisin sanoen, tehtävän muotoilua MI(N)LP:ksi ei välttämättä edellytetä.
76 Oleellista on nyt sopia, mitä ovat tietyn ratkaisun x lähellä olevat muut ratkaisut. Lähellä x:ää olevat "naapurit" ajatellaan saaduksi ratkaisusta x sopivalla siirrolla. Se, mitkä siirrot katsotaan sopiviksi, määrittelee avaruuden X lähistörakenteen. Oletamme, että nämä siirrot on sovittu. (Huomataan, että "kokonaislukumaailmassa" läheisyyden ilmaiseminen voi olla vaikeampaa, n kuin esimerkiksi :ssä tai muussa metrisessä avaruudessa, jossa on käytössä luonnollinen etäisyyden käsite.) Olkoon M kaikkien siirtojen m joukko. Ratkaisua x muutetaan siirrolla m siten, että tulos x = x m on uusi "häiritty" ratkaisu. Siirto m on käypä (sallittu), jos x m on käypä, muuten siirto on epäkäypä. Pisteen x lähistö koostuu kaikista ratkaisuista, jotka on saatu x:stä tekemällä siihen yksi siirto: N(x) = {x' X x = x m, m M }. Käypä lähistö saadaan tekemällä vain sallittuja, käypiä siirtoja, jolloin saadaan siis N(x) S. (Tässä on käytetty suomenkielistä sanaa "lähistö" termin "ympäristö" sijaan, koska jälkimmäisellä on oma merkityksensä topologiassa. Englanninkielisissä esityksissä molemmissa esiintyy termi "neighborhood".)
77 Lähistön koko on sen alkioiden lukumäärä. Se kertoo siis, kuinka monta erilaista siirtoa x:lle voidaan tehdä ("nollasiirto", eli että ei tehdä mitään siirtoa, luetaan tässä myös siirroksi). Kaikille lähistöjä käyttäville menetelmille on onnistumisen kannalta oleellista, minkälainen lähistörakenne on valittu. Jos lähistöt ovat liian suuria (ääritapauksessa koko ratkaisuavaruus X voi olla lähistönä), niin menetelmän jokainen iteraatio voi olla samaa luokkaa laskentatyöltään kuin alkuperäinen probleema. Jos lähistö on taas liian suppea, niin menetelmät etenevät hyvin hitaasti. Tehtävä Muodosta pisteen x = [0 1 0 0 1] T B 5 lähistö, jos siirtona on a) yhden komponentin (bitin) muuttaminen nollasta ykköseksi tai päinvastoin. b) kahden komponentin vaihto keskenään (esim. 1. ja 5. x' = [1 1 0 0 0] T ).
78 Lokaali haku (Local Search, Neighborhood Search) on menetelmä, jossa jokaisessa iteroinnissa uusi iterointipiste valitaan nykyisen lähistöstä. Valintaan voidaan käyttää evaluointifunktiota E, jonka maksimiarvon mukaan uusi piste poimitaan. Algoritmi on silloin seuraava, kun aloituspisteenä on jokin käypä ratkaisu x 0 : 1. k:=1, x k :=x 0, x * : = x 0. 2. x k+1 :=argmax{e(x) x N(x k )}. 3. k:=k+1. 4. Jos E(x k )>E(x * ), niin tee päivitys x * : = x k. 5. Onko lopetusehto voimassa? Jos on, x * on paras ratkaisu. Jos ei, niin jatka kohdasta 2. Merkintä argmax{e(x) x N(x k )} tarkoittaa sitä ratkaisua x, joka antaa funktiolle E suurimman arvon lähistössä N(x k ).
79 Evaluointifunktio ja lopetusehto jäävät tässä yleisellä tasolla määrittelemättä. Yleensä evaluointifunktio on maksimointitehtävässä kohdefunktio f sellaisenaan ja minimointitehtävässä -f tai positiivisen funktion tapauksessa myös 1/f. Osa sellaisista rajoitusehdoista, jotka on vaikea ilmaista lähistöjen käypyydellä, voidaan ottaa huomioon evaluointifunktiossa esim. sakkotermien avulla. Jos evaluointifunktiona käytetään pelkästään kohdefunktiota f, kyseessä on jyrkimmän nousun (steepest ascent) menetelmä. (Minimoinnissa: jyrkin vietto, steepest descent.) Sanotaan myös, että algoritmi on ahne (greedy), koska joka kerta valitaan eniten kohdefunktiota parantava vaihtoehto lähistöstä. (On sukua derivoituvien funktioiden gradienttimenetelmälle, mutta globaalin haun merkitys menetelmänä on diskreetissä optimoinnissa suurempi, kuin gradienttimenetelmän epälineaarisessa optimoinnissa.) Lokaalin haun suurimpia ongelmia on, että se jää usein kiinni lokaaliin optimiin.
80 Esimerkki: Kaupparatsuongelman (TSP) ratkaisumenetelmä 2-opt Menetelmässä verrataan olemassa olevaa ratkaisua x sellaisiin lähellä oleviin ratkaisuihin, jotka saadaan vaihtamalla kaksi reitin jaksoa toisiin kahteen jaksoon, muuten reitti säilyy samana. Siirto on siis tämä vaihto, ja lähistö koostuu näin saaduista reiteistä. Kaupunkien lukumäärä olkoon n, käytävä läpi kaikki kaupungit täsmälleen kerran. Aloitus kaupungista 1, johon sitten lopuksi palataan. Reitti on jono kaupunkeja i 1, i 2,, i n, missä i 1 = 1 ja jono kertoo järjestyksen, jossa kaikki kaupungit käydään läpi. Reitin jaksot ovat i i, i i,, i i, i i. 1 2 2 3 n 1 n n 1 Oletetaan, että tilanne on symmetrinen, eli jakson suunnalla ei ole väliä ja jokaisen jakson kustannus on sama molempiin suuntiin. Kustannukset saadaan symmetrisestä kustannusmatriisista W, koko n n.
81 Koska vaihdettavia jaksoja on täsmälleen kaksi, ne eivät voi olla peräkkäin. (Jos poistetaan peräkkäiset kaksi jaksoa, jää keskimmäinen kaupunki eristetyksi, jolloin se pitää yhdistää johonkin muuhun, mikä taas pakottaa poistamaan kolmannenkin jakson jostakin kohtaa) Edelleen todetaan, että jos tietyt kaksi jaksoa (a,b) ja (c,d) on poistettu, niin reitti on korjattava tasan kahdella uudella jaksolla käymättä missään kaupungissa useammin kuin kerran. Silloin uusiksi jaksoiksi reittiin on otettava (a,c) ja (b,d), muita mahdollisuuksia ei ole, kuten kuvasta voidaan päätellä. Joten vaihto on yksiselitteinen, kun poistettavat jaksot on päätetty. Algoritmi lähtee jaksosta i 1 i 2, käy läpi kaikki muut (paitsi vieressä olevia i 2 i 3 ja in i1 ) ja kokeilee kannattaako vaihtaa.
82 Vaihto on kannattava, mikäli kustannusten pudotus W(a,b)+W(c,d)- (W(a,c)+W(b,d)) on positiivinen. Jakson i 1 i 2 vaihtokaveriksi otetaan se (jos löytyy), joka antaa suurimman positiivisen pudotuksen. Näin käydään läpi kaikki mahdollisuudet muutella reittiä kahden vaihdolla. Lopetetaan, kun ei enää löydy kannattavaa vaihtoa. Silloin on löydetty (ainakin) lokaalisti optimaalinen reitti. Se ei ole välttämättä globaali optimi, mutta on käytännössä todettu usein melko hyväksi. Etuna on laskennan nopeus ja menetelmän yksinkertaisuus. d a b c Menetelmä on erityistapaus k-opt menetelmästä eli Lin-Kernighanalgoritmista. (S. Lin, B.W. Kernighan: An Effective Heuristic Algorithm for the Traveling Salesman Problem, Operations Research 21 (1973), 498-516)
83 Lokaalin haun taipumuksena yleisesti on algoritmin juuttuminen lokaaliin optimiin. Tämän estämiseksi voidaan käyttää erilaisia keinoja, joilla ratkaisu voi päästä "karkuun" lokaalista "kuopasta". Eräs idea tähän on löydettävissä fysikaalisen analogian kautta metallien lämpökäsittelystä. Kun sulaa hehkuvaa metallia jäähdytetään sopivan hitaasti (annealing), sen kiderakenne päätyy minimienergiatilaan. Jos taas jäähdytys on äkkinäistä (rapid quenching), rakenne voi jäädä lokaaliin optimitilaan ja tuloksena on hauraampi materiaali. Tätä matkivat matemaattiset optimointialgoritmit tunnetaan nimellä simuloitu mellotus (simulated annealing, simulated cooling, simuloitu hehkutus, simuloitu jäähdytys, termodynaaminen algoritmi). Ne kuuluvat stokastisten lokaalisten hakualgoritmien luokkaan.
84 Periaate on lyhyesti seuraava: Olemassa olevan iterointipisteen lähistöstä valitaan satunnaisesti vertailupiste. Jos se parantaa kohdefunktion arvoa, se otetaan uudeksi iterointipisteeksi. Ellei, se voidaan silti hyväksyä uudeksi iterointipisteeksi todennäköisyydellä P(T, d) = e -d/t, missä d on kohdefunktion huononnus pisteestä toiseen siirryttäessä ja T on ohjausparametri ("lämpötila"). Siis paljon nykyistä huonompi ratkaisu voi tulla kysymykseen vain hyvin pienellä todennäköisyydellä. Todennäköisyysfunktion muoto on peräisin Boltzmannin jakaumasta. Ohjausparametriä T muutetaan vakionopeudella r pienemmäksi (lämpötilan lasku, r = cooling rate). Alussa lämpötila T on suuri, jolloin todennäköisyys huononnusten hyväksymiseen on suurehko. Iteroinnin edetessä lämpötila T laskee ja huononnusta aiheuttavien ratkaisujen hyväksymisen todennäköisyys lähenee nollaa.
85 Olkoot aloituslämpötila T, jäähdytyskerroin r (0,1), lopetussääntö ja aloitusratkaisu x 0 annettu. Lisäksi tarvitaan iterointiluku L, joka ilmaisee, kuinka monta iterointipistettä samassa lämpötilassa satunnaisesti haetaan, ennen kuin lämpötilaa lasketaan. Koska kyseessä on satunnaistettu lokaali haku, tarvitaan myös pisteen x lähistö N(x). Tällöin algoritmin eräs toteutus on seuraava: 1. j:= 1, k:=1, x k :=x 0, x * : = x 0. 2. Jos lopetussääntö on voimassa, lopeta, x * on paras löydetty ratkaisu. Ellei, jatka kohdasta 3. 3. Jos j=l+1, jatka kohdasta 9. Ellei, jatka kohdasta 4. 4. Valitse satunnaisesti piste y N(x k ) ja laske kohdefunktion arvomuutos d = f(y)-f(x k ).
86 5. Jos d>0, jatka kohdasta 7. Jos d 0, generoi välille [0,1] tasaisesti jakautuneista satunnaisluvuista arvo p ja jatka kohdasta 6 6. Jos p e -d/t, jatka kohdasta 7. Ellei, aseta j:=j+1 ja jatka kohdasta 3. 7. Aseta x k+1 :=y ja k:=k+1. 8. Jos f(x k ) > f(x * ), aseta x * := x k, j:=1 ja jatka kohdasta 9. Ellei, aseta j:=j+1 ja jatka kohdasta 3. 9. Aseta T=rT, j=1 ja jatka kohdasta 2.
87 10. Bellmanin dynaaminen optimointi Jos ongelma voidaan esittää monivaiheisena peräkkäisten probleemoiden jonona, siihen voidaan soveltaa Richard Bellmanin 1950-luvulla esittämää Dynaamista optimointia (Dynamic Programming). Se perustuu Bellmanin optimaalisuusperiaatteeseen, jonka voi sanallisesti ilmaista eri tavoilla: Optimiratkaisussa on edettävä esillä olevasta vaiheesta optimaalisesti loppuun, riippumatta siitä, mitä aikaisemmissa vaiheissa tehtiin. Optimiratkaisussa jokaista vaihetta edeltävät vaiheet on suoritettu alusta lukien optimaalisesti. Optimiradan jokainen loppuosa (vastaavasti alkuosa) on myös itse optimaalinen.
88 Periaate on luonnollinen ja sinällään itsestään selvä. Sen systemaattinen hyväksikäyttö tarjoaa mahdollisuuden tietyn tyyppisissä kokonaislukuoptimointitehtävissä käypien ratkaisujen implisiittiseen läpikäyntiin, ja on siinä mielessä sukua branch-and-bound menetelmille. Ongelma on siis voitava esittää rakentuvaksi peräkkäisistä vaiheista (stage). Kussakin vaiheessa systeemi voi olla erilaisissa tiloissa (state).
89 Esimerkki 1 Tarkastellaan minimikustannusvirtausprobleemaa, jossa on 11 solmua. Solmut on ryhmitelty viiteen vaiheeseen: aloitus (vaihe 1) = solmu 1, vaihe 2 = solmut 2, 3, 4, vaihe 3 = solmut 5, 6, 7, 8, vaihe 4 = 9, 10 ja lopetus (vaihe 5) = solmu 11. Verkossa voi liikkua vain solmusta seuraavan vaiheen solmuihin (ei välttämättä kaikkiin). Verkon insidenssimatriisi ja kustannusvektori ovat: 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 A = 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 c = [ 4 11 7 9 6 12 2 2 5 8 9 1 5 3 4 2 5 4 7 8 12 13]. (Piirrä verkko, vaiheet vasemmalta oikealle, saman vaiheen solmut allekkain.)
90 Tehtävänä on kulkea solmusta 1 solmuun 11 lyhintä reittiä (kustannukset ovat solmujen välisiä välimatkoja; virtaus on 1, jos kaarta pitkin kuljetaan, solmu 1 on lähdesolmu, josta virtaus 1 lähtee ja solmu 11 kohdesolmu, johon se saapuu). Ratkaisu voidaan hakea dynaamisella optimoinnilla seuraavasti. Lähdetään solmusta 1 liikkeelle, ja edetään vaihe kerrallaan eteenpäin. Jokaiseen solmuun i liitetään etenemisen kuluessa lukupari (j,k). Siinä j kertoo solmun, josta solmuun i alusta lähtien optimaalista reittiä tultiin ja k vastaavan reitin minimipituuden. Silloin muodostuu järjestyksessä seuraava vaiheittainen data: aloitus vaihe 2 (2,3,4) vaihe 3 (5,6,7,8) vaihe 4 (9,10) lopetus [ 0] 1 4 1 11 1 7 2 13 2 10 4 8 4 12 6 12 7 12 [9 24]
91 Viimeisestä datasta nähdään, että optimireitin pituus on 24. Optimireitti löytyy taaksepäin siirtymällä: 11 9 6 2 1. Siis optimireitti on 1 2 6 9 11. Menetelmä oli siis rekursio eteenpäin. Vastaava laskenta voitaisiin tehdä aloittamalla solmusta 11, rekursio taaksepäin. Tässä esimerkissä eri vaiheissa tarvittavat osaoptimointitehtävät olivat hyvin yksinkertaisia täydellisellä läpikäynnillä (muutamasta vaihtoehdosta) ratkaistavia. Esimerkiksi vaiheessa 4 todettiin solmuun 9 päästävän solmusta 5,6,7 tai 8, joista 6 antoi lyhimmän tien; oleellista oli, että solmussa 6 oli käytettävissä tieto, mikä siihen on lyhin reitti alusta.
92 Muotoillaan seuraavaksi dynaamisen optimoinnin menetelmä yleisemmin: Probleema ("systeemi") olkoon jaettavissa eri vaiheisiin k = 1,, K. Kussakin vaiheessa k systeemi on jossakin tilassa y k. Mahdollisten tilojen joukko vaiheessa k on Y k. Kussakin vaiheessa k on valittava päätösmuuttuja xk X joukosta X k. k käyvästä Tehty päätös antaa systeemin seuraavan tilan siirtoyhtälöstä 1 yk = tk( yk 1, xk). Siirtofunktio t k on käännettävissä: y = k 1 tk ( yk, xk). Kohdefunktio saa vaiheesta k yhteenlaskettavan osuuden fk( yk 1, xk). Kumulatiivinen kohdefunktion optimiarvo on Fk( y k), kun ensimmäiset k vaihetta on edetty tilaan y k.
93 Kun vaiheesta toiseen siirrytään eteenpäin, kohdefunktio saa arvon F ( y, x ) = F ( y ) + f ( y, x ) k k k k 1 k 1 k k 1 k (rekursio eteenpäin). Silloin kumulatiiviselle optimiarvolle saadaan (jos kohdefunktiota maksimoidaan) rekursiokaava F ( y ) = F ( y, x ) = max F ( y, x ). k k k k k x k k k k Xk Lopullinen optimiratkaisun arvo on silloin z = F ( y ) = F ( y, x ). K K K K K Optimitilat saadaan taaksepäin siirtymällä ratkaisemalla kaavasta 1 y = k 1 tk ( yk, xk) peräkkäin yk 1, yk 2,, y2, y1 ja vastaavat yllä olevassa rekursiokaavassa maksimin antavat x k. Silloin optimiratkaisun päätösmuuttujat ovat x1, x2,, xk.
94 Jos kohdefunktiota minimoidaan, yllä olevassa rekursiokaavassa maksimointi vaihdetaan minimointiin. Yllä olevasta voidaan esittää ilmeisin muutoksin versio, jossa käytetään rekursiota taaksepäin. Siinä lopullinen ratkaisu sitten löydetään eteenpäin siirtymällä. Todettakoon myös, ettei menetelmä ota kantaa siihen, miten rekursiokaavassa esiintyvä optimointiprobleema ratkaistaan. Dynaamisen optimoinnin huonona puolena on tarvittavan laskenta-ajan ja muistitilan nopea kasvu.
95 2 3 Esimerkki 2 max z = 6x + 2 x + x 1 3 3x + 4x + 2x 12 1 2 3 0 x 3 1 1 x 4 2 0 x 2 x i 3 Z Kyseessä on siis epälineaarisen kokonaislukuoptimoinnin tehtävä. Koska kohdefunktio ja rajoitusehto ovat yhteenlaskuun nähden separoituvia, probleema voidaan ajatella kolmesta vaiheesta koostuvaksi, kutakin vaihetta i vastaa muuttuja x i. Jos rajoitusepäyhtälö 3x1+ 4x2 + 2x3 12 ajatellaan resurssiepäyhtälönä, systeemin "tilaksi" y k saadaan luontevasti se resurssimäärä, joka vaiheessa k ja sitä ennen on kulutettu. Siirtoyhtälö on näin ollen yk = yk 1 + akxk, missä a, a, a ] = [3,4,2]. [ ] 1 2 3
96 Vaihe 1 y0 = 0, y1 = y0 + a1x1 = 3x1, X 1 = {0,1, 2}, Y 1 = {0,3,6} y x F( y, x ) = F( y ) + f ( y, x ) F( y ) = F( y, x ) x 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 0 0 0 3 1 6 6 1 6 2 12 12 2 Vaihe 2 y2 = y1+ a2x2 = y1+ 4x2, X 2 = {1, 2,3}, Y 2 = {4,7,8,10,11,12} x y y = y + 4 x F ( y, x ) = F( y ) + f ( y, x ) F ( y ) = F ( y, x ) x 2 1 2 1 2 2 2 2 1 1 2 1 2 2 2 2 2 2 2 1 0 4 0+ 2= 2 2 1 1 3 7 6+ 2= 8 8 1 2 0 8 0+ 4= 4 4 2 1 6 10 12 + 2 = 14 14 1 2 3 11 6 + 4 = 10 10 2 3 0 12 0+ 8= 8 8 3
97 Vaihe 3 y3 = y2 + a3x3 = y2 + 2x3, X 3 = {0,1, 2}, Y 3 = {4,6,7,8,9,10,11,12} x y y = y + 2 x F ( y, x ) = F ( y ) + f ( y, x ) F ( y ) = F ( y, x ) x 3 2 3 2 3 3 3 3 2 2 3 2 3 3 3 3 3 3 3 0 4 4 2+ 0= 2 2 0 1 4 6 2+ 1= 3 3 1 0 7 7 8+ 0= 8 8 0 0 8 8 4+ 0= 0 2 4 8 2+ 8= 10 10 2 1 7 9 8+ 1= 9 9 1 0 10 10 14 + 0 = 14 14 0 1 8 10 4+ 1= 5 0 11 11 10+ 0= 10 2 7 11 8 + 8 = 16 16 2 0 12 12 8+ 0= 8 1 10 12 14 + 1 = 15 15 1 2 8 12 4+ 8= 12 Viimeisestä taulukosta sarakkeelta 5 nähdään siis, että optimiarvo on 16. Vastaavalta riviltä nähdään, että x3 = 2, y3 = 11, y2 = 7. Siirtymällä taaksepäin vaiheen 2 taulukkoon kohtaan y 2 = 7 nähdään, että x2 = 1, y1 = 3. Tästä jälleen taaksepäin ensimmäiseen taulukkoon, josta nähdään kun y 1 = 3, niin x 1 = 1. Optimiratkaisu on siis x1= 1, x2 = 1, x3= 2 ja z:n maksimiarvo z = 16.