Sunteți pe pagina 1din 11

ALGORITMI GENETICI Dr.

George Daniel Mateescu* Corina Sman* Mihai Buneci* Noiuni introductive Un algoritm genetic reprezint o transpunere in programare a unor principii biologice. Structura unui astfel de algoritm este descris prin urmtorii pai: Pasul 1. genereaz populaia iniial Pasul 2. genereaz urmaii (off-sping) Pasul 3. aplic mutaii genetice Pasul 4. selecteaz o parte a populaiei care prsete sistemul Pasul 5. repet pasii 2, 3, 4, pn la satisfacerea unui criteriu de optimalitate (sau de un anumit numr de ori) Formularea algoritmului este foarte general, iar programatorul trebuie sa-i adapteze propriul model, astfel: Populaia Aceasta este, din punct de vedere matematic, mulimea soluiilor posibile ale problemei. De exemplu, pentru cazul n care se modeleaz o problem de minim (sau de maxim) pentru o funcie f : R m R , atunci orice obiect ( x1 , x2 ,...xm ) R m reprezint o soluie posibil. n
consecin, n acest caz, orice submulime P R reprezint, din punctul nostru de vedere, populaia unui algoritm genetic.

Indivizii Populaia este format din indivizi; din punct de vedere matematic, indivizii sunt elementele mulimii . La rndul su, fiecare individ este caracterizat de trsturile sale, de zestrea sa cromozomial. Astfel, revenind la exemplul problemei de optimizare, este uor de observat c un individ (adic un punct din R m ) este complet determinat de coordonatele sale, respectiv de valorile x1 , x2 ,... xm . Desigur, fiecare coordonat va influena valoarea funciei care se minimizeaz (maximizeaz). Urmaii (generaia nou, off-spring) Aceast noiune modeleaz un procedeu de modificare (mbogire) a mulimii . Putem nelege mai bine aceast situaie daca o comparm cu alte metode de calcul. De exemplu, anumite metode numerice determin soluia prin intermediul unui ir de valori (definite, eventual, iterativ) ceea ce reprezint, de asemenea, o situaie de mbogire a unei mulimi, prin construcia, succesiv, de noi valori. De asemenea, metodele de simulare cunosc modaliti de creare a de noi entiti, adecvate unei anumite probleme. Modul de generare a urmailor depinde, intrinsec, de problema modelat, fr s existe un procedeu general. Astfel, pentru problema de optimizare a funciei f descrise mai sus, putem
*

Institutul de Prognoz Economic, Academia Romn, e-mail: ipe@ipe.ro

21

considera ca un urma provine din alturarea componentelor (trsturilor cromozomiale) preluate de la doi prini. Matematic, dac vom considera doi indivizi: ( x1 , x2 ,..., xk , xk +1 ,..., xm )

( y1 , y2 ,..., yk , yk +1 ,..., ym )
atunci, printr-un procedeu inspirat din mecanismul cross-over, putem imagina doi urmai, de forma: ( x1 , x2 ,..., xk , yk +1 ,..., ym )

( y1 , y2 ,..., yk , xk +1 ,..., xm )
obinui prin divizarea lanului cromozomial n poziia k.
Mutaii genetice Orice modificare suficient de mic a unui cromozom reprezint o mutaie genetic. Astfel de mutaii pot fi haotice (ntmpltoare) sau pot fi urmarea unor aa-numite achiziii genetice. Desigur, modelul cel mai adecvat de mutaie genetic va putea fi ales numai n funcie de problema modelat. n cazul particular al unei probleme de optimizare, cea mai potrivit cale de reprezentare a mutaiilor genetice este constituit de aa numita deplasare pe direcia gradientului. Justificarea unui astfel de procedeu se regsete n metodele numerice cunoscute, de tip Newton, n care determinarea soluiei se face printr-o deplasare pe o direcie care ine cont de gradientul funciei.

