I. STRATEGII ÎN REZOLVAREA PROBLEMELOR - … Genetici... · aceea unele strategii evolutive au o...

13
1 I. STRATEGII ÎN REZOLVAREA PROBLEMELOR Goldstein și Levin (1987) au definit rezolvarea problemelor ca fiind procesul cognitiv de ordin înalt care necesită modulația și controlul mai multor capacități / îndemânări fundamentale, considerând-o cea mai complexă dintre toate funcțiile intelectuale. Rezolvarea problemelor apare atunci când un organism sau un sistem ce posedă inteligență artificială nu cunoaște drumul de la o stare dată, către o stare scop dorită. Procesul rezolvării problemelor diferă în funcție de domeniul de cunoaștere și de nivelul de expertiză. Rezultate obținute în laboratoare de multe ori nu pot fi extinse pentru situații reale, complexe. Din acest motiv, cele mai noi studii se concentrează pe probleme cât mai complexe iar utilizarea calculatoarelor a devenit o necesitate. în rezolvarea de probleme cu ajutorul calculatorului sunt utilizate două strategii: abordarea deterministă (care cuprinde algoritmi determiniști exacți și euristici) și abordarea probabilistă. Algoritmii determiniști produc aceeași soluție și urmează aceeași secvență de stări pe o instanță dată la execuții repetate. Algoritmii determiniști exacți obțin soluții exacte dar nu sunt tot timpul utilizabili în practică deoarece, de cele mai multe ori realizează o căutare exhaustivă în spațiul problemei. Considerând pentru rezolvare clasa algoritmilor determiniști, a fost stabilită ierarhia de complexitate a problemelor. Astfel, o problemă are complexitatea dată de cel mai bun algoritm determinist precis cunoscut spre a o rezolva. Euristicile sunt algoritmi determiniști care obțin soluții aproximative. Cu cât precizia soluției este mai bună, cu atât complexitatea timp este mai mare. Algoritmii probabiliști implică măcar un pas în care decizia se ia în mod aleatoriu. Aceștia sunt algoritmi impredictibili, la repetări succesive se obțin soluții diferite datorită unor pași ce depind de valori generate aleatoriu în timpul execuției. Soluțiile obținute sunt aproximative. Un algoritm probabilist poate fi privit ca o distribuție de probabilitate peste o mulțime de algoritmi determiniști. Dacă este ușor să se găsească o instanță a unei probleme care să ridice dificultăți pentru unul sau mai mulți algoritmi determiniști din această mulțime, este dificil să se găsească o singură intrare cu șanse mari de a bate un algoritm ales aleatoriu. Această paradigmă stă la baza succesului oricărui algoritm probabilist (R. Motwani, P. Raghavan). Din clasa algoritmilor probabiliști fac parte algoritmi precum Monte Carlo, Las Vegas și metaeuristicile (algoritmi evolutivi, călirea simulată 1 etc.). Complexitatea timp pentru astfel de algoritmi crește odată cu precizia soluțiilor. Algoritmii genetici utilizează o schemă polinomială. De aceea unele strategii evolutive au o probabilitatea egală cu 1 să găsească soluția exactă. Calitatea unei soluții aproximative se apreciază cu ajutorul a doi indici: acuratețea - care măsoară distanța față de optim a valorii acelei soluții, și precizia - care măsoară apropierea variabilelor soluției de punctul în care se obține optimul (Fig.1.1.). 1 În literatura străină termenul este simulated annealing, termen care în limba română a fost preluat și tradus, în diverse lucrări, în mai multe variante, normalizare, regenerare, recoacere, călire simulată.

Transcript of I. STRATEGII ÎN REZOLVAREA PROBLEMELOR - … Genetici... · aceea unele strategii evolutive au o...

1

I. STRATEGII ÎN REZOLVAREA PROBLEMELOR

Goldstein și Levin (1987) au definit rezolvarea problemelor ca fiind procesul cognitiv de ordin înalt care necesită modulația și controlul mai multor capacități / îndemânări fundamentale, considerând-o cea mai complexă dintre toate funcțiile intelectuale. Rezolvarea problemelor apare atunci când un organism sau un sistem ce posedă inteligență artificială nu cunoaște drumul de la o stare dată, către o stare scop dorită.

Procesul rezolvării problemelor diferă în funcție de domeniul de cunoaștere și de nivelul de expertiză. Rezultate obținute în laboratoare de multe ori nu pot fi extinse pentru situații reale, complexe. Din acest motiv, cele mai noi studii se concentrează pe probleme cât mai complexe iar utilizarea calculatoarelor a devenit o necesitate.

în rezolvarea de probleme cu ajutorul calculatorului sunt utilizate două strategii: abordarea deterministă (care cuprinde algoritmi determiniști exacți și euristici) și abordarea probabilistă.

Algoritmii determiniști produc aceeași soluție și urmează aceeași secvență de stări pe o instanță dată la execuții repetate.

Algoritmii determiniști exacți obțin soluții exacte dar nu sunt tot timpul utilizabili în practică deoarece, de cele mai multe ori realizează o căutare exhaustivă în spațiul problemei. Considerând pentru rezolvare clasa algoritmilor determiniști, a fost stabilită ierarhia de complexitate a problemelor. Astfel, o problemă are complexitatea dată de cel mai bun algoritm determinist precis cunoscut spre a o rezolva.

Euristicile sunt algoritmi determiniști care obțin soluții aproximative. Cu cât precizia soluției este mai bună, cu atât complexitatea timp este mai mare.

Algoritmii probabiliști implică măcar un pas în care decizia se ia în mod aleatoriu. Aceștia sunt algoritmi impredictibili, la repetări succesive se obțin soluții diferite datorită unor pași ce depind de valori generate aleatoriu în timpul execuției. Soluțiile obținute sunt aproximative.

