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 NP-complete care necesită optimizarea globală a soluției și nu avem o metodă iterativă de rezolvare sau metoda iterativa ia foarte mult timp. 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 posibile ale problemei (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 3
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ă soluție obținută până la acel moment să nu se pierde. 2 of 3
Ca și 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 aliatoare 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ția 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 ci, 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(ci) 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: a. Dacă da cromozomul ales aleator se ia în considerare pentru a forma noua populație 3 of 4
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ă procesul 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 în 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 5
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 pc 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 inter-schimbă 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ți. 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 ale problemei). 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ă (dacă se cunoaște) 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 crossover și mutaţie astfel: i. Se selectează aleator folosind una din metodele prezentate doi cromozomi din prima jumătate a noii populații. ii. Se aplică operatorul de crossover pentru cei 2 cromozomi selectați. iii. La un număr mic de cromozomi rezultați după aplicarea operatorului de crossover se aplică și operatorul de mutație. Maxim la 5-10% din noii cromozomi rezultați. 6. Se continuă algoritmul sărind la pasul 3. Problema 1. Să se implementeze un algoritm genetic pentru calcul minimului următoarei funcții: cos( x) *cos( x) 1, pentru x 0,5 f ( x) sinh, x număr real Obs. Pentru această problemă un cromozom va fi format din reprezentarea binară a numărului real 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. Exemplu de algoritm genetic: http://www.obitko.com/tutorials/genetic-algorithms/example-functionminimum.php Problema 2. Să se implementeze un algoritm genetic care să găsească pozițiile optime pentru centroizii folosiți de algoritmul din laboratorul 2 (K-Means). Pentru evaluarea unei poziții în algoritmul de învățare K-Means se poate folosi funcția de cost E dis P C, unde k reprezintă numărul de centroizi, P reprezintă mulțimea de exemple de antrenament care aparțin unui centroid, iar Ci reprezintă centroidul i. 6 of 6