~ HEURISTIKE ~ Složen problem se često ne može rešiti tačno, zato koristimo približno rešenje! Heuristika je jedan vid rešavanja složenih problema. Umesto da se izlistaju sva rešenja nekog problema i među njima nađe najbolje rešenje, heuristikama se izdvaja rešenje koje je dovoljno dobro ili najbolje a da se nisu sva rešenja pronašla. Primer 1 (Heuristika za vožnju kroz Pariz) Pretpostavimo da ste u poseti prijatelju u Parizu i da ste iznajmili auto na aerodromu. Vaš cilj je da po što kraćoj putanji dođete od aerodroma do stana vašeg prijatelja. Rešenje: Posmatramo sledeći optimizacioni problem: Od svih mogućih putanja od aerodroma do stana prijatelja, izabrati najkraću. U zavisnosti od rasporeda ulica i njihove prohodnosti, problem može biti manje-više složen. Npr. Da su ulice Pariza međusobno paralelne i iste dužine, problem bi bio jednostavan. Kako ti nije slučaj sa Parizom, problem je složen. Heuristika bi, u ovom slučaju, dala rešenje po kome bismo se kretali samo po glavnim ulicama. Ovo nije najbolje rešenje, ali je dovoljno dobro. Primer 2 (Putovanje po Evropi) Pretpostavimo da želite da putuje po Evropi i da na tom putovanju obilazite sve glavne gradove a da troškovi puta budu minimalni. Rešenje: Problem je poznat kao problem Trgovačkog putnika (rastojanje između gradova se zameni troškovima puta između dva grada). Heuristika bi dala sledeće rešenje: Iz grada A kretati se ka onom gradu do kog su troškovi puta najjeftiniji. Primer 3 (Šah) Pretpostavimo da tokom igranja šaha, najčešće su situacije u kojima vi i protivnik jedan drugom pojedete figuru. Rešenje: Heuristika nam daje sledeće: Svakoj figuri dodeliti numeričku vrednost koja će predstavljati doprinost te figure igri i povlačiti poteze tako da prilikom uzajamnog gubljenja figura, figura koju vi imate, ima manju num.vrednost.
Neke poznate heuristike: - Genetski algoritmi - Simularno kaljenje - Tabu pretraživanje Ove metode se često nazivaju meta-heuristikama zato što su opštog tipa i mogu se, generalno, primeniti na svaki problem. Genetski algoritmi Genetski algoritmi su jedna vrsta evolucionih algoritama. Napravljeni su po uzoru na tehniku koja postoji u prirodi pa imaju osobine mutacije, selekcije i rekombinacije. Intuitivno, oslanjaju se na principe prirodne selekcije kako bi rešili složene opmtimizacione probleme. Osnovna ideja, genetskih algoritama je da svaki element prostora pretrage odgovara nekoj individui. Svaka individua predstavlja kandidata za rešenje problema. Pogodnost individue da bude kandidat za rešenje zavisi od toga koliko kvalitetno doprinosti tom rešenju. Na primer: U problemu trgovačkog putnika doprinos svake jedinke se odnosi na ukupne troškove puta. Evolucija počinje sa populacijom koja je proizvoljno generisana. Za svaku generaciju, procenjuje se koliko svaka jedinka odgovara rešenju, više individua se izdvaja (obično one najpovoljnije) i modifikuje (prekombinuje, mutira) kako bi oformilo novu generaciju. Nova generacija se koristi u sledećoj iteraciji algoritma.
Simularno kaljenje Simularno kaljenje (SA) je opšta meta-heuristika sa verovatnoćama. Koristi se za globalne optimizacione probleme u kojima se jako dobro aproksimira globalni optimum u velikom dopustivom skupu. U nekim slučajevima simularno kaljenje se smatra efikasnijim algoritmom od detaljnog pretraživanja, odnosno kada se smatra da je rešenje dovoljno dobro ako je pronađeno za neko fiksirano vreme i zadovoljava uslove problema. Kako su genetski algoritmi insipirisani prirodom, simularno kaljenje je insipirisano metalurgijom. Tehnika zagrevanja i kontrolisanog hlađenja koja se koristi u metalurgiji na neki način se simulira u ovom algoritmu. Kako izgleda algoritam SA: Svaka tačka S dopustivog skupa odgovara stanju nekog fizičkog sistema, a funkcija E(S) koju je potrebno minimizovati odgovara internoj energiji sistema. Zadatak je da se sistem prevede iz njegovog početnog stanja u stanje koje minimalno troši energiju. Na svakom koraku, SA heuristika razmatra stanja iz okoline trenutnog stanja S i, korišćenjem verovatnoće, odlučuje da li će se sistem menjati ili će ostati isti. Verovatnoće se računa tako da dovode sistem u stanje sa minimalnom energijom. Naravno, ovaj korak se ponavlja, sve dok sistem ne dostigne stanje koje se smatra dovoljno dobrim, ili dok se ne zadovolje neki drugi unapred zadati parametri (npr. program ne sme da radi duže od unapred određenog vremena t ili dok se ne potroši budžet raspoređen za pokretanje ovog problema). Okolina stanja sistema predstavlja skup sistema koji se dobijaju nakon transforimsanja trenutnog stanja u određenom pravcu. Na primer, kod problema trgovačkog putnika svako stanje predstavlja određenu permutaciju gradova koje će putnik obići. Okoline permutacija su, u stvari, permutacije u kojima su se dva grada međusobno zamenila. Prelazak sa jednog stanja u drugo nazivamo korakom i različiti koraci prave različite okoline. Traženje okoline sistema je jako bitno za optimizaciju zato što se konačno rešenje naći nakon nekoliko uzastopnih okolina. Jednostavne heuristike se pomeraju tako što traže najbolju okolinu, i zaustavljaju se kada dostignu rešenje u čijim se okolinama ne nalazi ni jedno bolje rešenje. Problem kod ovakvih algoritama je taj što okoline ne garantuju da će dovesti do najboljeg rešenja i, ukoliko se ne dostigne odgovarajuće rešenje, ovakav postupak ne garantuje da odgovarajuće rešenje ni ne postoji. Odnosno, algoritam vraća lokalna rešenja. Metaheuristke koriste okoline stanja sistema kako bi pretražile moguća stanja i mogu da pređu i u lošija okruženja kako bi pretražile sve mogućnosti, odnosno neće se zaustaviti u lokalnom minimumu. Verovatnoća, koja određuje u koju će okolinu sistem preći se računa na sledeći način: Posmatra se trenutno stanje S i kandidat za naredno stanje S, a zatim se računa verovatnoća p(e,e,t) koja zavisi od energije e=e(s), e =E(S ) oba sistema, i globalnog parametra T (temperatura). Funkcija verovatnoće p, treba da je pozitivna. Na ovaj način sprečavamo da se algoritam zaustavi u lokalnom minimumu koji je lošiji od globalnog. Kada T teži nuli, verovatnoća p(e,e,t) teži nuli ako je e >e, a pozitivna je inače.
Za dovoljno malo T sistem će forsirati kretanje ka sistemima niže energije i izbegavati one sisteme koji imaju veću energiju. Ako stavimo da je T=0 dobijamo greedy algoritam. U originalnom algoritmu SA, verovatnoća p(e,e,t) je jednaka nuli kada je e <e, odnosno procedura se uvek kreće ka nižim sistemima. Mnogi algoritmi i dalje koriste ovu implementaciju SA obzirom da taj uslov nije od presudnog značaja da algoritam radi. Pseudo kod: S S0; // inicijalno stanje e E(S); // inicijalna energija S_best S; // inicijalno najbolje stanje e_best e; k 0; // procena energije, broj iteracija WHILE k < k_max AND e > e_max // sve dok ima vremena i nismo nasli najbolje resenje T temperature(k/k_max) // izračunamo temperaturu S_new neighbour(s) // biramo okolinu e_new E(S_new) // izračunamo energiju okoline IF p(e, e_new, T) > random() THEN // da li da se preselimo? S S_new; // da, preći na novo stanje e e_new; IF e_new < e_best THEN // da li je novo stanje bolje? S_best S_new; // jeste, zapamti najbolje rešenje e_best e_new; k k+1 // još jedna procena RETURN S_best; // vrati najbolje nađeno rešenje. Primer SA (Problem trgovačkog putnika - TSP) Trgovački putnik treba da obiđe n gradova proizvoljno raspoređenih na [-1,1]x[-1,1]. Мinimizovati troškove puta (dužina pređenog puta, vreme trajanja puta,...). Svaki grad posetiti tačno jednom i vratiti se na početak putanje. Rešenje (teorijsko) Naći Hamiltonovu putanju kompletnog grafa i izabrati najkaću. Rešenje (SA) Obeležimo sa dc ( i, cj) = dc ( j, ci) rastojanje između dva grada Permutaciju obeležavamo sa π gde su gradovi Vi i Vi+ 1 s usedni i bira se tako da se minimizuje funkcije n 1 dv (, V ) + dv (, V). i= 1 i i+ 1 n 1
Posmatramo gradove [0 1 2 3 4 5 6 7]. Inicijalna permutacija [0 2 4 6 7 5 3 1] Uklonimo linkove ( V3, V1) i ( V4, V6). i pravimo novu permutaciju [0 2 4 3 5 7 6 1] Pomeranjem linkova ( Vi, V i + 1) i ( Vj, V j + 1) i formiranjem novih linkova ( Vi, V j ) i ( Vi+ 1, Vj+ 1) promena funkcije cilja se može izračunati na sledeći način: Δ C = d( V, V ) + d( V, V ) d( V, V ) d( V, V ) i j i+ 1 j+ 1 i i+ 1 j j+ 1 Šta sve treba računati? TI inicijalna temperatura C funkcija cilja TI mo ra biti dovoljno visoko kako ne bi uticalo na konačno rešenje. Ako je maksimalna razlika funkcije cilja između okolina poznata, TI se može izračunati tako da je verovatnoća izbora maksimalne razlike najveća: p e ΔC max / T in = Kako funkcioniše temperatura: - temperatura se povećava sve dok je količnik potencijanih i svih mogućih poteza veća od neke unapred date veličine - temperatura se smanjuje u zavisnosti od sledećih parametara o TL (temperature length) broj iteracija na datoj temperaturi o Cooling ratio (f) veličina na kojoj se temperatura smanjuje
Alternative: o veliki broj iteracija na par temperatura o mali broj iteracija na velikom broju temperatura Najčešće je hlađenje sporo i računa se po sledećoj formuli f( T) = at, 0.8 a 0.99. Koliko se dugo treba zadržavati na određenoj temperaturi? Broj iteracija na svakoj temperaturi zavisi od - veličine okoline - veličine prostora pretrage Broj iteracija može da varira od temperature do temperature - treba trošiti više vremena na nižim temperaturama (povećati TL kako se temperatura smanjuje) - ili po nekom unapred zadatom kriterijumu. Ekstremne situacije su kada se na svakoj temperaturi koristi samo jedna iteracija. Tada se temperatura smanjuje jako sporo f( T) = T /(1 + β ), β dovoljno malo U teoriji temperatura se smanjuje do nule, u praksi se smanjuje na neku minimalnu vrednost blisku nuli. Kriterijum za zaustavljanje: - dostignuta je minimalna temperatura - dostignut je broj iteracija - količnik dostupnih i mogućih poteza je manji od unapred zadate vrednosti Neka je n=15.
Local Search (Pseudo kod) S // proizvoljni početni skup je prazan WHIL E (true) IF ( v V / S ) SUCH THAT // sve dok nije kraj // uzimamo element iz skupa V/S koji val( S { v}) > val( S) // ako on popravlja rezultat S S + v ELSE // ubacujemo ga u S IF ( v S) SUCH THAT // ako ne popravlja rezultat i bolje je bez val ( S \{ v}) > val( S) // elementa v S S v // brišemo ga iz skupa S ELSE S is a local optimum // inače smo postigli optimum RETURN S Tabu Search (Pseudo kod) S S0 = InitialSet() S_ best S // proizvoljno bira početno rešenje // početno rešenje se smatra najboljim TabuList empty() // tabu lista je prazna WHILE (true) // sve dok nije kraj CandidateList empty() WHILE ( s _ Candidate Neighborhood( )) // uzima se kandidat iz okoline IF ( s_candidate TabuList ) // ako kandidat nije u tabu Listi CandidateList CandidateList + s_candidate // može da se razmatra s_candidate BestLocalSearch(CandidateList) // od svih kandidata iz okoline biramo najpovoljnijeg IF ( va l( s _ Candidate) > val( s _ Best) ) // ako je izabrani kandidat popravio rezultat TabuList featureddifferences // update-ujemo tabu listu S _ best s _ Candidate // kandidat postaje najbolji WHILE ( size( TabuList) > maxsizetabulist ) // ako tabu lista ima previše članova ukljanjamo one koji su prvi postavljeni expirefeatures(tabulist); RETURN S_best
Variable Neighborhood Search (Pseudo kod) k x k_min // broj pomeranja InitialSet () // proizvoljna početna vrednost WHILE (true) // sve dok nije kraj x' Shake(k,x) // pomeramo se za k mesta od originala x'' LocalSearch(x') // tražimo bolju vrednost u okolini tačke x IF ( valx ( '') > valx ( )) // ako je nova tačka povoljnija x x'' k k_min // pomeramo se u tačku x ELSE k k + k_ step // korak za udaljavanje od originala se povećava Ant Colony System (Pseudo kod) k k 0 // broj čvorova τ ( τ 0 ( // nivo privlačnosti čvora μ( k ) μ ( k) // nivo vidljivosti 0 WHILE (i<maxiteration) FOR ( each ant) DO ChoseProbabilisticallyTheNextStateToMove; // izbor na osnovu prethodnog AddThatMoveToTabuList; WHILE (each ant completed a solution) IF (Ant has completed a solution) Update attractivnes ( τ ( k) ) for each edge that ant traversed; IF (local best solution better then global solution) Save local best solution as global solution;
Ant System Algorithm for TSP (Pseudo kod) k k 0 // broj čvorova τ ( k) τ 0 ( k) // nivo fe rmiona PlaceEachAntOnARandomlyChosenCity; WHILE (i<maxiteration) FOR (each ant) MoveAntToNextCityByProbabilityFunction; E ND FOR ( each ant with a complete tour) EvaporatePheormones; ApplyPheromoneUpdate; IF (Ant k s tour is shorter then the global solution) Update global solution to ant k s tour; Bee Colony Optimization (Pseudo kod) a( n) a0 ( n) // prazna solucija za svaku pčelu WHILE (IterationIsNotEnd) // forward pass FOR (b=0; b<b; b++) FOR (k=0; k<nc; k++) EvaluateAllPossibleMoves; ChoseRandomOneMove; // backward pass EvaluateObjectiveFunctionValueForEachBee; ChoseLoyality; ForEachFollowerChoseARecruiter; EvaluateAllSolutionAndFindBest; Preuzet sa http://www.matf.bg.ac.rs/p/files/10-bco_presentation.pdf