Un algoritm probabilist poate fi privit ca o distribuție de probabilitate peste o mulțime de algoritmi determiniști. Dacă este ușor să se găsească o instanță a unei probleme care să ridice dificultăți pentru unul sau mai mulți algoritmi determiniști din această mulțime, este dificil să se găsească o singură intrare cu șanse mari de a bate un algoritm ales aleatoriu. Această paradigmă stă la baza succesului oricărui algoritm probabilist (R. Motwani, P. Raghavan).

Din clasa algoritmilor probabiliști fac parte algoritmi precum Monte Carlo, Las Vegas și metaeuristicile (algoritmi evolutivi, călirea simulată1 etc.). Complexitatea timp pentru astfel de algoritmi crește odată cu precizia soluțiilor. Algoritmii genetici utilizează o schemă polinomială. De aceea unele strategii evolutive au o probabilitatea egală cu 1 să găsească soluția exactă.

Calitatea unei soluții aproximative se apreciază cu ajutorul a doi indici: acuratețea - care măsoară distanța față de optim a valorii acelei soluții, și precizia - care măsoară apropierea variabilelor soluției de punctul în care se obține optimul (Fig.1.1.).

1 În literatura străină termenul este simulated annealing, termen care în limba română a fost preluat și tradus, în diverse lucrări, în mai multe variante, normalizare, regenerare, recoacere, călire simulată.

2

Fig. 1.1. Fig. Precizia și acuratețea unei soluții aproximative: f este funcția de evaluare; x reprezintă parametrii funcției.

Metodele convenționale de rezolvare de probleme precum calculul diferențial, calculul integral, analiza numerică ș.a. sunt denumite tehnici hard computing. Aceste modele sunt rigide, statice, fără posibilitate de adaptare; ele sunt complet formulate în prealabil și nu se pot modifica cu nimic pe parcursul rezolvării. Doar sisteme relativ simple pot fi descrise și analizate cu astfel de metode.

Existența sistemelor complexe din domenii precum biologia și medicina, a dus la apariția metodelor soft computing (Fig. 2.1.)care prezintă posibilitate de auto-adaptare. Aceste metode sunt bazate pe feed-back-ul intern al algoritmului și al structurilor de date iar proprietățile individuale ale instanței problemei sunt exploatate la maxim. Spre deosebire de metodele hard-computing care pun accent pe exactitate, tehnicile soft-computing exploatează adevărul parțial făcând uz de modelarea și raționarea probabilistă.

Principalele modele soft-computing sunt rețelele neuronale artificiale, sistemele fuzzy (vagi) și calculul evolutiv. Dacă primele două modele sunt dezvoltări moderne ale unor tehnici din statistică și teoria mulțimilor, calculul evolutiv a adus o abordare și un set de idei fundamental noi în modelare, în conceptul de calcul și în paradigma generală de rezolvare a problemelor de optimizare.

Fig. 2.1. Calculul soft este situat între calculul convențional (hard) și sistemele de inteligență artificială.

3

II. ALGORITMI GENETICI ȘI EVOLUTIVI. PRINCIPII GENERALE

Ideile inspirate de mecanismele evoluției și selecției naturale au condus la clase importante de algoritmi de căutare și optimizare. Astfel s-au pus bazele principiilor algoritmilor genetici și evolutivi.

II.1. Metafora evolutivă

Punctul de vedere acceptat în modelarea sistemelor în general este acela că îndeplinirea oricărei sarcini poate fi privită ca rezolvarea unei probleme. La rândul ei, rezolvarea unei probleme poate fi gândită ca o căutare în spațiul soluțiilor posibile (spațiul stărilor problemei). Această căutare poate fi ghidată de o funcție de performanță (fitness). Procesul de căutare este în acest caz însoțit de un proces de optimizare: dintre soluțiile posibile suntem interesați întotdeauna de cea mai bună sau, uneori, ne putem mulțumi doar cu o soluție suficient de bună (aproximativ optimă).

Pentru probleme de mare complexitate, găsirea soluției optime, sau chiar a uneia acceptabile, este dificil de realizat. Tehnicile clasice fie nu sunt aplicabile, fie necesită un timp de lucru prohibitiv. Algoritmii genetici (AG) sunt adecvați tocmai pentru soluționarea unor astfel de probleme dificile.

Algoritmii genetici (Holland, 1975) reprezintă tehnici de căutare și optimizare având ca punct de pornire o metaforă biologică. Această metaforă biologică este reprezentată de moștenirea genetică și evoluția naturală.

În cursul evoluției, toate organismele sunt confruntate cu problema adaptării la un mediu complicat, în continuă schimbare, sau ostil. În acest proces, fiecare specie „învață”, iar „cunoașterea”1 pe care a câștigat-o este codificată în cromozomii speciei. Evoluția este așadar un proces care are loc la nivelul cromozomilor. Caracteristicile unei ființe vii sunt stabilite printr-un proces de decodificare a cromozomilor săi. Codificarea și decodificarea informației genetice la nivelul cromozomilor nu este încă pe deplin elucidată.

Din perspectiva care ne interesează în acest context, reținem doar câteva caracteristici esențiale ale procesului de evoluție genetică:

