Professional Documents
Culture Documents
Datoteke
Diplomski rad u PDF obliku: DiplomskiRad.pdf
Sažetak
Ovaj diplomski rad opisuje rješavanje aproksimacijskog problema primjenom dva evolucijska
algoritma, genetskog algoritma i jedne varijacije genetskog programiranja, programiranja
genskih izraza. Ulazni podaci problema predstavljeni su kao niz točaka proizvoljnih
vrijednosti, a rezultat optimiranja je njihova aproksimacijska funkcija. U analizama, najveći
naglasak stavljen je na kvalitetu rada programiranja genskih izraza i osjetljivost njegovog
algoritma na promjene ulaznih parametara. Također, postoji usporedba kvalitete tih rješenja
s rješenjima genetskog algoritma.
Abstract
This diploma thesis describes solving of the approximation problem by two evolutionary
algorithms, genetic algorithm and a variant of genetic programming, gene-expression
programming. The problem’s input data is represented by an array of arbitrary points, while
the result of the optimization is an approximation function of those points. Most of the
analyses are focused on the result quality of gene-expression programming and sensitivity
analyses of its algorithm. Also, there’s a comparison of result quality between this method
and genetic algorithm.
Sadržaj
1. Uvod
2. Evolucijski algoritmi
2.1. Evolucija u prirodi
2.1.1. Darwinova istraživanja
2.1.2. Moderna genetika – od Mendela do molekule DNK
2.2. Genetski algoritam kao imitacija evolucije
2.2.1. O evolucijskim algoritmima
2.2.2. Genetski algoritam
2.2.3. Jednostavni genetski algoritam
2.3. Objekti genetskog algoritma
2.3.1. Jedinka
2.3.2. Populacija
2.4. Operatori genetskog algoritma
2.4.1. Evaluacija
2.4.2. Selekcija
2.4.3. Križanje
2.4.4. Mutacija
3. Programiranje genskih izraza
3.1. Genetsko programiranje
3.1.1. Računalni program – jedinka populacije
3.1.2. Evaluacija i dobrota računalnog programa
3.2. Proširenje genetskog programiranja genskim izrazima
3.2.1. Genski izraz – jedinka populacije
3.2.2. Izgradnja stabla izraza iz genskog izraza
3.2.3. Evaluacija i dobrota stabla izraza
3.2.4. Prilagodbe osnovnih i specifični genetski operatori
4. Aproksimacijski problem
4.1. Definicija problema
4.2. Ulazni podaci
4.3. Izlazna funkcija
5. Praktični rad
5.1. Rješavanje jednostavnim genetskim algoritmom
5.1.1. Programsko ostvarenje
5.1.2. Pokretanje procesa optimiranja
5.2. Rješavanje programiranjem genskih izraza
5.2.1. Programsko ostvarenje
5.2.2. Pokretanje procesa optimiranja
6. Analiza i usporedba rezultata optimiranja
6.1. Aproksimiranje manjeg skupa točaka
6.1.1. Početno dobro rješenje aproksimacijskog problema
6.1.2. Osjetljivost kvalitete rješenja o duljini glave gena
6.1.3. Osjetljivost kvalitete rješenja o broju gena
6.1.4. Osjetljivost kvalitete rješenja o broju iteracija
6.1.5. Osjetljivost kvalitete rješenja o veličini populacije
6.1.6. Osjetljivost kvalitete rješenja o vjerojatnosti mutacije
6.2. Aproksimiranje većeg skupa točaka
6.3. Usporedba programiranja genskih izraza i genetskog algoritma
7. Zaključak
8. Literatura
1. Uvod
Kada čovjek prikuplja informacije o svijetu oko sebe, on nesvjesno iz mnoštva informacija
odabire sebi najzanimljivije te ih zadržava u sjećanju. Na taj si je način predočio svijet u
jednostavnijem (aproksimiranom) obliku. Taj se proces neprestano i potpuno nesvjesno
ponavlja kroz cijeli njegov život.
Ovaj diplomski rad sastavljen je od osam poglavlja. Nakon uvodnog, slijedi poglavlje o
evolucijskim algoritmima. Ono započinje temom o biološkoj evoluciji, metodama napretka
populacije kroz generacije te nastankom novih vrsta. Nastavlja se detaljnim opisom
genetskog algoritma, metodologije za rješavanje raznih matematičkih problema pomoću
najvažnijih evolucijskih mehanizama – operatora križanja i mutacije.
Četvrto poglavlje ukratko definira aproksimacijski problem, njegove ulazne podatke i izlaznu
funkciju. Sljedeće, peto poglavlje, daje opis implementacije dvaju programa za rješavanje
aproksimacijskog problema pomoću genetskih algoritama i programiranja genskih izraza.
Usto, opisane su njihove ulazne i izlazne datoteke te upute za ispravno pokretanje procesa
traženja rješenja.
Šesto poglavlje stavlja naglasak na analizu rješenja dobivenih programiranjem genskih izraza,
jer je to naslovna metodologija ovog rada. Opisano je jedno zadovoljavajuće rješenje te kako
se algoritam ponaša kad mu se mijenjaju neki od ulaznih parametara. Na kraju, obavljena je
usporedba ovih rješenja i rješenja dobivenih genetskim algoritmom.
2. Evolucijski algoritmi
Put do današnjeg stadija nije bio nimalo lak. To je prvi ustvrdio Charles Darwin u svojoj knjizi
„O porijeklu vrsta“, objavljenoj 1859. godine u Velikoj Britaniji. Darwin iznosi teoriju biološke
evolucije po kojoj populacija neke vrste evoluira (napreduje) kroz generacije pomoću
procesa prirodne selekcije. Također, Darwin je primijetio da veću šansu za preživljavanje
imaju jedinke s boljim svojstvima, a da manju šansu imaju jedinke s gorim svojstvima pa one
najčešće odumiru. Opisani proces jest proces prirodne selekcije. Zbog njega, populacija
polagano napreduje po pitanju kvalitete njenih pripadnika (npr. sve je više jačih, bržih i
otpornijih pripadnika).
Sažimanjem gornjih tvrdnji i znanjem stečenim kroz vlastita istraživanja, Charles Darwin
definira dva glavna pokretača evolucije [1]:
1. Prirodna selekcija – proces po kojem priroda „određuje“ koja jedinka nema dovoljno
dobra svojstva za preživljavanje i kasniju reprodukciju.
2. Spolno razmnožavanje – različitost roditelja se prenosi na djecu, gdje ona dio
svojstava primaju od jednog, a dio od drugog roditelja; spolnim se razmnožavanjem
čuva raznolikost populacije i značajno ubrzava evolucijski proces.
Daljnji napredak tehnologije omogućio je bolji pogled unutar stanice i njene jezgre, gdje su
smješteni svi geni jedinke – njen genotip[2]. Geni su zapravo nizovi nukleotida međusobno
povezani u dugačak lanac. Takav se lanac uparuje s drugim, komplementarnim lancem
nukleotida gdje svaki nukleotid ima svoj komplementarni par. Na ovaj način se dobije
dvostruka, ljestvičasta uzvojnica koja predstavlja jednu molekulu deoksiribonukleinske
kiseline ili DNK, najvažnije molekule živog bića (Slika 2.1). Strukturu molekule DNK u obliku
dvostruke, ljestvičaste uzvojnice opisala su 1953. godine dva engleska znanstvenika, James
D. Watson i Francis Creek.
Razvučena molekula DNK nije praktična za korištenje zbog čega se kida na manje lance te
višestrukim namatanjem nakuplja u kromosome. Svrha ovakvog nakupljanja je manje
zauzimanje prostora unutar stranice, kao i lakša dioba iste kada dođe vrijeme za to.
Evolucijsko programiranje (EP) je danas metodologija širokog opsega, jer ne koristi fiksnu
strukturu za reprezentaciju jedinki. Zbog toga jako podsjeća na evolucijske strategije i teško
je povući granicu među njima. U prošlosti, koristili su se fiksni konačni automati i evoluirali su
se njihovi numerički parametri [5].
Genetski algoritam (GA) je metoda optimiranja kojom se prati populaciju rješenja nekog
problema i simuliranjem evolucijskog procesa nad njom traži što bolje (poželjno najbolje)
rješenje tog problema.
Naravno, genetski algoritam nije idealna preslika evolucije, već se često navodi kao „gruba
aproksimacija“ evolucije. Ukoliko bi se htjela simulirati stvarna evolucija, onda bi svaka
jedinka zauzimala popriličnu količinu memorijskog prostora. Npr. za preslikavanje genotipa
samo jedne jedinke žabe, bilo bi potrebno oko 1 GB memorijskog prostora [3]. Najčešće to
nije slučaj pa genetski algoritam koristi manje memorijskog prostora.
John Holland je u svom radu predložio (jednostavni) genetski algoritam kao računarski
proces koji imitira evolucijski proces u prirodi i primjenjuje ga na apstraktne jedinke [3].
Jednostavni genetski algoritam je često korišteni demonstracijski primjer u literaturi, jer
istovremeno predstavlja i jednostavno i moćno oruđe za rješavanje problema.
Genetski_algoritam
{
t = 0;
ispiši rješenje;
}
Unutar tijela petlje (tj. jedne iteracije), nad populacijom se obavljaju genetske operacije.
Prvo se selekcijom uklanjaju najgore jedinke i na njihovo mjesto dolaze kopije boljih. Drugi
korak je križanje parova jedinki, gdje djeca nastala križanjem zamjenjuju svoje roditelje.
Posljednji korak jest eventualno mutiranje određenog broja jedinki u populaciji. Nakon ovog
koraka, postupak se ponavlja. U terminologiji genetskog algoritma, iteracija se
naziva generacijom.
Svaki genetski algoritam radi sa strukturama podataka koje najviše odgovaraju problemu koji
se nastoji riješiti. U ovom su poglavlju opisani objekti jednostavnog genetskog algoritma,
format njihovog zapisa te prednosti i mane takvog pristupa.
2.3.1. Jedinka
Računalo najbolje radi s brojevima. Ono je prije svega numeričko-aritmetički stroj i zbog toga
se najbolje performanse u genetskog algoritma dobivaju kad se kao jedinke koriste brojevi.
Naravno, to nije jedina reprezentacija jedinke. One se mogu reprezentirati i kompliciranijim
strukturama podataka – poput niza, liste ili stabla. Jedinka populacije genetskog algoritma
naziva se kromosom. Kod jednostavnog genetskog algoritma, kromosom je konačan niz
bitova (engl. bit array), koji se zbog načina na koji računalo radi, tretira i kao pozitivan cijeli
broj[4] (engl. unsigned integer). Ta dva zapisa su ekvivalentna; kad se koji koristi, ovisi o
konkretnoj situaciji.
Cjelobrojna vrijednost kromosoma najčešće ne odgovara onoj koju zaista predstavlja, tj.
potrebno je obaviti njeno preslikavanje u točku iz zadanog intervala na brojevnom pravcu.
Kako je interval kontinuiran te ima beskonačno točaka, a skup vrijednosti kromosoma
konačan i diskretan, kromosomima se mogu dodijeliti samo diskretne vrijednosti iz tog
intervala (Slika 2.3). Interval je određen donjom (dg) i gornjom granicom (gg) te se
naziva područjem pretraživanja genetskog algoritma.
(2.1)
(2.2)
U navedenim funkcijama B predstavlja niz bitova (binarni vektor, engl. bit vector) i vrijedi da
je . Uz gore navedene dvije funkcije, postoji i koristi se još jedna
– funkcija v pretvara cijeli broj b u binarni vektor B, zbog čega vrijedi: .
Odabrane točke intervala uvijek su jednako razmaknute, što znači da je interval podijeljen na
2n – 1 jednakih odsječaka. Duljina odsječka označava se kao Δx i iznosi:
(2.3)
Kraći odsječak znači veću preciznost konačnog rješenja. Povećanje preciznosti rješenja
postiže se produljenjem binarnog zapisa kromosoma na duljinu koja udovoljava zahtjevima.
U takvim se situacijama zahtijeva preciznost rješenja x na najmanje p decimalnih mjesta, tj. x
ne smije odstupati od točnog rješenja za više od 10 -p. Uvjet koji mora zadovoljiti n zadan je
sljedećim izrazom:
(2.4)
(2.5)
Dakle, bilo koji n koji zadovoljava gornju nejednadžbu, osigurava preciznost rješenja na
barem p decimalnih mjesta. Veća preciznost usporava algoritam stoga je potrebno odvagnuti
najbolji odnos brzina-preciznost za konkretni problem.
2.3.2. Populacija
Već je spomenuto da je veličina populacije neke vrste u prirodi konstantna ili se jako sporo
mijenja. To se svojstvo prenosi i u područje genetskih algoritama. Stoga jednostavni genetski
algoritam radi s populacijom uvijek iste veličine. Postoje neke implementacije s
promjenjivom veličinom populacije, ali se pokazalo da to svojstvo ne poboljšava konačno
rješenje, a donekle usporava izvođenje algoritma. Veličina populacije je još jedan ulazni
parametar genetskog algoritma i u ovom radu označavat će se kao VEL_POP.
Dva su istaknuta načina stvaranja početne populacije. Najčešće se ona popuni slučajno
generiranim jedinkama, što rezultira velikom genetskom raznolikošću i većom vjerojatnošću
pronalaska najboljeg puta prema optimumu. U drugom slučaju, populacija se radi
kopiranjem jedne jedinke. Ovime je uklonjena genetska raznolikost i potrebno je neko
vrijeme dok se ona dobije radom genetskih operatora. Ponekad se u početnu populaciju kao
jedinka ubaci (među)rješenje dobiveno nekom drugom optimizacijskom tehnikom [3].
(2.6)
(2.7)
2.4.1. Evaluacija
Mjera kvalitete svake jedinke određuje se u ovoj fazi. Sâm genetski kod ništa ne govori o
dobroti jedinke, već se ta vrijednost mora izračunati. Kako bi se dobrota mogla izračunati,
prvo je potrebno odrediti funkciju dobrote (funkcija sposobnosti, funkcija cilja, engl. fitness
function). U najjednostavnijem slučaju, funkcija dobrote je jednaka funkciji f koju se želi
optimirati i tada vrijedi:
(2.8)
gdje je v binarni vektor (kromosom), a on je predstavljen brojem x iz intervala [dg, gg]. Veća
dobrota jedinke znači veću vjerojatnost preživljavanja i križanja, a time i mogućnost
poboljšanja genetskog materijala. Ovakva jednostavna veza funkcije dobrote i optimirane
funkcije često nije moguća, zbog ograničenja koja se postavljaju funkciji dobrote. Za
optimiranu funkciju f(x), naprotiv, najbolje je da nema nikakvih ograničenja, tj. ona je
potpuno proizvoljna. U procesu prilagodbe problema genetskom algoritmu, odabir funkcije
dobrote pokazao se kao najveća poteškoća, jer njena pogrešna ocjena vodi populaciju u
krivom smjeru. Funkcija dobrote, stoga, treba vjerno odražavati problem koji rješava [3].
2.4.2. Selekcija
Uloga selekcije je čuvanje i prenošenje dobrih svojstava u iduću populaciju, dok jedinke s
lošim značajkama odumiru. Ukoliko se selekcija definira deterministički (na primjer, u svakoj
generaciji ukloni Mnajgorih jedinki, gdje je M broj jedinki za eliminaciju), genetski algoritam
jako brzo, već kroz nekoliko iteracija, konvergira u najbližem lokalnom optimumu i dalje se
ne miče iz njega. Stoga, potrebno je na neki način omogućiti i najgorim jedinkama bar
malenu vjerojatnost preživljavanja za vrijeme selekcije. Boljim jedinkama je ta vjerojatnost
mnogo veća, ali nikad nije jednaka jedinici. Ovakva politika predstavlja rizik gubitka dobrog
genetskog materijala, ali genetska raznolikost populacije u svakom je trenutku važnija od
egzistencije pojedinih jedinki.
(2.9)
(2.10)
(2.11)
Slika 2.4. grafički prikazuje mehanizam jednostavne selekcije. Slučajan broj r „pogodio“ je
jedinku i zbog čega se ona prenosi u novu populaciju. Postupak se ponavlja VEL_POP puta.
Upravo zbog sličnosti s pravim ruletom, gdje loptica na slučajan način pogađa numerirane
utore, jednostavna selekcija je dobila i drugo ime.
Ovakvim načinom selekcije osigurana je veća vjerojatnost preživljavanja boljih jedinki, a opet
nije u potpunosti isključeno preživljavanje najgorih. Ipak, jednostavna selekcija ima i velike
nedostatke. U prvom redu, nije predviđen mehanizam provjere postoji li odabrana jedinka
već u populaciji, zbog čega se može javiti mnogo duplikata (čak do 50% dupliciranih
kromosoma [3]). Duplikati usporavaju napredovanje algoritma zbog smanjene genetske
raznolikosti. Drugi problem može nastati ukoliko se loše definira funkcija dobrote, što može
uzrokovati podjednaku vjerojatnost preživljavanja svih kromosoma. Ugradnjom jednostavnih
dodatnih mehanizmima, oba problema se lako rješavaju.
Slika 2.4. Kumulativna dobrota qi i vjerojatnost selekcije pi
Turnirska selekcija
U slučajevima kada je kromosom predstavljen kompliciranijom strukturom podataka (npr.
vezanom listom ili binarnim stablom) od običnog cijelog broja, obavljanje jednostavne
selekcije postaje računski najzahtjevnija operacija. Obavlja se mnogo kopiranja, slijednog
pregledavanja liste i međusobnog uspoređivanja elemenata, što sve zajedno jako usporava
algoritam. U takvim se slučajevima mora nekako smanjiti broj kromosoma uključenih u
selekciju po generaciji. Od takve ideje, nastala je k-turnirska selekcija (engl. tournament
selection), gdje je k prirodni broj veći od jedinice i oznaka veličine turnira.
Eliminacijska selekcija
Još jedno poboljšanje jednostavne selekcije predstavlja njena varijanta, zvana eliminacijska
selekcija (engl. steady-state selection). Za razliku od jednostavne koja
preferira dobre kromosome za prelazak u novu populaciju, eliminacijska selekcija
odabire loše i uklanja ih iz populacije. Zatim se genetskim operatorima od preostalih
kromosoma populacija dopunjava do svoje normalne veličine.
(2.12)
(2.13)
Elitizam
Kako genetski algoritam pripada razredu stohastičkih algoritama, ne postoji garancija da će
najbolja jedinka svaki put preživjeti selekcijski „odstrel“. Dakle, postoji mogućnost gubitka
najboljeg kromosoma i time nazadovanje populacije na nekoliko generacija. Rješenje
problema je elitizam, a predstavlja mehanizam zaštite najbolje jedinke od eliminacije.
Genetski algoritam s ugrađenim elitizmom kroz generacije asimptotski napreduje prema
globalnom optimumu.
Negativna strana elitizma je usporenje algoritma zbog traženja najbolje jedinke prije početka
selekcije. Povećanjem složenosti strukture kromosoma i pripadajuće funkcije dobrote,
traženje najboljeg kromosoma može utrošiti značajnu količinu procesorskog vremena [3, 8].
2.4.3. Križanje
Kod živih organizama, križanje (engl. crossing over, crossover) se obavlja za vrijeme mejoze,
kada se formiraju spolne stanice jedinke. Tada se upareni homologni kromosomi, bivalenti,
prekidaju na slučajnoj poziciji i zatim razmjenjuju odsječke genetskog materijala (Slika 2.6).
Jedna od metoda križanja se naziva križanje s m točaka prekida. „Točka“ je u ovom slučaju
mjesto između dva gena kromosoma, dok je . Slika 2.7. zorno prikazuje
križanje dva kromosoma gdje je točka prekida između 4. i 5. gena. Kromosomi se razrežu na
toj poziciji, zatim se zamijene odrezani dijelovi te ponovo spoje u dvije kompaktne cjeline.
Druga izvedba križanja binarnih kromosoma zove se uniformno križanje. Kod takvog križanja
svakom se genu roditelja pridružuje neka vjerojatnost njegovog nasljeđivanja na djecu.
Naravno, zbroj vjerojatnosti prenošenja gena na istoj poziciji mora biti 1 (npr. vjerojatnost da
će gen x biti naslijeđen od prvog roditelja iznosi 0,6, a od drugog 0,4). „Najpošteniji“ oblik
uniformnog križanja je slučaj kad svaki gen ima vjerojatnost nasljeđivanja 0,5. U tom slučaju,
operator križanja je najlakše izvesti u obliku logičke operacije nad bitovima, jer su one
ugrađene u strojni jezik računala i najbrže se izvode.
Prvi korak jest prenošenje gena koji su jednaki, a ostale postaviti na nulu. To se radi logičkom
operacijom I: A I B, gdje su A i B roditelji. Nadalje, neka je R slučajno generiran kromosom.
Tada operacija: R I (AXILI B) daje masku slučajnih bitova na mjestima gdje se roditelji
razlikuju. Konačno, logičkom operacijom ILI stapaju se dva izračunata međurješenja i dobiva
se kromosom-dijete. Izraz:
(2.14)
predstavlja matematički zapisan način dobivanja kromosoma djeteta. Ova formula, naravno,
vrijedi samo za kromosome u obliku binarnih brojeva. Ukoliko je gen predstavljen nekom
složenijom strukturom, uniformno križanje se izvodi na drukčiji način.
Upravo operator križanja razlikuje genetski algoritam od ostalih evolucijskih algoritama, jer
nijednom od njih nije sastavni dio.
2.4.4. Mutacija
Kada se dogodi mutacija za vrijeme života stanice nekog organizma, dolazi do nepredvidljive
promjene u genetskoj poruci. Najčešće se ta poruka detektira unutar same stanice pa se
popravi na vrijeme, ne ostavljajući nikakav trag iza sebe. No, neke mutacije ostaju
neprimijećene i često se njene manifestacije mogu vidjeti na fenotipu jedinke. Na primjer,
mutacija kod leptira može uzrokovati promjenu uzorka na krilima što će mu omogućiti
kvalitetniju mimikriju i veću sposobnost preživljavanja. Takvo, poboljšano svojstvo,
vjerojatno će kroz nekoliko generacija prevladati u populaciji. Naprotiv, veliki broj mutacija
ima negativne posljedice zbog kojih mutirane jedinke odumiru prirodnom selekcijom.
Genetski algoritam, kao i svi evolucijski algoritmi, oslanja se na mutaciju u svom radu. Ona je
glavna pokretačka snaga algoritma, jer njena nepredvidljivost može jedinku baciti u
nepoznato područje, područje gdje se nalazi globalni optimum. Naime, genetski algoritam
ima tendenciju zaglaviti u najbližem lokalnom optimumu (već nakon malenog broja
generacija) te se kasnije teško ili nikako ne miče iz njega. Mutacija izbacuje jedinku iz tog
napučenog područja. Ako se pomak pokazao pozitivnim, cijela populacija će se jako brzo
preseliti na to novo, neistraženo područje. Ukoliko mutacija da loše rezultate, jedinka ubrzo
odumire selekcijom.
Kao i sve kod jednostavnog genetskog algoritma, mutacija je također jednostavna. Ulazni
parametar u algoritam jest vjerojatnost mutacije gena pm. Ukoliko je ona bliska jedinici,
algoritam se pretvara u algoritam slučajne pretrage prostora rješenja, a ukoliko je bliska nuli,
populacija će zaglaviti u najbližem lokalnom optimumu iz kojeg će teško izaći. Jednostavna
mutacija svaki bit mijenja s istom vjerojatnošću pm [3]. Slika 2.8. prikazuje mutaciju trećeg
gena kromosoma iz jedinice u nulu.
Uz jednostavnu, postoji još nekoliko vrsta mutacija nad binarnim kromosomima, koje će se
samo ukratko spomenuti. One se ne moraju primijeniti na cijeli kromosom, već se mutirani
dio određuje preko slučajno generirane maske, niza bitova dugog koliko i kromosom.
Jedinice u maski određuju na koje će se bitove kromosoma primijeniti operator mutacije.
Ukoliko je kromosom građen od gena složenije strukture, onda vjerojatnost mutacije gena
možda nije odgovarajuća niti primjenjiva. U takvim slučajevima treba poznavati vjerojatnost
mutacije kromosoma pM. Ukoliko se ona želi odrediti u slučaju kad je poznat parametar pm,
tada vrijedi izraz:
(2.15)
Osnovna zamisao metode jest optimiranje računalnih programa na računalu. Računalo prati
populaciju računalnih programa i kroz određeni broj generacija poboljšava tu populaciju
primjenom poznatih genetskih operatora – selekcije, križanja i mutacije. Programi se prema
nekom kriteriju vrednuju (preciznost njihovih rezultata, brzina izvođenja, minimalni broj
instrukcija, itd) i u konačnici se najbolji predstavlja kao konačno rješenje.
int main()
{
printf("Hello world!");
return 0;
}
Danas se takvi rezultati optimiranja smatraju zadovoljavajućima, ali već sutra mogu postati
nedovoljno dobri. Kada se pojave takvi zahtjevi, genetsko programiranje bi moglo postati
odgovor na njih. Trenutno, ono nije doraslo rješavanju takvih problema, već se problemi
pojednostavljuju na programe građene od jednostavnih matematičkih operatora i funkcija –
na matematičke izraze.
(3.1)
Kao što se vidi, zagrade osiguravaju jednoznačnu izgradnju stabla izraza, jer bi se bez njih
moglo izgraditi više različitih stabala od iste početne funkcije.
Stablo izraza nije jedina korištena reprezentacija jedinke. Danas se istražuju i koriste razne
strukture za spremanje i optimiranje programa sličnijih imperativnim jezicima. Podvrsta
genetskog programiranja koja koristi takve strukture se zove linearno genetsko
programiranje [9].
Ukoliko se genetskim programiranjem traži funkcija g(x) koja najbolje opisuje zadani skup
točaka , kao mjeru kvalitete jedinke bolje je
uzeti funkciju kazne:
(3.2)
Ona predstavlja sumu kvadrata odstupanja trenutne funkcije od očekivanih iznosa (uzoraka).
Razlika se kvadrira kako bi se dodatno kaznile jedinke koje više odstupaju. Ovo kao posljedicu
može imati brzu homogenizaciju populacije, zbog čega je nužno dobro odrediti ostale
parametre genetskog programiranja (vjerojatnosti križanja i mutacije, veličinu populacije,
itd).
Programiranje_genskih_izraza
{
t = 0;
ispiši rješenje;
}
Usto, genetsko programiranje radi sa stablima, a operacije vezane za rad sa stablima su
sporije od rada s linearnim strukturama (nizom ili listom). Povećavanjem veličine jedinki, u
želji za dobivanjem boljeg rješenja, algoritam se dodatno usporava zbog tog negativnog
svojstva funkcija za rad sa stablima. Zbog toga, javila se potreba za vraćanjem genetske
poruke u linearni oblik, a da se opet iz nje može rekonstruirati računalni program. Nova
metoda optimiranja koja donosi rješenje zove se programiranje genskih izraza (engl. gene
expression programming, GEP) [10].
Programiranje genskih izraza predstavila je dr. Cândida Ferreira 1999. godine. Metoda je
revolucionarna zbog uvođenja novog, dvojakog gledanja na jedinku: njenu linearnu genetsku
poruku (genotip) i stablo izraza izgrađeno iz genetske poruke (fenotip). Usko povezani par
genotip-fenotip analogan je živim bićima u prirodi, gdje se iz linearne strukture molekule
DNK gradi cijeli organizam jedinke. Kako se jedinke u prirodi međusobno uparuju i
reproduciraju na temelju tjelesnih svojstava jedinki, a zapravo se prenosi njihova genetska
poruka, tako se kod programiranja genskih izraza evaluira fenotip, a njegov genotip provodi
kroz žrvanj genetskih operatora.
Tablica 3.2. prikazuje pseudokod algoritma programiranja genskih izraza. Većina navedenih
operatora je zasnovana na onima od genetskog algoritma, naravno, uz potrebne prilagodbe
specifičnostima algoritma. Detaljnije o karakteristikama operatora programiranja genskih
izraza nalazi se u poglavlju 3.2.4.
Kako je rečeno, pretpostavka je da su geni jednake duljine. Kako bi se ona mogla izračunati,
potrebno je doznati dva podatka: duljinu glave i najveći od brojeva argumenata nezavršnih
simbola. Prvi podatak je ulazni parametar u algoritam, dok se drugi određuje na početku
rada, prolazom kroz listu mogućih nezavršnih simbola. Jednadžba po kojoj se od duljine
glave h i najvećeg broja argumenata narg računa duljina repa t, glasi:
(3.3)
Slika 3.3. prikazuje kromosom od tri gena. Duljina glave gena je 3 simbola, najveći broj
argumenata imaju aritmetički operatori i on iznosi 2, zbog čega je duljina repa 4 simbola.
Jednadžba za računanje duljine repa daje dovoljno dug rep kako bi svaka funkcija ili operator
u glavi „dobila“ dovoljan broj ulaznih vrijednosti.
Slika 3.3. Genski izraz (kromosom) sastavljen od tri gena
Često se ne koriste svi elementi repa u izgradnji fenotipa. Aktivni genetski materijal (onaj koji
se koristi u fenotipu), označen je oznakama intervala iznad svakog gena kromosoma.
Neaktivni genetski materijal (intron[6]) ne igra ulogu u tom fenotipu, ali se može aktivirati
nekom od genetskih promjena na kromosomu. Vrijedi i obrat, tj. aktivni simboli se mogu
deaktivirati. Na primjer, ako mutacija promijeni prvi simbol bilo kojeg gena u varijablu a,
onda ostatak gena postaje neaktivnim. O toj temi više u poglavlju 3.2.2.
1. Prvi element gena postavlja se kao korijen stabla, po definiciji je to nulta razina.
2. Spušta se na novu razinu i redom uzimaju sljedeći simboli iz gena. Uvijek se u istom
smjeru (npr. slijeva nadesno) popunjavaju mjesta za djecu razine iznad.
3. Postupak popunjavanja se ponavlja sve dok se ne dođe do razine u kojoj su
postavljeni samo završni simboli.
Slika 3.4. prikazuje stablo izraza izgrađeno od priloženog gena, 11 simbola dugog (pet čine
glavu, a šest rep). Simboli su redom obuhvaćeni intervalima, gdje svaki interval predstavlja
simbole na istoj razini. Ovaj postupak je jednoznačan u oba smjera, dakle postoji bijekcija
između dva zapisa jedinke.
Vidljivo je da se tri simbola desno od točkaste linije (intron) ne koriste u izgrađenom stablu,
ali se mogu u budućnosti aktivirati radom genetskih operatora. O potencijalu genetske
poruke zapisane u intronima bit će više riječi u idućim poglavljima. Također, važno je navesti
poseban slučaj kada je korijen stabla završni simbol, a što nije rijetka pojava. Tada on sâm
predstavlja cijelo stablo izraza, jer završni simboli nemaju djecu.
Slika 3.4. Jednoznačna izgradnja stabla izraza iz kromosoma od jednog gena
Povezujuća funkcija se koristi nakon što se izgrade stabla izraza svih gena kromosoma. Zatim
se korijeni tih stabala postavljaju kao djeca čvora povezujuće funkcije. Nakon ovog koraka,
formiralo se jedno veliko stablo izraza, spremno za evaluaciju (Slika 3.5).
Mutacija
Mutacija se može dogoditi bilo gdje u kromosomu, s jednakom vjerojatnošću za svaki gen i za
svaki simbol u genu. U implementaciji, najčešće se koristi točkasta mutacija (engl. point
mutation). Kod nje se prvo slučajno odabere jedan simbol unutar kromosoma. Ako je
odabrani simbol smješten u glavi gena, onda on može mutirati u bilo koji iz skupa nezavršnih
i završnih simbola. Naprotiv, ako je smješten u repu gena, onda on može mutirati isključivo u
neki završni simbol.
Slika 3.6. oslikava izvođenje točkaste mutacije na priloženom genu duljine sedam simbola (tri
čine glavu, a četiri rep). Uz početni i mutirani gen prikazano je odgovarajuće stablo izraza.
Odabran je treći simbol gena, koji je iz završnog simbola a mutirao u nezavršni simbol
operatora zbrajanja. Ovakva promjena je moguća jer se odabrani simbol nalazi u glavi gena
(lijevo od crtkane linije). Kao posljedica mutacije, aktivni genetski materijal se proširio za
dodatna dva mjesta (pomak točkaste linije udesno), čime je u konačnici intron spao na
duljinu od samo jednog simbola. Rezultat mutacije je novo stablo izraza, s jednom granom
dodatno produženom i povećanim ukupnim brojem čvorova.
Ono što se može naslutiti, već iz ovako jednostavnog primjera, jest velika moć operatora
mutacije. On je u stanju iz temelja promijeniti fenotip jedinke i time u potpunosti okrenuti
smjer optimizacije. U slučaju da je mutacija nastupila na prvom elementu gena, mutirani
fenotip više ne bi niti podsjećao na početni. Suprotno ovome, mutacija unutar introna se ne
bi odrazila na izgledu fenotipa (stabla izraza), ali ostaje upamćena za ubuduće.
1. Kratak dio gena s nezavršnim ili završnim simbolom na prvom mjestu, koji se
prepisuje u glavu gena, osim na njeno prvo mjesto (korijen) – niz za umetanje
(engl. insertion sequence, IS).
2. Kratak dio gena s nezavršnim simbolom na prvom mjestu, koji se prepisuje na prvo
mjesto glave – niz za umetanje korijena (engl. root insertion sequence, RIS).
3. Kompletan gen koji se premješta na početak kromosoma.
Prvu vrstu koristi operator premještanja niza za umetanje (engl. IS transposition). Počinje se
odabirom mjesta u glavi gena gdje će se ubaciti kopija premjestivog elementa. Naravno, i
gen i mjesto ubačaja se biraju slučajnim putem. Drugi korak jest odabir niza za umetanje.
Kako on cijeli mora „stati“ u glavu, potrebno mu je duljinu ograničiti razlikom ukupne duljine
glave i mjesta ubačaja niza. Na ovaj način se ne prepisuje više elemenata od mogućeg. Dakle,
slučajno se odabiru gen, početak niza i njegova duljina (uz ograničenje). Konačno se odabrani
niz kopira u glavu. Svi simboli prije pozicije ubačaja ostaju na svome mjestu, a oni nakon nje
se guraju prema kraju glave. Između se umeće premjestivi element. Kako je glava fiksne
veličine, svi simboli koji bi trebali preći u rep jednostavno se brišu pa rep ostaje netaknut
ovim operatorom. Struktura kromosoma ostaje očuvana, što znači da je i program ostao
sintaktički ispravan.
Posljednju varijantu premjestivog elementa koristi operator premještanja gena (engl. gene
transposition). Ovo je najjednostavniji operator za izvedbu. Slučajno se odabere kromosom i
gen koji će se premjestiti. On se zatim premješta na prvo mjesto u tom kromosomu,
pomičući sve gene prije njega jedno mjesto unatrag. Za razliku od prethodna dva operatora,
ovdje je zaista riječ o premještanju, tako da je očuvana duljina kromosoma. Operator
premještanja gena je utoliko besmislen ako je povezujuća funkcija asocijativna (poput
zbrajanja ili množenja). Ipak, postoje problemi koji ne koriste asocijativne funkcije za
povezivanje gena i tada ovaj operator može značajno utjecati na kvalitetu jedinke.
Slika 3.7. prikazuje moguća djelovanja sva tri operatora premještanja na početni kromosom
sastavljen od tri gena. Operatori premještanja su ostatak razvojnog procesa metodologije
programiranja genskih izraza, jer je u početku kromosome činio samo jedan gen. U takvom je
okruženju kromosom sa završnim simbolom na početku rijetko bio koristan [10].
Slika 3.7. Prikaz rada svih operatora premještanja
Rekombinacija je operator koji u svom radu slučajnim odabirom prvo izdvaja dvije jedinke
(roditelja) iz populacije. Zatim roditelji međusobno razmjenjuju svoj genetski materijal da bi
se u konačnici dobile jedinke-djecu. One se vraćaju u populaciju i dalje sudjeluju u
optimizacijskom procesu. Implementacija algoritma najčešće koristi četiri vrste operatora
rekombinacije [10]:
Operatori križanja s jednom ili dvije točke prekida (engl. one/two-point recombination) jako
su slični. Slučajno se odabere jedna ili dvije točke na kromosomima roditelja gdje će se oni
razrezati. Zatim se naizmjenično uzimaju elementi jednog i drugog kromosoma, dok se ne
dobiju dva kromosoma sastavljena od dijelova roditelja (Slika 3.8). Na slici je prikazano
križanje s dvije točke prekida, gdje su točke na rubovima označenog podniza kromosoma.
Kao što je vidljivo sa slike, podniz se može protezati i kroz više od jednog gena (u primjeru su
kromosomi sastavljeni od dva gena).
Slika 3.8. Križanje kromosoma s dvije točke prekida
Slika 3.9. prikazuje djelovanje operatora rekombinacije gena (engl. gene recombination).
Slučajno se odabere gen za razmjenu (u primjeru je riječ o drugom genu) i zatim se cijeli
njihov sadržaj razmijeni među roditeljima.
4. Aproksimacijski problem
U životu je čest slučaj kad je potrebno problem riješiti dovoljno dobrom aproksimacijom
idealnog rješenja. Većina je slučajeva takvih da nije potrebna ili nije dosežna apsolutna
preciznost konačnog rješenja. Kvaliteta konačnog rješenja određena je kroz dva zahtjeva:
preko najveće dozvoljene pogreške ili preko raspoložive količine resursa dodijeljene za
njegovo traženje (vrijeme, novac, itd).
Aproksimacijski problem, kao tema ovog diplomskog rada, odnosi se na problem određivanja
funkcije koja najbliže prolazi ulaznom skupu točaka. Metoda kojom se rješava opisani
problem zove se nelinearna regresija, jer je rješenje redovito nelinearna funkcija.
Funkcija je uvijek nepoznata pa se traži nova funkcija koja prolazi dovoljno blizu
točaka ulaznog skupa (Slika 4.1).
Na primjer, ulazni podaci predstavljaju cijene sirove nafte na tržištu u proteklih 365 dana.
Očito ne postoji jasan matematički izraz kojim se može odrediti točna cijena goriva sljedećeg
dana. Cijena je u skladu s uvjetima na tržištu, a izrazito je osjetljiva na razne lokalne krize.
Ipak, njena vrijednost se određuje svakog dana i te se vrijednosti uzimaju kao ulazne točke za
rješavanje pomoću nelinearne regresije.
5. Praktični rad
(5.1)
Jedinka se stvara na način da se svi koeficijenti an redom poslažu u niz te se kasnije nad njom
i ostalim jedinkama obavljaju razne genetske operacije. Rezultat je oscilirajuća funkcija koja
prolazi blizu ulaznih točaka.
Ulazne točke se definiraju u posebnoj datoteci u kojoj se nalaze svi podaci nužni za
pokretanje algoritma. Pokretanjem programa, ova se datoteka čita i iz nje se izvlače korisni
podaci. Nakon pripreme ulaznih podataka, algoritam počinje s radom. Za vrijeme rada, svaki
željeni broj iteracija se ispisuje najbolja jedinka populacije korisniku na ekran. Kako je riječ o
iznimno brzom algoritmu, taj željeni broj bi trebao biti reda veličine tisuće, a ukupan broj
iteracija se može postaviti na nekoliko desetaka tisuća. Završetkom optimiranja, program
ispisuje najbolje rješenje na ekranu i prestaje s radom.
$ ./GA 22
Program u radu ispisuje najbolje međurezultate na ekranu, a kad se obave sve iteracije
algoritma, najbolje pronađeno rješenje (Tablica 5.1). Važno je napomenuti da se konačno
rješenje ispisuje na ekranu, ali ne i u nekoj datoteci, pa je potrebno dobiveno rješenje ručno
sačuvati nakon završetka rada programa.
Tablica 5.1. Primjer ispisa stanja iteracije
…
plot "22", 5.668812+3.770904*x+3.717413*sin(1.123434*x+9.955155)+11.
697889*sin(0.689043*x+3.122941)+-2.108214*sin(1.626793*x+-5.656446)+2
.028031*sin(1.807326*x+-8.189608)+14.352562*sin(0.185584*x+3.752040)+
5.751334*sin(1.494461*x+-3.763075)+-10.421261*sin(1.702628*x+-0.00404
7)+1.944271*sin(1.999225*x+-7.500324)+-8.549360*sin(1.803168*x+-5.004
815)+4.356705*sin(1.249228*x+3.747235)+-1.474038*sin(0.542869*x+-4.32
4821)+1.582881*sin(0.964173*x+-9.024443)
pause -1 "# 61999 # f(x)=-274.076265"
…
Kako je sve u Lispu S-izraz, isto je i sa stablom izraza (Tablica 5.3). Ono je građeno od manjih
stabala, konstruiranih iz pojedinih gena, a povezanih zajedničkom povezujućom funkcijom.
Za primjer u tablicama odabrano je zbrajanje, jer je ono najčešći odabir.
Tablica 5.3. Izgrađeno stablo izraza iz prethodnog primjera u obliku S-izraza
(+
(+
(sin x)
(log x))
(÷
(exp x)
(cos x)))
U trenutku izvršavanja S-izrazi se gledaju kao matematički izrazi u prefiksnom zapisu. Ovaj
način zapisa nešto je teži ljudima za čitanje od uobičajenog, infiksnog zapisa. Naprotiv,
računalu ono predstavlja mnogo jednostavniju strukturu, lakšu za obradu i evaluaciju, jer
nema potencijalnih dvosmislenosti kao kod infiksnog zapisa.
(5.2)
Ovakva funkcija dobrote osigurava put prema optimumu, prema nuli, jer je jedino tada
dosegnuto idealno poklapanje funkcije i njene aproksimacije.
Tablica 5.4. Struktura jedinke korištena u implementaciji algoritma
(kromosom
stablo-izraza-kao-S-izraz
stablo-izraza-kao-strojni-jezik
dobrota)
Struktura podataka jedinke u memoriji je zapravo lista od četiri elementa: kromosom, stablo
izraza u obliku S-izraza, stablo izraza prevedeno u strojni jezik i vrijednost funkcije dobrote
jedinke (Tablica 5.4). Stablo izraza u obliku S-izraza se čuva zbog eventualnog ispisa na ekran.
Kako se ista funkcija poziva za mnogo ulaznih točaka, veliko se ubrzanje računanja dobije
prevođenjem S-izraza u strojni jezik. Naime, ukoliko se spomenuto prevođenje ne obavi,
ugrađena evaluacijska funkcija eval to radi svaki put kad se pozove. Očito je da se zbog
brzine izvođenja isplati prevesti S-izraz u strojni jezik.
Ulazne datoteke
Program koristi tri ulazne datoteke. Kako one sadrže strukture zapisane u standardnom
obliku jezika Lisp, na prvi tren su malo zbunjujuće. Za vrijeme razvoja aplikacije ovog
diplomskog rada, koristile su se sljedeće datoteke:
Izlazne datoteke
Uz ispisivanje najnužnijih informacija o iteraciji na ekranu, program stvara tri izlazne
datoteke s rezultatima optimiranja:
CL-USER> (main)
Program zatim čita podatke iz ulaznih datoteka, priprema početnu populaciju te pokreće
proces optimizacije. Za vrijeme trajanja optimizacije, periodički se ispisuje napredovanje
najbolje jedinke kroz iteracije (Tablica 5.5). Povećavanje dobrote najbolje jedinke znak je
dobrog rada algoritma i postupno približavanje optimumu. Kad se odrade sve iteracije,
ispisuje se znak „T“ (oznaka istinitosti u Lispu), koji označava uspješan završetak rada.
Tablica 5.5. Primjer ispisa dobrote najbolje jedinke svakih 100 iteracija
Optimal fitness: 0
i = 0: Best fitness = -1324105023.3028002000
i = 100: Best fitness = -441129105.3803288000
i = 200: Best fitness = -174028712.4330331000
i = 300: Best fitness = -120330342.2389534900
i = 400: Best fitness = -76211144.9210937300
…
i = 4000: Best fitness = -5512158.7813292510
T
Manji skup sastoji se od 20 proizvoljno odabranih točaka, gdje je vrijednost yi svake točke iz
intervala . Zbog brže optimizacije nad malim skupom, može se napraviti više analiza
osjetljivosti na promjene ulaznih parametara algoritma. Stoga su odabrani najzanimljiviji
parametri – duljina glave gena, broj gena u kromosomu, broj iteracija algoritma i broj jedinki
u populaciji. Testno računalno je Intel Core2 Duo procesor na 2,13 GHz, 2 GB radne
memorije i operacijski sustav Microsoft Windows XP.
Vjerojatnost:
- mutacije kromosoma pM 0,07
- premještanja niza za umetanje 0,1
- premještanja niza za umetanje 0,1
korijena
- premještanja gena 0,1
- križanja s jednom točkom prekida 0,4
- križanja s dvije točke prekida 0,5
- rekombinacije gena 0,3
Skup raspoloživih funkcija činile su sljedeće funkcije: sinus, kosinus, tangens, e x, kvadratni
korijen i četiri aritmetičke operacije.
Tablica 6.2. daje statističku analizu kvalitete najbolje jedinke. Već je rečeno da je njena
dobrota jednostavno dobivena, negiranjem sume kvadrata odstupanja. Dijeljenjem te sume
s brojem uzoraka dobiva se srednje kvadratno odstupanje (pogreška, engl. mean squared
error). Kvadratni korijen te vrijednosti daje srednje odstupanje aproksimacije u odnosu na
originalnu funkciju. Kako ta vrijednost rijetko nešto znači, slijedi određivanje
iznosa relativnog srednjeg odstupanja (pogreške), dijeljenjem srednjeg odstupanja i
prosječne vrijednosti ulaznog skupa. Stoga, relativno srednje odstupanje najbolje jedinke
iznosi jako dobrih 2,5 %.
Tablica 6.2. Kvaliteta najbolje aproksimacije manjeg skupa točaka
Podatak Vrijednost
suma kvadrata odstupanja 58,47
broj uzoraka 20
srednje kvadratno odstupanje 2,924
srednje odstupanje ±1,71
prosječna vrijednost uzorka 68,3
relativno srednje odstupanje ≈ ±2,5 %
Slika 6.2. Poklapanje originalne funkcije i njezine aproksimacije za manji skup točaka
Slika 6.2. prikazuje poklapanje originalne funkcije i njene aproksimacije dobivene radom
programiranja genskih izraza. Kako je aproksimacijska funkcija g(x) iznimno složena (Tablica
6.3), njen graf je prikazan u znatno pojednostavljenom obliku. Za svaki xi određene su
odgovarajuće vrijednosti g(xi) te naknadno povezane linearnim odsječcima. Pravi izgled grafa
nije pregledan, jer funkcija ima mnogo prekida i/ili skokova u beskonačnost. Razlog ovakvom
izgledu grafa funkcije g(x) jest nepostojanje uvjeta njene neprekinutosti. Ukoliko je
postavljen, može se ispuniti korištenjem samo funkcije sinus te operacija zbrajanja i
množenja, tj. upotrebom funkcija iz Fourierovog reda.
Tablica 6.3. S-izraz konačne aproksimacijske funkcije g(x)
Porastom duljine glave konačno rješenje postaje sve bolje i bolje (Slika 6.3). Kada duljina
glave dosegne šest elemenata, konačno rješenje postaje blisko optimumu pa dodatno
produljenje glave primjetno ne popravlja rješenje. Kako se metoda optimiranja zasniva na
slučajnim procesima, veća duljina glave ne osigurava nužno i bolje konačno rješenje. Na
primjer, za glavu dugu 8 elemenata, konačno rješenje je nekoliko puta gore i od onog s
kraćom glavom i od onog s duljom glavom. Stoga je nužno nekoliko puta ponoviti
optimizaciju i od dobivenih rješenja odabrati najbolje, radi izbjegavanja ovakvih situacija.
Drugi graf prikazuje trajanje procesa optimizacije u ovisnosti o duljini glave (Slika 6.4). Uz
stvarne podatke, ubačena je funkcija trenda porasta trajanja. Pokazalo se da je trajanje
optimizacije linearno proporcionalno s duljinom glave. Odstupanja stvarnih vrijednosti od
linearne funkcije najvjerojatnije su uzrokovana složenošću cijele populacije. Ukoliko
prevladavaju jednostavnije jedinke, evaluacija se brže izvodi pa je i cijeli algoritam brži.
Slika 6.4. Trajanje optimizacijskog procesa za različite duljine glave i trend porasta
Slika 6.5. prikazuje graf kvalitete najbolje pronađene jedinke. Najbolji rezultati se postižu za
broj gena od 30 do 60. Kao i u prethodnom poglavlju, algoritam zbog svoje stohastičke
prirode nije došao do boljeg rješenja za broj gena 40 i 50, što ne znači da ne može.
Za kromosome s brojem gena manjim od 30 nema puno pomoći, jer ne daju dovoljno
članova u konačnoj funkciji, a rješenje može biti produljenje glave gena. Slično, porastom
broja gena preko 60 drastično opada kvaliteta najbolje jedinke. To znači da je kromosom
presložen za efikasno rješavanje u okviru ulaznih parametara, tj. vjerojatno je dovoljno samo
povećati broj iteracija i algoritam će doći bliže optimumu.
Slika 6.6. Trajanje optimizacijskog procesa za različit broj gena i trend porasta
Kao i u prethodnim poglavljima, druga slika (Slika 6.8), prikazuje porast trajanja izvođenja
optimizacijskog algoritma. I u ovom slučaju je očita linearna ovisnost o mijenjanom
parametru. Oscilacije oko linearne funkcije naročito su došle do izražaja kod velikog broja
iteracija.
Slika 6.8. Trajanje optimizacijskog procesa za različit broj iteracija i trend porasta
Na prvi pogled, neočekivana je linearna ovisnost brzine rada algoritma o veličini populacije
(Slika 6.10). Razlog ovome je stvar implementacije populacije u programskom jeziku. Naime,
populacija se sprema u obliku vezane liste zbog čega je gornja granica trajanja pristupa
nekom njenom elementu određena s O(n). Ovaj problem se rješava korištenjem običnog niza
ili tablice raspršivanja, gdje je trajanje pristupa elementu određeno kao O(1).
Slika 6.9. Najbolja dobivena rješenja za različite veličine populacije
Slika 6.10. Trajanje optimizacijskog procesa za različite veličine populacije i trend porasta
6.1.6. Osjetljivost kvalitete rješenja o vjerojatnosti mutacije
Operator mutacije tjera evolucijski proces naprijed zbog mogućnosti izbacivanja populacije iz
lokalnog optimuma. Ovo je najvažniji parametar evolucijskog programa i kvaliteta konačnog
rješenja je najosjetljivija na njegovu vrijednost. Stoga je zanimljivo vidjeti kako učestalost
javljanja mutacije utječe na kvalitetu konačnog rješenja (Slika 6.11). Učestalost javljanja je
definirana preko parametra vjerojatnosti mutacije. U analizama se vjerojatnost mutacije
povećavala od 5 do 90 ‰, a broj iteracija smanjen je na 4000 kako bi se svako optimiranje
moglo ponoviti bar deset puta.
Slika 6.12. prikazuje napredovanje najbolje jedinke za dva iznosa vjerojatnosti mutacije, za 4
% i za 7 %. Manji iznos vjerojatnosti je osigurao gotovo idealnu krivulju napretka najbolje
jedinke. U početnim iteracijama se jedinka iznimno brzo poboljšava, zatim se taj trend
postupno smanjuje i nakon „koljena“ praktički više nema značajnog napretka. Ovakav izgled
grafa označava temeljitiju pretragu prostora rješenja i sigurnije kretanje prema globalnom
optimumu. U idealnom slučaju, ovaj bi se graf poklapao s grafom eksponencijalne funkcije.
Slika 6.12. Usporedba napredovanja najbolje jedinke za vjerojatnosti mutacije 4 % i 7 %
Veći iznos vjerojatnosti mutacije (7 %, iz poglavlja 6.1.1) pokvario je izgled grafa. On sad ima
dosta iznenadnih skokova i manje podsjeća na eksponencijalnu funkciju. Takav izgled
naznaka je prevelike vjerojatnosti mutacije i zapravo sreće da je algoritam našao put prema
boljem rješenju. Na kraju optimiranja, manja vjerojatnost mutacije dovela je algoritam do
boljeg rješenja (-130,567 nasuprot -292,5 jedinica dobrote).
Iz ovih saznanja zaključuje se da manja vjerojatnost mutacije osigurava sporiji, ali stabilniji
put prema globalnom optimumu. Njezin veći iznos daje nepredvidljivije kretanje najbolje
jedinke i u konačnici možda gori rezultat.
Skup od 20 točaka koji se dosad koristio, razmjerno je malen ulazni skup i sposobnost
algoritma da riješi problem se demonstrira nad većim skupovima. Traženje aproksimacija
većih skupova je čest slučaj u praksi, pogotovo u sustavima za predviđanje kretanja
vrijednosti promatrane veličine u budućnosti. Najčešće je riječ o kretanju cijene raznih
energenata ili dionica neke tvrtke.
Stoga je napravljen skup od 100 vrijednosti, ali ne slučajno odabranih, već iz stvarnog života.
Riječ je o vrijednostima dionice na Zagrebačkoj burzi. Konkretno, uzete su zadnje dnevne
vrijednosti dionica INA-e (simbol „INA-R-A“), iz razdoblja od 1. prosinca 2006. do 26. travnja
2007. Podaci su preuzeti sa službenih stranica Zagrebačke burze [14].
Tablica 6.4. Ulazni parametri algoritma za veći skup točaka
Vjerojatnost:
- mutacije kromosoma pM 0,07
- premještanja niza za umetanje 0,1
- premještanja niza za umetanje 0,1
korijena
- premještanja gena 0,1
- križanja s jednom točkom prekida 0,4
- križanja s dvije točke prekida 0,5
- rekombinacije gena 0,3
Tablica 6.4. popisuje ulazne parametre različite od onih u poglavlju 6.1.1. Testno računalo
isto je kao i u navedenom poglavlju.
Slika 6.13. Poklapanje originalne funkcije i njezine aproksimacije za veći skup točaka
Optimizacijski proces trajao je oko 8 sati i 15 minuta. Slika 6.13. prikazuje odnos originalne
funkcije i najbolje pronađene aproksimacije. Kako funkcija originala nije poznata, a funkcija
aproksimacije iznimno složena (Tablica 6.5), obje su prikazane u svom jednostavnom obliku –
pomoću linearnih odsječaka za vrijednosti između svakog g(xi).
Kao i kod svake metode optimiranja, najbolja jedinka je jako brzo napredovala kroz prve
generacije, da bi nakon prolaska „koljena“ napredovanje stagniralo u blizini globalnog
optimuma ili rješenja dosežnog uz zadane ulazne parametre (Slika 6.14). Dobrota najbolje
jedinke iznosila je oko -1,2 milijuna jedinica dobrote. Kako je vidljivo iz grafa, algoritam je
došao do najboljeg rješenja do kojeg je mogao doći. Daljnje optimiranje ne bi puno popravilo
najbolju jedinku. Bolji put je redefiniranje ulaznih parametara i ponovno pokretanje
programa.
Tablica 6.5. S-izraz najbolje aproksimacije većeg skupa točaka
Statistički gledano, rješenje s ovako velikom sumom kvadrata odstupanja ipak nije toliko loše
kakvo se čini na prvi pogled. Računanjem srednjeg odstupanja pa njegovog relativnog iznosa,
dobije se odstupanje od približno 4 % u odnosu na ulazni skup, a to u mnogim slučajevima
može biti dovoljno dobro (Tablica 6.6).
Tablica 6.6. Kvaliteta najbolje aproksimacije većeg skupa točaka
Podatak Vrijednost
suma kvadrata odstupanja 1 200 000
broj uzoraka 100
srednje kvadratno odstupanje 12000
srednje odstupanje ±110
prosječna vrijednost uzorka 2711,85
relativno srednje odstupanje ≈ ±4 %
Ulazni skup je isti kao u poglavlju 6.1. Od parametara programiranja genskih izraza, jedina
promjena u odnosu na one iz poglavlja 6.1.1. je povećan broj iteracija na 10 tisuća. Tablica
6.7. popisuje parametre jednostavnog genetskog algoritma.
Tablica 6.7. Parametri jednostavnog genetskog algoritma
Parametar Vrijednost
Broj iteracija 100 000
Broj bitova reprezentacije 26
Veličina populacije 70
Jedan od važnijih razloga tolike razlike u brzini je izbor programskog jezika. Program
genetskog algoritma je napisan u programskom jeziku C++, koristi nizove cijelih brojeva te
obavlja osnovne logičke i aritmetičke operacije nad njima. Sve su te operacije izravno
podržane u hardveru računala i zbog toga se najbrže izvode. Common Lisp (tj. njegova
implementacija CLISP), prvo prevodi naredbe jezika u svoj vlastiti međukod, a on se dalje
prevodi u odgovarajući strojni kod tek kad se pokrene program na nekom računalu. Kako se
interpretiranje međukoda obavlja za svaku naredbu, njihovo izvršavanje je dosta sporije od
onih iz jezika C. Također, intenzivno korištenje listi, a ne nizova, dodatno usporava
implementaciju programiranja genskih izraza.
Tablica 6.8. Usporedba konačnih rješenja dvije metodologije
Rješenje dobiveno radom genetskog algoritma ima dvostruko veću pogrešku od najbolje
jedinke drugog algoritma, makar je odradio 10 puta više iteracija. Rješenje se može popraviti
dodavanjem još sinusnih članova u aproksimacijsku funkciju prema izrazu (5.1). Slika 6.15.
prikazuje iznose obiju konačnih funkcija za svaki xi iz ulaznog niza. Radi preglednosti grafa,
konačne funkcije su prikazane u točkastom obliku.
7. Zaključak
Odabir evolucijskog procesa kao osnovu nekog optimizacijskog algoritma, pokazao se kao
smjela, ali dobra odluka. Oba testirana algoritma su pokazala sposobnost dostizanja jako
dobrog rješenja u relativno kratkom roku. Programiranje genskih izraza, kao tema ovog
diplomskog rada, za nekoliko je redova veličine sporija metoda optimiranja od genetskog
algoritma, ali zato dostiže bolje konačno rješenje i ima širu primjenjivost.
Bez obzira na navedene nedostatke, programiranje genskih izraza se pokazala kao iznimno
moćna metoda, jednostavna za implementaciju i korištenje te sposobna odrediti najbolje
aproksimacije nepoznatog skupa točaka.
8. Literatura
[1] Vidljive značajke jedinke (npr. boja kose, visina, težina i sl).
[2] Genetski identitet jedinke; predstavlja cjelokupni genetski sastav jedinke iz kojeg se oblikuje fenotip.
[3] Slika preuzeta sa stranice: http://en.wikipedia.org/wiki/DNA , 12. siječnja 2008.
[4] Strogo matematički gledano nulu je potrebno posebno naglasiti obzirom da ona nije ni pozitivan ni
negativan broj. Ipak, zbog jednostavnosti, ona će se podrazumijevati kao dio skupa pozitivnih cijelih brojeva.
[5] Slika preuzeta sa stranice: http://www.stanford.edu/group/Urchin/meiosis.htm , 29. siječnja 2008.
[6] Introni su neaktivni isječci DNK, zaostali kroz evoluciju unutar molekule. Oni danas nemaju poznatu funkciju,
a pretpostavka je da su nekad u prošlosti bili aktivni dio DNK (egzoni).
[7] Svi materijali se nalaze na CD-u priloženom uz ovaj diplomski rad.