- Oddelek za matematiko

Transcription

- Oddelek za matematiko
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