1. Cromozomii sunt purtătorii informației genetice. 2. Fiecare individ al unei specii posedă un număr determinat de cromozomi. Totalitatea cromozomilor unui individ reprezintă genotipul său. 3. Cromozomii sunt structuri liniare alcătuite din gene. Genele poartă caracteristicile ereditare. O genă controlează una sau mai multe caracteristici. Genele unei anumite caracteristici ocupă locuri determinate în cromozom, numite loci. O genă poate fi în mai multe stări, numite alele (valori ale caracteristicilor). 4. Evoluția este un proces ce operează la nivelul cromozomilor. 5. Selecția naturală reprezintă legătura dintre cromozomi și performanțele indivizilor (structurilor decodificate respective). Procesul selecției naturale favorizează reproducerea acelor cromozomi ce codifică structuri de succes. 6. Evoluția se realizează în procesul reproducerii. În evoluție acționează procese de selecție și mutație. Foarte importante sunt procesele de recombinare a materialului genetic ce caracterizează părinții.

1 Selecție, câștig adaptativ.

4

În 1965, John Holland de la Universitatea Michigan a avut ideea de a aplica modelul genetic al evoluției în rezolvarea unor probleme de căutare și optimizare. Sistemele construite în acest fel utilizează o populație de cromozomi ce reprezintă o mulțime de soluții potențiale. Prin procese de selecție, mutație și recombinare sistemul evoluează spre stări mai apropiate de optim. Selecția cromozomilor pentru modificare se face folosind o funcție de evaluare (adecvare). Putem admite că această funcție descrie acțiunea mediului.

Originea algoritmilor evolutivi poate fi pusă în legătură cu unele lucrări din anii ’50, cum ar fi cele ale lui Box (1957) și Fraser (1957).

Algoritmii genetici reprezintă o clasă de algoritmi evolutivi. Algoritmii evolutivi implementează proceduri care imită procesele de adaptare / căutare apărute în evoluția naturală. Toți algoritmii evolutivi folosesc populații în care fiecare individ reprezintă un punct din spațiul de căutare. Algoritmii evolutivi se bazează pe principiul învățării colective în cadrul unei populații.

Programarea evolutivă (Fogel, Owens, Walsh, 1966), strategiile evolutive (Rechenberg, 1973; Schwefel, 1981) și algoritmii genetici sunt cele mai cunoscute tipuri de algoritmi evolutivi.

II.2. Algoritmul evolutiv

Algoritmii evolutivi reprezintă mai multe clase de metode aleatorii de căutare. Fiecare individ al populațiilor implicate în procesul de căutare se descrie printr-un singur cromozom. Considerăm așadar că genotipul fiecărui individ conține un singur cromozom.

Orice algoritm evolutiv (sau program evolutiv) folosește o populație de indivizi (cromozomi) care este modificată prin intermediul unor operatori genetici cum ar fi cei de selecție, mutație, recombinare etc. Timpul variază discret. Notăm cu P(t) populația de cromozomi de la momentul t, unde t = 0, 1, 2, …

Fie X spațiul de căutare (spațiul stărilor problemei)1. Fiecare individ (cromozom) reprezintă un element din X, adică o soluție posibilă a problemei. Un cromozom este un șir finit peste elementele unui vocabular2. Evaluarea calității indivizilor din spațiul de căutare se face cu ajutorul unei funcții de performanță (fitness). În literatură apar diverse denumiri pentru această funcție, dar cu același sens, cum ar fi: funcție de potrivire, funcție de adecvare sau funcție de evaluare. Fie f: X → R, funcția de performanță (sau funcția de adecvare). Fiecare individ (soluție) este evaluat prin intermediul acestei funcții.

Dacă considerăm P(t) = { xt1, xt

2, …, xtn } populația la momentul t, atunci, în acest caz P(t) reprezintă

o generație. Noua generație P(t+1) se formează selectând cei mai performanți indivizi din P(t) aplicând asupra lor operatorii genetici de recombinare, mutație etc.

II.2.1. Operatorii Operatorul de recombinare este folosit pentru a crea noi indivizi folosind segmente (subșiruri) a doi sau mai mulți cromozomi. Operatorul de recombinare se poate defini ca o aplicație R : Xp → Xq. În acest caz spunem că operatorul R realizează o transformare de tipul (p, q) în care p părinți dau naștere la q descendenți.

Operatorul de mutație reprezintă o transformare unară3 m : X → X. Operatorul de mutație m creează noi indivizi prin schimbări (mici) ale unui singur individ. De exemplu m permite schimbarea

1 Mulțimea tuturor cromozomilor. 2 Toate combinațiile posibile ale caracterelor unui alfabet. 3 O modificare care nu implică un al doilea element. Ex. operația logică de negare schimbă valoarea elementului căreia i se aplică. De aceea mutația este considerată un operator unar pentru că transformă conținutul cromozomului fără intervenția unui alt element suplimentar. Adunarea este un operator binar, ea necesită cel puțin două elemente.

5

unei singure gene a individului (cromozomului) respectiv, mutația realizând astfel mici perturbări ale cromozomilor obținuți prin recombinare.

Operatorul de supraviețuire decide care cromozomi (părinții și descendenții lor obținuți prin recombinare și mutație) vor forma efectiv noua generație. Fiecare tip de algoritm evolutiv are un mecanism propriu ce realizează supraviețuirea.

Populația inițială se generează de regulă prin selectarea aleatorie a unor puncte din spațiul de căutare. În unele cazuri cunoștințele specifice despre domeniul problemei pot servi pentru a ghida căutarea. Criteriul de oprire pentru un algoritm evolutiv este de regulă legat de numărul de generații. Cel mai performant individ al ultimei generații (sau cel mai performant individ din întreaga istorie a procesului) reprezintă soluția obținută pentru problema în discuție.

Considerațiile de mai sus conduc la următoarea structură a unui algoritm evolutiv:

II.2.2. Structura generală a unui algoritm evolutiv O procedură evolutivă se desfășoară în următorii pași.

