UNIVERZA V MARIBORU PEDAGOŠKA FAKULTETA MARIBOR ODDELEK ZA MATEMATIKO Andrej Taranenko GENETSKI ALGORITMI Diplomsko delo MARIBOR, 2001 ZAHVALA Mentorju dr. Aleksandru Veselu se iskreno zahvaljujem za skrbno spremljanje ter pomoč pri izdelavi diplomskega dela. Zahvaljujem se tudi staršem, sestri in njeni družini ter babici za vsestransko pomoč na moji izobraževalni poti. Prav tako se zahvaljujem vsem prijateljem, saj so mi stali ob strani, ko sem jih potreboval. Kazalo 1 Uvod 7 2 Osnove genetskih algoritmov 2.1 Osnovni pojmi . . . . . . . . . . . . . . . . 2.2 Definicija enostavnega genetskega algoritma 2.3 Funkcija uspešnosti . . . . . . . . . . . . . . 2.4 Razmnoževanje . . . . . . . . . . . . . . . . 2.4.1 Križanje . . . . . . . . . . . . . . . . 2.4.2 Mutacija . . . . . . . . . . . . . . . . 2.5 Kako delujejo genetski algoritmi? . . . . . . 2.6 Primerjava z drugimi tehnikami . . . . . . . 2.6.1 Grobo in naključno iskanje . . . . . . 2.6.2 Metode plezanja v hrib . . . . . . . . 2.6.3 Algoritem ohlajanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 10 11 12 12 14 14 26 26 26 27 3 Matematično ozadje genetskih algoritmov 29 3.1 Sheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.2 Osnovni izrek o genetskih algoritmih . . . . . . . . . . . . . . . . . . 30 4 Neodvisnostno število grafa 4.1 Osnovni pojmi iz teorije grafov . . . . . . . . . . . . . 4.2 Genetski pristop za iskanje največje neodvisne množice 4.2.1 Genetski algoritem . . . . . . . . . . . . . . . . 4.2.2 Kodiranje in dekodiranje rešitev . . . . . . . . . 4.3 Funkcija uspešnosti . . . . . . . . . . . . . . . . . . . . 4.4 Operaciji križanja in mutacije . . . . . . . . . . . . . . 4.4.1 Križanje z delno preslikavo . . . . . . . . . . . . 4.4.2 Križanje položajev . . . . . . . . . . . . . . . . 4.4.3 Krožno križanje . . . . . . . . . . . . . . . . . . 4.4.4 Operacija mutacije . . . . . . . . . . . . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 35 36 36 37 39 40 40 42 42 43 KAZALO 4.5 4.6 Elitna strategija . . . . . . . . . . . . . . . Eksperimentalni rezultati . . . . . . . . . . 4.6.1 DIMACS testni grafi . . . . . . . . 4.6.2 Vrednosti uporabljenih parametrov 4.6.3 Rezultati . . . . . . . . . . . . . . . 4.6.4 Računalniški program . . . . . . . 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 45 45 45 46 47 Program diplomskega dela Naslov: Genetski algoritmi Podrobno predstavite osnove genetskih algoritmov, njihovo delovanje in matematično ozadje. Opišite delovanje genetskega algoritma za iskanje največje neodvisne množice grafa in ga implementirajte v programskem okolju Borland Delphi. Preizkusite delovanje programa s pomočjo DIMACS testnih grafov. Mentor: dr. Aleksander Vesel Povzetek V diplomskem delu so na začetku predstavljeni in definirani genetski algoritmi ter osnovni pojmi, kot so osebek, populacija, generacija, funkcija uspešnosti, selekcija, križanje in mutacija. Na primeru je natančno razloženo delovanje enostavnega genetskega algoritma. V nadaljevanju je opisano matematično ozadje genetskih algoritmov in izrek o shemah. V zadnjem poglavju je predstavljeno iskanje največje neodvisne množice s pomočjo računalniškega programa, ki temelji na genetskih algoritmih. Na koncu so prikazani rezultati delovanja programa na DIMACS testnih grafih. Math. Subj. Class. (2000): 68W20, 68W25 Ključne besede: genetski algoritem, neodvisnostno število 1 Uvod Genetski algoritmi (GA) so prilagodljive metode, ki jih uporabljamo za reševanje iskalnih in optimizacijskih problemov. Temeljijo na genetskem procesu bioloških organizmov, saj se zgledujejo po evoluciji v naravi, kjer se populacija neke vrste skozi generacije razvija po načelu naravnega izbora in preživetju uspešnejšega. To je prvi jasno zapisal že Charles Darwin. S posnemanjem tega procesa lahko genetski algoritmi “razvijejo” rešitev podanega problema, če jih ustrezno sprogramiramo. Osnove genetskih algoritmov je prvi predstavil Holland leta 1962. Od takrat so genetski algoritmi hvaležno področje za mnoge tehtne raziskave. Pravi razcvet pa doživijo v 90tih letih, ko izide mnogo pomembnih člankov in monografij, glej npr. [5]. GA posnemajo tiste procese v naravi, ki so bistveni za evolucijo. V naravi posamezniki neke populacije med seboj tekmujejo za življenjsko pomembne vire. Hitrejši in pametnejši predstavniki vrste bodo imeli več in boljše vire za preživetje, počasnejši in manj pametni jih bodo dobili težje ali pa sploh ne. Ravno tako se pojavi tekmovanje pri iskanju partnerja za razmnoževanje. Tisti, ki so uspešnejši v preživetju in pri parjenju, bodo po vsej verjetnosti imeli relativno večje število potomcev. Slabši posamezniki jih bodo imeli manj ali pa sploh ne. To pomeni, da se bodo geni dobro prilagojenih oz. ustreznih posameznikov bolj razširili na prihodnje generacije, slabši pa bodo celo izumrli. Kombinacija genov dveh ustreznih staršev lahko privede do pojava super-ustreznega potomca, ki ima boljše lastnosti od obeh staršev. Na ta način se vrste razvijajo in prilagajajo na svoje okolje. GA delujejo po analogiji k temu naravnemu procesu. Delujejo nad neko populacijo osebkov (kromosomov), od katerih vsak predstavlja možno rešitev danega 7 1. UVOD 8 problema. Vsakemu kromosomu se priredi ocena uspešnosti, ki je prilagojena iskanemu problemu (npr. če bi iskali najkrajšo pot v grafu med dvema vozliščema, bi bila ocena lahko kar dolžina poti, ki jo kromosom predstavlja). Ustreznejši kromosomi - tisti z boljšo oceno - imajo več možnosti za reprodukcijo od ostalih. Nad trenutno populacijo izvedemo simuliran proces evolucije. Iz naše populacije izberemo podmnožico staršev, ki se razmnožujejo. Tako za našo populacijo dobimo nove potomce, ki prevzamejo nekaj lastnosti od vsakega starša. Manj ustrezni predstavniki se bodo razmnoževali z manjšo verjetnostjo in tako izumrli. Z izborom najustreznejših rešitev (staršev) s pomočjo razmnoževanja dobimo nove rešitve (potomce), ki nadomestijo slabše osebke. Ta nova populacija rešitev vsebuje višje povprečje lastnosti dobrih rešitev prejšnje populacije. Na ta način se dobre lastnosti razširijo v naslednje generacije. Z izbiranjem ustreznejših kromosomov za razmnoževanje raziščemo najobetavnejša področja v domeni rešitev. Če smo genetski algoritem dobro zastavili, bo populacija konvergirala k optimalni rešitvi. 2 Osnove genetskih algoritmov 2.1 Osnovni pojmi Naj bodo možne rešitve, nad katerimi izvajamo genetski algoritem, predstavljene z nizi. Tako predstavljene rešitve so osebki, pravimo jim tudi kromosomi. Posamezne simbole v nizu imenujemo geni. Lokus je mesto gena v kromosomu, alel pa njegova konkretna vrednost. V prostoru preiskovanja ima vsaka točka svojo vrednost glede na kriterijsko funkcijo. V genetskem algoritmu pa osebke ocenjujemo s pomočjo funkcije uspešnosti (angl. fitness function). Le-ta mora biti definirana tako, da osebkom, ki predstavljajo boljše rešitve, priredi višjo uspešnost (glej razdelek 2.3). Populacija je množica osebkov. Populacijo obdelujemo v korakih, ki jih imenujemo generacije. Iz osebkov (staršev) trenutne populacije tvorimo naslednike (potomce), ki pripadajo populaciji v naslednji generaciji. Velikost populacije ostaja nespremenjena skozi vse generacije. Nad posamezno populacijo izvajamo tri operacije, s pomočjo katerih dobimo potomce. Te operacije so: selekcija, križanje in mutacija. Selekcija iz tekoče populacije izbere osebke za razmnoževanje. Križanje in mutacija sta t.i. genetski operaciji, saj delujeta na ravni genov izbranih kromosomov. 9 2. OSNOVE GENETSKIH ALGORITMOV 2.2 10 Definicija enostavnega genetskega algoritma Genetski algoritmi so sredstvo za reševanje problemov, ki so iskalne ali optimizacijske narave. Delujejo na principu preživetja uspešnejšega. Dobre rešitve združimo v upanju, da bo potomec predstavljal boljšo rešitev. Genetski algoritem lahko predstavimo s psevdokodo, kot jo vidimo na sliki 2.1. BEGIN /* genetski algoritem */ ustvarimo začetno populacijo; izračun uspešnosti osebkov v populaciji; WHILE nimamo najboljše rešitve nismo izvedli določeno število korakov ni minil določen čas se potomci bistveno razlikujejo staršev BEGIN // faza selekcije izbor staršev za razmnoževanje; OR OR OR DO // faza razmnoževanja križanje staršev; mutiranje posameznikov; ocena uspešnosti populacije; END END Slika 2.1: Enostavni genetski algoritem Ko prvič izvedemo genetski algoritem, se ustvari začetna populacija rešitev. Le-te se po navadi izberejo naključno in večina osebkov v prvotni populaciji verjetno ne bo predstavljala dobrih rešitev. Nekatere bodo celo nasprotje pričakovanega. Izračun uspešnosti osebkov v populaciji se nanaša na preizkušanje rešitev, glede na to, kako uspešno in v kaki meri rešijo dani problem. Na ta način lahko določimo, katera rešitev je boljša od druge. Osebki, ki uspešneje ali vsaj delno rešijo problem, dobijo večjo vrednost uspešnosti od tistih, ki problem rešijo slabše ali pa ga ne morejo rešiti. Izračun uspešnosti se opravi glede na funkcijo uspešnosti. 2. OSNOVE GENETSKIH ALGORITMOV 11 V fazi selekcije iz trenutne populacije izberemo podmnožico osebkov. Glede na oceno uspešnosti bomo kasneje iz te podmnožice izbrali pare osebkov - staršev, ki jih bomo uporabili za razmnoževanje. V fazi razmnoževanja se po nekem postopku združita izbrana starša, iz katerih dobimo dve novi rešitvi (dva potomca). Cilj je, da nam razmnoževanje dá vsaj enega potomca, ki je, glede na funkcijo uspešnosti, boljši od obeh staršev. Novi rešitvi v populaciji zamenjata dva osebka z najmanjšo oceno uspešnosti, ali pa zamenjata kar starša. Tako velikost populacije ostaja nespremenjena. Mutacija spremeni posamezne gene v potomcih. Koliko otrok bo mutiralo, če sploh bo kateri mutiral, se določi naključno. Tudi geni mutacije se praviloma izberejo naključno. V algoritmu na sliki 2.1 vidimo, da se postopek ponavlja tako dolgo, dokler ne najdemo najboljše rešitve. Vedno pa ni nujno tako. GA lahko tudi prenehamo izvajati po določenem številu korakov, čez določen čas (mišljen je realni čas) ali ko potomci niso več uspešnejši od staršev. V veliko primerih bo genetski algoritem našel zelo dobro rešitev, vendar ne tudi najboljše. Če genetski algoritem izvajamo zelo dolgo, postanejo vsi kromosomi v populaciji enaki. Ta pojav lahko delno odpravimo z mutacijo ali z večjo populacijo, popolnoma pa ga ne moremo odpraviti. 2.3 Funkcija uspešnosti Obstaja več oblik genetskih algoritmov. Pri različnih oblikah lahko izbiramo različne lastnosti in parametre, vendar razen kodiranja in funkcije uspešnosti velikega vpliva na delovanje algoritma ti dejavniki nimajo. Skupaj z izbiro predstavitve rešitev (pri enostavnem genetskem algoritmu so to običajno binarni nizi), je primerna izbira funkcije uspešnosti najbolj pomemben del genetskih algoritmov. Funkcijo uspešnosti moramo definirati posebej za vsak problem, ki ga rešujemo. Funkcija uspešnosti danemu kromosomu priredi neko numerično “uspešnost”, ki naj bi bila sorazmerna s sposobnostjo oz. učinkovitostjo osebka, ki ga kromosom predstavlja. V idealnem primeru bi želeli, da je funkcija uspešnosti zvezna tako, da so kromosomi s primerno uspešnostjo blizu (glede na prostor preiskovanja) kromosomom 2. OSNOVE GENETSKIH ALGORITMOV 12 z malo boljšo uspešnostjo. Žal takih funkcij ni vedno mogoče najti. Če pa želimo, da GA delujejo dobro, moramo najti funkcijo uspešnosti, ki nima preveč lokalnih maksimumov ali zelo izoliranega globalnega maksimuma. Splošno pravilo pri konstruiranju funkcije uspešnosti je, da naj predstavi vrednost kromosoma na nek “realen” način. Vendar pa ta “realna” vrednost ni vedno uporabna količina za GA. V kombinatorični optimizaciji so pogosti problemi z veliko omejitevami, kar pomeni, da veliko točk v prostoru preiskovanja predstavlja neveljavne kromosome in zato nimajo “realne” vrednosti. Da bi bil GA v takšnih primerih učinkovit, moramo najti tako funkcijo uspešnosti, ki bo ocenjevala uspešnost nedopustnega kromosoma glede na to, ali nas lahko pripelje do dopustne rešitve. Težava v tem primeru je, da moramo vedeti, kje so dopustne rešitve, da lahko okoliške točke dobijo dobre ocene, bolj oddaljene pa slabše. Drugi pristop k reševanju problema, v katerem se pojavljajo omejitve, je uporaba funkcije kaznovanja. V tem primeru kromosomom, ki ne izpolnjujejo določenih omejitev, zmanjšamo njihovo oceno uspešnosti. Slabost tega pristopa je, da je težko ločiti skoraj dopustne rešitve (to so tiste, ki zadoščajo večini omejitev) od dopustnih rešitev z nizko vrednostjo kriterijske funkcije. 2.4 Razmnoževanje V fazi razmnoževanja iz trenutne populacije naključno, po nekem pravilu, ki upošteva uspešnost posameznikov, izberemo starše, iz katerih dobimo potomce, ki bodo člani populacije v novi generaciji. Posamezniki z visoko uspešnostjo bodo za razmnoževanje izbrani z večjo verjetnostjo in večkrat kot tisti z nizko uspešnostjo, za katere se pogosto pripeti, da za razmnoževanje sploh niso izbrani. Kako lahko izberemo posameznike za razmnoževanje, je opisano v poglavju 2.5. Še prej si oglejmo, kako iz dveh staršev dobimo potomca. Pri tem si pomagamo z binarnima operacijama – s križanjem in mutacijo. 2.4.1 Križanje Križanje je operacija, s pomočjo katere iz dveh staršev dobimo dva potomca, ki v populaciji običajno nadomestita svoje starše. Križanje običajno poteka tako, da 2. OSNOVE GENETSKIH ALGORITMOV 13 naključno izberemo mesto križanja, ki kromosoma obeh staršev (predstavljena kot binarna niza) razdeli na dva dela, “glavo” in “rep”. Nato zamenjamo glavi ali repa obeh staršev in tako dobimo dva kromosoma, ki predstavljata nova potomca. Na ta način vsak izmed potomcev podeduje nekaj genov od vsakega starša. Ta način križanja imenujemo enostavno ali enomestno križanje. Primer je prikazan na sliki 2.2. Obstajajo pa oblike križanja, pri katerih izberemo več točk križanja in kromosomoma, ki predstavljata starše, izmenjamo enega ali več podnizov. Primer križanja v dveh točkah je na sliki 2.3. Slika 2.2: Križanje v eni točki Slika 2.3: Križanje v dveh točkah Običajno ne križamo vseh parov izbranih za razmnoževanje. Ali bomo par križali, določimo z neko v naprej določeno verjetnostjo. Verjetnost za križanje je v ra- 2. OSNOVE GENETSKIH ALGORITMOV 14 zličnih izvedbah različna, običajno se giblje med 0.25 in 1.0. Če para ne križamo, sta potomca kar enaka svojima staršema. Tako ima vsak posameznik, izbran za razmnoževanje možnost, da njegovi geni pridejo v novo generacijo, ne da bi se jih spremenilo s križanjem. 2.4.2 Mutacija Mutacija, se za razliko od križanja, izvaja na potomcih. Za vsakega potomca se določi lokus (mesto gena), ki se mu spremeni vrednost. Mutacijo nad posameznikom izvajamo z zelo majhno verjetnostjo (običajno reda 0.01). Na sliki 2.4 se potomcu z mutacijo spremeni tretji gen. Slika 2.4: Mutacija v eni točki Križanje je operacija, ki nam omogoča hitro raziskovanje prostora preiskovanja v smeri optimuma, mutacija pa poskrbi za naključno raziskovanje, ter za to, da nobena točka v preiskovalnem prostoru ni brez možnosti, da bi jo raziskali. 2.5 Kako delujejo genetski algoritmi? Preden na primeru prikažemo, kako delujejo genetski algoritmi, zapišimo nekaj opomb. Ni težko videti, da lahko, brez izgube za splošnost, govorimo samo o maksimizacijskih problemih. Če bi problem zahteval minimizacijo funkcije f , lahko problem pretvorimo v maksimizacijo funkcije g, kjer je g = −f , ker velja min f (x) = max g(x) = max{−f (x)}. Predpostavimo lahko tudi, da je funkcija f pozitivna na celotnem definicijskem območju. Sicer lahko vedno dodamo tako konstanto C, da velja f (x) + C je povsod 2. OSNOVE GENETSKIH ALGORITMOV 15 pozitivna in max f (x) = max{f (x) + C}. Recimo, da želimo poiskati maksimum funkcije n spremenljivk, f (x1 , . . . , xn ) : Rn → R. Naj velja: xi ∈ Di = [ai , bi ] ⊆ R in f (x1 , . . . , xn ) > 0 za vsak xi ∈ Di . Maksimum želimo poiskati na šest decimalnih mest natančno. Za takšno natančnost moramo vsako domeno Di razdeliti na (bi − ai ) · 106 enako velikih intervalov. Z mi označimo najmanjše celo število, tako da velja (bi −ai )·106 ≤ 2mi −1. Potem zahtevi natančnosti očitno zadošča, da predstavimo vsako spremenljivko iz domene Di kot binarne nize dolžine mi . Vrednost tako kodiranega kromosoma dobimo po naslednji formuli: bi − a i xi = ai + dec(11001 . . . 00112 ) · mi , 2 −1 kjer je dec(niz) desetiška vrednost binarnega niza niz. Tako lahko vsak kromosom (kot možno rešitev) predstavimo z binarnim nizom P dolžine m = ni=1 mi , saj prvih m1 genov pretvorimo v vrednost iz domene D1 = [a1 , b1 ], naslednjo skupino m2 genov v vrednost iz domene D2 , itd., zadnjih mn genov pa v vrednost iz domene Dn . Za začetno populacijo lahko preprosto določimo velikost pop kromosomov, ki jim naključno izberemo vrednosti genov. Če imamo kakšno informacijo o porazdelitvi možnih maksimumov, lahko pri izbiri začetne populacije to uporabimo. Nato sledimo algoritmu za enostavni genetski algoritem, kot je predstavljen na sliki 2.1: v vsaki generaciji ocenimo trenutno populacijo (tako da uporabimo funkcijo f na dekodiranih vrednostih), izberemo novo populacijo glede na verjetnost izbora, ki je odvisna od njihove ocene uspešnosti, spremenimo kromosome v novi populaciji s pomočjo operatorjev (križanje in mutacija). Po določenem številu generacij, ko ne opazimo nobene izboljšave več, najboljši kromosom predstavlja (lahko tudi globalno) najboljšo rešitev. Kot smo že povedali, pa lahko algoritem ustavimo tudi po določenem številu ponavljanj. Za fazo selekcije (izbor nove populacije glede na verjetnost, odvisno od ocene uspešnosti) se uporablja t.i. ruleta z režami velikosti, ki so odvisne od uspešnosti kromosoma. Ruleto tvorimo na naslednji način (predpostavimo, da so ocene uspešnosti pozitivne vrednosti): • Izračunamo uspešnost oceni(vi ) za vsak kromosom vi , i = 1, . . . , velikost pop. 2. OSNOVE GENETSKIH ALGORITMOV 16 • Izračunamo skupno uspešnost populacije U= Pvelikost pop i=1 oceni(vi ). • Izračunamo verjetnost izbire pi za vsak kromosom vi , i = 1, . . . , velikost pop: pi = oceni(vi )/U • Izračunamo kumulativno verjetnost qi za vsak kromosom vi , i = 1, . . . , velikost pop: qi = Pi j=1 pj . Proces selekcije poteka tako, da velikost pop -krat zavrtimo ruleto in vsakič iz trenutne populacije izberemo en kromosom, na sledeči način: • Izberemo naključno (realno) število r z intervala [0, 1]. • Če je r < q1 potem izberemo prvi kromosom (v1 ); sicer izberemo i-ti kromosom vi (2 ≤ i ≤ velikost pop), tako da qi−1 < r ≤ qi . Očitno je, da lahko nekatere kromosome izberemo večkrat. To je v skladu z izrekom o shemah (poglavje 3.2): najboljši kromosomi dobijo več kopij, povprečnih ostane enako, najslabši pa izumrejo. Sedaj smo pripravljeni na fazo križanja. Križanje izvajamo z verjetnostjo pc , ki je podana kot parameter genetskega algoritma. Ta verjetnost nam dá pričakovano število pc · velikost pop kromosomov, ki se bodo križali. Izbor poteka takole: Za vsak kromosom iz (nove) populacije: • Izberemo naključno (realno) število r iz intervala [0, 1]. • Če je r < pc , izberemo kromosom za križanje. Sedaj izbrane kromosome naključno križamo: za vsak par kromosomov generiramo naključno celo število kje iz intervala [1, m − 1], kjer je m dolžina kromosoma (število genov v kromosomu). Število kje določa mesto križanja. Tako kromosoma 2. OSNOVE GENETSKIH ALGORITMOV 17 (b1 b2 . . . bkje bkje+1 . . . bm ) in (c1 c2 . . . ckje ckje+1 . . . cm ) nadomestimo z njunima potomcema: (b1 b2 . . . bkje ckje+1 . . . cm ) in (c1 c2 . . . ckje bkje+1 . . . bm ). Naslednja operacija, ki jo izvedemo, je mutacija. Mutacijo izvajamo nad vsakim genom posebej. Parameter pm (verjetnost mutacije) genetskega algoritma nam poda pričakovano število mutiranih genov pm · m · velikost pop. Vsak gen (v vseh kromosomih v celotni populaciji) ima enako možnost, da bo mutiral, t.j. se spremenil iz 0 v 1 in obratno. Za vsak kromosom iz trenutne (po izvedenem križanju) populacije in za vsak gen v kromosomu: • Izberemo naključno (realno) število r iz intervala [0, 1]. • Če je r < pm , mutiramo gen. Po končanih treh fazah (selekcija, križanje in mutacija) lahko na novo ocenimo dobljeno populacijo. Glede na nove ocene ponovimo celoten postopek, kar pomeni da za novo populacijo definiramo novo ruleto, izberemo podmnožico možnih staršev, jih s podano verjetnostjo križamo in po križanju z verjetnostjo mutacije mutiramo vse gene kromosomov v celotni populaciji. Proces oponašanja evolucije nad rešitvami je le ponavljanje teh korakov (glej algoritem na sliki 2.2). Poglejmo si sedaj celoten postopek na konkretnem primeru optimizacije funkcije. Naj bo velikost populacije velikost pop = 20, verjetnost križanja pc = 0.25 in verjetnost mutacije pm = 0.01. Recimo, da želimo poiskati maksimum funkcije dveh spremenljivk: f (x, y) = 45 + xy sin(4πx) cos(20πy), kjer velja: −3.0 < x < 13.0 in 3.0 < y < 5.0. Graf funkcije vidimo na sliki 2.5. Recimo, da želimo natančnost štirih decimalnih mest za vsako izmed spremenljivk. Dolžina domene spremenljivke x je 16.0; zahteva natančnosti določa, da interval [−3.0, 13.0] razdelimo na vsaj 16.0 · 104 ekvidistančnih intervalov. To pomeni, da 2. OSNOVE GENETSKIH ALGORITMOV 18 Slika 2.5: Graf funkcije f (x, y) = 45 + xy sin(4πx) cos(20πy) 18 bitov zadostuje za predstavitev prve spremenljivke v binarnem kromosomu, saj velja 217 < 160000 ≤ 218 . Dolžina domene spremenljivke y je 2.0, zato podobno kot pri spremenljivki x, zaradi zahtevane natančnosti za njeno predstavitev v binarnem kromosomu zadostuje 15 bitov, saj velja 214 < 20000 ≤ 215 . Končna dolžina kromosoma, ki predstavlja možno rešitev, je torej m = 18 + 15 = 33 bitov; prvih 18 bitov predstavlja x, ostalih 15 bitov (to so biti od 19 do 33) pa predstavlja y. Poglejmo kromosom (001111110011010110111000000111110). Prvih 18 bitov, 001111110011010110, predstavlja x = −3.0+dec(0011111100110101102 )· 13.0−(−3.0) = 218 −1 16.0 = −3.0 + 3.950576 = 0.950576. −3.0 + 64726 · 262143 Naslednjih 15 bitov, 111000000111110, predstavlja y = 3.0+dec(1110000001111102 )· 2. OSNOVE GENETSKIH ALGORITMOV 19 2.0 = 3.0 + 28734 · 32767 = 3.0 + 1.753837 = 4.753837. Tako kromosom (001111110011010110111000000111110) predstavlja par hx, yi = h0.950576, 4.753837i. Ocena uspešnosti za ta kromosom je 5.0−3.0 215 −1 f (0.950576, 4.753837) = 47.553499. Za optimizacijo funkcije f s pomočjo genetskega algoritma, smo ustvarili populacijo velikosti velikost pop = 20 kromosomov. Vsem 33 genom v kromosomu so naključno določene vrednosti (aleli). Tako dobimo naslednjo začetno populacijo: v1 = (111100001010101000001001101010111) v2 = (111111110100011011000110100010001) v3 = (111100010001011001100100101010101) v4 = (111000101001111001111001001000001) v5 = (100101011001000010100011000010110) v6 = (010111011010111011011101001010110) v7 = (010101111110100011001100000100010) v8 = (010011110101110100101100100000111) v9 = (101010110000110100010000011100101) v10 = (000110111111110010011000010110111) v11 = (000100000100111100011000001101001) v12 = (011111001101001111111011001111111) v13 = (001110011101100100110110001011101) v14 = (100010000101111100001000011000110) v15 = (010001000111001000010010111101010) v16 = (000011011101100100010000001011011) v17 = (100011000101100110000111101000000) v18 = (101101011100000100010000111010100) v19 = (110000011011001001100000110001000) v20 = (101001000110111110000001010100001) Ko ocenjujemo uspešnost kromosomov, vsakega dekodiramo in izračunamo vrednost funkcije f (x, y) za vrednosti, ki smo jih dekodirali. Tako dobimo: 2. OSNOVE GENETSKIH ALGORITMOV oceni(v1 ) = f (12.041561, 3.302194) = 64.647939 oceni(v2 ) = f (12.954833, 3.204168) = 23.446118 oceni(v3 ) = f (12.067989, 4.145847) = 8.5442915 oceni(v4 ) = f (11.163689, 4.785271) = 73.410052 oceni(v5 ) = f (6.347813, 4.095126) = 21.646644 oceni(v6 ) = f (2.855185, 3.911526) = 36.893084 oceni(v7 ) = f (2.494344, 3.377086) = 44.921802 oceni(v8 ) = f (1.960223, 4.391094) = 41.503667 oceni(v9 ) = f (7.690714, 3.513992) = 56.685521 oceni(v10 ) = f (−1.250847, 3.761192) = 45.038230 oceni(v11 ) = f (−1.980709, 3.756431) = 46.642200 oceni(v12 ) = f (4.801726, 4.851557) = 59.031114 oceni(v13 ) = f (0.615492, 4.693227) = 47.612314 oceni(v14 ) = f (5.523225, 3.262092) = 41.241623 oceni(v15 ) = f (1.277848, 3.592425) = 43.601019 oceni(v16 ) = f (−2.134518, 3.505569) = 51.978953 oceni(v17 ) = f (5.771884, 3.238288) = 48.762288 oceni(v18 ) = f (8.359662, 3.528580) = 51.458562 oceni(v19 ) = f (9.106064, 4.023957) = 47.331909 oceni(v20 ) = f (7.277260.3.041077) = 51.296084 Vidimo, da je kromosom v4 najboljši, kromosom v3 pa najslabši. Sedaj ustvarimo ruleto za fazo selekcije. Skupna uspešnost generacije je U = 905.693421. Verjetnost izbire pi za vsak kromosom vi (i = 1, . . . , 20) je enaka: 20 2. OSNOVE GENETSKIH ALGORITMOV p1 = oceni(v1 )/U p3 = oceni(v3 )/U p5 = oceni(v5 )/U p7 = oceni(v7 )/U p9 = oceni(v9 )/U p11 = oceni(v11 )/U p13 = oceni(v13 )/U p15 = oceni(v15 )/U p17 = oceni(v17 )/U p19 = oceni(v19 )/U = 0.071379 = 0.009433 = 0.023900 = 0.049599 = 0.062587 = 0.051498 = 0.052570 = 0.048141 = 0.053839 = 0.052260 21 p2 = oceni(v2 )/U p4 = oceni(v4 )/U p6 = oceni(v6 )/U p8 = oceni(v8 )/U p10 = oceni(v10 )/U p12 = oceni(v12 )/U p14 = oceni(v14 )/U p16 = oceni(v16 )/U p18 = oceni(v18 )/U p20 = oceni(v20 )/U = 0.025887 = 0.081053 = 0.040734 = 0.045825 = 0.049727 = 0.065177 = 0.045535 = 0.057391 = 0.056816 = 0.056637 Kumulativne verjetnosti qi za vsak kromosom vi (i = 1, . . . , 20) so: q1 q5 q9 q13 q17 = 0.071379 q2 = 0.211655 q6 = 0.410402 q10 = 0.629377 q14 = 0.834285 q18 = 0.097266 q3 = 0.252390 q7 = 0.460130 q11 = 0.674913 q15 = 0.891102 q19 = 0.106700 q4 = 0.301989 q8 = 0.511629 q12 = 0.723054 q16 = 0.943362 q20 = 0.187754 = 0.347814 = 0.576807 = 0.780445 = 1.000000 Sedaj smo pripravljeni, da 20-krat zavrtimo ruleto, vsakič iz populacije izberemo enega od kromosomov. Program je generiral naslednjih 20 naključnih števil iz intervala [0, 1]: 0.487727 0.712488 0.384286 0.631095 0.354492 0.102114 0.551053 0.809124 0.275074 0.470400 0.376828 0.897063 0.228429 0.628189 0.466801 0.831809 0.321259 0.603310 0.232462 0.036421 Prvo število r = 0.487727 je večje od q10 in manjše od q11 , kar pomeni, da za novo populacijo izberemo kromosom v11 ; naslednje število r = 0.354492 je večje od q8 in manjše od q9 , zato v novo populacijo dodamo kromosom v9 , itd. Tako je nova populacija sestavljena iz naslednjih kromosomov: v10 = (000100000100111100011000001101001) = v11 v02 = (101010110000110100010000011100101) = v9 v03 = (111100010001011001100100101010101) = v3 v40 = (011111001101001111111011001111111) = v12 v05 = (100011000101100110000111101000000) = v17 v06 = (010001000111001000010010111101010) = v15 v70 = (010101111110100011001100000100010) = v7 2. OSNOVE GENETSKIH ALGORITMOV 22 v08 = (000100000100111100011000001101001) = v11 v90 = (101010110000110100010000011100101) = v9 0 = (110000011011001001100000110001000) = v v10 19 v011 = (101010110000110100010000011100101) = v9 v012 = (010111011010111011011101001010110) = v6 v013 = (001110011101100100110110001011101) = v13 v014 = (000100000100111100011000001101001) = v17 v015 = (100011000101100110000111101000000) = v11 0 = (100010000101111100001000011000110) = v v16 14 v017 = (010011110101110100101100100000111) = v8 v018 = (001110011101100100110110001011101) = v13 v019 = (010111011010111011011101001010110) = v6 0 = (111100001010101000001001101010111) = v v20 1 Sedaj nad to populacijo (vektorji vi0 ) izvedemo križanje z verjetnostjo pc = 0.25, kar pomeni, da lahko pričakujemo, da se bo v povprečju križalo 25% kromosomov, v našem primeru torej 5 kromosomov. To storimo tako: za vsak kromosom v (novi) populaciji tvorimo naključno realno število r iz intervala [0, 1]; če je r < 0.25, izberemo dan kromosom za križanje. Naj bodo tvorjena naslednja naključna števila: 0.415826 0.576977 0.425767 0.866816 0.703928 0.314879 0.547305 0.474972 0.835276 0.267812 0.384001 0.223930 0.232305 0.433631 0.442863 0.549149 0.064320 0.737575 0.981984 0.092007 To pomeni, da so kromosomi v0 10 , v0 12 , v0 17 in v0 20 izbrani za križanje. Če je število izbranih kromosomov liho, enega izpustimo ali pa enega dodatno (seveda naključno) izberemo. Sedaj naključno križamo izbrane kromosome: recimo prva dva (t.j. v0 10 in v0 10 ) in naslednja dva (v0 17 in v0 20 ). Za vsakega od teh parov tvorimo naključno celo število kje iz intervala [1, 32] (33 je dolžina kromosoma). Število kje nam pove mesto križanja v kromosomu. Prvi par kromosomov je v010 = (110000011011001001100000110|001000) 0 = (010111011010111011011101001|010110) v12 2. OSNOVE GENETSKIH ALGORITMOV 23 in mesto križanja kje = 27. Kromosoma križamo v tej točki in ju v populaciji zamenjamo z njunima potomcema v0010 = (110000011011001001100000110|010110) v0012 = (010111011010111011011101001|001000). Drugi par kromosomov je 0 v17 = (01001111|0101110100101100100000111) 0 v20 = (11110000|1010101000001001101010111) in tvorjeno število za mesto križanja kje = 8. Tudi ta dva kromosoma nadomestita njuna potomca: v0017 = (01001111|1010101000001001101010111) v0020 = (11110000|0101110100101100100000111). Trenutno populacijo sestavljajo torej naslednji kromosomi: v01 = (000100000100111100011000001101001) v02 = (101010110000110100010000011100101) v03 = (111100010001011001100100101010101) v04 = (011111001101001111111011001111111) v05 = (100011000101100110000111101000000) v06 = (010001000111001000010010111101010) v07 = (010101111110100011001100000100010) v08 = (000100000100111100011000001101001) v09 = (101010110000110100010000011100101) 00 = (110000011011001001100000110010110) v10 v011 = (101010110000110100010000011100101) v0012 = (010111011010111011011101001001000) v013 = (001110011101100100110110001011101) 0 = (000100000100111100011000001101001) v14 v015 = (100011000101100110000111101000000) v016 = (100010000101111100001000011000110) v0017 = (010011111010101000001001101010111) v018 = (001110011101100100110110001011101) 0 = (010111011010111011011101001010110) v19 2. OSNOVE GENETSKIH ALGORITMOV 24 v0020 = (111100000101110100101100100000111) Naslednja operacija, ki jo izvajamo nad vsakim genom v vseh kromosomih v celotni populaciji, je mutacija. Verjetnost mutiranja pm = 0.01 pomeni, da v povprečju pričakujemo, da bo mutiralo 1% genov. V celotni populaciji je m × velikost pop = 33 × 20 = 660 bitov (genov), od katerih ima vsak enako možnost, da mutira, zato za vsak bit v populaciji tvorimo naključno realno število r iz intervala [0, 1], in če je r < 0.01 potem bit mutiramo. To pomeni, da moramo tvoriti 660 naključnih števil. V našem primeru so bila štiri od teh števil manjša od 0.01, tako so mutirali naslednji štirje geni: Tvorjeno število Številka kromosoma Številka gena 0.007657 7 19 0.003393 10 13 0.009272 12 7 0.000461 15 12 Spodaj je izpisana končna nova populacija, mutirani geni (biti) so krepko izpisani: v1 = (000100000100111100011000001101001) v2 = (101010110000110100010000011100101) v3 = (111100010001011001100100101010101) v4 = (011111001101001111111011001111111) v5 = (100011000101100110000111101000000) v6 = (010001000111001000010010111101010) v7 = (010101111110100011101100000100010) v8 = (000100000100111100011000001101001) v9 = (101010110000110100010000011100101) v10 = (110000011011101001100000110010110) v11 = (101010110000110100010000011100101) v12 = (010111111010111011011101001001000) v13 = (001110011101100100110110001011101) v14 = (000100000100111100011000001101001) v15 = (100011000100100110000111101000000) v16 = (100010000101111100001000011000110) v17 = (010011111010101000001001101010111) 2. OSNOVE GENETSKIH ALGORITMOV 25 v18 = (001110011101100100110110001011101) v19 = (010111011010111011011101001010110) v20 = (111100000101110100101100100000111) Zaključili smo prvo ponavljanje (t.j. prvo generacijo) v while zanki preprostega genetskega algoritma (slika 2.2). Poglejmo, kakšno oceno uspešnosti imajo kromosomi eno generacijo kasneje: oceni(v1 ) = f (−1.980709, 3.756431) = 46.642200 oceni(v2 ) = f (7.690714, 3.513992) = 56.685521 oceni(v3 ) = f (12.067989, 4.145847) = 8.544291 oceni(v4 ) = f (4.801726, 4.851557) = 59.031114 oceni(v5 ) = f (5.771884, 3.238288) = 48.762288 oceni(v6 ) = f (1.277848, 3.592425) = 43.601019 oceni(v7 ) = f (2.494344, 4.377117) = 44.897172 oceni(v8 ) = f (−1.980709, 3.756431) = 46.642200 oceni(v9 ) = f (7.690714, 3.513992) = 56.685521 oceni(v10 ) = f (9.108017, 4.024811) = 45.424202 oceni(v11 ) = f (7.690714, 3.513992) = 56.685521 oceni(v12 ) = f (2.980186, 3.910672) = 42.749931 oceni(v13 ) = f (0.615492, 4.693227) = 47.612314 oceni(v14 ) = f (−1.980709, 3.756431) = 46.642200 oceni(v15 ) = f (5.767977, 3.238288) = 48.101372 oceni(v16 ) = f (5.523225, 3.262092) = 41.241623 oceni(v17 ) = f (1.979022, 3.302194) = 43.313343 oceni(v18 ) = f (0.615492, 4.693227) = 47.612314 oceni(v19 ) = f (2.855185, 3.911526) = 36.893084 oceni(v20 ) = f (12.022762, 4.391094) = 57.624276 Opazimo, da je skupna uspešnost nove generacije U = 925.391516 veliko večja kot skupna uspešnost predhodne populacije, 905.693421. Sedaj lahko ponovimo celoten postopek nad novo populacijo. Po 1000 generacijah dobimo najboljši kromosom best = (111111100001101111111011001100111), katerega ocena uspešnosti 2. OSNOVE GENETSKIH ALGORITMOV 26 je oceni(best2 ) = f (12.881835, 4.850093) = 107.246685. V našem primeru to ni najboljši najden kromosom v celotnem procesu evolucije, saj je najboljši kromosom v 519. generaciji imel oceno uspešnosti 107.418042. 2.6 Primerjava z drugimi tehnikami Za reševanje iskalnih in optimizacijskih problemov je znanih veliko tehnik. Podobno kot genetski algoritmi, te tehnike predpostavljajo, da problem določa funkcija uspešnosti, ki jo moramo maksimizirati. Vse tehnike lahko uporabljamo tudi za minimizacijo, vendar smo že povedali, da lahko brez izgube za splošnost govorimo samo o maksimizaciji. Poglejmo sedaj nekaj drugih tehnik. 2.6.1 Grobo in naključno iskanje Za “divje” funkcije lahko uporabimo naključno ali grobo iskanje. Naključno iskanje točke v preiskovalnem prostoru naključno izbira in vrednoti. Ta metoda se zelo redko samostojno uporablja in je običajno neučinkovita. Grobo iskanje pa se pregledovanja preiskovalnega prostora loti sistematično po nekem predpisu. Slaba lastnost te metode je velika (običajno eksponentna) časovna zahtevnost. 2.6.2 Metode plezanja v hrib Za “lepe” funkcije je bilo razvitih kar nekaj metod, ki temeljijo na naraščanju funkcije, kar vodi smer raziskovanja preiskovalnega prostora. Če ne moremo izračunati odvoda funkcije, pa te metode pogosto ne najdejo dobrih rešitev. Takim metodam rečemo metode plezanja v hrib. Metode so zelo uspešne na funkcijah z enim samim maksimumom (unimodalne funkcije). Na funkcijah z večimi maksimumi (multimodalne funkcije) se soočimo s težavami, da se lahko povzpnemo na prvi najdeni maksimum, ki ni nujno globalni maksimum. Ko enkrat dosežemo lokalni maksimum, ne moremo več najti kakšne boljše točke. Na sliki 2.6 vidimo primer, kjer se iz naključno izbrane začetne točke X, povzpnemo do vrha B. Višjih vrhov A in C ne najdemo. 2. OSNOVE GENETSKIH ALGORITMOV 27 Slika 2.6: Plezanje v hrib 2.6.3 Algoritem ohlajanja Algoritem ohlajanja (angl. simulated annealing) je leta 1982 definiral Kirkpatrick. Gre za spremenjeno metodo plezanja v hrib. Iz naključno izbrane točke preiskovalnega prostora naredimo premik v naključno izbrano smer. Če nas premik privede do višje točke, ga sprejmemo. Če v višjo točko s pomočjo tega premika ne pridemo, ga sprejmemo samo z določeno verjetnostjo p(t), kjer t predstavlja temperaturo. Verjetnost p(t) je v začetku blizu 1, vendar s časom pada proti ničli – od tod analogija z ohlajanjem trdnega telesa. V začetku sprejmemo skoraj vsak premik, vendar se z nižanjem “temperature” niža tudi verjetnost, da sprejmemo neugodni premik. Neugodni premiki so pomembni, kadar želimo “uiti” lokalnemu maksimumu, je pa očitno, da nas preveč takšnih premikov privede proč od maksimuma. Podobno kot pri naključnem iskanju algoritem ohlajanja preverja eno možno rešitev naenkrat, ter tako ne daje kakšne splošne slike o preiskovalnem prostoru. Ne shranjujemo niti nobenih informacij o predhodnih premikih, da bi se s pomočjo le-teh odločali o nadalnjih izbirah. Pregled in primerjavo tehnik bomo zaključili z duhovitim opisom, ki ga je 1. septembra 1993, na Internetu v članku Kenguruji v novičarski skupini comp.ai.neuralnets objavil W. Sarle. Ta del članka nam poda lepo primerjavo med plezanjem v hrib, ohlajanjem in genetskimi algoritmi: 2. OSNOVE GENETSKIH ALGORITMOV “Opazimo, da lahko v vseh metodah plezanja v hrib, ki smo jih do sedaj opisali, kenguru upa, da bo našel vrh gore blizu točke, kjer je začel. Ni nobenega zagotovila, da bo ta gora Everest, ali sploh visoka gora. Da bi našli globalni optimum, se poskušajo uporabljati različne metode. Pri ohlajanju je kenguru pijan in zelo dolgo skače naokoli. Vendar se počasi strezni in teži k temu, da bi priskakal do vrha. V genetskih algoritmih imamo veliko kengurujev, ki jih s padali naključno spustimo v Himalajo (če se pilot ni izgubil). Ti kenguruji ne vedo, da bi naj iskali vrh Mt. Everesta. Kakorkoli, vsakih nekaj let postrelimo kenguruje v nižinah in upamo, da bodo preostali plodni in se razmnožili.” 28 3 Matematično ozadje genetskih algoritmov Genetski algoritmi so preprosti, saj so zasnovani na elementarnih operacijah nad nizi, ki nam predstavljajo možne rešitve problema. Iz empiričnih razlogov vemo, da evolucijsko razvijanje rešitev, kakršnega poznamo iz GA, vodi do zelo dobrih rešitev. V tem poglavju si bomo ogledali, kako delovanje genetskih algoritmov podpira teorija. 3.1 Sheme Za teoretično utemeljevanje GA bomo definirali sheme. Naj bodo rešitve problema kodirane z nizi dolžine l nad neko abecedo A. Shemo vpeljemo z uvedbo ?, t.i. nadomestnega simbola. Tako iz abecede A dobimo razširjeno abecedo A+ = A∪{?}. Znak ? predstavlja katerikoli znak iz abecede A. Sheme definiramo kot nize dolžine l nad abecedo A+ . Shema predstavlja vse nize, ki se z njo ujemajo na vseh mestih različnih od ?. Na primer, poglejmo binarne nize in sheme dolžine 5. Potem shemi (? 0 1 0 0) ustrezata natanko dva niza: (00100), (10100), shema (? 0 1 ? 0) pa predstavlja štiri nize: (00100), (00110), (10100), (10110). 29 3. MATEMATIČNO OZADJE GENETSKIH ALGORITMOV 30 Seveda shema (1 0 1 1 0) predstavlja natanko en niz: (10110), shema (? ? ? ? ?) pa je predstavnica vseh nizov dolžine 5. Očitno je, da vsaka shema predstavlja 2n nizov, kjer je n število simbolov ? v shemi. Za nize dolžine l (v mislih imamo binarne nize), obstaja 3l različnih shem, saj za vsak lokus obstajajo trije možni aleli: (0, 1, ?). Po drugi strani je vsak niz dolžine l predstavnik 2l shem. V populaciji velikosti n in z nizi dolžine l lahko torej prikažemo med 2l in n2l shem. Različne sheme imajo različne lastnosti. Opazili smo že, da število nadomestnih simbolov v shemi določa število nizov, ki tej shemi pripadajo. Uvedimo še dve pomembni lastnosti shem. Red sheme S nam poda število fiksnih znakov, t.j. od ? različnih znakov, v shemi S. Označimo ga z o(S). Tako za shemo S1 = (? 0 1 0 0) velja o(S1 ) = 4, za S2 = (? 0 1 ? ?) pa o(S2 ) = 2. Red sheme je pomemben, ko računamo možnosti preživetja sheme po mutaciji. Aktivna dolžina sheme S je razdalja med prvim in zadnjim fiksnim mestom v shemi, označimo jo z δ(S). Če pogledamo prejšnja primera: δ(S1 ) = 3 in δ(S2 ) = 1. Aktivna dolžina sheme je pomembna pri računanju preživetja sheme pri križanju. 3.2 Osnovni izrek o genetskih algoritmih Poglejmo, kako selekcija in razmnoževanje vplivata na število predstavnikov sheme v populaciji. Imamo neko določeno shemo S. Označimo z ξ(S, t) število predstavnikov, ki v času t (čas merimo v generacijah) pripadajo shemi S. Definirajmo še eno lastnost sheme S. Uspešnost sheme S (angl. schema fitness) v času t je povprečna uspešnost vseh nizov v populaciji, ki jih shema S predstavlja. Označimo jo z oceni(S, t). Recimo, da p nizov {vi1 , vi2 , . . . , vip } v populaciji ustreza shemi S v času t. Potem je oceni(S, t) = p X oceni(vij ) j=1 p . V fazi selekcije ustvarimo vmesno populacijo, kjer vsak kromosom kopiramo ničkrat, enkrat ali večkrat, odvisno od njegove uspešnosti. Kot je bilo rečeno v 3. MATEMATIČNO OZADJE GENETSKIH ALGORITMOV 31 prejšnjem poglavju, je verjetnost, da bo kromosom vi izbran za razmnoževanje, enaka pi = oceni(vi )/U (t) (U (t) je skupna uspešnost celotne populacije v času t). Po fazi selekcije pričakujemo, da bo ξ(S, t + 1) nizov ustrezalo shemi S. Ker je (1) za povprečen niz, ki pripada shemi S, verjetnost selekcije enaka oceni(S, t)/U (t), (2) število nizov, ki jih shema S predstavlja, enako ξ(S, t) in (3) število selekcij enako velikost pop, je očitno, da je ξ(S, t + 1) = ξ(S, t) · velikost pop · oceni(S, t) . U (t) Upoštevamo, da je povprečna uspešnost populacije U (t) = U (t)/velikost pop in zgornjo formulo pretvorimo v ξ(S, t + 1) = ξ(S, t) · oceni(S, t) U (t) . (3.1) Formulo (3.1) imenujemo formula rasti sheme po razmnoževanju. Z drugimi besedami, število nizov v populaciji raste v razmerju uspešnosti sheme s povprečno uspešnostjo populacije. To pomeni, da nadpovprečne sheme dobijo v naslednji generaciji večje število predstavnikov, slabše manjše število, predstavnikov povprečnih shem pa ostane enako število. Predpostavimo, da je shema S v naslednji generaciji % nad povprečjem (t.j. oceni(S, t) = U (t) + · U (t)). Potem je ξ(S, t) = ξ(S, 0)(1 + )t , in = (oceni(S, t) − U (t))/U (t) ( > 0 za nadpovprečne sheme in < 0 za podpovprečne sheme). Ne le, da nadpovprečne sheme dobijo povečano število predstavnikov, ampak število le-teh raste eksponentno, kot eksponentno pada število podpovprečnih shem. Selekcija sama ne doda za pregled novih točk (možnih rešitev) preiskovalnega prostora, ampak samo kopira stare v vmesno populacijo. Za raziskovanje novih točk je odgovorna naslednja faza v genetskem algoritmu - razmnoževanje, pri čemer uporabljamo dve operaciji: križanje in mutacijo. Shema S preživi križanje, če je vsaj eden od potomcev njen predstavnik. Verjetnost, da shema S preživi križanje, je odvisna od aktivne dolžine sheme δ(S), saj 3. MATEMATIČNO OZADJE GENETSKIH ALGORITMOV 32 križanje shemo uniči, kadar je mesto križanja med prvim in zadnjim fiksnim mestom v kromosomu. V splošnem primeru izberemo mesto križanja v enem izmed m − 1 možnih mest. Torej je verjetnost uničenja sheme pd (S) = δ(S) , m−1 in zato verjetnost preživetja sheme ps (S) = 1 − δ(S) . m−1 Pomembno se je zavedati, da operator križanja z verjetnostjo pc izvajamo samo nad nekaterimi kromosomi. Kar pomeni, da je verjetnost preživetja sheme v resnici ps (S) = 1 − pc · δ(S) . m−1 Zgodi se lahko tudi, da shema S preživi križanje tudi, če je mesto križanja med prvim in zadnjim fiksnim mestom v kromosomu (npr. če sta oba starša predstavnika iste sheme). Zato formulo preživetja sheme pri križanju zapišimo kot: ps (S) ≥ 1 − pc · δ(S) . m−1 Z upoštevanjem sprememb pri križanju in prejšnjih ugotovitev iz faze selekcije, lahko formulo rasti sheme v razmnoževanju izpopolnimo: ξ(S, t) · oceni(S, t) δ(S) ξ(S, t + 1) ≥ (3.2) 1 − pc · . m−1 U (t) Formula (3.2) nam pove, da je pričakovano število kromosomov, ki pripadajo shemi S v naslednji generaciji, funkcija števila kromosomov, ki pripadajo shemi v tej generaciji, relativne uspešnosti sheme in njene aktivne dolžine. Število kromosomov nadpovprečne sheme še vedno raste eksponentno. Druga operacija, ki jo v fazi razmnoževanja izvajamo, je mutacija. Operator mutacije z verjetnostjo pm naključno spremeni določen gen v kromosomu. Sprememba pomeni, da se vrednost premeni iz ‘0’ v ‘1’ in obratno. Če želimo, da shema preživi mutacijo, je očitno, da morajo vsa fiksna mesta (število fiksnih mest sheme S smo označili z o(S)) v shemi ostati nespremenjena. Ker je verjetnost spremembe gena 3. MATEMATIČNO OZADJE GENETSKIH ALGORITMOV 33 enaka pm , je verjetnost preživetja gena enaka 1 − pm . Mutacije genov so med seboj neodvisne, tako je verjetnost, da shema S preživi mutacijo enaka psm (S) = (1 − pm )o(S) . Ker je pm 1, lahko to verjetnost zapišemo s približkom: psm (S) ≈ 1 − o(S) · pm . Združeni učinki selekcije, križanja in mutacije, nam dajo novo obliko formule rasti sheme v razmnoževanju: ξ(S, t + 1) ≥ ξ(S, t) · oceni(S, t) h U (t) i δ(S) ih 1 − pc · 1 − o(S) · pm . m−1 (3.3) Formula (3.3) nam (podobno kot 3.1 in 3.2) pove, da je pričakovano število kromosomov, ki pripadajo shemi S v naslednji generaciji, funkcija števila kromosomov, ki pripadajo shemi, relativne uspešnosti sheme in njene aktivne dolžine ter njenega reda. Znova je očitno, da število kromosomov nadpovprečne sheme s kratko aktivno dolžino in majhnega reda raste eksponentno. Formula (3.3) je osnovana na predpostavki, da je funkcija uspešnosti f pozitivna na celotnem definicijskem območju. Tako dobimo izrek o shemah ali osnovni izrek o genetskih algoritmih: Izrek 1 (Izrek o shemah) Z genetskim algoritmom se v evolucijskem procesu z generacijami eksponentno povečuje število primerkov nadpovprečno uspešnih (in pada število primerkov podpovprečno uspešnih) shem s kratko aktivno dolžino in nizkega reda. Izrek velja za model enostavnega genetskega algoritma, kakršnega smo obravnavali v predhodnih poglavjih. Izrek o shemah pojasnjuje delovanje genetskih algoritmov. Namesto neposrednega generiranja rešitev GA z odkrivanjem in kombiniranjem predstavnikov uspešnih shem postopoma sestavljajo čedalje boljše rešitve. Pri tem igrajo posebno vlogo nadpovprečne sheme kratke aktivne dolžine in nizkega reda. Takim shemam pravimo gradniki ([1]). 3. MATEMATIČNO OZADJE GENETSKIH ALGORITMOV 34 Hipoteza 1 (Hipoteza o gradnikih) Genetski algoritem raziskuje rešitve blizu optimuma, tako da preiskuje, združuje in znova preiskuje nadpovprečno uspešne sheme s kratko aktivno dolžino in nizkega reda. Čeprav je bil dokaz te hipoteze tema mnogih raziskav, se lahko pri netrivialnih problemih sklicujemo zgolj na empirične rezultate. V zadnjih petnajstih letih je bilo na različnih področjih razvitih mnogo genetskih algoritmov, ki so hipotezo o gradnikih potrdili. Hipoteza nam pove, da je izbor kodiranja rešitev v genetskem algoritmu kjučnega pomena, saj mora zadoščati ideji kratkih gradnikov. Rekli smo, da lahko v populaciji velikosti velikost pop kromosomov dolžine m genetski algoritem obdela vsaj 2m in največ velikost pop · 2m shem. Nekaj od teh shem je obdelanih v koristnem smislu (pripomorejo k iskanju optimalne rešitve): to so sheme, katerih število predstavnikov v populaciji eksponentno raste in jih križanje in mutacija ne “pokvarita”. Takim shemam pravimo koristne sheme. Obdelovanje shem v genetskih algoritmih je analiziral že Holland leta 1975. Izpeljal je oceno števila koristnih shem. Po tej oceni nastopa pri obravnavanju n nizov O(n3 ) takšnih shem1 . To lastnost genetskih algoritmov je Holland poimenoval implicitni paralelizem, saj jo dobimo brez dodatne uporabe spomina ali dodatnega obdelovanja. Zanimivo je opomniti, da je v populaciji velikosti velikost pop predstavljenih mnogo več shem od velikost pop. 1 Pred kratkim je bilo pokazano, da ocena O(n3 ) velja le v določenih primerih, ko je velikost pop sorazmerna z 2l . 4 Neodvisnostno število grafa 4.1 Osnovni pojmi iz teorije grafov Graf G predstavlja neprazna množica elementov, ki jih imenujemo točke grafa, in seznam (neurejenih) parov elementov, ki jih imenujemo povezave grafa. Množico točk grafa označimo z V (G), seznam povezav pa z E(G). Če sta v in w točki grafa G, potem za povezavi vw ali wv rečemo, da povezujeta točki v in w. Imejmo graf G z množico točk V (G) in seznamom povezav E(G) ter graf G0 z množico točk V 0 in seznamom povezav E 0 . Če je V 0 podmnožica množice V (G) in če je vsaka povezava iz seznama E 0 tudi v seznamu povezav E(G), potem je G0 podgraf grafa G. Naj bosta v in w točki grafa G. Če sta v in w povezani s povezavo, rečemo, da sta točki v in w sosednji ali krajišči povezave vw. Naj bo G graf z n točkami, označenimi z 1, 2, 3, . . . , n. Matrika sosednosti M (G) je matrika razsežnosti n×n, v kateri element v j-tem stolpcu i-te vrstice pove število povezav, ki povezujejo točki i in j. Povezave, ki povezujejo isti par točk, imenujemo večkratne povezave. Povezava, ki povezuje neko točko s seboj, je zanka. Enostavni graf je graf brez zank in večkratnih povezav. Matrika sosednosti za enostavni graf je binarna matrika, v kateri je element v j-tem stoplcu i-te vrstice enak 1, če sta točki i in j povezani, sicer je enak 0. Naj bo G enostavni graf. Komplement G grafa G je graf z množico točk V (G), v katerem sta poljubni točki povezani natanko tedaj, ko v grafu G nista. Polni graf je graf, v katerem je vsak par različnih točk povezan z natanko eno 35 4. NEODVISNOSTNO ŠTEVILO GRAFA 36 povezavo. Poln graf na n točkah označimo s Kn . Polni podgraf imenujemo tudi klika. Velikost največje klike oz. velikost polnega podgrafa grafa G označimo z ω(G). Množico točk, v kateri noben par točk ni soseden, imenujemo neodvisna množica točk, neodvisna množica točk največje velikosti pa je največja neodvisna množica. Moč največje neodvisne množice imenujemo neodvisnostno število grafa G in ga označimo z α(G). Neodvisnostno število in velikost največje klike sta tesno povezani. Očitno namreč velja α(G) = ω(G). 4.2 Genetski pristop za iskanje največje neodvisne množice Problema določitve neodvisnostnega števila in velikosti največje klike sta NP-težka. V [2] so avtorji predstavili genetski algoritem za reševanje problema neodvisnostnega števila grafa. 4.2.1 Genetski algoritem V genetskem algoritmu, uporabljenem za reševanje problema neodvisnostnega števila, predstavlja P (t) populacijo v generaciji t. Populacija je konstantne velikosti velikost pop, kar pomeni, da vedno obstaja velikost pop kromosomov. Rešitev, ki jo kromosom β predstavlja, razumemo kot neodvisno množico, ki jo iz β izpeljemo. Če se vrednost najboljšega kromosoma po Tstop generacijah ne izboljša, prenehamo z izvajanjem algoritma. Na sliki 4.1 je predstavljen algoritem, ki smo ga uporabili za iskanje neodvisnostnega števila grafa. V inicializaciji se velikost pop kromosomom priredijo naključno izbrane vrednosti genov. Ocenjevanje izračuna vrednost uspešnosti vseh kromosomov v populaciji. Izbor je faza selekcije, kjer se s pomočjo rulete izberejo novi osebki populacije, ki jih v fazi razmnoževanja med sabo križamo in potomce z določeno verjetnostjo tudi mutiramo. 4. NEODVISNOSTNO ŠTEVILO GRAFA 37 PROCEDURE GenetskiAlgoritem; BEGIN inicializiraj P(0); najboljši := 0; števec := 0; t := 0; WHILE števec < Tstop DO BEGIN oceni kromosome v P(t); rešitev := najboljši kromosom v P(t); IF (rešitev > najboljši) THEN BEGIN števec := 0; najboljši := rešitev; END; števec := števec + 1; izberi P(t+1) iz P(t); razmnoževanje izbranih; t := t + 1; END; END. Slika 4.1: Genetski algoritem za iskanje neodvisnostnega števila 4.2.2 Kodiranje in dekodiranje rešitev V [2] so avtorji predlagali za kodiranje rešitev naslednjo metodo. Metoda kodira možno rešitev kot permutacijo objektov in jo s požrešnim algoritmom dekodira. Glede na to, da so objekti v danem problemu točke grafa G(V, E), je kromosom permutacija n točk, kjer je n = |V (G)|. Požrešno dekodiranje določi vse točke v kromosomu, ki pripadajo skupni neodvisni množici, v vrstnem redu, kot se pojavijo v permutaciji. Označimo permutacijo β velikosti n kot β = (β(1), β(2), . . . , β(n)), kjer je vsak β(k), 1 ≤ k ≤ n, točka iz V (G). Ker podan kromosom opisuje vrstni red točk, ki bi lahko bile v neodvisni množici, algoritem dekodiranja uporablja sosednost že pregledanih točk z ostalimi, tako da 4. NEODVISNOSTNO ŠTEVILO GRAFA 38 izključi tiste, ki v neodvisni množici ne morejo biti. Algoritem dekodiranja je predstavljen na sliki 4.2 in vrne število točk v neodvisni množici, ki jo izpeljemo iz kromosoma β. Če na koncu dekodiranja velja vrednost[v] = 1, potem točka v pripada neodvisni množici, sicer pa ne. Množica sosednje[v] vsebuje vse točke, ki so sosednje z v. Ni težko preveriti, da je neodvisna množica, izpeljana iz permutacije na tak način, vedno maksimalna. Dokažemo lahko tudi, da za vsako maksimalno neodvisno množico obstaja permutacija, iz katere algoritem to množico izpelje . FUNCTION Dekodiraj(β); BEGIN FOR (∀v ∈ V ) DO vrednost[v] := 1; števec := 1; FOR i := 1 TO n DO BEGIN v := β(i); IF (vrednost[v] = 1) THEN BEGIN števec := števec + 1; FOR (∀u ∈ sosednje[v]) DO vrednost[u] := 0; END; END; RETURN števec; END. Slika 4.2: Funkcijski algoritem za dekodiranje kromosoma Po končanem dekodiranju je informacija o neodvisni množici, izpeljani iz kromosoma β, shranjena v nizu vrednost. Glede na to informacijo je možno preurediti točke v β tako, kot kaže funkcijski algoritem na sliki 4.3. Najprej postavimo točke, ki pripadajo neodvisni množici, na začetek preurejenega kromosoma, v vrstnem redu, kot se pojavijo v originalu β. Nato preostala mesta permutacije zapolnimo s točkami, ki niso v neodvisni množici. V funkcijo dekodiranja 4. NEODVISNOSTNO ŠTEVILO GRAFA 39 na konec dodamo vrstico: β := Preuredi(β, vrednost); Intuitivno lahko pričakujemo, da bo preurejanje kromosomov pripomoglo k uspešnenjšemu delovanju algoritma. V naši implementaciji je verjetnost preurejanja pr = 0.9. Na preurejanje lahko gledamo, tudi kot na dodatno mutiranje. FUNCTION Preuredi(β, vrednost); BEGIN j := 1; FOR i := 1 TO n DO IF (vrednost[i] = 1) THEN BEGIN γ[j] := β[i]; j := j + 1; END; FOR i := 1 TO n DO IF (vrednost[i] = 0) THEN BEGIN γ[j] := β[i]; j := j + 1; END; RETURN γ; END. Slika 4.3: Funkcijski algoritem za preurejanje kromosoma 4.3 Funkcija uspešnosti Funkcija uspešnosti je definirana1 kot: f (β) = eDekodiraj(β)−Dmin +1 , 1 V [2] so avtorji kot funkcijo uspešnosti v implementaciji programa uporabili funkcijo g(β) = 2 2 Dekodiraj(β) − Dmin + 1. 4. NEODVISNOSTNO ŠTEVILO GRAFA 40 kjer je Dekodiraj(β) enako številu točk v neodvisni množici izpeljani iz kromosoma β in Dmin najmanjša vrednost Dekodiraj(γ) med vsemi kromosomi γ iz generacije t. Eksponentno funkcijo smo izbrali za to, da dobijo bolj uspešni kromosomi večjo možnost, da bodo izbrani za razmnoževanje, saj je razlika Dekodiraj(β) − Dmin + 1 v večini primerov zelo majhna. 4.4 Operaciji križanja in mutacije Za operacijo križanja smo uporabili več različnih tipov križanja permutacij. Izvedli smo običajno in spremenjeno križanje z delno preslikavo (angl. partially mapped crossover - PMX), križanje položajev (angl. order crossover - OX) ter krožno križanje (angl. cycle crossover - CX). 4.4.1 Križanje z delno preslikavo Običajno križanje z delno preslikavo zgradi potomca tako, da izbere del permutacije enega starša ter pri kolikor točkah je možno ohrani vrstni red in mesto točk drugega starša. Del permutacije se izbere tako, da naključno določimo dve točki križanja, ki služita kot meji za zamenjavo. Poglejmo si to na primeru. Starša (točki križanja sta označeni z ‘| ’) s1 = (1 2 3 | 4 5 6 7 | 8 9) in s2 = (4 5 2 | 1 8 7 6 | 9 3) tvorita potomca na naslednji način. Najprej se dela kromosomov med točkama križanja zamenjata (znak ‘x’ naj predstavlja trenutno še neznano vrednost): p1 = (x x x | 1 8 7 6 | x x) in p2 = (x x x | 4 5 6 7 | x x). Zamenjava definira naslednje preslikave: 1 ↔ 4, 8 ↔ 5, 7 → 6 in 6 ← 7. Tiste vrednosti, ki v zgornjih preslikavah ne nastopajo (2, 3 in 8), ostanejo v potomcih na svojih mestih: p1 = (x 2 3 | 1 8 7 6 | x 9) in p2 = (x x 2 | 4 5 6 7 | 9 3). 4. NEODVISNOSTNO ŠTEVILO GRAFA 41 Sedaj bi moral biti prvi x v potomcu p1 enak 1, vendar je 1 že zastopana v permutaciji, zato 1 preslikamo, kot nam pove preslikava: 1 ↔ 4. Podobno nadomestimo drugi x v potomcu p1 s 5, nedopolnjeni mesti v potomcu p2 sta (po enakem postopku) 1 in 8, v tem vrstnem redu. Tako sta potomca enaka: p1 = (4 2 3 | 1 8 7 6 | 5 9) in p2 = (1 8 2 | 4 5 6 7 | 9 3). Spremenjeno križanje z delno preslikavo, ki je bilo uporabljeno v našem primeru, deluje tako, da se določita točki križanja in se nato v celoti določi preslikava, ki jo geni med točkama križanja določajo. Tako bi v prejšnjem primeru, če bi dodali preslikave, ki jih določajo prve tri točke (1 ↔ 4, 8 ↔ 5, 7 ↔ 6) dobili kot preslikavo naslednjo permutacijo: 1 2 3 4 5 6 7 8 9 π= . 4 2 3 1 8 7 6 5 9 Vendar moramo dodati še eno preslikavo in sicer 1 2 3 4 5 6 7 8 π= 4 2 3 1 8 6 7 5 7 ↔ 6. Tako dobimo: 9 . 9 Sedaj, ko imamo preslikavo definirano, preslikamo vse točke v obeh starših, kot določa preslikava. Tako po spremenjenem križanju z delno preslikavo na koncu dobimo potomca: p1 = (4 2 3 | 1 8 6 7 | 5 9) in p2 = (1 8 2 | 4 5 7 6 | 9 3). Razlika med obema operatorjema je v tem, da ni nujno, da se izbrani podsekvenci v starših izmenjata, kot demonstrira prejšnji primer. Križanje z delno preslikavo smo spremenili zato, ker so avtorji v [2] svoje rezultate dosegli s spremenjenim križanjem z delno preslikavo. V [2] ni podano, kako so avtorji PMX križanje spremenili, zato smo se mi odločili za prej opisano različico spremenjenega PMX križanja. S to vrsto križanja smo dosegli zanimive rezultate, ki so podani v tabeli 4.1. 4. NEODVISNOSTNO ŠTEVILO GRAFA 4.4.2 42 Križanje položajev S pomočjo tega tipa operatorja za križanje ustvarimo potomca tako, da izberemo zaporedje točk iz prvega starša ter ohranimo relativni položaj ostalih točk v drugem staršu. Poglejmo, katera potomca bi dobili s tem operatorjem na že znanem primeru. Starša (točki križanja sta označeni z ‘| ’) s1 = (1 2 3 | 4 5 6 7 | 8 9) in s2 = (4 5 2 | 1 8 7 6 | 9 3) tvorita potomca na naslednji način. Najprej se dela kromosomov med točkama križanja skopirata v potomca: p1 = (x x x | 4 5 6 7 | x x). p2 = (x x x | 1 8 7 6 | x x) in Nato začenši v drugi točki križanja enega starša, skopiramo točke drugega starša v vrstnem redu, kot se pojavijo, a pri tem izpustimo točke, ki so že v potomcu. Ko dosežemo konec kromosoma, nadaljujemo na njegovem prvem mestu. Vrstni red točk v drugem staršu (od druge točke križanja dalje) je 9 − 3 − 4 − 5 − 2 − 1 − 8 − 7 − 6; ko odstranimo točke 4, 5, 6 in 7, ki so že v potomcu, dobimo 9 − 3 − 2 − 1 − 8. Te točke vstavimo v prvega potomca (začenši po drugi točki križanja): p1 = (2 1 8 | 4 5 6 7 | 9 3). Podobno dobimo drugega potomca: p2 = (3 4 5 | 1 8 7 6 | 9 2). Križanje položajev izkorišča lastnost kromosomov, da so pomembni položaji točk (t.j. vrstni red točk), saj v dekodiranju neodvisno množico iščemo zaporedno po točkah, kot se pojavijo. 4.4.3 Krožno križanje Krožno križanje gradi potomca tako, da položaj vsake točke v potomcu ustreza položaju te točke v enem od staršev. Na primeru poglejmo, kako krožno križanje deluje. Starša 4. NEODVISNOSTNO ŠTEVILO GRAFA 43 s1 = (1 2 3 4 5 6 7 8 9) in s2 = (4 1 2 8 7 6 9 3 5) bi dala enega od potomcev tako, da vzamemo prvo mesto prvega starša: p1 = (1 x x x x x x x x). Glede na to, da bi morala biti vsaka točka (in njen položaj) vzeta iz enega od staršev, sedaj nimamo izbire: naslednja točka, ki pride v poštev je točka 4, saj je točka 4 v staršu p2 na istem mestu kot v staršu p1 izbrana točka 1. V p1 je ta točka na mestu številka ‘4’, zato je p1 = (1 x x 4 x x x x x). To nam poda točko 8, saj je 8 v p2 istoležna 4 v p1 . Tako dobimo p1 = (1 x x 4 x x x 8 x); Če sledimo temu pravilu, sta naslednji točki, ki ju vstavimo v potomca 3 in 2. Sedaj pa nam izbira točke 2 nakaže, da moramo izbrati točko 1, ki pa je že v potomcu tako smo sklenili krog p1 = (1 2 3 4 x x x 8 x). Preostale točke dopolnimo iz drugega starša: p1 = (1 2 3 4 7 6 9 8 5). Podobno dobimo p2 = (4 1 2 8 5 6 7 3 9). Krožno križanje ohranja absolutni položaj točk glede na kromosoma staršev. 4.4.4 Operacija mutacije Uporabljena je običajna oblika mutacije, pri kateri želimo ohranjati permutacije. Razen mesta gena, ki mutira, naključno določimo še en gen v kromosomu, in njuni vrednosti zamenjamo. Na ta način kromosomi ohranijo lastnost permutacije. K mutaciji pripomore tudi, kot že omenjeno, preurejanje kromosoma, če le-to izvedemo z verjetnostjo pr < 1. 4. NEODVISNOSTNO ŠTEVILO GRAFA 4.5 44 Elitna strategija Elitna strategija je oblika genetskega algoritma, kjer je spremenjen postopek določanja osebkov nove generacije. Z uporabo elitne strategije določimo osebke za novo generacijo tako, da s pomočjo selekcije, križanja in mutacije po običajnem postopku ustvarimo vmesno populacijo in jo ocenimo. Stare populacije ne nadomestimo z na novo dobljeno populacijo, temveč iz obeh populacij izberemo velikost pop kromosomov z največjo uspešnostjo. Ti izbrani kromosomi so osebki v novi generaciji. Eksperimentalni rezultati kažejo, da s pomočjo elitne strategije, genetski algoritem hitreje konvergira k optimalni rešitvi. Na sliki 4.4 je predstavljen genetski algoritem z elitno strategijo. PROCEDURE GenetskiAlgoritem; BEGIN inicializiraj P(0); najboljši := 0; števec := 0; t := 0; WHILE števec < Tstop DO BEGIN oceni kromosome v P(t); rešitev := najboljši kromosom v P(t); IF (rešitev > najboljši) THEN BEGIN števec := 0; najboljši := rešitev; END; števec := števec + 1; izberi P(t+1) iz P(t); razmnoževanje izbranih; P(t+1) := elitni izbor nad P(t) in P(t+1); t := t + 1; END; END. Slika 4.4: Genetski algoritem z elitno strategijo 4. NEODVISNOSTNO ŠTEVILO GRAFA 4.6 45 Eksperimentalni rezultati Opisani algoritem je implementiran v programskem okolju Borland Delphi 4 (objektni Pascal). Program smo poganjali na osebnem računalniku s procesorjem Intel Celeron 433 MHz s 64 MB delovnega pomnilnika. 4.6.1 DIMACS testni grafi DIMACS testni grafi so bili predstavljeni v drugem implementacijskem izzivu leta 1993 na NSF centru za znanost in tehnologijo. Namenjeni so za testiranje učinkovitosti programov oziroma algoritmov za različne probleme diskretne optimizacije: teorija kodiranja, barvanje grafov, geometrija in diagnosticiranje napak. Grafov za testiranje učinkovitosti iskanja največje neodvisne množice med DIMACS grafi sicer ni, so pa testni grafi za iskanje največje klike. Ker neodvisnostno število grafa ustreza velikosti največje klike njegovega komplementa, lahko te grafe seveda enostavno uporabimo za naš namen. Testni grafi so sestavljeni iz naključnih grafov z znanimi velikostmi največjih klik. Na voljo je devet različnih razredov grafov, ki skupaj vsebujejo 66 grafov velikosti od 28 do 3.361 točk in z do 5.506.380 povezav. 4.6.2 Vrednosti uporabljenih parametrov Pred testiranjem programa je bilo potrebno določiti ustrezne parametre. Na začetku smo določili parametra velikost pop = 30 in Tstop = 1000, kar pomeni, da algoritem preneha z iskanjem boljše rešitve, če po 1000 generacijah ne pride do izboljšave. Verjetnosti za križanje, mutacijo in preurejanje so pc = 0.8, pm = 0.08 in pr = 0.9. Testiranje je bilo izvedeno z vsemi tremi vrstami križanja, kot so opisane v razdelku 4.4. Rezultate smo primerjali z rezultati podanimi v [2], kjer so bili uporabljeni drugačni parametri (npr. velikost pop = 50 in Tstop = 50). V članku tudi ni podrobno opisano, kateri operator križanja je bil uporabljen, omenjeno je le, da je uporabljeno prirejeno križanje z delno preslikavo, na kakšen način so avtorji to vrsto križanja priredili, pa ni opisano. 4. NEODVISNOSTNO ŠTEVILO GRAFA 4.6.3 46 Rezultati Rezultate testiranja smo primerjali z rezultati iz [2]. Naš algoritem je bil zelo uspešen v večini primerov. Od 66 testnih grafov je bila najdena največja neodvisna množica ali pa dosežena znana spodnja meja kar v 54 grafih. Pri 21 grafih so bili doseženi tudi boljši rezultati, kot z metodo opisano v [2]. Najboljše rezultate, v primerjavi z metodo iz članka, smo dosegli pri skupini grafov brock-xxx-y, saj smo pri vseh grafih iz te skupine, razen pri grafu brock-800-4, vsaj z eno vrsto križanja našli večjo neodvisno množico. Boljši rezultat od našega so avtorji iz [2] dosegli le pri enem grafu in sicer pri p-hat1500-3. Tako kot v [2] smo pri dveh grafih (p-hat1000-3 in p-hat1500-2) presegli spodnjo mejo, ki je bila podana DIMACSovih podatkih. V implementaciji programa je bila uporabljena tudi elitna strategija. Kot smo že povedali, elitna strategija spremeni postopek določanja nove generacije, saj s selekcijo, križanjem in mutacijo po običajnem postopku določimo novo generacijo, vendar z njo ne nadomestimo stare generacije. Osebke nove generacije dobimo tako, da iz obeh generacij izberemo velikost pop kromosomov z najboljšimi uspešnosti. Rezultate, boljše od zapisanih v tabelah 4.1 in 4.2, smo dosegli z običajnim PMX križanjem, če smo uporabili še elitno strategijo, je to označeno z dodatnim znakom ‘e’. Izboljšani rezultati so prikazani v tabeli 4.3. Rezultati testiranja so zapisani v tabelah 4.1 in 4.2. V stolpcu naša metoda so poudarjeno označeni rezultati, pri katerih je bila najdena ali presežena največja neodvisna množica. Če je z metodo dosežena znana spodnja meja velikosti največje neodvisne množice za graf, je ob rezultatu izpisan znak ‘=’. Znak • pri rezultatih pa pomeni, da je najdena največja neodvisna množica večja od množice, ki so jo s svojo implementacijo algoritma dosegli v [2]. Tudi naš algoritem je v grafih p-hat1000-3 in p-hat-1500-2 presegel znani spodnji meji (tabela 4.3). Program je pri velikih grafih časovno zelo požrešen, saj že sam proces dekodiranja enega vektorja traja več sekund. V skupinah grafov c-fatxxx-y in johnsonxx-y-z je bila spodnja meja neodvisnostnega števila dosežena že v inicializacijski populaciji (čas od 0 do 50 milisekund). V tabeli 4.4 so za posamezne družine grafov zapisani časi trajanja procesa evolucije do najboljšega najdenega kromosoma za PMX križanje brez in z uporabo elitne strategije (PMXe). 4. NEODVISNOSTNO ŠTEVILO GRAFA 4.6.4 47 Računalniški program Program teče v operacijskih sistemih MS Windows. V oknu, ki se nam odpre po zagonu programa, moramo najprej naložiti graf, ki je shranjen v tekstovni datoteki tipa .mts. V datoteki so podani naslednji podatki: 1. vrstica: število točk v grafu 2. vrstica: spodnja znana meja neodvisnostnega števila 3. vrstica: od te vrstice dalje je shranjena spodnje trikotna matrika sosednosti za komplement grafa2 , za katerega iščemo neodvisnostno množico. V programskem oknu lahko izbiramo tip križanja, pri čemer so na voljo vse štiri oblike križanja (običajno in spremenjeno križanje z delno preslikavo, krožno križanje in križanje položajev). Program preneha s procesom evolucije, ko doseže znano spodnjo mejo neodvisnostnega števila, če imamo izbrano to opcijo v pogovornem oknu, sicer proces evolucije poteka, dokler določeno število generacij (število se lahko v programu določi) ni bilo izboljšave. Izberemo lahko tudi, kolikokrat naj program izvede proces evolucije, kar je primerno za testiranje programa. Izberemo lahko tudi, ali želimo uporabiti elitno strategijo ali ne. Med iskanjem evolucije se na ekran izpisuje največje neodvisnostno število v generaciji, zaporedna številka najboljšega kromosoma ter največja najdena neodvisna množica. Ko program neha z iskanjem neodvisnostnega števila, se izpiše čas, ki je pretekel od pričetka evolucije do ustavitve. Kot smo že povedali, do ustavitve lahko pride v dveh primerih: določeno število generacij ni bilo izboljšave ali pa je bila dosežena znana spodnja meja in je bila v programu izbrana možnost, da se v tem primeru z izvajanjem preneha. Okno programa je na sliki 4.5. Naj bo n število točk v grafu. Potem imajo posamezne vrste križanja v implementaciji sledeče časovne zahtevnosti: PMX križanje: O(n2 ), spremenjeno PMX križanje: O(n2 ), OX križanje: O(n) in CX križanje: O(n2 ). Prostorska zahtevnost programa je reda O(n2 ), saj je graf predstavljen kot ma- 2 DIMACS testni grafi so bili prvotno namenjeni za problem iskanja največje klike. 4. NEODVISNOSTNO ŠTEVILO GRAFA 48 Slika 4.5: Okno programa trika n × n velikosti, v kateri je element na mestu (i, j) enak 1, če sta točki i in j povezani, sicer ima vrednost 0. Podprogram, ki ocenjuje uspešnost kromosomov v določeni generaciji, ima časovno zahtevnost O(n3 ), kar je tudi najvišja časovna zahtevnost med podprogrami v celotni implementaciji. Zaradi te ocene, ocenimo časovno zahtenost ene celotne evolucije (sprememba za eno generacijo) z O(n3 ). Elitna strategija je bila implementirana s pomočjo urejanja s kopico, saj moramo po velikosti urediti polje uspešnosti kromosomov v dveh populacijah (velikosti populacij sta enaki in konstantni). Urejanje s kopico ima časovno zahtevnost O(n·log n). 4. NEODVISNOSTNO ŠTEVILO GRAFA 49 Tabela 4.1: Tabela rezultatov na DIMACS testnih grafih graf c-fat200-1 c-fat200-2 c-fat200-5 c-fat500-1 c-fat500-2 c-fat500-5 c-fat500-10 johnson8-2-4 johnson8-4-4 johnson16-2-4 johnson32-2-4 keller4 keller5 keller6 hamming6-2 hamming6-4 hamming8-2 hamming8-4 hamming10-2 hamming10-4 sanr200-0.7 sanr200-0.9 sanr400-0.5 sanr400-0.7 san200-0.7-1 san200-0.7-2 san200-0.9-1 san200-0.9-2 san200-0.9-3 san400-0.5-1 san400-0.7-1 san400-0.7-2 san400-0.7-3 san400-0.9-1 san1000 št. točk št. povezav optimum [2] 200 200 200 500 500 500 500 4 14 8 16 171 776 3361 64 64 256 256 1024 1024 200 200 400 400 200 200 200 200 200 400 400 400 400 400 1000 1534 3235 8473 4459 9139 23191 46627 210 210 210 210 9435 225990 4619898 1824 704 31616 20864 518656 434176 13868 17863 39984 55869 13930 13930 17910 17910 17910 39900 55860 55860 55860 71820 250500 12 24 58 14 26 64 ≥ 126 4 14 8 16 11 27 ≥ 59 32 4 128 16 512 ≥ 40 18 ≥ 42 13 ≥ 21 30 18 70 60 44 13 40 30 22 100 15 12 24 58 14 26 64 126 4 14 8 16 11 27 50 32 4 128 16 512 36 18 41 13 21 30 18 70 60 37 13 40 30 17 100 10 naša metoda sPMX OX CX 12 12 12 24 24 24 58 58 58 14 14 14 26 26 26 64 64 64 = 126 = 126 = 126 4 4 4 14 14 14 8 8 8 16 16 16 11 11 11 27 27 27 • 51 50 • 51 32 32 32 4 4 4 128 128 128 16 16 16 494 471 476 35 34 36 18 18 18 = • 42 = • 42 = • 42 13 13 13 = 21 = 21 = 21 30 30 30 18 18 18 70 70 70 60 60 60 • 44 • 44 • 44 13 13 13 40 40 40 30 30 30 • 22 • 22 • 22 100 100 100 • 15 10 10 4. NEODVISNOSTNO ŠTEVILO GRAFA 50 Tabela 4.2: Tabela rezultatov na DIMACS testnih grafih (nadaljevanje) graf brock200-1 brock200-2 brock200-3 brock200-4 brock400-1 brock400-2 brock400-3 brock400-4 brock800-1 brock800-2 brock800-3 brock800-4 p-hat300-1 p-hat300-2 p-hat300-3 p-hat500-1 p-hat500-2 p-hat500-3 p-hat700-1 p-hat700-2 p-hat700-3 p-hat1000-1 p-hat1000-2 p-hat1000-3 p-hat1500-1 p-hat1500-2 p-hat1500-3 MANN-a9 MANN-a27 MANN-a45 MANN-a81 št. točk št. povezav optimum [2] 200 200 200 200 400 400 400 400 800 800 800 800 300 300 300 500 500 500 700 700 700 1000 1000 1000 1500 1500 1500 45 378 1035 3321 14834 9876 12048 13089 59723 59786 59681 59765 207505 208166 207333 207643 10933 21928 33390 31569 62946 93800 60999 121728 183010 122253 244799 371746 284923 568960 847244 918 70551 533115 5506380 21 12 15 17 27 29 31 33 23 24 25 26 8 25 36 9 36 ≥ 49 11 44 ≥ 62 10 ≥ 46 ≥ 65 12 ≥ 63 ≥ 94 16 126 345 ≥ 1100 20 10 14 16 23 24 23 23 18 19 18 20 8 25 35 9 36 49 11 44 61 10 46 68 11 64 94 16 126 341 1094 naša metoda sPMX OX CX • 21 • 21 20 • 12 • 12 • 12 14 • 15 • 15 • 17 16 • 17 • 25 • 24 • 24 24 • 25 • 25 23 23 • 25 • 24 • 24 • 25 • 19 • 19 • 20 • 20 • 20 • 21 • 19 • 19 • 20 18 19 20 8 8 8 25 25 25 • 36 35 • 36 9 9 9 36 36 36 = 49 = 49 = 49 11 11 11 44 44 44 61 59 60 10 10 10 46 44 45 61 63 64 11 11 11 63 61 63 85 82 83 16 16 16 126 126 126 • 342 • 342 • 343 • 1095 1092 1094 4. NEODVISNOSTNO ŠTEVILO GRAFA 51 Tabela 4.3: Izboljšani rezultati s pomočjo elitne strategije graf keller6 hamming10-2 hamming10-4 p-hat700-3 p-hat1000-3 p-hat1500-1 p-hat1500-2 MANN-a45 MANN-a81 št. točk 3361 1024 1024 700 1000 1500 1000 1035 3321 št. povezav 4619898 518656 434176 183010 371746 284923 568960 533115 5506380 optimum ≥ 59 512 ≥ 40 ≥ 62 ≥ 65 12 ≥ 63 345 ≥ 1100 [2] 50 512 36 61 68 11 64 341 1094 naša metoda: PMX • 55 e = 512 = • 40 e = • 62 e > 68 e = • 12 e > 64 e • 344 e • 1098 e Tabela 4.4: časovne meritve za družine grafov graf c-fat500-10 johnson32-2-4 keller4 keller 6 hamming8-2 hamming10-2 hamming10-4 san200-0.9-1 san400-0.7-1 san1000 brock200-4 brock400-3 brock800-4 p-hat300-3 p-hat500-3 p-hat700-3 p-hat1000-3 p-hat1500-2 MANN-a27 MANN-a45 MANN-a81 št. točk št. povezav 500 16 171 3361 256 1024 1024 200 400 1000 200 400 800 300 500 700 1000 1500 378 1035 3321 46627 210 9435 4619898 20864 518656 434176 17910 55860 250500 13089 59681 207643 33390 93800 183010 371746 568960 70551 533115 5506380 DIMACS optimum 126 16 11 ≥ 59 16 512 ≥ 40 60 40 15 17 31 26 36 ≥ 49 ≥ 62 ≥ 65 ≥ 63 126 345 ≥ 1100 PMX čas v ms PMXe čas v ms 126 16 11 51 16 512 35 60 40 15 16 25 20 36 49 62 61 62 126 343 1095 0 0 60 87880 220 980370 37630 440 2980 42840 11700 23560 26320 21290 34880 61190 43670 104850 19720 48120 4976420 126 16 11 55 16 478 40 60 40 10 17 23 20 36 49 62 68 64 126 344 1098 0 0 110 414440 1040 339930 51090 610 7580 900 30320 5100 18400 46300 44930 123690 266940 270000 9550 312580 8544980 Literatura [1] B. Filipič, Genetski algoritmi v kombinatorični optimizaciji, doktorska disertacija, FER, Ljubljana, 1993 [2] A. Sakamoto, X. Liu in T. Shimamoto, A Genetic Approach for Maximum Independent Set Problems, IEICE TRANS. Fundamentals, Vol. E80-A, No.3, [551-556] 1997 [3] W. Sarle, Kangaroos, članek poslan 1. septembra 1993 na novičarsko skupino comp.ai.neural-nets [4] R.J. Wilson in J.J. Watkins, Uvod v teorijo grafov, DMFA Slovenije, Ljubljana, 1997 [5] Z. Michalewicz, Genetic algorithms + data structures = evolution programs, Springer - Verlag, New York, 1999 52
© Copyright 2024