Imaginea de mai sus este sugestiv, astfel, dac vrem s determinm minimul funciei i ne aflm n punctul a, atunci va trebui s ne deplasm spre dreapta, ceea ce corespunde unui sens cresctor, invers fa de semnul derivatei (gradientului) funciei n punctul a. Dac ne aflm n punctul b, atunci va trebui s realizm o deplasare spre stnga, ceea ce reprezint un sens descresctor, invers semnului derivatei (gradientului) funciei n punctul b. Strategia de deplasare care ine seama de direcia gradientului poate fi extins pentru cazul funciilor de mai multe variabile, prin deplasri n raport cu fiecare coordonat, corespunztor semnului (direciei) derivatei pariale a funciei obiectiv, n raport cu respectiva coordonat. Mutaiile genetice sunt deosebit de importante pentru convergena algoritmului, pentru probleme concrete, aa cum am demonstrat n [2].
Selecia Acest pas reprezint modul n care anumii indivizi ies din sistem. Alegerea unui procedeu de ieire din sistem ine de problema modelat. Astfel, este cu totul natural ca pentru o problem de optimizare, clasificarea populaiei s se fac n funcie de valoarea corespunztoare

22

a funciei obiectiv. Aceast funcie devine, necesar, o funcie de performan, prin intermediul creia se va decide ieirea din sistem a indivizilor. Concret, pentru o problem de minimizare a unei funcii f, vom clasifica indivizii cresctor, n funcie de valoarea corespunztoare a funciei f i vom elimina surplusul de populaie, rezultat ca urmare a generrii de urmai. Pentru o problem de maximizare vom clasifica indivizii n ordinea descresctoare a valorilor funciei obiectiv.
Finalitatea Evident, ca n orice algoritm, trebuie s existe un test de terminare a acestuia. Finalitatea este determinat de scopul urmrit, deci nu se poate indica o strategie general. Pentru probleme de optimizare, aa cum am artat n lucrarea [2] se poate folosi un test similar cu estimarea aposteriori a erorii, cunoscut n probleme de calcul numeric. Astfel, dac notm prin xn individul cu cea mai bun performan al generaiei a n-a, atunci un test de oprire a algoritmului poate fi de forma: f ( xn 1 ) f ( xn ) <

Programarea unui algoritm de optimizare, prin algoritm genetic

Considerm urmtoarea problema de optimizare:


min f ( x, z , y ) f ( x, z , y ) = ( x 1) + ( y 2 ) + ( z 4 )
2 2 2

Pentru a determina soluia printr-un algoritm de tip genetic, vom modela conceptele expuse privind populaia, urmaii, mutaiile genetice i selecia. Am ales acest exemplu pentru c cititorul poate nelege i poate verifica programele, comparnd soluia obinut prin algoritm, cu soluia exact, n cazul dat x = 1, y = 2, z = 4 . Avnd n vedere c un algoritm genetic este un procedeu de determinare aproximativ, utilizatorul va accepta, ca soluie, orice aproximare suficient de fin a soluiei exacte.
Populaia. Orice submulime din R 3 poate juca rolul de populaie, orice punct de coordonate ( x, y, z ) putnd fi o soluie posibil. Iniial, vom genera populaia n mod aleator. Pe parcursul algoritmului, vom considera c populaia are un numr fix de indivizi (1000 n exemplul dat) i vom menine acest numr, prin eliminarea excesului de populaie, n baza criteriului de optimalitate. Drept suport de programare am ales limbajul Pascal, astfel nct definiia populaiei revine la o lista de forma:
var pop:array[1..1200,1..4] of real;

Fiecare linie a matricei pop reprezint un individ. Pentru fiecare individ, primele trei componente reprezint coordonatele x, y, z, n accepiunea genetic a algoritmului aceasta fiind zestrea sa cromozomial. Cea de-a patra component din fiecare line a matricei, corespunztoare unui individ, va conine valoarea funciei de performan, respectiv f ( x, y, z ) .

23

Schematic, matricea populaiei se prezint n forma: x1 x2 xn y1 y2 yn z1 z2 zn f ( x1 , y1 , z1 )