P1. Se stabilește t = 0 ; P2. Se inițializează populația P(t) ; P3. Se evaluează P(t) utilizând o funcție de performanță f ; P4. Până când (condiție) se execută { t = t + 1 ; Selecția P(t) ; Recombinarea asupra lui P(t) ; Mutația asupra lui P(t) ; Evaluarea lui P(t ) ; Supraviețuirea în P(t) ; }

Observație: La pasul P4 apare o condiție de oprire a algoritmului. De regulă, această condiție se referă la atingerea numărului de generații prescris.

Orice procedură evolutivă trebuie să furnizeze următoarele elemente:

1. O reprezentare genetică a spațiului de căutare (spațiul stărilor problemei sau spațiul soluțiilor potențiale ale problemei). 2. O populație inițială de soluții potențiale1. De regulă, populația inițială se alege în mod arbitrar. 3. O funcție de evaluare ce măsoară performanța fiecărui individ în raport cu scopul urmărit. 4. O metodă de selectare a cromozomilor pentru modificare și recombinare (reproducere). 5. Operatorii genetici pentru crearea de noi cromozomi prin recombinare, mutație, inversiune etc. 6. Valorile parametrilor ce apar în algoritmul evolutiv (dimensiunea populației, probabilitățile de aplicare a diferiților operatori genetici, numărul total de generații etc.).

1 Se favorizează o populație inițială capabilă să genereze soluția convenabilă.

6

II.2.3. Modulele unui algoritm evolutiv Din cele prezentate anterior rezultă că un algoritm evolutiv are mai multe componente. Ele pot fi grupate în trei module:

• Modulul Populație; • Modulul Evaluare; • Modulul Recombinare și Mutație.

Modulul Populație Conține o metodă pentru inițializarea unei populații de cromozomi. Modulul conține tehnica de reprezentare a cromozomilor și tehnici pentru crearea și manipularea noilor generații ale populației. În acest modul se specifică felul în care se trece de la o populație la alta. Această trecere se poate face prin înlocuirea totală sau parțială a cromozomilor generației vechi cu noua generație de cromozomi. Modulul indică metoda de selecție a cromozomilor, dimensiunea populației și numărul total de generații.

Modulul Evaluare Conține funcția de performanță folosită pentru compararea cromozomilor.

Modulul Recombinare și Mutație Conține metodele folosite pentru a crea noi cromozomi. Sunt specificați parametrii operatorilor genetici utilizați, cum ar fi probabilitatea de mutație, probabilitatea de încrucișare etc.

II.3. Algoritmul genetic

Într-un algoritm genetic, fiecare element al spațiului de căutare se poate reprezenta ca un individ (sau un cromozom) al unei populații. După cum s-a precizat anterior, fiecare cromozom este constituit dintr-o mulțime de elemente numite caracteristici sau gene. Fiecare genă se poate afla în mai multe stări, numite alele. Acestea din urmă indică valori (nu neapărat numerice) ale caracteristicilor (genelor). În abordările standard numărul de gene dintr-un cromozom este constant pentru o problemă dată, iar numărul genelor definește lungimea cromozomului. Se va nota cu r lungimea cromozomilor unei populații.

Fie V alfabetul1 ce corespunde valorilor alelelor. Un cromozom se reprezintă printr-o secvență de lungime r formată cu elemente ale lui V. Rezultă că orice cromozom este un element din Vr. Alfabetul V depinde de clasa de probleme la care se aplică algoritmul genetic. Lungimea cromozomilor este stabilită în funcție de natura problemei. Cea mai răspândită este codificarea binară a valorilor genelor. În acest caz, alfabetul este V = {0, 1}, iar un cromozom este o secvență binară de lungime r ≥ 1.

II.3.1. Echilibrul explorare – exploatare Fiecare cromozom reprezintă o soluție potențială a problemei. Un algoritm genetic realizează căutarea în spațiul soluțiilor problemei prin modificarea unei populații de cromozomi. Căutarea soluției într-un spațiu complex implică realizarea unui compromis între două obiective aparent contradictorii: exploatarea celor mai bune soluții disponibile Ia un moment dat și explorarea eficientă a spațiului soluțiilor posibile. Cele două aspecte corespund căutării locale și respectiv căutării globale în spațiul soluțiilor problemei.

Obținerea unui echilibru între exploatarea informației obținute până la momentul curent și explorarea spațiului stărilor pentru a obține soluții noi, mai bune, este specifică tuturor metodelor puternice de optimizare. Dacă soluțiile obținute sunt exploatate prea mult atunci se atinge o convergență prematură, iar procedura se oprește cu o soluție care poate să nu fie acceptabilă. Pe 1 În cazul concret al macromoleculei de ADN alfabetul este limitat la ACGT

7

de altă parte, dacă accentul cade prea mult pe explorare, este posibil ca informația deja obținută să nu fie utilizată în mod corespunzător. Acest lucru face ca timpul de căutare să crească foarte mult, ceea ce apropie procedurile respective de metodele aleatorii de căutare. Se va indica în continuare felul în care unele clase de metode rezolvă problema echilibrului dintre exploatare și explorare.

Metodele de coborâre (de tip gradient) reprezintă o situație extremă în compromisul explorare-exploatare. Ele sunt strategii care exploatează cea mai bună soluție pentru îmbunătățiri ulterioare ale acestei soluții. Se neglijează însă explorarea spațiului de căutare și, în consecință, metoda suferă din cauza caracterului local al optimului găsit.

În mod similar, metoda Box (Box, 1957), deși este bazată pe utilizarea unei populații de soluții potențiale, nu are nici un mecanism de explorare. Din acest motiv metoda nu este foarte eficientă.

