1.1 Generalităţi Algoritmii genetici fac parte din categoria algoritmilor de calcul evoluţionist şi sunt inspiraţi de teoria lui Darwin asupra evoluţiei. Idea calculului evoluţionist a fost introdusă în 1960 de I. Rechenberg în lucrarea intitulată Evolution strategies. Algoritmii genetici au fost aplicaţi cu succes într-o varietate de aplicaţii care necesită optimizarea globală a soluţiei. Algoritmii genetici se referă la un model introdus şi analizat de J. Holland în 1975 şi sunt proceduri adaptive care găsesc soluţia problemei pe baza unui mecanism de selecţie naturală şi evoluţie genetică. Algoritmul este des folosit pentru probleme în care găsirea soluţiei optime nu este uşoară sau cel puţin ineficientă datorită caracteristicilor căutării probabilistice. Algoritmii genetici codifică o soluţie posibilă la o problemă specifică într-o singură structură de date numită cromozom şi aplică operatori genetici la aceste structuri astfel încât să menţină informaţiile critice. Algoritmii genetici pornesc de la o mulţime iniţială de soluţii (de obicei aleasă aleator) numită în literatură populaţie. În această populaţie fiecare individ este numit cromozom şi reprezintă o soluţie posibilă a problemei. În aproape toate cazurile cromozomul este un şir de simboluri (de obicei reprezentat ca un şir de biţi). Aceşti cromozomi evoluează pe durata iteraţiilor succesive numite generaţii. În fiecare generaţie, cromozomii sunt evaluaţi utilizând unele măsuri de potrivire (fitness). Pentru crearea următoarei populaţii cei mai buni cromozomi din generaţia (populaţia) curentă sunt selectaţi şi noii cromozomi sunt formaţii folosind unul dintre cei trei operatori genetici esenţiali: selecţia, crossover şi mutaţia. Selecţia asigură că anumiţi cromozomi din generaţia curentă sunt copiaţi în acord cu valoarea funcţiei lor de potrivire în noua generaţie ceea ce înseamnă că cromozomii cu o importanţă mare au o probabilitate mare să contribuie la formarea noii generaţii. Crossover este un alt operator genetic care reprezintă procesul prin care pe baza a doi cromozomi din populaţia curentă sunt formaţi doi cromozomi pentru populaţia următoare. Mutaţia este procesul prin care un cromozom din populaţia curentă este modificat şi salvat în noua populaţie. 1 of 6
1.2 Codificarea cromozomilor şi problema de optimizare Algoritmii genetici au două componente principale care depind de problema abordată: codificarea problemei şi funcţia de evaluare (de fitness). Cromozomii care reprezintă codificarea problemei trebuie într-o oarecare măsură să conţină informaţiile despre soluţia problemei şi depind foarte mult de problemă. Există mai multe codificări, care au fost utilizate cu succes cum ar fi codificarea binară (cromozomul este format din şiruri de 0 sau 1 care reprezintă binar soluţia problemei) sau codificarea prin valoare (cromozomul este format dintr-un şir de valori vector întregi sau reale care pe ansamblu reprezintă soluţia problemei). De exemplu un cromozom poate avea următoare formă (reprezentat prin valoare): Cromozom 1-0.23 0 0 0.89 0 0.52 0 0 0 0-0.04 0.03 Cromozom 2 0 0 0.08-0.67-0.01 0 0 0 0 0.01 0 0.01 Funcţia de evaluare numită şi funcţia de fitness (potrivire) este funcţia care ne permite să dăm o încredere la fiecare cromozom din populaţie. Această funcţie este de obicei funcţia care reprezintă descrierea problemei. Când trebuie să rezolvăm o problemă, de obicei ne uităm după anumite soluţii care sunt mai bune decât alte soluţii obţinute anterior. Spaţiul tuturor soluţiilor fezabile este numit spaţiul de căutare sau spaţiul stărilor. Problemele abordate folosind algoritmi genetici sunt de obicei probleme pentru care căutarea în spaţiul soluţiilor este o problemă complicată sau chiar (NP-completă). De obicei nu ştim unde să ne uităm după soluţie şi de unde să începem. Soluţiile obţinute folosind algoritmi genetici sunt de obicei considerate ca soluţii bune deoarece nu este întotdeauna posibil să cunoaştem care este optimul real. 1.3 Metode de selecţie a cromozomilor Un alt pas important în algoritmul genetic este cum selectăm părinţii din populaţia curentă care vor alcătuii noua populaţie. Aceasta poate fi făcută în mai multe feluri, dar idea de bază este de a selecta cei mai buni părinţi (în speranţa că aceştia vor produce cei mai buni copii). În acest pas poate apărea o problemă: făcând noua populaţie doar pe baza noilor copii obţinuţii poate duce la pierderea celui mai bun cromozom obţinut până la acel pas. De obicei această problemă este rezolvată prin utilizarea aşa numitei metode de elitism. Adică cel puţin un cromozom care produce cea mai bună soluţie conform cu funcţia de fitness este copiat fără nici o modificare în noua populaţie, astfel cea mai bună 2 of 6
soluţie obţinută până la acel moment să nu se pierde. Ca si metode de selecţie a cromozomilor propunem două metode, fiecare dintre ele cu avantajele şi dezavantajele ei: 1.3.1 Metoda Roulette Wheel (ruleta) În această metodă fiecare individ din populaţia curentă este reprezentat printr-un spaţiu proporţional cu valoarea funcţiei lui de evaluare. Prin eşantionări aleatoare succesive din acest spaţiu de reprezentare a cromozomilor asigură că cei mai buni cromozomi au şanse mai mari să fie selectaţi la un anumit pas decât cei cu mai slabi. Această metodă de selecţie va avea probleme în momentul în care valoarea funcţiei de evaluare diferă foarte mult de la un cromozom la altul. De exemplu dacă cel mai bun cromozom are valoare funcţiei de evaluare mare (care va ocupa 90% din spaţiul de reprezentare) iar restul cromozomilor au valori ale funcţiilor de evaluare foarte mici această metodă va selecta de foarte multe ori cromozomul cel mai bun ducând în final la degenerarea populaţiei. 1.3.2 Selecţia utilizând metoda lui Gauss Paşii propuşi pentru această metodă sunt: 1. Se alege un cromozom din populaţie curentă. 2. Utilizând formula lui Gauss calculăm probabilitatea ca acel cromozom să fie un cromozom bun (Acela care obţine valoarea funcţie de evaluare maximă). P ( M fitness( 2 2σ ( c i ) = e c i )) 2 unde P(.) reprezintă probabilitatea calculată pentru cromozomul c i, M reprezintă media, care aici este valoarea maximă care poate fi obţinută de către funcţia de evaluare şi σ care reprezintă dispersia sau panta cu care scade probabilitatea, iar fitness(c i ) reprezintă valoarea funcţiei de evaluare pentru acel cromozom. De exemplu dacă valoare maximă a funcţiei de evaluare este 1, M va fi 1 iar pentru dispersie propunem o valoare între 0.3-0.5. 3. În al treilea pas această probabilitate calculată este comparată cu o probabilitate aleasă aleator în domeniul [0,1] (Probabilitatea lui Gauss întoarce valori în acest domeniu). 4. Se verifică dacă probabilitatea lui Gauss calculată pentru cromozomul ales este mai mare decât probabilitatea aleasă aleator: 3 of 6
a. Dacă da cromozomul ales aleator se ia în considerare pentru a forma noua populaţie b. Dacă nu se trece din nou la pasul 1 Această metodă asigură posibilitatea luării în considerare şi a cromozomilor care nu au obţinut valori mari pentru funcţia de evaluare (oferă şanse mai mari de evoluţie şi cromozomilor mai slabi). 1.4 Operatorii genetici 1.4.1 Selecţia Pentru acest operator genetic de obicei se selectează doar un singur cromozom din populaţia. Acest cromozom este copiat în noua populaţie fără nici o modificare. Această metodă se mai foloseşte şi pentru a nu pierde cromozomul care a obţinut cea mai bună valoare la funcţia de evaluare (elitism) în populaţia curentă. De asemenea, acest operator se aplică şi pentru alţi cromozomi selectaţi pe baza metodelor de selecţie propuse dar de obicei acest operator apare de un număr mic de ori la generarea noii populaţii. 1.4.2 Mutaţia Mutaţia este un alt operator genetic important şi reprezintă un proces prin care cromozomul curent îşi modifică ocazional una sau mai multe valori într-un singur pas. Mutaţia depinde de asemenea de codificarea cromozomului. Mutaţia alege doar un singur candidat şi aleator modifică unele valori ale acestuia (modificând doar semnul acelei valori sau uneori se modifică şi valoarea in cazul reprezentării prin valoare sau se schimbă doar valoarea în cazul reprezentării binare). Mutaţia funcţionează prin alegerea aleatoare a numărului de valori care vor fi schimbate şi a modului de modificare a acestora. Prezentăm un exemplu de modificare a 2 cromozomi primul având trei puncte de modificare iar al doilea doar două puncte de modificare. În funcţie de dimensiunea cromozomului se alege numărul de puncte pentru care se aplică mutaţia. Original 1-0.23 0 0 0.89 0 0.52 0 0 0 0-0.04 0.03 Original 2 0 0 0.08-0.67-0.01 0 0 0 0 0.01 0 0.01 Urmaş modificat 1 0.23 0 0 0.89 0 0.52 0 0-1.0 0-0.04-0.03 Urmaş modificat 2 1.0 0 0.08-0.67-0.01 0 0 0 0 0.1 0 0.01 4 of 6
1.4.3 Crossover Crossover poate fi văzut ca crearea următoarei populaţii folosind populaţia curenta. Acest operator depinde foarte mult de tipul de codificare al cromozomilor. Metoda de crossover este aplicată la o pereche de părinţi aleşi folosind una din metodele prezentate. Cu o probabilitate p c părinţii sunt recombinaţi pentru a forma doi noi copii care vor fi introduşi în noua populaţie. De exemplu luăm 2 părinţi din populaţia curentă, îi împărţim şi încrucişăm componentele astfel încât să producem 2 noi candidaţi. Aceşti candidaţi în urma încrucişării trebuie să reprezenta o soluţie posibilă pentru parametrii problemei noastre de optimizare de aceea de obicei se interschimbă valori de pe aceleaşi poziţii. Utilizând un punct de recombinare putem crea noii candidaţi prin combinarea primei părţi din primul părinte cu a doua parte din al doilea părinte. După recombinare se poate face aleator o mutaţie pe noii candidaţi obţinuţii. Dacă dimensiunea cromozomului este mare se pot alege mai multe puncte de recombinare. Prezentăm un exemplu cu două puncte de recombinare: Cromozom 1-0.23 0 0 0.89 0 0.52 0 0 0 0-0.04 0.03 Cromozom 2 0 0 0.08-0.67-0.01 0 0 0 0 0.01 0 0.01 Urmaş1-0.23 0 0 0.89-0.01 0 0 0 0 0.01 0 0.03 Urmaş 2 0 0 0.08-0.67 0 0.52 0 0 0 0-0.04 0.01 1.5 Paşii algoritmului genetic: 1. Se codifică datele problemei într-un cromozom. 2. Se generează aleator o populaţie. Se recomandă ca populaţia să aibă un număr suficient de mare de cromozomi (50-100 cromozomi soluţii aleatoare la problemă). Fiecare valoare din cromozom este iniţializată cu o valoare aleatoare mică. 3. Pentru fiecare cromozom din populaţie se calculează încrederea acestuia folosind funcţia de evaluare (fitness). 4. Dacă s-a găsit un cromozom pentru care se obţine valoarea dorită se termină algoritmul iar acel cromozom reprezintă soluţia problemei (în cazul în care se ştie unde dorim să ajungem). O altă condiţie de terminare a algoritmului ar putea fi cazul în care după un număr specificat de paşi nu s-au mai obţinut îmbunătăţiri (în cazul în care nu ştim exact valoarea unde vom ajunge). 5. Folosind rezultatele funcţiei de evaluare se generează următoare populaţie astfel: a. Se vor selecta primii cei mai buni 50% din cromozomi din prima populaţie şi se vor 5 of 6
copia în noua populaţie; b. Pentru restul de 50% din noua populaţie se vor folosii operatorii de mutaţie şi crossover astfel: i. Se selectează aleator folosind una din metodele prezentate unul sau doi cromozomi din prima jumătate a noii populaţii. ii. Dacă s-a selectat doar un cromozom se aplică acestuia operatorul de mutaţie. iii. Dacă s-au selectat 2 cromozomi se aplică operatorul de crossover. 6. Se sare la pasul 3. Problema. Să se implementeze un algoritm genetic pentru calcul minimului următoarei funcţii: ( cos( x) * cos( x) + 1 ), pentru [ 0,5] f ( x) = sinh x, x număr real Obs. Pentru această problemă un cromozom va fi format din reprezentarea binară a numărului x. Se va folosi o populaţie de 100 de cromozomi. Funcţia de fitness pentru această problemă va fi de fapt funcţia f(x) prezentată mai sus. Pentru a respecta teoria evoluţiei se recomandă ca operatorii de mutaţie şi selecţie să se folosească de un număr considerabil redus de ori în comparaţie cu operatorul crossover pentru generarea unei noi populaţii. Exemplu de algoritm genetic: http://www.obitko.com/tutorials/genetic-algorithms/example-functionminimum.php 6 of 6