f ( x2 , y2 , z2 )

f ( xn , yn , zn )

Funcia de performan. Avnd n vedere specificul problemei, funcia de performan 2 2 2 este chiar f ( x, z , y ) = ( x 1) + ( y 2 ) + ( z 4 ) , iar programarea acesteia se face innd cont de sintaxa specific a limbajului Pascal:
function f(x,y,z:real):real; begin f:=sqr(x-1)+sqr(y-2)+sqr(z-4); end;

Selecia. Aceasta este necesar pentru a pstra numrul de indivizi la nivelul iniial de 1000. La fiecare generaie vom aduga 200 de urmai, dup care vom elimina surplusul avnd drept criteriu valoarea funciei de performan. Deoarece aceast valoare este plasat n a patra poziie a fiecrei linii, urmeaz s aplicm un procedeu de ordonare descresctoare a liniilor matricei pop, n funcie de valoarea aflat pe ultima coloan. Algoritmul folosit este o transpunerea cunoscutei metode a bulelor, in care, prin parcurgeri succesive ale liniilor matricei, elementul de valoare minim avanseaz n jos. Sortarea este implementat n procedura care urmeaz.
procedure ordonare; var i,j,h:integer; test:boolean; x:real; begin for h:=1199 downto 1 do for i:=1 to h do if pop[i,4]>pop[i+1,4] then for j:=1 to 4 do begin x:=pop[i,j]; pop[i,j]:=pop[i+1,j];pop[i+1,j]:=x; end; end;

Iniializarea. Populaia iniial este generat aleator, folosind generatorul de numere aleatoare al limbajului Pascal. Pentru fiecare individ, dup generarea aleatoare a componentelor sale (coordonate) se calculeaz valoarea funciei de performan, care este plasat n ultima poziie.
procedure initializare; var i,j:integer; begin randomize; for i:=1 to 1200 do for j:=1 to 3 do pop[i,j]:=10*random; for i:=1 to 1200 do pop[i,4]:=f(pop[i,1],pop[i,2],pop[i,3]); end;

24

Mutaiile genetice. Dup cum am menionat, mutaiile genetice joac un rol cheie n algoritm, deoarece, aa cum am vzut n [2] de ndat ce iniiem mutaii genetice pe direcia gradientului funciei obiectiv, algoritmul este convergent. La rndul su, gradientul poate fi calculat folosind o formul de calcul aproximativ, pentru fiecare derivat parial: f ( x + h, y, z ) f ( x, y, z ) f x h f x , y + h , z ( ) f ( x, y , z ) f y h f ( x , y , z + h ) f ( x, y , z ) f z h Dup cum se tie, precizia aproximrii n formulele de mai sus este de acelai ordin de mrime cu h. Pe de alt parte, mutaiile genetice trebuie s fie variaii mici ale coordonatelor, f f f astfel nct am folosit expresiile: 0.001 sgn , 0.001 sgn respectiv 0.001 sgn y x z pentru coordonatele corespunztoare.
procedure mutatie; var i,n,m:integer; begin for i:=1 to 20 do begin n:=1+random(1000); if f(pop[n,1]+0.001,pop[n,2],pop[n,3])>f(pop[n,1],pop[n,2],pop[n,3]) then pop[n,1]:=pop[n,1]-0.001 else pop[n,1]:=pop[n,1]+0.001; if f(pop[n,1],pop[n,2]+0.001,pop[n,3])>f(pop[n,1],pop[n,2],pop[n,3]) then pop[n,2]:=pop[n,2]-0.001 else pop[n,2]:=pop[n,2]+0.001; if f(pop[n,1],pop[n,2],pop[n,3]+0.001)>f(pop[n,1],pop[n,2],pop[n,3]) then pop[n,3]:=pop[n,3]-0.001 else pop[n,3]:=pop[n,3]+0.001; pop[n,4]:=f(pop[n,1],pop[n,2],pop[n,3]); end; end;