Metodele de căutare aleatorii reprezintă cealaltă situație extremă. Căutarea pur aleatorie este un exemplu tipic de strategie care explorează spațiul de căutare, ignorând exploatarea regiunilor promițătoare ale spațiului. Metodele de acest tip sunt lente și aceasta le face inaplicabile pentru probleme practice dificile.

Metoda „călirii simulate” (simulated annealing) reprezintă o procedură de căutare aleatorie în care este prezentă și exploatarea. Acest lucru se realizează printr-un mecanism ce asigură stabilirea unui echilibru la fiecare valoare a unui parametru care are semnificația temperaturii termodinamice (Pentru detalii se poate consulta monografia Dumitrescu și Costin, 1996).

În contrast cu cele descrise, algoritmii genetici reprezintă o clasă de strategii de căutare generală (strategii independente de domeniu) care realizează un compromis rezonabil între explorarea și exploatarea spațiului soluțiilor. Studii teoretice (Holland, 1975) au arătat că algoritmii genetici realizează acest compromis de o manieră aproape optimală. Exploatarea și explorarea sunt aspecte ce pot fi controlate aproape independent, ceea ce permite o mare flexibilitate în proiectarea algoritmilor genetici.

II.3.2. Rezolvarea problemelor utilizând algoritmi genetici Pentru rezolvarea unei probleme folosind un algoritm genetic este necesară definirea de către utilizator a unei funcții care măsoară performanța (adecvarea) fiecărui cromozom. Funcția de performanță (adecvare) depinde de abilitatea utilizatorului de a codifica în mod adecvat problema sa. Dacă se rezolvă o problemă clasică de optimizare sau una de optimizare combinatorială, funcția de adecvare poate coincide cu funcția criteriu (funcția obiectiv) asociată problemei sau se obține prin transformări simple (de exemplu prin scalare) aplicate funcției criteriu. În alte situații funcția de evaluare reprezintă o funcție de „cost”, o funcție de „câștig” etc., sau este dedusă dintr-o astfel de funcție.

Un algoritm genetic este o procedură iterativă de căutare globală având drept scop optimizarea funcției de evaluare. Algoritmul lucrează în paralel asupra unei populații de soluții potențiale (cromozomi) distribuite peste întreg spațiul de căutare. În mod obișnuit, valoarea performanței unui cromozom este independentă de performanțele celorlalți indivizi ai populației. O altă posibilitate este de a considera o funcție de adecvare implicită ale cărei valori depind și de restul populației prin intermediul anumitor interacțiuni între indivizi. În acest caz putem vorbi de o adaptare intrinsecă (Packard, 1988) ce asigură co-evoluția indivizilor (Kaufman și Johnsen, 1991).

Dinamica procesului de căutare generat de un algoritm genetic se ilustrează prin combinarea și modificarea cromozomilor. Scopul este găsirea combinației optime, adică a acelei combinații ce corespunde adecvării maxime. La fiecare iterație a algoritmului se creează o nouă populație, numită generație. Toate generațiile au același număr de indivizi. Se admite că, în general, noua

8

generație constă din indivizi mai performanți, adică mai bine adaptați la mediul reprezentat de funcția de adecvare. Pe măsură ce se succed generațiile se va înregistra o tendință de evoluție a indivizilor spre optimul global al funcției de adecvare.

Obținerea unei noi generații plecând de la precedenta are loc în trei etape:

1. Evaluarea: algoritmul genetic calculează valoarea funcției de adecvare pentru fiecare individ al vechii populații. 2. Selecția: algoritmul genetic selecționează indivizii unei populații P(t) în funcție de performanțele lor. Indivizii selecționați vor reprezenta o populație intermediară P1. Cromozomii populației P1 devin părinții noii generații P(t+1). 3. Recombinarea și modificarea: Algoritmul genetic recombină și modifică indivizii selecționați. În acest scop se utilizează operatorii genetici de încrucișare (recombinare), mutație, inversiune etc. Din punct de vedere algoritmic, operatorii genetici reprezintă metode de a schimba local soluțiile reprezentate de părinți (mutația și inversia) sau de a combina aceste soluții (încrucișarea), aceasta din urmă constând într-un transfer de gene între doi cromozomi.

Fiecărui operator genetic îi corespunde o probabilitate de aplicare. Aceste probabilități sunt parametri ai algoritmului. Operatorii genetici de recombinare și modificare se aplică, cu probabilitățile respective asupra populației intermediare. Aplicând operatorul de încrucișare asupra populației P1 se obține o populație P2. Asupra indivizilor din P2 se aplică operatorii de mutație, inversie etc. Indivizii din P2 împreună cu acei indivizi din P1 care nu au suferit recombinarea vor constitui noua generație P(t+1). Sunt posibile numeroase alte modalități de a selecta cromozomii populației P(t+1).

II.3.3. Algoritmul genetic fundamental (AGF) Etapele implementării și utilizării unui algoritm genetic sunt următoarele:

- definirea elementelor algoritmului (reprezentarea, funcția de performanță (fitness), mecanismul de selecție, operatorii genetici, parametrii). - proiectarea experimentului. - execuția experimentului. - interpretarea rezultatelor.

Analiza unui algoritm evolutiv se face empiric, pe baza rezultatelor unor experimente ce urmăresc fie performanța de calcul absolută a algoritmului studiat, fie compararea algoritmului genetic studiat cu un alt algoritm ce rezolvă aceeași problemă (studiu relativ). De aceea, în faza de proiectare a experimentului trebuie avută în vedere optimizarea algoritmului genetic, iar pentru faza de comparare, trebuie luate în considerare și alte tipuri de algoritmi decât cei genetici pentru efectuarea de comparații.

