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