Urmaii (off spring). Pentru doi indivizi, x, y, identificai prin liniile m i n ale matricei populaiei, am generat doi urmai folosind mecanismul cross-over, astfel: z1 = x1 , z2 = y2 , z3 = y3 , respectiv z1 = x1 , z2 = x2 , z3 = y3 Indivizii obinui sunt plasai pe liniile de la 1001 la 1200 ale matricei astfel nct, dup sortare n funcie de performan, numrul de indivizi rmne constant, corespunztor liniilor 1..1000 ale matricei pop.
procedure generatie; var i,j,k,m,n:integer; begin for i:=1001 to 1100 do begin m:=1+random(20);n:=1+random(20); pop[i,1]:=pop[m,1]; pop[i,2]:=pop[n,2]; pop[i,3]:=pop[n,3]; pop[i,4]:=f(pop[i,1],pop[i,2],pop[i,3]); pop[i+100,1]:=pop[n,1];

25

pop[i+100,2]:=pop[n,2]; pop[i+100,3]:=pop[m,3]; pop[i+100,4]:=f(pop[i+100,1],pop[i+100,2],pop[i+100,3]); end; end;

Programul propriu-zis, care rezolv problema, const n execuia repetat a procedurilor corespunztoare algoritmului genetic:
var i:integer; begin initializare; for i:=1 to 300 do begin generatie; mutatie; ordonare; end; writeln(pop[1,1],' ',pop[1,2],' readln; end.

',pop[1,3],'

',pop[1,4]);

Calculul parametrilor funciei de regresie

Vom prezenta n continuare o aplicaie a programrii genetice pentru determinarea parametrilor unei funcii de regresie. Problema model utilizeaz urmtorul cadru: xi , i = 1..n serie de valori (date) independente yi , i = 1..n serie de valori (date) dependente y = ax + b relaia de dependen prezumat Problema const n determinarea parametrilor a i b, care minimizeaz suma ptratelor erorilor (diferenelor) dintre valorile statistice (observate) yi i cele rezultate din relaia de dependen prezumat, respectiv, axi + b . Considerm funcia: ( a, b ) =
i =1..n

( y ax b )
i i

iar problema devine:

min ( a, b ) adic o problem de optimizare pentru care se poate aplica algoritmul (i programul) anterior. Desigur, pentru regresii de tip liniar, ca cea de mai sus, exist formule de determinare a parametrilor a i b. Pe de alt parte, se observ c prin aplicarea unui algoritm de tip genetic, putem determina parametrii unei funcii arbitrare, indiferent dac exist sau nu exist formule de determinare. Ne propunem s utilizm o dependen de tipul: y = a + bx + cx 2 i observm cu uurin c determinarea parametrilor a, b, c se face prin minimizarea funciei:
f ( a , b, c ) =
i =1..n

( y a bx cx )
i i

2 2 i

Adaptarea algoritmului genetic deja prezentat se reflect n elementele urmtoare.

26

n plus fa de variabilele globale ale programului anterior, am introdus variabilele vx i vy, care corespund, respectiv, variabilei independente x i variabilei dependente y. Aceste variabile vor fi citite din fiierul c:\date.dat, identificat prin descriptorul date.
var pop:array[1..1200,1..4] of real; date : text; nr : integer; vx,vy:array[1..100] of real;

Adaptarea funciei de performan se face n conformitate cu problema de minimizare a sumei abaterilor ptratice, respectiv metoda celor mai mici ptrate.
function f(x,y,z:real):real; var s:real; i:integer; begin s:=0; for i:=1 to nr do s:=s+sqr(vy[i]-x-y*vx[i]-z*sqr(vx[i])); f:=s; end;

Iniializarea datelor problemei i a populaiei conine, n plus fa de programul anterior, procedura de iniializare (citire) a valorilor seriilor de date.
procedure initializare; var i,j:integer; begin assign(date,'c:\date.dat'); reset(date); readln(date,nr); for i:=1 to nr do readln(date,vx[i],vy[i]); close(date); randomize; for i:=1 to 1200 do for j:=1 to 3 do pop[i,j]:=random; for i:=1 to 1200 do pop[i,4]:=f(pop[i,1],pop[i,2],pop[i,3]); end;

Sisteme de ecuaii neliniare


Tehnica de programare genetic poate fi aplicat pentru determinarea soluiilor sistemelor de ecuaii neliniare. Pentru un astfel de sistem, scris formal: F1 ( x1 , x2 ,..., xm ) = 0 F2 ( x1 , x2 ,..., xm ) = 0 ... Fm ( x1 , x2 ,..., xm ) = 0

vom considera

f ( x1 , x2 ,..., xm ) =

i =1..m

( F ( x , x ,..., x ) )
1 2 m

, iar sistemul de ecuaii dat este

echivalent cu problema de optimizare:


min f ( x1 , x2 ,..., xm )

27

De exemplu, pentru determinarea soluiei sistemului de ecuaii neliniare:

x + y 2 z = 1 x + 2 yz z = 2 xy y 9 z = 9
vom avem f ( x, y, z ) = ( x + y 2 z + 1) + ( x + 2 yz z 2 ) + ( xy y 9 z + 9 ) .
2 2 2

Singura deosebire fa de primul program const n descrierea funciei de performan, n limbajul Pascal:
function f(x,y,z:real):real; begin f:=sqr(-x+sqr(y)-z+1)+sqr(x+2*y*z-z-2)+sqr(x*y-y-9*z+9); end;

O problem de optimizare discret: problema comis-voiajorului


Sub acest nume este cunoscut o problem, semnificativ, prin care ne propunem s determinm un drum de cost minim ntr-un graf. Formularea acesteia se face prin referire la urmtoarea situaie practic: Se presupune c un comis-voiajor trebuie s viziteze un numr de n orae, pornind din oraul A i avnd ca destinaie final oraul B. Deplasarea ntre oricare dou orae este condiionat de un anumit cost. Se cere s se determine traseul optim, adic acel traseu care parcurge toate oraele, costul total al deplasrii fiind minim. Pentru nceput, vom observa c numrul total de trasee este egal cu n! ceea ce face ca determinarea traseului optim, printr-o metod exhaustiv, s fie imposibil, chiar pentru valori modeste ale lui n.

B A

Problema poate fi modelat n conformitate cu principiile genetice, deja expuse. Vom ncepe cu noiunea de individ. Aa cum am observat, un individ reprezint o soluie posibil a problemei date. n consecin, vom considera c un traseu complet, de la A la B, care trece prin toate oraele, reprezint un individ. Aadar, codificarea unui individ se prezint sub forma: A Oi1 Oi 2 ... Oin B

28

Costul deplasrii ntre dou orae va fi reinut n matricea de adiacen a, n care elementul a[i,j] conine o valoare numeric ce reprezint costul deplasrii de la oraul i la oraul j. Nu este neaprat necesar ca a[i,j]=a[j,i]. n exemplul considerat (n program) am folosit un model care are 14 orae, primul i ultimul fiind fixate (A i B). Populaia este reprezentat prin matricea pop, fiecare linie reprezentnd un individ (traseu) iar pe ultima poziie a fiecrei linii se afl, calculat, costul traseului respectiv.
var pop:array[1..1200,1..15] of integer; a:array[1..14,1..14] of integer; date:text;

Funcia de performan calculeaz costul total al deplasrii, corepunztoare unui individ (traseu posibil).
function f(i:integer):integer; var s,j:integer; begin s:=0; for j:=2 to 14 do s:=s+a[pop[i,j-1],pop[i,j]]; f:=s; end;

Clasificarea indivizilor se face n funcie de valorile cresctoare ale funciei de performan (costul traseului).
procedure ordonare; var i,j,h:integer; test:boolean; x:integer; begin for h:=1199 downto 1 do for i:=1 to h do if pop[i,15]>pop[i+1,15] then for j:=1 to 15 do begin x:=pop[i,j]; pop[i,j]:=pop[i+1,j];pop[i+1,j]:=x; end; end;

Datele privind costurile deplasrilor sunt citite din fiier i depuse n matricea a (matricea de adiacen a grafului). Populaia iniial este generat aleator, fiecare individ fiind depus pe o linie a matricii pop. Pe ultima poziie din fiecare linie se plaseaz costul traseului, calculat cu ajutorul funciei f.
procedure initializare; var i,j,k,x:integer; test:boolean; begin assign(date,'c:\work\a.txt'); reset(date); for i:=1 to 14 do begin

29

for j:=1 to 14 do read(date,a[i,j]); readln(date); end; close(date); randomize; for i:=1 to 1000 do begin for j:=2 to 13 do begin repeat x:=2+random(12); test:=true; for k:=2 to j-1 do if x=pop[i,k] then test:=false; until test; pop[i,j]:=x; end; pop[i,1]:=1;pop[i,14]:=14; end; for i:=1 to 1000 do pop[i,15]:=f(i); end;

Mutaiile genetice au fost modelate prin alegerea, n mod aleator, a unui traseu i inversarea poziiilor unor orae, selectate de asemenea aleator.
procedure mutatie; var i,n,m,p,x:integer; begin for i:=1 to 50 do begin n:=1+random(1200); m:=2+random(12);p:=2+random(12); x:=pop[n,m];pop[n,m]:=pop[n,p];pop[n,p]:=x; m:=2+random(12);p:=2+random(12); x:=pop[n,m];pop[n,m]:=pop[n,p];pop[n,p]:=x; pop[n,15]:=f(n); end; end;

Generaia nou (off spring) este obinut printr-un procedeu cross-over. Spre deosebire de problemele (modelele) anterioare, pentru problema comis-voiajorului, nu orice doi indivizi sunt eligibili. Concret, fiind date dou trasee care se intersecteaz, vom crea dou noi trasee, astfel: primul traseu continu, de la intersecie, pe cel de-al doilea traseu al doilea traseu continu, de la intersecie, pe primul traseu
Cele dou noi trasee sunt permise dac se parcurg toate oraele; procedura care urmeaz verific aceast condiie.
procedure generatie; var i,j,k,m,n:integer; test:boolean; begin for i:=1001 to 1100 do begin repeat test:=true; m:=1+random(20);n:=1+random(20); k:=1; repeat k:=k+1; until pop[m,k]=pop[n,k]; for j:=1 to k do pop[i,j]:=pop[m,j];

30

for j:=k+1 to 14 do pop[i,j]:=pop[n,j]; for j:=2 to 13 do for k:=2 to 13 do if (pop[i,j]=pop[i,k]) and (j<>k) then test:=false; for j:=1 to k do pop[i+100,j]:=pop[n,j]; for j:=k+1 to 14 do pop[i+100,j]:=pop[m,j]; for j:=2 to 13 do for k:=2 to 13 do if (pop[i+100,j]=pop[i+100,k]) and (j<>k) then test:=false; until test; pop[i,15]:=f(i); pop[i+100,15]:=f(i+100); end; end;

Programul propriu-zis conine etapele care caracterizeaz orice algoritm genetic:


var i,j:integer; begin initializare; for i:=1 to 100 do begin generatie; mutatie; ordonare; end; for j:=1 to 14 do write(pop[1,j],' writeln('cost:',pop[1,15]); readln; end.

');

Bibliografie
[1]Banzhaf W., Nordon P., Keller R.E., Francone F.D., Genetic Programming An introduction, Morgan Kaufmann Publishiers, San Francisco 1998 [2]Mateescu, G. D.: Optimization by Using Evolutionary Algorithms with Genetic Acquisitions, Romanian Journal of Economic Forecasting, 2, 2005 [3]Stoer J., Bulirsch R., Introduction to Numerical Analysis, Springer-Verlag, 1992

31

S-ar putea să vă placă și