în algoritmul genetic clasic, funcția de evaluare trebuie să fie strict pozitivă, iar asupra ei să se realizeze maximizare. Ambele condiții sunt ușor de satisfăcut atunci când funcția de performanță este dată de o funcție reală: funcția de evaluare poate fi ușor modificată prin translarea cu o constantă iar, dacă este cazul, problema de minimizare poate fi exprimată ca problemă de maximizare prin înmulțirea cu -1 a funcției de performanță.

Nu orice problemă poate fi exprimată ca problemă de optimizare a unei funcții reale. Pentru situații în care funcția de performanță nu are o expresie algoritmică sau este necunoscută (în unele aplicații de inteligență artificială) se poate folosi evaluarea interactivă în care utilizatorul stabilește on-line performanța fiecărui individ sau ierarhia generației.

Algoritmii genetici clasici sunt formulați pentru optimizarea uni-criterială. În practică însă, sunt numeroase probleme în care trebuie urmărite mai multe obiective. Un exemplu este problema

9

orarului în care, în afara constrângerilor de natură materială care trebuie satisfăcute (suprapunerea a două cursuri în aceeași sală, resursele materiale ce trebuie distribuite între profesori sunt limitate: videoproiector, laptop etc.), sunt necesare și optimizări din punct de vedere al timpului alocat (cât mai puține ferestre în orarul unui profesor/student).

Soluția preferată în rezolvarea unor astfel de probleme este construirea unui criteriu global (modele liniare sau neliniare) în care fiecărui subcriteriu i se acordă mai multă sau mai puțină importanță.

Algoritmii genetici sunt algoritmi care îmbunătățesc soluția pas cu pas de-a lungul mai multor generații. Există probleme însă de tipul „acul în carul cu fân” care prin formulare nu permit o îmbunătățire pas cu pas. Un exemplu în acest sens este problema satisfiabilității1 în care, fiind dată o formulă în logica booleană, peste un număr de k variabile booleene, se cere o asignare a acestora astfel încât întreaga formulă sa fie satisfiabilă (rezultatul evaluării să fie 1 ca echivalență a valorii booleene adevărat). Pentru o astfel problemă poate fi scris un algoritm genetic clasic în care reprezentarea soluțiilor se face sub forma unui șir de k biți, iar operatorii genetici sunt cei standard. Funcția de performanță (fitness) dă valoarea de adevăr a expresiei booleene sub asignările date de cromozomi. Dificultatea rezidă în faptul că evaluând cromozomii cu o funcție de performanță (fitness) ce are doar două valori, nu se poate face o îmbunătățire pas cu pas, iar învățarea devine imposibilă. Trebuie găsită o modalitate de a ierarhiza indivizii ne-satisfiabili iar acest lucru este posibil utilizând cunoștințe suplimentare din domeniul problemei. O soluție este exprimarea problemei în formă normală conjunctivă echivalentă. Pentru o astfel de formulare a problemei, îmbunătățirea soluțiilor poate fi realizată pas cu pas considerând ca funcție de performanță numărul de termeni care se evaluează la valoarea booleană adevărat.

Structura unui algoritm genetic este identică, în esență, cu cea a unei proceduri evolutive. Cromozomii utilizați au lungime constantă. Populația (generația) P(t+1) la momentul (t+1) se obține reținând toți descendenții populației P(t) și ștergând apoi complet cromozomii generației precedente (P(t)). Numărul cromozomilor în fiecare generație este constant. Principalii operatori genetici utilizați sunt cei de mutație, încrucișare și inversiune. Algoritmul genetic standard (algoritmul canonic) are ca operatori principali încrucișarea și mutația. Structura acestui algoritm genetic se poate reprezenta astfel:

P1. Se stabilește t = 0 ; P2. Se inițializează aleatoriu populația P(t) ; P3. Se evaluează. cromozomii populației P(t) ; În acest scop se utilizează o funcție de performanță ce depinde de problema dată. P4. Cât timp (nu se întrunește condiția C) execută:

P4.1. Selectează cromozomii din P(t) care vor contribui la formarea noii generații. Fie P1 mulțimea cromozomilor selectați. (P1 reprezintă o populație intermediară) ; P4.2. Se aplică cromozomilor din P1 operatorii genetici. Cei mai utilizați sunt operatorii de mutație și încrucișare. În funcție de problemă se pot alege și alți operatori (inversiune, reordonare, operatori speciali) ; Fie P2 populația astfel obținută (descendenții populației P(t)). Se șterg din P1 părinții noilor indivizi obținuți. Cromozomii rămași în P1 sunt atribuiți populației P2. Se construiește noua generație: P(t+1) = P2 ;

1 În logica matematică, satisfiabilitatea și validitatea sunt concepte elementare de natură semantică. O formulă este satisfiabilă dacă există posibilitatea de a găsi o interpretare (model) care să o facă adevărată. O formulă este validă dacă toate interpretările sale sunt adevărate.

10

Se șterg toți cromozomii din P(t) ; Se modifică t = t+1 ; Se evaluează P(t) ;

Sfârșit Cât timp ;

Observații:

1. Condiția de oprire C se referă, de regulă, la atingerea numărului de generații specificate. Dacă numărul maxim admis de generații este N, atunci condiția de oprire C este t > N.

2. De obicei se admite că rezultatul algoritmului este codificat de cel mai performant individ din ultima generație. În realitate, nimic nu ne garantează că un individ mai performant nu a fost obținut într-o generație anterioară. Este deci natural ca la fiecare pas (la fiecare moment t) să reținem cel mai bun individ care a fost generat până atunci. Pentru a implementa această strategie sunt necesare câteva mici modificări în algoritmul de mai sus.

