Kapitel 13. Genetiska algoritmer

Kapitel 13. Genetiska algoritmer
Som vi tidigare sett, är det i allmänhet svårt att finna det globala minimet för en funktion av många
variabler. Det betyder också att det inte är lätt att hitta på en metod att finna den konfiguration som ger
den lägsta energin för ett fysikaliskt system.
Den genetiska algoritmen är en metod man kan använda för att försöka nå detta mål. Idén har lånats
från den biologiska evolutionsprocessen, där mutationer och arvet från föräldrarna som överförs till den
nya generationen spelar en viktig roll. Lämpligheten (”fitness”) används som test för välja ut en genetisk
struktur för kromosomen, som får representera individen. Metoden infördes av J.H. Holland (1975) och
har utvecklats vidare av Goldberg (1989). Många varianter av den genetiska algoritmen har kommit till på
senare tid, och går under det allmännare namnet evolutionära algoritmer (”biologisk naturvetenskap”). En
översikt av evolutionär beräkning och artificiell intelligens har skrivits av David Fogel1.
1 David B. Fogel: Evolutionary computation, IEEE Press. 1995
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
1
Evolutionära beräkningar har en lång historia. Att evolution är en inlärningsprocess insåg man redan på
1930–talet. Den matematiska biologen Nils Barricelli experimenterade år 1953 med artificiellt liv på en dator
i Princeton genom att placera tal i ett nät och flytta på dem enligt vissa regler. Hans experiment påminde
mycket om ”Game of Life”, som introducerades av den brittiska matematikern John Conway år 1970. Senare
utvecklade Michael Conrad evolutionära algoritmer för att simulera evolution av ekosystem. Friedberg och
Fogel introducerade också redan på 1960–talet metoder att simulera evolution för att åstadkomma artificiell
intelligens.
Istället för att koda konfigurationerna som kromosomer, är det möjligt att variera kodningssättet, så att
programmet i praktiken kodar sig självt. Detta sätt att direkt manipulera eller alstra optimala program som
baserar sig på evolutionsidén kallas för genetisk programmering, och uppfanns av Fogel redan år 1962.
Här skall vi bara nöja oss med att ge en kort introduktion till genetiska algoritmer utan några programexempel. För Matlab finns ett verktyg för genetiska algoritmer (The Genetic Algorithm Toolbox for
MATLAB, http://www.shef.ac.uk/acse/research/ecrg/gat.html).
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
2
13.1. Kodning av genetiska algoritmer
Vid konstruktionen av en genetisk algoritm försöker man följa en biologisk evolutionsprocess där man väljer
den väg som leder till en optimal konfiguration av ett komplext system. Ett växelverkande flerkropparssystem
kan man t.ex. bringa i jämvikt genom att överföra det till en konformation som representerar det globala
minimet på potentialenergiytan. Det är alltså fråga om optimering, som kan beskrivas matematiskt så, att
man uppsöker det globala minimet för en funktion av flera variabler g(r1, r2, . . . , rn). Optimeringen kan
också inkludera tvångsvillkor.
Vi skall här nöja oss med att beskriva en binär version av den genetiska algoritmen, som följer en evolutionär
process. Fördelen med en binär genetisk algoritm är att den är enkel, och uttrycker evolutionen med hjälp
av binära kromosomer. I en binär algoritm, representeras varje variabelkonfiguration (r1, r2, . . . , rn) av
en binär sträng (talräcka). Denna räcka kan lagras i datorn som en heltalig talräcka, där varje element
innehåller talet 1 eller 0, eller en räcka av logiska element, som innehåller en bit som är falsk (0) eller sann
(1) (en ”gen”).
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
3
En genetisk algoritm kan uppdelas på flera steg. Vi börjar med att konstruera en ursprungspopulation
av konfigurationer, som kallas för en genpool. Sedan väljer man några medlemmar av den, som får vara
föräldrar och ge upphov till avkomma. Sättet att blanda föräldrarnas gener kallas korsning (crossover på
engelska), och anger hur de genetiska egenskaperna går i arv. För att alstra äkta avkomma, delas föräldrakromosomerna i segment som utbyts och kombineras så att det bildas nya kromosomer för avkomman.
Därefter låter man en viss procent av bitarna i kromosomerna att undergå mutation. Under hela processen
används lämpligheten (fitness på engelska) av varje konfiguration baserad på kostnaden (dvs den funktion
som skall optimeras) g(r1, r2, . . . , rn) som kriterium för att välja föräldrar och sortera kromosomerna
för nästa generation i genpoolen. I de tre viktigaste operationerna i varje generation (dvs urval, korsning
och mutation) ser man till att de bästa konfigurationerna med de lägsta kostnaderna alltid överlever (går
vidare).
Den ursprungliga populationen för genpoolen väljs vanligen slumpmässigt. En sorteringsmetod används för
att klassificera kromosomerna enligt deras lämplighet. Vid initialiseringen av genpoolen är valet av populationens storlek viktigt. Även om varje konfiguration representeras av en bestämd kromosom, så kommer ett
bra val av populationens storlek att leda till optimering av simuleringens konvergenshastighet. Om populationen är alltför liten, kommer det att ta mera tid att sampla hela det möjliga konfigurationsrummet,
men om populationen är för stor, kommer det att ta längre tid att konstruera nya generationer. En annan
viktig sak är kvaliteten av den ursprungliga genpoolen.
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
4
Om vi använder alla konfigurationer som alstras slumpmässigt, så kommer kvaliteten av genpoolen att
vara låg, och det leder till att konvergensen blir långsam. Istället konstruerar man vanligen mera kromosomer i början än vad som behövs för att få fler valmöjligheter. Om vi t.ex. strävar efter en population
av ng kromosomer i genpoolen, så kan vi slumpmässigt alstra ett större antal kromosomer (t.ex. 2ng
stycken), och därav välja de ng kromosomer som har den minsta kostnaden. Vi måste koda varje konfiguration i en kromosom och också beräkna den motsvarande kostnaden. Sedan vi beräknat kostnaderna
för alla konfigurationer, rangordnar vi dem efter hur bra de är enligt ett sorteringsschema. Eftersom vi vill
notera rangordningen och använda den för att numrera kromosomerna på nytt, så måste vi ge dem ett
rankningsindex i sorteringsprocessen.
Vi skall nu beskriva, hur en konfiguration kan kodas. Emedan vi vill simulera den genetiska processen så
noggrant som möjligt, så måste vi konvertera varje konfiguration (r1, r2, . . . , rn) till en kromosom. Vi
antar att variablerna ri hör till intervallet [0, 1], dvs 0 ≤ ri ≤ 1 för i = 1, 2, . . . , n. Vi kan koda
en godtycklig variabel inom intervallet [0, 1] som en binär sträng, där varje bit antingen har ett sant eller
ett falskt värde. Om den k:te biten är sann, så ingår bråktalet 1/2k i variabeln. Den kan då uttryckas i
∞
X
yij
yi2
yi3
yi1
, där yij är ett heltal som antingen är 0 eller 1.
formen ri = 2 + 4 + 8 + . . . =
j
2
j=1
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
5
Vi kan avkorta den binära strängvariabeln vid en viss siffra m, vars värde beror på hur noggrant vi önskar
m
X
yij
. Om t.ex. ri = 0.93, så får vi yi1 = yi2 = yi3 = 1
uttrycka ri, Vi får då (approximativt) ri ≈
j
2
j=1
och yi4 = 0, och om ri = 0.6347, så har vi yi1 = yi3 = 1 och yi2 = yi4 = 0, om m = 4. Det
största felet i ri som uppstår på detta sätt är ±1/2m+1.
Processen varigenom yij alstras, kallas kodning och uttryckas genom formeln:
2
3
j−1
X j−k−1 5
j−1
4
yij = int 2 ri −
(2
yik ) ,
j = 2, 3, . . . , m
k=1
Vi antar att int-operationen kommer att avrunda värdet som som står innanför klammeruttrycket till det
närmaste heltalet (antingen 0 eller 1), för i = 1, 2, . . . , n. Observera, att yi1 = int[ri].
Kodningen är en process, som uttrycker ri i form av en binär räcka där varje element innehåller en bit som
är sann eller falsk, och motsvarar ett heltal 0 eller 1. Denna binära räcka yij , j = 1, 2, . . . , m kallas för
kromosomens i:te gen. Kromosomen är en binär representation för hela räckan (r1, r2, . . . , rn).
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
6
Den omvända proceduren är också nödvändig då vi vill använda konfigurationsinformationen vid beräkningen av kostnadsfunktionen eller skriva ut de slutliga konfigurationerna. För att avkoda en kromosom används
den approximativa formeln för ri. Om vi t.ex. har en kromosom w = [1010111001 . . .] och m = 10,
så är den motsvarande variabelns värde
1
1
1
1
1
1
r1 ≈ + 3 + 5 + 6 + 7 + 10 ≈ 0.6807.
2
2
2
2
2
2
Observera, att osäkerheten i r1 bestäms här av valet av m, som beräknas ur ±1/2m+1 ≈ ±0.0005
i detta fall. Avkodningen är lätt att programmera. Kodningsprceduren kan nu användas för att alstra
en ursprungspopulation som sorteras med kostnadsfunktionen. Därpå kan vi klara av de tre viktigaste
operationerna, urval, korsning och mutation.
Vi måste kunna välja en bråkdel av kromosomerna från den givna genpoolen för att kunna överföra generna. Därigenom simuleras den naturliga reproduktionsprocessen. Enligt Darwin är det sannolikast att de
kromosomer som överlever har den lägre kostnaden. Man har utvecklat olika metoder som följer denna
princip för att välja föräldrarna. Enklast är att välja ut den bästa hälften av kromosomerna från hela populationen utgående från kostnaderna. Sedan kan man slumpmässigt välja det ena paret efter det andra från
föräldrapoolen för att alstra avkomma. En annan möjlighet är att välja en kromosom från hela populationen
med en sannolikhet som baserar sig på en tillordnad vikt antingen beroende på dess kostnadsrankning eller
på den relativa kostnaden.
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
7
Den populäraste metoden är att ordna turneringar, där två eller flere deltagare väljs slumpmässigt, och
vinnaren är den som har den bästa (lägsta) kostnaden. Observera, att varje medlem av poolen får delta, men
endast i en match. Hälften av kromosomerna i poolen (nr = ng /2) väljs till föräldrar utan fördubbling.
Denna metod leder till att den bästa kromosomen stannar kvar, och den sämsta elimineras.
Några andra turneringsmetoder tillåter fördubblingar. Man kan t.ex. få två kopior av den bästa kromosomen
genom att låta varje kromosom delta i två matcher. Man brukar också blanda om indexen före matcherna,
så att deltagarna väljs ut slumpmässigt med lika stor sannolikhet.
Alstrandet av genpooler har hittills baserat sig på slumpmässigt valda bitar, och därefter har vissa gener
utsetts till föräldrar. Nästa steg är att hitta på ett sätt att utforska kostnadsytan. Det finns två operationer
i den genetiska algoritmen, som kan behandla hela variabelrummet. Den ena operationen kallas crossover
(överkorsning), som efterliknar den naturliga reproduktionsprocesssen. Vi kan välja ett par föräldrar ur
föräldrapoolen, dela varje föräldrakromosom i två segment vid en viss punkt, och sedan förena den ena
förälderns högra segment med den andra förälderns vänstra segment, och tvärtom. På detta sätt alstras
två nya kromosomer för avkomman.
Om t.ex. de två föräldrakromosomerna är w1 = {01101010} och w2 = {10101101}, så är de två
kromosomerna för avkomman w3 = {01101101} och w4 = {10101010}, om korsningspunkten väljs
i mitten av kromosomerna.
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
8
Överkorsning är ett av de effektivaste sätten att utforska kostnadsytan för alla de tänkbara konformationerna. Vi har beskrivit ett schema med endast en korsningspunkt, men det finns också andra metoder, där
man använder flere delningspunkter.
Observera, att vi har varje gång parat ihop två medlemmmar från föräldrapoolen för att alstra två ättlingar
genom korsningsmetoden. Vi kan också välja föräldrarna på annat sätt från poolen. Sedan vi avslutat
reproduktionen av nr = ng /2 ättlingar, måste vi ordna på nytt alla kromosomer, både föräldrar och
avkomma, i ökande kostnadsordning. Detta är nödvändigt för att förbereda genpoolen för mutationer, som
vi härnäst skall studera.
Ett annat sätt att utforska kostnadsytan i den genetiska algoritmen är att använda mutationsprocessen.
Detta sker genom slumpmässig omkastning av bitarna i slumpmässigt valda kromosomer, varvid man väljer
ett slumptal, som anger positionen för den bit i kromosomen som skall bytas ut. Det finns två saker att
beakta vid mutation.
Den ena är hur stor del av bitarna i hela genpoolen som skall muteras i varje generation. Ofta väljer man
omkring 1 % av bitarna slumpmässigt för mutation (0 → 1 och 1 → 0). Ju flere bitar som väljs, desto
större blir fluktuationen. Men om en större bråkdel av bitarna muteras kan kostnadsytan utforskas snabbare,
vilket kan betyda att den lägsta kostnaden förbigås i denna process. Därför måste man experimentera med
olika mutationsprocenter för en given kostnadsfunktion för att kunna finna en kompromiss som tillåter oss
att utforska kostnadsytan tillräckligt snabbt utan att förbigå den bästa kostnadskonfigurationen.
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
9
En annan viktig sak är antalet konfigurationer, som vi önskar att skall vara opåverkade av mutation. I alla
mutationsmetoder förblir den bästa kromosomen alltid oförändrad. Men vi kanske också vill låta några
av de nästbästa kromosomerna vara oförändrade. Detta gör utforskningen av kostnadsytan långsammare
vid mutation, men det ökar konvergenshastigheten, eftersom konfigurationerna redan kan innehålla en stor
andel utmärkta gener i sina kromosomer. I praktiken måste vi experimentera för att finna den lämpligaste
bråkdelen bitar som skall muteras i ett bestämt problem.
Schematiskt skulle man kunna beskriva en genetisk algoritm på följande sätt:
1) Initialisera populationen {ri, i = 1, 2, . . . , n}.
2) Beräkna kostnadsfunktionens värden g(r1, r2, . . . , rn).
3) Korsa två utvalda kromosomer: ri, rj → r 0.
4) Mutera r 0 → r 00.
5) Beräkna kostnadsfunktionens värde g(r 00) för den nya kromosomen.
6) Spara kromosomen r 00 i den nya populationen.
7) Avsluta om lösningen är bra; upprepa annars proceduren.
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
10
13.2. Thomsons problem
Som en tillämpning skall vi studera Thomsons problem, som introducerades av J.J. Thomson år 1904 då han
utvecklade sin plumpudding-modell för atomen. Problemet som gällde hur man kan finna grundtillståndet
för ett antal klassiska elektroner på ytan av en sfär, kan också formuleras allmännare så att man söker
den laddningskonfiguration som minimerar den elektrostatiska energin under ett antaget jämviktsvillkor.
Man kan t.ex. visa att varje ledare i ett system bildar en ekvipotentialyta om laddningen på varje ledare är
konstant och den totala elektrostatiska energin minimeras. Emellertid uppstår det problem om man försöker
bestämma jämviktskonfigurationen för ett större antal diskreta laddningar, t.ex. den stabila geometrin för
nc identiska punktladdningar på ytan av en enhetssfär (Thomsons problem). Problemet är komplext på
grund av dess olinjära egenskaper och det stora antalet låga energinivåer.
Exakta lösningar känner man endast i vissa fall. Vi kan t.ex. visa, att laddningarna kommer att täcka hela
ytan likformigt då nc → ∞, och att vissa symmetriska konfigurationer leder till stabila konfigurationer
för små värden av nc. För nc = 3 får man t.ex. en liksidig triangel, för nc = 4 en tetraeder, för nc = 8
ett ”sammantryckt kubiskt antiprisma” etc. Ju större nc blir, desto svårare blir problemet. Då nc är 200,
blir antalet lågtliggande energinivåer omkring 8000. Problemet anses fortfarande vara olöst för stora värden
av nc. De bästa resultaten för nc ≤ 200 har erhållits med en genetisk algoritm2.
2 J.R. Morris, D.M. Deaven, och K.M. Ho, Phys. Rev. B, 53 (1996) R1740.
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
11
Matematiskt kan man uttrycka Thomsons problem så, att man söker efter den konfiguration som minimerar
den elektrostatiska energin
nc
1
q2 X
,
U =
4π0 i>j=1 |r i − r j |
om laddningen q på varje partikel är konstant, 0 är den elektriska permittiviteten i vakuum, och ri är den
i:te laddningens positionsvektor. Eftersom alla laddningarna begränsas till ytan av en sfär, så är ri = 1.
För enkelhetens skull brukar man sätta q 2/4π0 = 1. Om de kartesiska koordinaterna uttrycks i sfäriska
koordinater, fås
xi = sin θi cos φi
yi = sin θi cos φi
zi = cos θi (ri = 1).
I den genetiska algoritmen kommer givetvis kostnadsfunktionen att motsvaras av den elektrostatiska energin.
Thomsonproblemet är intressant, eftersom antalet lågtliggande exciterade tillstånd växer exponentiellt med
antalet laddningar. Å andra sidan vet vi att lösningen är den konfiguration, som sprider ut laddningarna så
likformigt som möjligt, laddningarna försöker att undvika varandra så mycket som möjligt, men emedan
de är begränsade till en ändlig yta leder det till en kompromiss. En Java applet för att lösa problemet med
olika metoder finns här: http://physics.syr.edu/condensedmatter/thomson/thomsonapplet.htm
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
12
Morris beskriver den genetiska algoritmen som användes i den nämnda artikeln på följande sätt. Utgående
från ett litet antal initiala geometrier konstruerades ett antal strukturer, som härleder sina egenskaper
från två av de ursprungliga geometrierna. Av denna population utvaldes de strukturer som hade de lägsta
energierna (dvs de ”bästa” strukturerna) och fick ersätta de ursprungliga geometrierna.
Genom upprepning av denna procedur erhölls strukturer med lägre energi. I allmänhet kan man också
använda andra sökkriterier som beaktas på så sätt, att man först konstruerar en lämplighetsfunktion, som
avspeglar de olika kriterierna, och därpå optimerar denna funktion med en urvalsprincip.
En av svårigheterna är att energiberäkningar tar tid, speciellt om man använder noggranna strukturmodeller.
I stället för arbeta med genetiska sekvenser, vilket är ineffektivt då man vill studera strukturer, arbetade
Morris direkt med själva strukturerna. En ny struktur genererades från två slumpmässigt valda hälfter av
föräldrastrukturer, under antagandet att antalet partiklar bevarades. Varje struktur underkastades därpå
relaxation. På detta sätt kunde man alstra nya strukturer som bevarade föräldrastrukturernas viktigaste
egenskaper, och kunde ändå utforska olika lokala minimer på funktionsytan.
Vid beräkningen alstrades först fyra slumpmässiga geometrier. Med hjälp av alla de möjliga paren av
initialgeometrier konstruerades därpå 16 nya strukturer, och av dessa 20 strukturer valdes de fyra bästa
kandidaterna ut under antagandet att ingen struktur får dominera hela populationen. På detta sätt kunde
man finna strukturer ända upp till nc = 200. Liknande metoder har också använts på mera realistiska
atommodeller, såsom Lennard-Jones potentialmodeller och atomkluster.
Vetenskapliga beräkningar III, Tom Sundius 2008
JJ J I II ×
13