24 10. Lokaali haku Optimoinnissa heuristisilla menetelmillä tarkoitetaan algoritmeja, jotka osassa tapauksista antavat tehtävälle hyvän tai lähes optimaalisen ratkaisun, mutta joiden toimivuutta ei voida täsmällisesti taata. Heuristiset menetelmät voivat olla deterministisiä tai stokastisia. Usein heuristiset algoritmit ovat hyvin tehtäväkohtaisia ja käyttävät hyväkseen ongelman erityispiirteitä. Yleisempään tarkoitukseen sopivia heuristisia menetelmiä sanotaan myös metaheuristiikaksi. Edellä käsitelty branch-and-bound on esimerkki sellaisista tarkoista algoritmeista, joiden avulla voidaan hakea (ellei aika lopu kesken) globaali optimi, ja algoritmin toiminnan onnistuminen voidaan todistaa (oletuksena ajan riittävyys). Lokaalin haun menetelmät eroavat näistä siinä, että ne nimensä mukaisesti toimivat paikallisen informaation varassa ja eivät välttämättä konvergoi kohti globaalia optimia. Näin voi käydä vaikka käypä joukko olisi suhteellisen pienikin äärellinen joukko, menetelmät eivät välttämättä "osaa" nähdä lokaalia lähiympäristöä kauemmaksi. Etuna lokaalin haun menetelmillä voi kuitenkin olla kyky saavuttaa nopeasti suurissakin ongelmissa hyviä ratkaisuja, vaikka ei välttämättä täysin optimaalisia. Tarkastellaan optimointiprobleemaa muodossa max z = f(x), x S X, missä X on ratkaisuavaruus ja S probleeman käypä joukko. Tässä X voi olla yleisempi kombinatorisen optimoinnin tehtävän ratkaisuavaruus kuin R n. Toisin sanoen, tehtävän muotoilua MI(N)LP:ksi ei välttämättä edellytetä. 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, kuin esimerkiksi R n :ssä tai muussa metrisessä avaruudessa, jossa on käytössä 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: N(x) S. (Termiä "lähistö" on käytetty tarkoituksellisesti topologian termin "ympäristö" asemasta sekaantumisen välttämiseksi)
25 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 useimmiten myös siirroksi). Kaikille lähistöjä käyttäville menetelmille on onnistumisen kannalta oleellista, minkälainen lähistöstruktuuri 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. Lokaali haku (Local Search, Neighborhood Search) on menetelmä(tyyppi), jossa jokaisessa iteraatiossa uusi iteraatiopiste 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. Laske E(x) x N(x k ) 3. x k+1 :=argmax{e(x) x N(x k )} 4. k:=k+1 5. Jos f(x k )>f(x * ), niin tee päivitys x * = x k. 6. Onko lopetusehto voimassa? Jos on, x * on paras ratkaisu. Jos ei, niin jatka kohdasta 2. (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 merkitys on suhteessa suurempi.) Lokaalin haun suurimpia ongelmia on, että se jää usein kiinni lokaaliin optimiin. Esimerkki 1. 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 ).
26 Esimerkki 2: Kaupparatsuongelman 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ä 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 1 ->i 2, i 2 ->i 3,, i N-1 ->i N, i N ->i 1. Nyt 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. 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 i N ->i 1 ) ja kokeilee kannattaako vaihtaa. 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. (Menetelmä tunnetaan yleisemmässä muodossaan k-opt-algoritmina ja Lin-Kernighanalgoritmina.) Oheisissa kuvissa on Matlabilla toteutetulla 2-opt-algoritmilla ratkaistu 300:n kaupungin TSP satunnaisesta alkuratkaisusta lähtien.
27
28 11. Simuloitu mellotus Lokaalin haun suurimpia ongelmia oli algoritmin juuttuminen lokaaliin optimiin. Eräs keino korjata tämä tilanne 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. Periaate on lyhyesti seuraava: Olemassa olevan iteraatiopisteen lähistöstä valitaan satunnaisesti vertailupiste. Jos se parantaa kohdefunktion arvoa, se otetaan uudeksi iteraatiopisteeksi. Ellei, se voidaan silti hyväksyä uudeksi iteraatiopisteeksi todennäköisyydellä P(T, d) = e -d/t,
29 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. Olkoot aloituslämpötila T, jäähdytyskerroin r (0,1), lopetussääntö ja aloitusratkaisu x 1 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: Simuloitu mellotus 0. x * = x 1, j = 1, k=1. 1. Jos lopetussääntö on voimassa, lopeta, x * on paras löydetty ratkaisu. Ellei, jatka kohdasta 2. 2. Jos j=l+1, jatka kohdasta 8. Ellei, jatka kohdasta 3. 3. Valitse satunnaisesti piste y N(x k ) ja laske kohdefunktion arvomuutos d = f(y)-f(x k ). 4. Jos d 0, generoi välille [0,1] tasaisesti jakautuneista satunnaisluvuista arvo p ja jatka kohdasta 5. Jos d<0, jatka kohdasta 6. 5. Jos p e -d/t, jatka kohdasta 6. Ellei, aseta j=j+1 ja jatka kohdasta 2. 6. Aseta x k+1 =y ja k=k+1. 7. Jos f(x k ) < f(x * ), aseta x * = x k, j=1 ja jatka kohdasta 8. Ellei, aseta j=j+1 ja jatka kohdasta 2. 8. Aseta T=rT, j=1 ja jatka kohdasta 1.