3. Modificarea propusă în observația precedentă poate fi extrem de utilă. În acest fel suntem siguri că cea mai bună soluție găsită nu s-a pierdut pe parcurs. Natura acestei modificări este similară cu cea propusă de Gallant în raport cu algoritmul de instruire al perceptronului1 (vezi, Dumitrescu și Costin, 1996).

4. Sunt posibile și numeroase alte variante de supraviețuire. Putem de exemplu să considerăm că cei mai buni q indivizi din generația P(t) vor fi incluși în mod automat în generația următoare. Totodată ei vor putea să sufere și operațiile de recombinare, mutație etc.

I.3.4. Modulele unui algoritm genetic Implementarea unui algoritm genetic se poate face utilizând modulele POPULAȚIE, EVALUARE și RECOMBINARE-MODIFICARE specifice algoritmilor evolutivi. Structura acestor trei module corespunzătoare Algoritmului Genetic Fundamental (AGF) poate fi descrisă sintetic astfel:

MODULUL POPULAȚIE

Metoda de reprezentare: codificare binară sau codificare reală. Lungimea cromozomului: r . Metoda de inițializare: inițializare aleatorie. Metoda de ștergere: șterge vechea populație în întregime (sau altă metodă). Metoda de înlocuire: înlocuire cu noua generație. Metoda de selecție pentru modificare și reproducere: metodă probabilistică (de exemplu selecția uniformă cu metoda Monte Carlo). Metoda de apreciere a adecvării: evaluarea cu o funcție de evaluare. Dimensiunea populației: n1 . Numărul maxim de generații: n2 .

MODULUL EVALUARE

Funcția de evaluare:

MODULUL RECOMBINARE-MODIFICARE

Operatorii genetici utilizați: mutația, încrucișarea, inversiunea. Parametrii algoritmului: - probabilitatea de mutație: pm

1 În cadrul învățării automate (machine learning), perceptronul este un tip de clasificator linear. Acesta ia o decizie de clasificare pe baza unei valori obținută dintr-o combinație liniară de caracteristici.

11

- probabilitatea de încrucișare: pc - probabilitatea de inversiune: Pi

I.3.5. Scheme și blocuri constructive Algoritmii genetici utilizează operatori conținând copierea cromozomilor, schimbarea unor subșiruri și modificarea unor poziții. Astfel se poate realiza o căutare eficientă. Modelul descris în continuare se bazează pe observarea anumitor similarități între cromozomii care reprezentă două populații succesive obținute prin aplicarea unui AG. În general este de așteptat ca performanța medie a populației să crească de la o generație la alta. Similaritățile întâlnite ar putea fi corelate cu această creștere a performanței. În literatura de specialitate, similaritățile dintre cromozomi se numesc scheme. Mai precis, o schemă reprezintă o mulțime de cromozomi având anumite poziții identice.

În codificarea binară, o schemă este un șir format cu simbolurile 0, 1 și *. Simbolul * într-o poziție a șirului înseamnă că această poziție poate fi ocupată de orice simbol al alfabetului binar {0, 1}.

Exemplul 1: fie schema S = (1 * * 0)

Această schemă reprezintă patru cromozomi, având 1 pe prima poziție și 0 pe ultima poziție. Acești cromozomi vor fi:

x1 = 1 0 0 0 x2 = 1 0 1 0 x3 = 1 1 0 0 x4 = 1 1 1 0

Exemplul 2: pornind de la o soluție cunoscută, avem cromozomul:

x = 1 0

Acesta este reprezentat de 22 scheme. Aceste scheme sunt următoarele:

S1 = * * S2 = * 0 S3 = 1 0 S4 = 1 *

Cromozomul x considerat este o instanță1 sau un reprezentant al fiecăreia dintre schemele S1 - S4. Pentru noțiunile introduse mai sus pot fi enunțate următoarele definiții:

O schemă de lungime r este un element al mulțimii {0, 1 ,*}r

Fie S o schemă de lungime r. Spunem că un cromozom x {0, 1}r este o instanță a schemei S dacă oricărei poziții diferite de * din S îi corespunde o poziție din x având aceeași valoare.

Se numește poziție specifică a schemei S orice poziție din S diferită de *. Simbolul * are semnificația indiferent, adică poziția respectivă poate fi, cu egală îndreptățire, 0 sau 1.

O schemă S reprezintă toți acei cromozomi x pentru care toate pozițiile specifice ale lui S coincid cu pozițiile corespunzătoare din x. Cromozomul x este un reprezentant al (o instanță a) schemei S.

Exemple:

Schema S1 = (* * *) reprezintă toți cromozomii de lungime 3. Schema S2 = (1 0 1) reprezintă un singur cromozom și anume x = (1 0 1).

1 Altfel spus, instanța este un caz concret (particular) pentru o schemă.

12

Deoarece o schemă reprezintă anumiți cromozomi similari rezultă că o schemă poate fi identificată cu o anumită regiune a spațiului X al cromozomilor de lungime r. Așadar, schemele reprezintă submulțimi ale spațiului de căutare. Din punct de vedere geometric, schemele reprezintă drepte, varietăți liniare, sau hiperplane1 în spațiul de căutare.

Următoarea propoziție stabilește un rezultat elementar privind numărul reprezentanților unei scheme: Fiecare schemă S reprezintă 2m cromozomi (S are 2m instanțe), unde m este numărul simbolurilor * (numărul pozițiilor nespecifice) din schema S.

Demonstrația se face prin inducție matematică:

m = 1 avem S1 = {*} => (x = 0 și x = 1) => 2 instanțe deci 21. m = 1 avem S2 = {* *} => (x = 1 1; x = 1 0; x = 0 1; x = 0 0) => 4 instanțe deci 22.

m = n avem Sn = {* … *} => 2n instanțe (considerăm adevărat) m = n + 1 avem Sn+1 = {* … *, *} => 2n+1 instanțe pentru că atunci când x = *…* (de n ori) dacă adăugăm încă o poziție (n+1 ori), această poziție conform schemei nu poate lua decât două valori 1 sau 0. Deci dacă x = *…* = 2n instanțe, adăugând încă o poziție, relația devine x = *…*1 sau x = *…*0 deci matematic se poate scrie că 2n∙2 = 2n+1 instanțe.

Exemplu:

Schema: S = 1 * 0 * are patru instanțe: x1 = 1 0 0 0; x2 = 1 0 0 1; x3 = 1 1 0 0; x4 = 1 1 0 1. Așadar, schema S descrie mulțimea {x1, x2, x3, x4} din spațiul de căutare.

I.3.6. Teorema schemelor Ordinul unei scheme este dat de numărul de poziții specifice, iar lungimea utilă este diferența dintre ultima și prima poziție specifică a schemei.

Adecvarea (performanța, calitatea) unei scheme într-o populație poate fi definită ca fiind adecvarea medie a reprezentanților (instanțelor) ei în acea populație.

Teorema schemelor indică tocmai faptul că evoluția generațiilor are loc în sensul creșterii performanței, iar rezultatul stabilit de teorema schemelor are un caracter probabilistic.

Teorema schemelor:

O schemă având o adecvare (performanță) peste medie, valori mici ale ordinului și lungimii utile, tinde să apară mai frecvent în cromozomii generației următoare. Dimpotrivă, o schemă având o adecvare sub medie tinde să apară mai puțin frecvent (să aibă mai puțini reprezentanți) în generațiile următoare.

I.3.7. Blocuri constructive și paralelismul intrinsec Un algoritm genetic manipulează simultan un mare număr de scheme. Această caracteristică reprezintă paralelismul intrinsec al algoritmilor genetici. Teorema schemelor ne asigură că paralelismul intrinsec este asociat cu creșterea adecvării în generațiile succesive.

O categorie specială de scheme o reprezintă blocurile constructive. Astfel, o schemă ce are o calitate peste medie, dar are un ordin și o lungime utilă mici se numește bloc constructiv.

1 În geometrie, hiperplanul este un subspațiu cu o dimensiune mai mică (n-1) decât spațiul față de care este definit. De ex. un punct este un hiperplan într-un spațiu 1-dimensional, o linie este un hiperplan într-un spațiu 2-dimensional, un plan este un hiperplan într-un spațiu 3-dimensional. O linie nu este însă un hiperplan într-un spațiu 3-dimensional, ea nu poate să separe spațiul în două părți.

13

Conform teoremei schemelor, prin acțiunea operatorilor genetici, blocurile constructive se combină dând naștere la blocuri constructive tot mai performante, care vor converge spre soluția optimă.

I.3.8. Caracteristicile algoritmilor genetici Algoritmii genetici reprezintă o clasă importantă de metode de căutare și optimizare. Aceste metode se bazează pe principiile geneticii și selecției naturale. Din considerațiile expuse anterior se pot desprinde principalele caracteristici ale algoritmilor genetici. Aceste caracteristici se referă mai ales la particularitățile acestora în raport cu alte metode de căutare și optimizare.

1. Algoritmii genetici reprezintă o clasă de algoritmi probabiliști care combină elemente de căutare dirijată și căutare aleatorie. Ei realizează un echilibru aproape optimal între explorarea spațiului stărilor și exploatarea celor mai bune soluții găsite.

2. Algoritmii genetici sunt mai robuști decât alte metode existente de căutare dirijată și decât algoritmii clasici de optimizare.

3. Metodele de căutare bazate pe algoritmii genetici sunt caracterizate de faptul că ele mențin o populație de soluții potențiale. Metodele clasice de căutare acționează la un moment asupra unui singur punct din spațiul de căutare.

4. De regulă, algoritmii genetici lucrează cu o codificare a elementelor din spațiul stărilor problemei și nu acționează direct asupra elementelor acestui spațiu.

5. Algoritmii genetici folosesc funcții de performanță obținute prin transformări simple ale funcției obiectiv. Nu este necesar ca funcția obiectiv să fie derivabilă. Nu sunt necesare nici proprietăți speciale de convexitate ale funcției obiectiv.

6. Algoritmii genetici sunt simplu de folosit.

7. Algoritmii genetici pot găsi soluțiile optime (sau aproape optime) cu o mare probabilitate.

III. BIBLIOGRAFIE

Box G. E. P. (1957), Evolutionary operation: a method of increasing industrial productivity, Applied Statistics, 6, 81-101.

Davis L. (1991), Handbook of Genetic Algorithms, Van Nostrand Reinhold, New York.

Eck J. D. (2011), Genetic Algorithms in JavaScript Demo, http://math.hws.edu/eck/jsdemo/jsGeneticAlgorithm.html

FogeI L. J., Owens A. J., Walsh M. J. (1966), Artificial lntelligence Through Simulated Evolution, Wiley, New York.

Fraser A. S. (1957), Simulation of genetic systems by automatic digital computers, Australian Journal of Biological Science, 10, 484-491.

Holland J. (1975), Adaptation in Natural and Artificial Systems, University of Michigan Press, Ann Arbor.

Rechenberg I. (1973), Evolutionstrategic: Optimierung Technischen Systeme nacht Prinzipen der Biologischen Evolution, Fromman Holzboog, Stuttgart.

Schwefel H. P. (1981), Numerical Optimization for Computer Models, Wiley, Chicester, U.K.