Sunteți pe pagina 1din 31

Capitolul 6

ALGORITMI GENETICI
Algoritmii genetici sunt procedee robuste de căutare şi
optimizare bazate pe mecanismele geneticii şi a selecţiei naturale.
Combină supravieţuirea artificială a celui mai bun individ cu
operatorii genetici în scopul formării unui mecanism robust,
aplicabil unei largi game de probleme

6.1. Introducere
Evoluţia şi reproducerea sunt fenomene naturale, specifice lumii vii. Fiecare
organism are un set de reguli, o aşa-zisă amprentă, codată în genele acestuia. Prin
legarea mai multor gene în şiruri lungi se obţin cromozomii. Fiecare genă
reprezintă o trăsătură specifică a organismului, cum ar fi culoarea ochilor sau a
părului şi are mai multe valori posibile. De exemplu, valorile posibile pentru gena
ce codifică trăsătura culoarea părului sunt ”blond”, ”brunet”, ”roşcat” sau ”şaten”.
Aceste gene şi valorile aferente lor sunt numite în literatura de specialitate genotip.
Expresia fizică a genotipului – organismul în sine – este numit fenotip.
Prin împerecherea a două organisme, acestea îşi pun în comun genele,
urmaşul rezultat în final având o parte din genele unui părinte şi o parte din genele
celuilalt (se va vedea mai târziu în ce măsură se moştenesc acestea). Acest proces
poartă numele de recombinare. Foarte rar, o genă poate suferi procesul de mutaţie.
În mod obişnuit, o astfel de genă nu afectează dezvoltarea fenotipului, dar
ocazional se va regăsi în organism sub forma unei noi trăsături. După cum se va
vedea, acest fenomen este folosit pentru o mai bună acoperire a spaţiului stărilor
pentru problema de rezolvat.
Tehnicile de calcul evoluţionist (TCE) sunt metode de căutare stocastice care
simulează evoluţia biologică naturală. Domeniul calculului evoluţionist mai este
cunoscut şi sub denumirile de Inteligenţă Computaţională (IC) sau Calcul Uşor
[6.10]. Acestea rezolvă problemele pe baza principiilor din ”teoria evoluţionistă”,
dezvoltată de Charles Darwin în secolul al XIX-lea. În acest sens, simulând
evoluţia structurilor individuale prin procesele de selecţie, mutaţie şi recombinare
au fost dezvoltate diverse tipuri de TCE. Procesele depind de performanţele
fiecărei structuri, care la rândul său este influenţată de mediul înconjurător.
Interesul pentru aceste tehnici a crescut foarte repede, deoarece oferă un mecanism
foarte robust de căutare a soluţiei optime.
În figura 6.1 sunt prezentate etapele generale ale tehnicilor de calcul
evoluţionist.
238 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

La începutul procesului de calcul se generează în mod aleator un număr


prestabilit de indivizi (populaţia iniţială), pentru aceştia evaluându-se funcţia
obiectiv. Dacă nu a fost atins optimul funcţiei obiectiv, se generează o nouă
populaţie în care urmaşii generaţi de către părinţi îi vor înlocui pe aceştia. Procesul
ciclic de împerechere a părinţilor şi generare de urmaşi este repetat până în
momentul atingerii optimului funcţiei obiectiv.
G e n e r a rE e v a l u a r eS - a a t i n Cs e i m a i
p o pţ u l a if eu ţ n c i e c r i t e r i Du l a db eu n i
i n ţ i i aă l o b i e c t i vo p t i m i z a i rn e d ? i v i z i
N u
S t a r t R e z u l t a t e
G e n e r S a re eţ l e c þ i i e e
p o pţ u l a i e
n oă u R e c o m b i n a r e

M ţu t a i e

Fig. 6.1. Structura unui algoritm evoluţionist.


Tehnicile care utilizează o singură populaţie oferă soluţii bune pentru o gamă
largă de probleme. Rezultate mult mai bune pot fi obţinute prin utilizarea mai
multor populaţii, numite subpopulaţii. Fiecare subpopulaţie evoluează izolat (ca un
algoritm evolutiv unipopulaţie), după care unul sau mai mulţi indivizi vor fi
interschimbaţi între subpopulaţiile ce constituie populaţia. Acest tip
(multipopulaţie) modelează mult mai exact evoluţia speciilor, implicând şi
conceptul de rasă, adică apartenenţa la un tip de subpopulaţie.
Cele mai răspândite tehnici de calcul evoluţionist sunt [6.10]:
• algoritmii genetici (AG);
• programarea evolutivă;
• strategiile evolutive;
• programarea genetică;
• sistemele de clasificare.
Unii autori preferă denumirea de cromozomi în loc de indivizi, însă pentru
simplitatea expunerii (prin similaritatea cu lumea reală) se va utiliza a doua
noţiune, cu observaţia că prin individ se urmăreşte implicit evoluţia valorilor
genelor din cromozomul acestuia.

6.2. Noţiuni şi concepte în algoritmii genetici

6.2.1. Definiţie şi structura unui algoritm genetic


simplu
Algoritmii genetici (AG) sunt procedee de căutare şi optimizare bazate pe
mecanismele geneticii şi a selecţiei naturale. Ei combină supravieţuirea artificială
Algoritmi genetici 239

a celui mai bun individ cu operatorii genetici care sunt abstractizări ale celor din
natură, în scopul formării unui mecanism robust, aplicabil unei largi game de
probleme.
Algoritmii genetici şi, în general, tehnicile de calcul evoluţionist, au fost
aplicate cu succes într-un număr mare de probleme. Dintre argumentele care au
condus la extinderea utilizării algoritmilor genetici se menţionează următoarele:
a) sunt uşor de folosit şi necesită un suport matematic puţin complex,
orientat spre intuiţie;
b) rezolvă probleme dificile ce nu pot fi rezolvate prin metode clasice;
c) sunt uşor de extins şi pot fi aplicaţi pentru o gamă largă de probleme;
d) portabilitatea – se pot păstra unele subrutine de la un program la altul.
La nivel general, algoritmii genetici simulează evoluţia unei specii vii,
plasată într-un mediu ambiant ostil, în virtutea principiului darwinist al luptei
pentru existenţă prin selecţie naturală şi moştenire ereditară. În aceşti algoritmi, o
populaţie de indivizi (soluţii posibile) suferă o serie de transformări de tip
încrucişare şi mutaţie. Luptând pentru supravieţuire, indivizii respectivi se
selectează după o schemă ce oferă şanse sporite celor mai performanţi dintre ei
care alcătuiesc o generaţie nouă. Repetând procesul de un număr suficient de
generaţii, apare natural ca cel mai bun individ din generaţia finală să aspire la a
reprezenta soluţia optimă a problemei [6.16].
În algoritmii genetici clasici, individul (soluţia posibilă) se reprezintă printr-
un şir de 0 şi 1, în care sunt concatenate (codificat) valorile necunoscutelor
problemelor. Apar astfel inconveniente legate de procesare şi interpretarea
rezultatelor, dar acestea pot fi evitate prin AG hibrizi, în cadrul cărora codificarea
se face în numere reale.
Algoritmii genetici modelează evoluţia în natură, deci ţin cont şi de mediul în
care se dezvoltă indivizii (soluţiile). AG operează simultan cu o populaţie de
indivizi valorificându-i pe cei mai performanţi, dar şi explorând spaţiul soluţiilor
prin ceilalţi.
Procesul de căutare genetică este caracterizat de trei componente:
(i) Starea în care se va merge, care reprezintă cunoştinţele ce conţin
informaţii acumulate în timpul procesului de căutare şi pe baza cărora
se determină starea curentă şi stările viitoare;
(ii) Funcţia de căutare care este utilizată, la un moment dat, pentru a
genera starea următoare în procesul de căutare, pe baza unui procedeu
euristic;
(iii) Funcţia de învăţare, care este utilizată pentru generarea stării
următoare pe baza rezultatelor obţinute în timpul căutărilor cele mai
recente.
Strategiile de căutare, la rândul lor, pot fi împărţite în trei categorii:
1. Modelele bazate pe cale, care au un spaţiu de căutare ce este definit
recursiv de o stare iniţială şi de o mulţime de operatori interstări. Strategia de
căutare va găsi soluţia ca fiind calea de la starea iniţială la o stare finală. Aceste
strategii de căutare includ tehnici de căutare arborescente cum ar fi căutarea în
adâncime;
240 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

2. Modelele bazate pe punct, care memorează locaţia şi valoarea unui


punct în spaţiul de căutare, acesta fiind definit ca punct curent. În jurul acestuia se
defineşte o vecinătate, iar punctele analizate vor fi numai acelea care aparţin
acestei vecinătăţi. Cele mai bune puncte sunt creditate pentru a deveni punct
curent, în timp ce celelalte nu vor mai fi analizate;
3. Modelele bazate pe populaţie, care memorează o mulţime de locaţii şi
valori ale punctelor generate în timpul procesului de căutare. Pe baza comparaţiei
valorilor punctelor cu o valoare de prag, sunt alese cele mai bune puncte, acestea
fiind adăugate mulţimii de locaţii.
Algoritmii genetici aparţin strategiilor bazate pe populaţie. La începutul
procesului, fiecare individ (cromozom) este iniţializat în mod aleator cu o valoare.
Algoritmul genetic caută în spaţiul posibililor cromozomi (spaţiu Hamming) cele
mai bune valori pentru indivizi. Procesul de căutare este ghidat astfel încât mediul
înconjurător să returneze valori cât mai bune. Aceasta reprezintă o măsură a
capacităţii fiecărui individ de a rezolva problema şi în acelaşi timp probabilitatea ca
el să apară în generaţiile viitoare.
Este de aşteptat ca performanţele indivizilor din noua generaţie să fie în
medie mai mari decât ale indivizilor din populaţia anterioară, iar cel mai
performant dintre ei să fie superior celui mai valoros din vechea generaţie.
Repetând operaţiile de evaluare, selecţie şi transformare pe un număr
suficient de mare de generaţii succesive, se vor obţine populaţii tot mai bine
adaptate la mediu (seturi de soluţii tot mai apropiate de optim) şi soluţia cea mai
bună din populaţia finală va putea fi admisă ca o soluţie satisfăcătoare a problemei.
AG nu oferă garanţia găsirii optimului global, dar în mod cert se va depista o
soluţie suficient de apropiată de cea optimă. În acelaşi timp, prin caracteristica de a
lucra cu populaţii de soluţii, se evită riscul de a limita căutarea în zona unui optim
local.
Structura unui algoritm genetic simplu:
Start
t = 0;
Iniţializează P ( t ) ; {creează o populaţie aleatoare P ( t ) }
Evaluează P ( t ) ; {evaluează funcţia obiectiv pentru fiecare
membru al P ( t ) }
Cât timp (condiţie de terminare) execută {operatorii genetici
creează o nouă populaţie}
Start
t = t +1;
Selectează P ( t ) din P ( t − 1) ;
Recombină P ( t ) ;
Evaluează P ( t ) ; {Evaluează noua populaţie}
Stop
Stop
Algoritmi genetici 241

Un algoritm genetic pentru rezolvarea unei probleme date trebuie să aibă


cinci componente:
• o reprezentare genetică a soluţiei potenţiale a problemei, numită şi
reprezentare cromozomială;
• un mod de creare a unei populaţii iniţiale de indivizi;
• o funcţie de evaluare (performanţă) care joacă rolul mediului;
• operatori care transformă componenţa populaţiei;
• valori pentru diferiţi parametri ai algoritmului genetic (mărimea
populaţiei, probabilităţi de aplicare a operatorilor, criterii de oprire,
număr de generaţii parcurse în program).

6.2.2. Reprezentarea cromozomială


După cum s-a specificat anterior, cromozomii sunt şiruri de gene, care
codifică informaţia necesară rezolvării problemei. Primii algoritmi genetici utilizau
codificarea cromozomilor sub formă binară – fiecare cromozom fiind reprezentat
printr-un şir de biţi. Ulterior au fost dezvoltaţi şi AG cu codificare în numere reale,
fiind cunoscuţi ca AG hibrizi.
Trebuie menţionat faptul că fiecare metodă de codificare este însoţită în mod
necesar de o metodă complementară de decodificare. Pentru o mai bună înţelegere
a acestei componente se consideră următoarea problemă de rezolvat: cunoscând
cifrele 0...9 şi operatorii aritmetici +, -, * şi / să se găsească şirul de operaţii
necesare pentru obţinerea unui număr dat.
Exemplu: Dacă numărul dat este 23, atunci secvenţa 6 + 5 * 4 / 2 + 1 este o soluţie
posibilă. Dacă numărul obiectiv este 76,5, atunci secvenţa 5 / 2 + 9 * 7 - 5 este o soluţie
posibilă.
Pentru început, trebuie să se stabilească o metodă de codificare a unei soluţii
posibile printr-un şir de biţi. Pentru aceasta trebuie să se găsească o cale de
reprezentare a tuturor caracterelor ce pot apărea în soluţie, adică cele 0...9 cifre şi
operatorii. Acestea vor reprezenta genele, iar fiecare cromozom (deci individ) va fi
constituit dintr-o serie de gene.
Fiind vorba despre 14 caractere (cifrele zecimale şi cei patru operatori), este
necesară reprezentarea pe 4 biţi, reprezentarea pe 3 biţi fiind insuficientă, deoarece
nu am putea codifica decât 9 caractere. Se observă că prin reprezentarea pe 4 biţi
pentru 14 caractere, 2 coduri rămân neutilizate; fie acestea 1110 şi 1111. Atunci
când algoritmul va întâlni una dintre acestea, o va ignora (după cum se va vedea
din procesul de decodificare).
Caracterele pot fi codificate deci astfel:
0: 0000 7: 0111
1: 0001 8: 1000
2: 0010 9: 1001
3: 0011 +: 1010
4: 0100 -: 1011
5: 0101 *: 1100
242 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

6: 0110 /: 1101
Se observă ca soluţia menţionată anterior pentru numărul 23, ”6+5*4/2+1”,
se va reprezenta prin nouă gene având corespondenţa:

011 101 010 110 010 110 001 101


0001
0 0 1 0 0 1 0 0
6 + 5 * 4 / 2 + 1
Prin lipirea acestor gene rezultă cromozomul (aferent individului):
011010100101110001001101001010100001
Decodificarea se face în acest caz intuitiv, împărţind cromozomul în gene de
lungime 4 şi decodificând apoi aceste gene separat, conform tabelului de mai sus.
O observaţie importantă în ceea ce priveşte decodificarea este următoarea:
deoarece algoritmul lucrează cu aranjamente aleatorii de biţi, cromozomii vor arăta
foarte adesea în felul următor:
0011001010111111101001000110
Făcând decodificarea, aceşti biţi ar reprezenta

001 001 101 111 101 010


0110
1 0 1 1 0 0
3 2 - n/a + 4 6
Ceea ce nu reprezintă un şir coerent pentru problema în cauză. Deci, atunci
când se face decodarea, algoritmul va ignora toate genele ce nu se conformează cu
modelul căutat al soluţiei problemei: număr.operator.număr. operator.număr etc.
Cu această menţiune, şirul de mai sus, aparent necoerent este citit şi testat în cadrul
algoritmului ca 3 - 4.
Pentru a depăşi inconvenientele menţionate, s-au căutat alte tipuri de
reprezentări cromozomiale. Codificarea Gray foloseşte tot cifrele 0 şi 1, dar două
numere reale apropiate din spaţiul problemei apar apropiate şi în reprezentarea
Gray, în sensul că diferă doar prin conţinutul unui bit (de exemplu, în cod binar
cifrele 13 şi 14 se reprezintă prin 1101 şi 1110, iar în cod Gray prin 1011 şi 1001,
în primul caz conţinutul diferă la două poziţii de biţi, iar în ultimul, la o singură
poziţie).
Totuşi, cea mai naturală reprezentare s-a dovedit a fi cea în numere reale. Ea
nu mai reclamă transformări dintr-o bază în alta, este conceptual adecvată spaţiului
soluţiilor problemei şi permite implementarea eficientă a operatorilor genetici.

6.2.3. Crearea populaţiei iniţiale


Populaţia iniţială de soluţii posibile se poate crea în diverse moduri: fie prin
”însămânţarea” cu un număr limitat de soluţii admisibile şi multiplicarea lor până
la numărul de indivizi dorit, fie prin copierea unuia singur, fie prin generarea
aleatoare de valori din domeniile posibile ale variabilelor şi gruparea lor în
Algoritmi genetici 243

cromozomi diferiţi etc. În orice caz, metoda folosită trebuie să ţină seama şi de
modul de reprezentare cromozomială deoarece, de exemplu, dacă la reprezentarea
binară o populaţie iniţială de indivizi identici nu influenţează prea mult evoluţia
ulterioară (ei producând soluţii urmaşi diferite), la reprezentarea în numere reale şi
alterare prin încrucişare aritmetică, o populaţie iniţială de soluţii identice nu ar mai
suferi decât modificări lente şi acestea datorate mutaţiilor.
Cel mai frecvent se utilizează generarea aleatoare de valori pentru
necunoscute. Totuşi, dacă problema conţine restricţii prin care sunt legate între ele
domeniile admisibile ale variabilelor, este posibil ca generarea aleatoare să producă
şi soluţii nefezabile (care se ignoră), fiind necesară repetarea producerii aleatoare
de indivizi până când se obţine numărul dorit de soluţii admisibile. Desigur că este
posibilă şi acceptarea din start a unor soluţii nefezabile, dar prezenţa lor trebuie
avută în vedere la alcătuirea funcţiei de evaluare şi/sau a procedeului de selecţie
pentru baza genetică a generaţiei viitoare.

6.2.4. Funcţia de performanţă


Aceasta se poate întâlni în literatura de specialitate şi sub denumirea de
”funcţie de fitness”. Alegerea funcţiei de performanţă poate fi cea mai grea parte
din conceperea unui AG. Ea depinde foarte mult de problema care trebuie
rezolvată, însă ideea de bază constă în găsirea unei căi de asociere a unui punctaj
de performanţă (scor de fitness) mai mare unui cromozom cu cât acesta este mai
aproape de soluţia problemei. În contextul exemplului analizat, punctajul de
performanţă care poate fi asociat este invers proporţional cu diferenţa în modul
dintre soluţie şi valoarea decodată actuală a cromozomului. Presupunând numărul
obiectiv ca fiind 42, atunci cromozomul
100110100101110001101101001010100111
are un punctaj de 1 / (49 - 42), adică 1 / 7.
Dacă se ia în calcul o astfel de evaluare a performanţei, atunci când se
găseşte o soluţie se obţine o eroare de diviziune cu zero, deoarece performanţa va fi
1 / (42 - 42). Ţinând însă cont de faptul că aceasta înseamnă exact găsirea unei
soluţii, se poate implementa cu uşurinţă un test înainte ca această eroare să apară şi
oprirea rulării în mod corespunzător. În cele mai multe cazuri, însă, valorile stărilor
din spaţiul de căutare nu sunt cunoscute (deoarece acesta nu a fost explorat în
întregime) şi deci nu se poate evalua cu exactitate apropierea de soluţie. Varianta
adoptată este de a limita apriori numărul de iteraţii (numărul de generaţii ce
urmează a fi evoluate).

6.2.5. Operatorii
Cei trei operatori folosiţi în AG sunt: selecţia, recombinarea (sau
încrucişarea) şi mutaţia. Aceştia vor fi prezentaţi separat în paragraful 6.3.
Selecţia este cel mai important operator al algoritmilor genetici şi are rol
hotărâtor în dirijarea procesului de căutare din spaţiul soluţiilor şi presupune
244 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

alegerea celor mai buni indivizi din cadrul unei populaţii pentru a forma o nouă
generaţie. Printre cele mai răspândite metode de selecţie se regăsesc: metoda roţii
de ruletă, selecţia locală, selecţia prin trunchiere, selecţia competiţională.
Încrucişarea asigură schimbul de informaţie dintre indivizii unei populaţii
asigurând transmiterea caracteristicilor celor mai bune în cadrul următoarei
populaţii. Metodele de încrucişare diferă de la un tip de reprezentare cromozomială
la altul. Câteva metode specifice de încrucişare pentru codificarea genelor în
numere reale sunt: discretă, aritmetică, euristică. Printre metodele de încrucişare
specifice codificării genelor în sistem binar se regăsesc: încrucişarea cu un singur
punct de tăiere, încrucişarea cu două puncte de taiere, încrucişarea uniformă.
Mutaţia este utilizată pentru păstrarea diversităţii populaţiei de la o generaţie
la alta şi presupune modificarea uneia sau mai multor gene ale unui individ din
baza genetică înainte de a fi transferat în noua generaţie. Mutaţia evită convergenţa
către optime locale prin împiedicarea indivizilor din populaţie să devină prea
asemănători unii cu alţii, ceea ce ar duce la încetinirea sau chiar la stagnarea
evoluţiei.
Operatorii sunt trataţi mai detaliat în subcapitolul 6.3.

6.2.6. Dimensionarea parametrilor


G. Grefenstette [6.9] a prezentat câteva consideraţii asupra alegerii valorilor
pentru diferiţi parametri ai algoritmilor genetici.
Mărimea populaţiei afectează atât performanţa globală, cât şi eficienţa AG.
Aceştia, în general, se comportă slab în condiţiile unei populaţii de mici
dimensiuni. Cu o populaţie de dimensiuni mari, algoritmul poate realiza o căutare
mult mai informată. Astfel, o populaţie mare descurajează convergenţa prematură
spre soluţii suboptimale. Pe de altă parte, o populaţie mare necesită mai multe
evaluări la fiecare generaţie.
Rata de încrucişare controlează frecvenţa cu care este aplicat operatorul de
încrucişare. Cu cât este mai mare rata de încrucişare, cu atât mai repede vor fi
introduse în populaţie noile structuri. Dacă rata este prea mare, structurile
performante sunt înlăturate înainte ca selecţia să poată produce îmbunătăţiri. Dacă
rata încrucişării este prea mică, atunci căutarea poate stagna din cauza unei rate de
explorare scăzute.
Pentru stabilirea diferitelor probabilităţi de aplicare a operatorilor nu există
sugestii standard [6.16].

6.3. Operatori genetici

6.3.1. Metode de selecţie


Selecţia este operatorul prin intermediul căruia se aleg o serie de indivizi din
generaţia curentă pentru a ”supravieţui” în cadrul generaţiei următoare. Înainte de a
Algoritmi genetici 245

fi integrat în generaţia următoare, un individ selectat poate suferi procese de


recombinare şi/sau mutaţie (în funcţie de rata prestabilită de reproducere şi de
mutaţie), caz în care acesta nu mai este inclus în generaţia următoare, ci urmaşul
său. În această etapă individul selectat este stocat în baza genetică.
Deşi există o gamă largă de metode pentru a realiza aceasta, se vor prezenta
numai câteva dintre ele.

6.3.1.1. Selecţia prin metoda roţii de ruletă

Roata de ruletă cunoscută din jocurile de noroc este un disc rotitor împărţit în
mai multe secţiuni egale (evenimentele reprezentând oprirea bilei în fiecare
secţiune sunt echiprobabile) pe care se aruncă o bilă. Când discul se opreşte din
rotaţie bila se opreşte şi ea într-una din secţiuni. Se asociază fiecărui individ câte o
secţiune, însă în acest caz evenimentele nu mai sunt echiprobabile (fig. 6.2), ci
depind de valoarea performanţei individului. Lăţimea fiecărei secţiuni este
calculată pe baza funcţiei de performanţă normalizată. Normalizarea performanţei
unui individ se face prin împărţirea acesteia la suma performanţelor tuturor
indivizilor din generaţie. Altfel spus, un individ are şanse mai mari să fie selectat
cu cât funcţia sa de performanţă are valori mai mari.
0
1
1.16 0.19 0.77
1.09 2
1.48 3
0.45
4
5
0.58
6
2.7 0.7
0.83 7
8
9
Fig. 6.2. Selecţia roată de ruletă.
Exemplu. Se consideră o populaţie de 10 indivizi, ca în tabelul 6.1, având suma
performanţelor egală cu 155 . Fiecare valoare din coloana de performanţe este împărţită la
această valoare, rezultând funcţiile de performanţă normalizate. În figura 6.2 s-au
reprezentat valorile performanţelor în urma normalizării.
Tabelul 6.1. Exemplu de populaţie
Performanţa Suma parţială
Individul Performanţa
normalizată normalizată
0 3 0,019 0,019
1 12 0,077 0,096
2 17 0,109 0,205
3 7 0,045 0,250
4 9 0,058 0,308
5 11 0,070 0,378
246 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

6 13 0,083 0,461
7 42 0,270 0,731
8 23 0,148 0,879
9 18 0,116 1,00
Fiecare individ are o probabilitate de selecţie proporţională cu valoarea
performanţei normalizate. Dacă, de exemplu, se înmulţeşte coloana 3 cu 10, atunci,
la 10 opriri ale bilei, individul 8 va fi selectat de 1,48 ori.
Pasul următor constă în generarea a 10 numere aleatorii (deoarece populaţia
este compusă din 10 indivizi) între 0 şi 1 (suma parţială normalizată maximă).
Dacă numărul astfel generat este între 0 şi 0,019, atunci este selectat individul 0.
Dacă se află între 0,019 şi 0,096, atunci este selectat individul 1 etc.
Formal, paşii de lucru pot fi sintetizaţi astfel:
a) Fie S suma performanţelor întregii populaţii:
S = ∑ Pi

Performanţele normalizate ale fiecărui individ:


pi = Pi S , i = 1, 2,K , n (se consideră populaţia de n indivizi)
Suma parţială normalizată pentru fiecare individ:
qi = ∑ p j , j = 1, 2,K , i

b) Se generează un număr aleatoriu r ∈ [ 0;1) şi


– dacă r < q1 se alege primul cromozom;
– altfel se alege cromozomul i pentru care qi −1 < r < qi şi se consideră
selectat.
c) Se repetă operaţia de la punctul b) de n ori (talia populaţiei), până la
completarea bazei genetice cu numărul necesar de indivizi.
În continuare este descris un mod simplificat de implementare în C++, o
variantă mai detaliată a implementării – bazată pe obiecte – fiind prezentată în
paragraful 6.6.
/* Selectarea unui individ pentru generaţia
următoare în mod proporţional cu contribuţia lui la
performanţa totală a populaţiei */
// Valorile funcţiilor de performanţă sunt păstrate
// în vectorul perf
// Întoarce un singur individ
int select (real S)
// S = performanţa totală a populaţiei
{
int index = 0;
double sum = 0;
r = drand48() * S; // număr aleator între 0 şi S
do
Algoritmi genetici 247
{
index++;
sum = sum + perf[index];
}
while (index < n-1) && (sum < r);
// n = dimensiunea populaţiei
return index;
}

6.3.1.2. Selecţia locală

În cadrul selecţiei locale, fiecare individ este situat într-un mediu înconjurător
numit vecinătate, el ca individ interacţionând numai cu indivizii din vecinătatea sa
[6.3]. Vecinătatea este definită de structura pe baza căreia este formată populaţia şi
poate fi văzută ca un grup de potenţiali părinţi. În prima fază se selectează un
posibil părinte, apoi din vecinătatea acestuia se selectează individul ce va fi părinte,
adică va participa la procesele de recombinare şi mutaţie. Selecţia părintelui se
poate face prin alegerea celui mai bun individ, alegerea individului ce are valoarea
potrivirii cea mai mare, sau alegerea aleatoare a unui individ din vecinătatea
selectată. V e ăc i n t a t e l i n ăe a r ( d i s ţ tă a n = 2
Structura vecinătăţii poate fi [6.2]:
• liniară:
– inel întreg sau jumătate
(fig. 6.3);
I n e l
• bidimensională (2D): j u ăm t a t e
– cruce întreagă sau
jumătate (fig. 6.4);
– stea întreagă sau Fig. 6.3. Vecinătate liniară: inel întreg şi
jumătate (fig. 6.5). jumătate.
V e ăc i n t a t e V2 De ă c i ( n d i st ţ at ă a t en 2 D = 1( d ) i s ţ t ă a n = 1 )
C r u c e ă î n t r e Sa g t e a ă î n t r e a g

C r u că e j u m t a St et e aă j u m t a t e

Fig. 6.4. Vecinătate Fig. 6.5. Vecinătate


bidimensională: cruce bidimensională: stea
întreagă şi jumătate. întreagă şi jumătate.
Mărimea distanţei dintre vecini şi tipul vecinătăţii determină mărimea
vecinătăţii. În tabelul 6.2 este prezentat numărul de indivizi dintr-o vecinătate,
pentru diferite mărimi ale distanţei şi diverse tipuri de vecinătăţi.
Tabelul 6.2. Numărul de vecini pentru selecţia locală.
Distanţa
Structura
1 2
248 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

Inel întreg 2 4
Inel jumătate 1 2
Cruce întreagă 4 8
Cruce jumătate 2 4
Stea întreagă 8 24
Stea jumătate 3 8
Mărimea vecinătăţii determină viteza de propagare a informaţiei între
indivizii populaţiei, trebuind să se aleagă între rapiditatea propagării şi o diversitate
mare a populaţiei. O diversitate ridicată implică probleme precum convergenţa
prematură către un minim local. S-a demonstrat că performanţele selecţiei locale
sunt mult mai bune în cazul unei vecinătăţi mai mici [6.17]. În cazul populaţiilor
mici (mai puţin de 100 de indivizi) structura de tip stea jumătate şi de distanţă 1,
oferă cele mai bune rezultate. În cazul populaţiilor mari poate fi utilizat cu rezultate
foarte bune orice tip de structură.

6.3.1.3. Selecţia prin trunchiere

În literatura de specialitate se mai întâlneşte şi sub denumirea de selecţie prin


ordonare genetică normalizată.
Spre deosebire de metodele de selecţie prezentate anterior, metoda de selecţie
prin trunchiere se poate utiliza doar în cazul populaţiilor de dimensiuni mari (peste
100 de indivizi).
Procedeul constă în ordonarea indivizilor în sensul descrescător al valorii
funcţiei de performanţă. Cu indivizii astfel ordonaţi, se calculează probabilităţile
individuale de selecţie, cu formula:

a ( 1− a)
i −1

pi = , i = 1, 2,K , n
1− (1− a)
n

unde i este indexul, iar a ∈ ( 0;1) este un parametru stabilit de utilizator. Se obţin
sumele parţiale:
qi = ∑ p j , j = 1, 2,K , i

Se generează un număr aleator r ∈ [ 0;1) şi primul individ pentru care qi ≥ r


va trece în baza genetică. Indivizii plasaţi sub această limită nu vor supravieţui în
generaţia următoare. Înlocuitorii lor sunt obţinuţi prin recombinarea aleatoare a
indivizilor cu performanţe mai bune (mai mari decât r). Dacă din cei n indivizi se
înlătură m, atunci vor fi necesare m înlocuiri şi deci va fi nevoie de m/2 perechi
pentru recombinare, fiecare pereche generând doi urmaşi. Aceste perechi se pot
forma aleatoriu, prin regula turnirului, stohastic etc. Dacă m este impar, atunci una
din perechi nu va genera decât un urmaş. Această metodă este asemănătoare
elitismului.
Parametrul a imprimă presiunea de selecţie a algoritmului şi este
recomandabil să se plaseze sub 0,1 pentru a nu forţa convergenţa către soluţii
nesatisfăcătoare.
Algoritmi genetici 249

6.3.1.4. Selecţia prin regula turnirului


(competiţională)

Selecţia prin turnir implică alegerea a doi sau trei candidaţi din populaţia
curentă, compararea valorilor performanţelor şi alegerea celui cu valoarea cea mai
mare. O populaţie de n indivizi va necesita în cazul extragerii a doi câte doi indivizi
2n turniruri.
Această metodă poate fi combinată cu selecţia prin metoda roţii de ruletă; cei
2 (sau 3) candidaţi vor fi selectaţi pe baza performanţelor normalizate şi apoi se
aplică regula turnirului. Metoda rezultantă poartă numele de selecţie stohastică prin
regula turnirului.
Această metodă este eficientă în diversificarea populaţiilor (de urmaşi)
datorită implicării preponderente a caracterului aleatoriu.

6.3.1.5. Comparaţie între metodele de selecţie

Performanţele algoritmilor genetici (în special numărul de populaţii generate


până în momentul atingerii soluţiei) depind de tipul metodei de selecţie utilizată. În
continuare, se prezintă o comparaţie între tipurile de selecţie prezentate în
paragrafele anterioare.
Pentru aceasta, este necesară definirea următorilor termeni:
• constrângerea selectivă, reprezintă raportul dintre probabilitatea de a fi
selectat a celui mai bun individ şi media probabilităţilor de a fi selectaţi
a tuturor indivizilor ce formează populaţia;
• părtinirea este diferenţa dintre valoarea funcţiei de potrivire a unui
individ şi probabilitatea de reproducere a sa;
• răspândirea este domeniul valorilor posibile ale urmaşilor pe care-i
poate genera un individ;
• pierderea diversităţii reprezintă proporţia indivizilor ce nu sunt selectaţi
în timpul procesului de selecţie;
• intensitatea selecţiei şi abaterea selecţiei reprezintă media şi respectiv
abaterea distribuţiei gaussiene a valorilor funcţiei de potrivire rezultate
în urma procesului de selecţie.
Într-o populaţie generată la un moment dat, proporţia de gene ”1” este dată de
relaţia [6.2]:
1  IntSel × gen 
p( gen) =  1 + sin  + asin(2 p0 −1)   (6.1)
2  n 
unde:n este gradul funcţiei obiectiv, aceasta fiind de tip polinomial;
p0 – proporţia de gene ”1” din populaţia iniţială;
gen – numărul generaţiei curente.
Se consideră că algoritmul genetic a convers (s-a găsit soluţia optimă) atunci
când p( gen) = 1 . În cazul special, în care p0 = 0,5 , soluţia este găsită după
250 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

π n
generarea a gen = populaţii. Numărul de populaţii generate până în
2 IntSel
momentul găsirii soluţiei depinde de tipul de selecţie utilizat. În tabelul 6.3 sunt
prezentate, considerând p0 = 0,5 , valorile numărului de populaţii generate pentru
cele trei tipuri de selecţie: ierarhică, prin trunchiere şi prin competiţie.
Performanţele algoritmului genetic sunt influenţate în mare măsură de
metoda de selecţie utilizată. În continuare se prezintă dependenţa pierderii
diversităţii (fig. 6.6) şi a variaţiei selecţiei (fig. 6.7), în funcţie de intensitatea
selecţiei, pentru cele trei metode de selecţie prezentate anterior.
Tabelul 6.3. Numărul de populaţii generate până la găsirea soluţiei.
Tipul selecţiei Numărul de populaţii generate până la găsirea soluţiei
π× n
Selecţie ierarhică gen =
2(CS − 1)
π n
Selecţie prin trunchiere gen =
2 IntSel
π n
Selecţie prin competiţie gen =
2 2(log(Comp) − log( 4,14 log(Comp)))

1 , 0
0 , 9
0 , 8
0 , 7 S e ţl e c i e p r i n t r u n c h i e r e
0 , 6
0 , 5
0 , 4 S e ţl e c i e p r i n c o m pţ e t i i e
0 , 3
0 , 2
0 , 1 S e ţl e c i e i e r a r ăh i c

0 0 , 2 0 , 4 0 , 6 0 , 8 1 , 0 1 , 2 1 , 4 1 , 6
Fig. 6.6. Dependenţa pierderii diversităţii în funcţie de intensitatea selecţiei.
Algoritmi genetici 251

1 , 0
S e ţl e c i e i e r a r ăh i c
0 , 9
0 , 8
0 , 7
0 , 6 S e ţl e c i e p r i n c o m pţ e t i i e
0 , 5
0 , 4
0 , 3 S e ţl e c i e p r i n t r u n c h i e r e
0 , 2
0 , 1

0 0 , 2 0 , 4 0 , 6 0 , 8 1 , 0 1 , 2 1 , 4 1 , 6
Fig. 6.7. Dependenţa variaţiei selecţiei în funcţie de intensitatea selecţiei.
Pentru aceeaşi valoare a intensităţii selecţiei, metoda de selecţie prin
trunchiere conduce la o pierdere mult mai mare a diversităţii, în comparaţie cu
selecţia ierarhizată şi selecţia prin competiţie. Selecţia prin trunchiere înlocuieşte
indivizii cu urmaşi mult mai buni, deoarece acelor indivizi care au o valoare de
potrivire mică li se asociază o probabilitate de selecţie foarte mică. Metodele de
selecţie de tip ierarhizat şi prin competiţie au un comportament similar, domeniile
lor de aplicabilitate fiind complementare, datorită caracterului discret al metodei de
selecţie prin competiţie.
În figura 6.7 se poate observa că pentru aceeaşi valoare a intensităţii selecţiei,
valoarea variaţiei selecţiei este mult mai mică în cazul metodei de selecţie prin
trunchiere. Şi aici se poate observa caracterul asemănător al metodelor de selecţie
de tip ierarhic şi respectiv prin competiţie.

6.3.2. Metode de recombinare


Recombinarea, cunoscută şi sub numele de încrucişare, este operatorul prin
care doi indivizi (părinţi) dau naştere urmaşilor. Recombinarea este folosită în
ideea că noul individ, moştenind caracteristicile cele mai bune de la fiecare părinte,
va rezulta mai performant decât aceştia.
Astfel, pentru fiecare nouă soluţie (individ din generaţia următoare) se
selectează doi părinţi din baza genetică formată anterior (care conţine doar indivizii
cei mai performanţi din generaţia curentă), se recombină caracteristicile acestora şi
se memorează rezultatele. Procesul continuă până când numărul de indivizi atinge
dimensiunea scontată a populaţiei.
Recombinarea are loc de-a lungul evoluţiei în funcţie de valoarea
parametrului probabilitate de recombinare stabilită apriori de către utilizator. În
cazul în care acest proces nu are loc, indivizii selectaţi sunt copiaţi ca atare în
următoarea generaţie.
252 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

6.3.2.1. Metode de recombinare în cazul codificării în


numere reale

i) Recombinarea discretă realizează schimbul de valori ale variabilelor între


indivizi [6.12]. Se consideră următorii doi indivizi caracterizaţi fiecare de câte trei
valori:
Individul 1 12 25 5
Individul 2 123 4 34
Fiecare variabilă a părinţilor contribuie la determinarea valorii variabilelor
urmaşilor. Dacă valorile variabilelor sunt alese conform distribuţiei:
Exemplul 1 Individ 2 Individ 2 Individ 1
Exemplul 2 Individ 1 Individ 2 Individ 1
atunci urmaşii sunt:
Urmaş 1 123 4 5
Urmaş 2 12 4 5
ii) Recombinarea aritmetică este operatorul care combină doi cromozomi
părinţi pentru a produce doi urmaşi conform ecuaţiilor:
Urmaş1 = a ⋅ Părinte1 + ( 1 − a ) ⋅ Părinte 2
Urmaş 2 = ( 1 − a ) ⋅ Părinte1 + a ⋅ Părinte 2
unde a este un factor aleator de ponderare (ales înainte de fiecare operaţie de
recombinare). Acesta poate fi constant (caz în care recombinarea se numeşte
aritmetică uniformă), poate fi variabil cu vârsta generaţiei (aritmetică neuniformă)
sau poate fi generat aleator din domeniul [0;1) (încrucişare liniară).
Fie doi părinţi având cromozomii formaţi din câte 4 gene reale, selectaţi
pentru recombinare:
Părinte1:( 0,3) ( 1, 4 ) ( 0, 2 ) ( 7, 4 )
Părinte 2 :( 0,5 ) ( 4,5 ) ( 0,1) ( 6,6 )

Dacă a = 0,7 , atunci se vor produce următorii urmaşi:


Urmaş1: ( 0,36 ) ( 2,33) ( 0,17 ) ( 6,86 )
Urmaş 2 : ( 0, 402 ) ( 2,981) ( 0,149 ) ( 6,842 )

iii) Recombinarea euristică este un operator ce utilizează valorile funcţiilor


de performanţă ale părinţilor pentru a determina direcţia căutării.
Urmaşii sunt creaţi conform ecuaţiilor:
Urmaş1 = Po + r ( Po − Ps )
Urmaş 2 = Po

unde Po este părintele mai performant dintre cei doi selectaţi (adică cel cu valoarea
funcţiei de performantă cea mai mică în cazul problemelor de minimizare, sau cea
Algoritmi genetici 253

mai mare, în cazul problemelor de maximizare), Ps este părintele mai slab, iar r
este un parametru generat aleator între 0 şi 1.
Există cazuri în care Urmaş1 astfel generat nu este fezabil. Aceasta se
întâmplă atunci când r ia valori care conduc la aruncarea uneia sau mai multor gene
în afara limitelor admisibile de variaţie. Din acest motiv, recombinarea euristică
foloseşte un parametru introdus de utilizator (n) care specifică de câte ori se va
încerca găsirea (nimerirea) unui r ce duce la o soluţie fezabilă. Dacă după cele n
încercări nu s-a produs un cromozom corespunzător, atunci Urmaş1 ia valoarea
părintelui slab ( Ps ).

6.3.2.2. Metode de recombinare în cazul codificării


binare

i) Încrucişarea într-un singur punct


În acest caz se alege aleator o poziţie de încrucişare p în intervalul [1, N],
unde N este lungimea cromozomilor. Astfel, urmaşul 1 va moştenii primele p gene
de la individul 1 şi ultimele N − p gene de la individul 2, în timp ce urmaşul 2 va
moştenii primele p gene de la individul 2 şi ultimele N − p gene de la individul 1,
aşa cum se poate observa şi în figura 6.8.
p g e nN e - p g e n e p g e n eN - p g e n e
Pă r i n t e 1 U r şm a 1

Pă r i n t e 2 U r şm a 2

Fig. 6.8. Încrucişare într-un singur punct.

Dacă se consideră că există 2 indivizi, I1 = ( g11 , g 12 ,..., g 1N −1 , g 1N ) şi respectiv


I 2 = ( g12 , g 22 ,..., g N2 −1 , g N2 ) , atunci algoritmul de încrucişare într-un punct este:

Algoritmul de încrucişare într-un singur punct


Pasul 1: Se generează aleator punctul de încrucişare p, 1 < p < N .
Pasul 2: Împarte I1 în ( g1 , g 2 ,..., g p −1 , g p ) şi ( g p +1 , g p + 2 ,..., g N −1 , g N ) .
1 1 1 1 1 1 1 1

Împarte I 2 în ( g1 , g 2 ,..., g p −1 , g p ) şi ( g p +1 , g p + 2 ,..., g N −1 , g N ) .


2 2 2 2 2 2 2 2

Pasul 3: Generează cei doi urmaşi U1 = ( g11 , g 12 ,..., g 1p , g p2 +1,..., g N2 ) şi

respectiv U 2 = ( g1 , g 2 ,..., g p , g p +1,..., g N ) .


2 2 2 1 1

Pentru a exemplifica această metodă de recombinare, se consideră doi


indivizi caracterizaţi de un cromozom de lungime 11:
Individul 1 0 1 1 1 0 0 1 1 0 1 0
Individul 2 1 0 1 0 1 1 0 0 1 0 1
254 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

Dacă punctul de încrucişare este 5, atunci urmaşii generaţi vor fi:


Urmaşul 1 0 1 1 1 0 1 0 0 1 0 1
Urmaşul 2 1 0 1 0 1 0 1 1 0 1 0
ii) Încrucişarea în mai multe puncte
Încrucişarea în mai multe puncte reprezintă o generalizare a încrucişării într-
un punct. În acest caz vor fi generate m puncte de încrucişare p1 < p2 < pm în
intervalul [1, N]. Apoi variabilele dintre două puncte succesive de încrucişare sunt
interschimbate între cei doi părinţi, pentru a obţine cei doi urmaşi, aşa cum se poate
observa în figura 6.9.

Pă r i n t e 1 U r şm a 1

Pă r i n t e 2 U r şm a 2

Fig. 6.9. Încrucişare în mai multe puncte.

Pentru cazul a 2 indivizi, I1 = ( g11 , g 12 ,..., g 1N −1 , g 1N ) şi respectiv


I 2 = ( g , g ,..., g
2
1
2
2
2
N −1
2
, g ) , algoritmul de încrucişare în mai multe puncte este:
N

Algoritmul de încrucişare în mai multe puncte


Pasul 1: Se generează aleator m puncte de încrucişare p1 , p2 ,K , pm
1 < p1 < p2 < ... < pm < N .
Pasul 2: Împarte I1 în m + 1 părţi: I1 = g1 , g 2 ,..., g p1 ,
1 1 1 1
( )
( ) ( )
I12 = g 1p1 +1 ,..., g 1p2 , I13 = g 1p2 +1 ,..., g 1p3 ,…, I1m = g 1pm−1 +1 ,..., g 1pm , ( )
(
I1m +1 = g 1pm +1 ,..., g 1N . )
Împarte I 2 în m + 1 părţi: I 2 = g1 , g 2 ,..., g p1 ,
1 2 2 2
( )
I = g
2
2 ( 2
p1 +1 ,..., g ) , I =( g
2
p2
3
2
2
p2 +1 ) (
,..., g 2p3 ,…, I 2m = g 2pm−1 +1 ,..., g 2pm , )
(
I 2m +1 = g 2pm +1 ,..., g ) . 2
N

Pasul 3: Generează cei doi urmaşi U1 = ( I1 , I 2 , I1 , I 2 ,...) şi respectiv


1 2 3 4

U 2 = ( I 21 , I12 , I 23 , I14 ,...) .

Se consideră exemplul prezentat în paragraful anterior:


Individul 1 0 1 1 1 0 0 1 1 0 1 0
Individul 2 1 0 1 0 1 1 0 0 1 0 1
Dacă m = 3 şi cele trei puncte de încrucişare sunt p1 = 2 < p2 = 6 < p3 = 10 ,
atunci urmaşii generaţi vor fi:
Urmaşul 1 0 1 1 0 1 1 0 1 1 1 1
Algoritmi genetici 255

Urmaşul 2 1 0 1 1 0 0 0 0 1 0 0
iii) Încrucişarea uniformă este un operator pentru codificarea binară care
specifică provenienţa pentru fiecare genă a urmaşului (de la ce părinte s-a moştenit
fiecare genă). Acest principiu face posibilă încrucişarea la nivel de genă, nu la
nivel de segment, ca în cazurile anterioare.Gradul de ”amestecare” a genelor este
dat de un parametru subunitar (uzual egal cu 0,5) numit rată de încrucişare.
Fie doi părinţi având cromozomii:
gena1 gena2 gena3 gena4 gena5 gena6 gena7 gena8 gena9
Părinte 1 0110 1010 0101 1100 0100 1101 0010 0010 0001
Părinte 2 0010 0111 0010 0010 1010 1110 1011 0111 0010
Pentru fiecare se generează o mască (de lungime egală cu numărul de gene
din cromozom) după care se va ghida procesul de copiere a genelor în cromozomul
urmaşilor. Această mască este formată tot din valori binare, însă având următoarea
semnificaţie: dacă valoarea de pe poziţia k din masca primului părinte este 1, atunci
gena de rang k este copiată în cromozomul urmaşului 1, pe poziţia k, iar gena de
rang k din urmaşul 2 va lua valoarea genei corespunzătoare din părintele 2. Altfel,
pentru valoarea 0, se procedează dual. Reiese natural că măştile sunt
complementare (una este negaţia celeilalte).
Pentru părinţii reprezentaţi mai sus, dacă se alege o rată de încrucişare de 0,5,
cele două măşti pot fi, de exemplu:
gena1 gena2 gena3 gena4 gena5 gena6 gena7 gena8 gena9
Părinte 1 0 0 1 0 1 1 1 0 0
Părinte 2 1 1 0 1 0 0 0 1 1
Aceasta înseamnă că gena de rang 4 pentru urmaşul 1 va fi 0010 (adică gena
de acelaşi rang a părintelui 2) iar pentru urmaşul 2, gena de rang 4 va fi 1100
(corespunzătoare părintelui 1).

6.3.3. Operatorul de mutaţie


Operatorul de mutaţie este utilizat pentru păstrarea diversităţii populaţiei de
la o generaţie la alta. Mutaţia evită convergenţa către optime locale prin
împiedicarea indivizilor din populaţie să devină prea asemănători unii cu alţii, ceea
ce ar duce la încetinirea sau chiar la stagnarea evoluţiei. Aceasta se obţine prin
modificarea uneia sau mai multor gene ale unui individ din baza genetică înainte de
a fi transferat în noua generaţie. Fiind inspirată din natură, unde procesele de
mutaţie au loc foarte rar, probabilitatea de mutaţie este foarte scăzută (de ordinul
0,001), spre deosebire de încrucişare.
În cazul codificării binare, procedeul de mutaţie este intuitiv, şi constă în
negarea unui bit arbitrar din secvenţa genetică pe baza unei probabilităţi de
modificare. O metodă uzuală de implementare a operatorului de mutaţie implică
generarea unui număr aleatoriu pentru fiecare bit din secvenţă, care precizează dacă
un bit va fi modificat sau nu.
256 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

De exemplu, pentru un cromozom 11001001, mutaţia la nivelul genei 2


produce un cromozom cu structura 10001001.
Mutaţia poate fi aplicată şi în cazul codificării în numere reale:
a) Mutaţia neuniformă
În acest caz se alege aleatoriu una dintre genele individului şi se modifică,
restul cromozomului rămânând nemodificat.
Fie x cromozomul la care se produce mutaţia genei xk . Atunci aceasta se
modifică în:
 xk + ( xkd − xk ) δ dacă r1 < 0,5

, δ = r2 ( 1 − t T )
b
x 'k = 
 xk − ( xk − xk ) δ dacă r1 ≥ 0,5
s

unde: r1 şi r2 sunt două numere aleatoare;


T – numărul total de generaţii;
t – generaţia curentă;
b – parametru impus de utilizator.
Pe măsură ce numărul generaţiilor parcurse, t, creşte, termenul δ devine mai
mic, şi modificările produse de operator se diminuează, având ca efect nepărăsirea
brutală a unei soluţii bune din spaţiul soluţiilor.
b) Mutaţia la frontieră
Se generează un număr aleatoriu între 0 şi 1, iar dacă r este mai mic decât 0,5
atunci gena de modificat se mută la capătul inferior al intervalului de apartenenţă
stabilit anterior. Altfel, gena se înlocuieşte cu marginea superioară a intervalului.

6.4. Exemple de optimizare utilizând


algoritmii genetici
Aplicaţia 1. Fiind dată funcţia f ( x ) = x , să se găsească maximul acesteia în
2

intervalul 0..31.
Reprezentarea soluţiilor se poate face prin şiruri de 5 biţi.
Iniţializarea: se porneşte de la o populaţie aleatoare (fie aceasta de 4 indivizi), fiecare
de câte 5 biţi. De exemplu, aceştia pot fi 01101, 11000, 01000, 10011 (aleşi aleator).
Performanţa: funcţia de performanţă pentru acest exemplu simplu se calculează prin
evaluarea funcţiei f ( x ) = x . Rezultă valorile 169, 576,64, 361, cu valoarea medie 293 şi
2

maximul de 576.
Selecţia:
– se însumează performanţele rezultând 1170 şi se reproduc fiecare individ în
noua generaţie în funcţie de proporţia performanţei lui în cadrul sumei (de
exemplu, 14.4%, 49.2%, 6.5%, 30.9%);
– se alege un număr aleator r între 1 şi 1000;
– dacă r ≤ 144 atunci se selectează 01101
altfel
Algoritmi genetici 257

dacă 145 ≤ r ≤ 636 atunci se selectează 11000


altfel
dacă 637 ≤ r ≤ 692 atunci se selectează 01000
altfel se selectează 10011.
– repetă de 4 ori (cât numărul de indivizi din populaţie).
Se presupune că în urma acestor iteraţii numerele aleatoare au condus la selectarea
numai a indivizilor 01101, 11000, 11000, şi 10011 (aceştia formează baza genetică pentru
generaţia următoare); individul 01000 a dispărut.
Recombinarea: se aleg doi indivizi din baza genetică, la întâmplare; se alege un
punct de încrucişare aleatoriu între 1 şi 5 (k), şi se interschimbă toate valorile de rang mai
mare decât k. De exemplu, pentru k = 4 , cromozomii 01101 şi 11000 produc urmaşii
01100 şi 11001.
Mutaţia: Considerând o probabilitate de ordinul 0.001 pentru fiecare bit, în noua
populaţie unii biţi vor fi schimbaţi în concordanţă cu aceste probabilităţi. Având 4 indivizi a
5 biţi, reiese că se vor schimba 20*0.001=0.02 biţi. În exemplul considerat nu se va
modifica nici un bit. (a se observa cât de mică este probabilitatea de mutaţie).
Evaluarea noii generaţii: performanţele noii generaţii sunt 144, 625, 729, 256, cu o
medie de 439 şi un maxim de 729.
Observaţie: În acest exemplu, găsirea maximului nu pare a fi o problemă de căutare.
Maximul se poate calcula uşor, deoarece se ştie deja că funcţia de performanţă aleasă este
monoton crescătoare. Însă, în general, funcţia de performanţă nu este monotonă, iar o
abordare computaţională clasică nu mai este utilă.
Aplicaţia 2. Se consideră o populaţie constituită din patru indivizi, aceştia fiind
codificaţi pe patru biţi. Rata de încrucişare utilizată este Ri = 0, 6 iar rata mutaţiilor este
Rm = 0, 001 . În aceste condiţii să se caute maximul funcţiei f ( x) = − x 2 + 16 x + 15 .

Se consideră că genele indivizilor reprezintă codificarea binară a numărului x. Astfel,


se obţin valorile prezentate în tabelul 6.4.
Tabelul 6.4. Valorile codificate şi decodificate ale indivizilor.
Individ Valoarea decodificată (x) Individ Valoarea decodificată (x)
0000 0 1000 8
0001 1 1001 9
0010 2 1010 10
0011 3 1011 11
0100 4 1100 12
0101 5 1101 13
0110 6 1110 14
0111 7 1111 15

Prin utilizarea tabelului 6.4 se determină valoarea decodificată a individului şi se


calculează valoarea funcţiei f în acest punct, valoarea funcţiei de potrivire fiind direct
proporţională cu această valoare. Altfel spus, pentru fiecare individ i se defineşte valoarea
funcţiei de potrivire conform relaţiei:
f ( xi )
Potrivire ( i ) = N

∑f(x )
(6.2)
j
j =0
258 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

unde xi este valoarea decodificată a individului i, f ( x) valoarea funcţiei obiectiv (funcţia


pentru care se doreşte găsirea optimului), iar N este numărul de indivizi ai populaţiei, în
cazul de faţă fiind 4.
Primul pas îl constituie generarea aleatoare a patru indivizi, ce vor constitui generaţia
iniţială. Se consideră că cei patru indivizi generaţi sunt: 1101, 0100, 0011, şi respectiv
1001. Din tabelul 6.4 se obţin valorile decodificate ale indivizilor, pe baza acestora
calculându-se valorile funcţiei f în aceste puncte. Aceste valori, împreună cu valoarea
funcţiei de potrivire pentru fiecare din cei patru indivizi sunt prezentate în tabelul 6.5.
Tabelul 6.5. Valorile pentru populaţia iniţială.

Valoarea Valoarea funcţiei Valoarea funcţiei


Individ
decodificată (x) obiectiv f ( x ) de potrivire
1101 13 54 0,217
0100 4 63 0,253
0011 3 54 0,217
1001 9 78 0,313

Deoarece rata de încrucişare este Ri = 0, 6 numărul indivizilor ce participă la


recombinare este N R = N ⋅ Ri = 4 ⋅ 0, 6 = 2, 4 ≅ 2 ; indivizii selectaţi pentru încrucişare sunt
0100 şi respectiv 1001. Dacă se aplică acestora o încrucişare într-un singur punct cu p = 2 ,
atunci urmaşii rezultaţi sunt 1101 şi 0011. Noua generaţie va fi formată din indivizii 1111,
0100, 0001 şi 1001. Pentru această nouă generaţie, valorile decodificate, ale funcţiei
obiectiv precum şi cele ale funcţiei de potrivire se dau în tabelul 6.6.
Tabelul 6.6. Valorile pentru populaţia iniţială.

Valoarea Valoarea funcţiei Valoarea funcţiei


Individ
decodificată (x) obiectiv f ( x ) de potrivire
1111 15 30 0,149
0100 4 63 0,314
0001 1 30 0,149
1001 9 78 0,388
Se consideră că indivizii selectaţi sunt 0100 şi respectiv 1001, şi între aceştia are loc
o încrucişare într-un punct cu p = 2 . Noua generaţie va fi formată din: 1111, 0101, 0001 şi
1000. Se observă că această generaţie conţine individul 1000 a cărui valoare decodificată
este 8, valoare pentru care funcţia f ( x) = − x 2 + 16 x + 15 îşi atinge maximul. Aceasta
înseamnă că cea de-a treia generaţie conţine soluţia.

6.5. Implementarea algoritmilor genetici în


limbajul C++
Acest paragraf are scopul îndrumării cititorului în realizarea unui program ce
simulează algoritmii genetici. Pentru compilarea şi rularea programului, trebuie
utilizat un compilator C++. Programul listat a fost realizat cu ajutorul Microsoft
Visual Studio 2005.
Algoritmi genetici 259

6.5.1. Abordare şi elemente de limbaj


După cum s-a prezentat în paragrafele precedente, algoritmii genetici
simulează viaţa organismelor vii în virtutea principiilor darwiniste. În acest sens, se
pleacă de la o populaţie iniţială, se evaluează performanţele, se aleg câteva dintre
cele mai potrivite organisme (i.e. cu performanţele cele mai bune) şi se recombină,
pentru a produce o nouă generaţie. Organismele din generaţia precedentă dispar, iar
cele din generaţia curentă sunt supuse aceluiaşi proces. Această rutină se reiterează
până când unul din organismele obţinute devine optim, sau până când se ajunge la
un număr maxim prestabilit de generaţii.
Problema care se urmăreşte a fi rezolvată a fost prezentată în paragraful 6.2 şi
este următoarea: cunoscând cifrele 0, 1, ..., 9 şi operatorii aritmetici +, -, * şi /, să
se găsească şirul de operaţii necesare pentru obţinerea unui număr dat.
Programul poate fi văzut ca o ierarhie de funcţii, toate aflate în acelaşi fişier,
a cărui structură generală este:

Declaraţii ( )
Prototipuri
main( )
Citire date
Initializare
Pentru fiecare cromozom din populaţia curenta execută
Procedura_Selectie( )
Procedura_Incrucisare( )
Procedura_Mutatie( )
Procedura_Performante( )
Procedura_Afisare( )
SfarsitPentru
SfarsitMain
Secţiunea de declaraţii conţine seria de fişiere Header şi Namespace-uri care
sunt necesare (iostream.h, math.h, string.h etc.). Pe lângă acestea, tot aici se
definesc unele valori predefinite (rata de încrucişare, numărul maxim de generaţii
etc.). În cazul problemei expuse, sunt necesare:
#define RATA_INCRUCISARE 0.7
#define RATA_MUTATIE 0.001
#define DIM_POP 100 //trebuie sa fie
numar intreg
#define LUNGIME_CROMOZ 300
#define LUNGIME_GENA 4
#define NR_MAX_GENERATII 400
#define RANDOM_NUM ((float)rand()/(RAND_MAX+1))
Cromozomii în această situaţie sunt codificaţi în binar, având structura
definită astfel:
260 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice
struct chromo_typ
{
// stringul de biti va fi stocat intr-un
// std::string
string biti;
float fitness; //functia de performanta
chromo_typ(): biti(""), fitness(0.0f){};
chromo_typ(string bts, float ftns): biti(bts),
fitness(ftns){}
};
Secţiunea de prototipuri este destinată declarării funcţiilor utilizate; aceasta
poate lipsi, dacă fiecare funcţie este definită înainte de a fi apelată. Funcţiile
necesare sunt:
void TiparSimbolGena(int val);
string PreiaBitiAleatori(int length);
int BinToDec(string biti):
float AssignFitness(string biti, float
valoare_obiectiv);
void TiparCromoz(string biti)
int ImparteBiti(string biti, int* buffer);
string Ruleta(int total_fitness, chromo_typ*
Populatie);
void Mutatie(string &biti);
void Recomb(string &urmas1, string &urmas2);
Funcţia Ruleta realizează procedura de selecţie prin metoda roţii de ruletă,
recombinarea se face într-un singur punct, iar mutaţia este la nivel de bit. Funcţiile
de afişare pe ecran sunt TiparSimbolGena şi TiparCromoz, iar celelalte sunt funcţii
auxiliare folosite pentru manipularea şirurilor de biţi. De exemplu, funcţia
BinToDec face decodificarea cromozomilor, prin conversia de la numărul în baza 2
la cel zecimal corespunzător.
În cadrul funcţiei main se realizează următoarele:
– citirea datelor: un număr real ţintă;
– iniţializarea populaţiei iniţiale, cu funcţia fitness egală cu 0.
for (int i=0; i<DIM_POP; i++)
{
Populatie[i].biti =
PreiaBitiAleatori(LUNGIME_CROMOZ);
Populatie[i].fitness = 0.0f;
}
– calculul performanţelor
Populatie[i].fitness=AssignFitness(Populatie[i].biti
,Obiectiv);
– în cazul găsirii unei soluţii, tipărirea acesteia şi încheierea procesului de
căutare.
Funcţia PreiaBitiAleatori utilizată la generarea populaţiei iniţiale întoarce un
şir aleator format din cifre de 0 şi de 1, având lungimea LUNGIME_CROMOZ.
Algoritmi genetici 261

Funcţia AssignFitness foloseşte ÎmparteBiţi pentru a ”sparge” şirul în gene a


patru biţi şi calculează rezultatul operaţiilor echivalente. Pe baza acestui rezultat se
evaluează funcţia de fitness a cromozomului şi se asociază acestuia.
if (rezultat == valoare_obiectiv)
return 999.0f;
else
return 1/(float)fabs((double)(valoare_obiectiv-
rezultat));
S-a considerat valoarea arbitrară 999 ca fiind cea mai mare valoare a funcţiei
fitness, iar cromozomii având această funcţie egală cu 999 se consideră soluţie.
Funcţia Ruleta realizează selecţia, utilizând principiul roţii de ruletă, conform
căruia un disc este împărţit în ”felii” de dimensiuni proporţionale cu fitness-ul
fiecărui cromozom. Alegând un număr aleator, este cel mai probabil ca acesta să
”nimerească” în dreptul feliei cu dimensiunile cele mai mari. Astfel se asigură
supravieţuirea cromozomului celui mai bine adaptat (cel mai aproape de soluţie).
for (int i=0; i<DIM_POP; i++)
{
Suma_pana_acum += Populatie[i].fitness;
if (Suma_pana_acum >= felie)
return Populatie[i].biti;
}
Suma_pana_acum este suma parţială a fitness-urilor cromozomilor procesaţi
până în prezent şi este necesară pentru partiţionarea (”felierea”) ponderată a
discului.
Funcţia Recomb asigură încrucişarea cromozomilor şi realizează
interschimbarea biţilor de la un rang aleator spre sfârşitul cromozomilor selectaţi.
Acest operator se aplică proporţional cu rata de recombinare.
int Recomb = (int) (RANDOM_NUM * LUNGIME_CROMOZ);
string t1=urmas1.substr(0,Recomb)
+urmas2.substr(Recomb,LUNGIME_CROMOZ);
string t2=urmas2.substr(0,Recomb)
+urmas1.substr(Recomb,LUNGIME_CROMOZ);
urmas1 = t1;
urmas2 = t2;
Funcţia Mutatie aplică operatorul de mutaţie la nivel de bit, modificând
aleator o parte din biţi din 0 în 1 sau din 1 în 0.
for (i=0; i<biti.length(); i++)
{
if (RANDOM_NUM < RATA_MUTATIE)
{
if (biti.at(i) == '1')
biti.at(i) = '0';
else
biti.at(i) = '1';
}
}
262 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

Afişarea soluţiei pe ecran se face prin funcţia TiparCromoz, care la rândul


său apelează funcţia TiparSimbolGenă, pentru fiecare genă rezultată din împărţirea
cromozomului în secvenţe de câte patru biţi.
for (int i=0; i<nr_elemente; i++)
{
TiparSimbolGena(buffer[i]);
}

6.5.2. Aspecte privind utilizarea


programării orientate pe obiecte în cadrul
algoritmilor genetici
Metodele de analiză a algoritmelor genetice cu ajutorul programării orientate
pe obiecte au fost dezvoltate în scopul [6.10]:
• înţelegerii problemei;
• identificării obiectelor importante pentru aplicaţia respectivă;
• identificării relaţiilor dintre obiecte şi modul în care acestea
interacţionează între ele.

6.5.2.1. Identificarea obiectelor în cadrul algoritmilor


genetici

Prima etapă în cadrul procesului de analiză a algoritmilor genetici este


identificarea obiectelor domeniului de analiză. Obiectele pot fi obţinute printr-o
analiză atentă a descrierii problemei combinată cu cunoştinţele acumulate de
experţii umani în domeniul respectiv. Analiza domeniului poate fi îndreptată numai
spre identificarea obiectelor pe care experţii umani le consideră importante pentru
rezolvarea problemei. Aceasta se realizează prin studierea unor aplicaţii similare ce
au fost rezolvate de către experţi.
Un model orientat pe obiecte este utilizat pentru a descrie structura statică a
sistemului şi relaţiile dintre obiecte; în figura 6.10 se prezintă diagrama unei astfel
de structuri pentru algoritmele genetice.
Algoritmi genetici 263

P o pţ u l a i e
A l g o r i t m g e n e t i c
M ă r i m e S e aă p l i c
G e n e r a r e
R a p o r t şd e î n c r u c i a r e
F o ră m a t d i n
R a p o r tţ d e m u t a i i
I n d i v i d
U t i l ăi z e a z
P a r a m e t r i
d e p o t r i v i r e P a r a m e t r i
F o r m a t d i n M ă r i m e c r o m o z o m i
N uă m r d e v a r i a b i l e
C r o m o z o m G e nţ e r a i i
R a p o r t şd e î n c r u c i a r e
L u n g i m e R a p o r tţ d e m u t a i i

F o r m a t d i n

G ăe n

C a r a c t e r

Fig. 6.10. Reprezentarea orientată pe obiecte în cazul algoritmelor genetice.


Se observă că algoritmul genetic utilizează o populaţie de indivizi, fiecare
individ fiind compus din cromozomi care au asociate diverse valori de potrivire.
Cromozomii au aceeaşi lungime şi sunt formaţi din gene, fiecare genă reprezentând
unul din biţii informaţiei codate.

6.5.2.2. Operaţiile asupra obiectelor

Pentru a descrie diferitele stări ale unui algoritm genetic, poate fi utilizat un
model dinamic. Comportamentul AG depinde de operatorii care acţionează asupra
sa şi de evenimentele la care este supus. De exemplu, un model dinamic, reprezintă
de fapt enumerarea stărilor importante necesare realizării unui algoritm genetic şi a
operaţiilor ce sunt necesare pentru construcţia sa. Reprezentarea dinamică poată fi
realizată sub forma unei scheme logice, aşa cum se prezintă în figura 6.11 [6.10].
264 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

S t a r t

C r e a r eţ p o p u l a i e

N eţ i n i i a l i z a r e

I nţ i i a l i z a r e p o p u lţ a i e

I nţ i i a l i z a r e

R u l a r e

R u l a r e
R e g e n e r a r e

E p u i z a rţ e a g e n e r a i i l o r

S t o p

D i v e r g e n t C o n v e r g e n t

Fig. 6.11. Schema logică a unui algoritm genetic.


Diversele evenimente precum crearea, iniţializarea şi rularea vor cauza o
tranziţie între două stări a algoritmului genetic. Spre exemplu, dacă evenimentul
este creare, atunci populaţia algoritmului genetic va ajunge în starea neiniţializare.
Dacă evenimentul este iniţializare, atunci va avea loc o tranziţie din starea de
neiniţializare în starea iniţializare. În starea rulare se ajunge atunci când este
recepţionat un mesaj de rulare, fiind apelat totodată, procesul de regenerare a
populaţiei. În momentul epuizării generaţiilor, se ajunge în starea finală, care poate
fi convergentă (a fost găsită soluţia) sau divergentă.

6.5.2.3. Implementarea orientată pe obiecte

Scopul metodei de implementare este crearea unui program capabil să


simuleze comportamentul algoritmelor genetice. Astfel, pentru o implementare
uşoară şi eficientă, atributele obiectelor ce formează caracteristicile problemei
studiate, sunt organizate sub o formă ierarhizată de clase. Acestei ierarhii de clase i
se vor adăuga obiecte noi pentru ca algoritmul genetic să fie robust şi eficient.
Aceste noi obiecte nu aparţin problemei de studiat, dar sunt necesare pentru
uşurarea procesului de implementare a algoritmului genetic. În final, sistemul va fi
format din mai multe subsisteme, ce pot fi construite şi testate independent, pentru
a reduce complexitatea acestuia.
Algoritmi genetici 265

În cazul utilizării programării orientate pe obiecte, este necesară definirea


unei ierarhi de clase. Ierarhia de clase, pentru reprezentarea algoritmelor genetice
cu ajutorul programării orientate pe obiecte, este prezentată în figura 6.12 în care
sunt descrise clasele, membrii şi funcţiile acestora, precum şi relaţiile de
interdependenţă între clase. Alfabetul ce codifică reprezentarea informaţiei se
consideră format din trei caractere, şi anume 1, 0 şi # care înseamnă ”nu contează”.
Clasa alfabet este considerată clasă de bază, din aceste clase derivând clasele şir,
vector şi cromozom. Clasa individ este derivată din clasa cromozom, fiecare individ
al populaţiei algoritmului genetic fiind caracterizat de un obiect de tip cromozom şi
o valoare de potrivire. Obiectul algoritm genetic este format dintr-o populaţie, care
este un vector de obiecte individ, şi un alt obiect denumit parametri, ce cuprinde o
colecţie de atribute de genul: mărimea populaţiei, lungimea cromozomului,
funcţiile de încrucişare şi mutaţie. În figura 6.12 clasele sunt prezentate sub formă
de dreptunghiuri, specificându-se numele clasei, membrii şi funcţiile sale.
P o pţ u l a i e A l g o r i t m g e n e t i c P a r a m e t r i i
M ă r i m Ue t i l ăi z e a z U t i l ăi z e M a ă z r i m e a c r o m o z o m i l o r
R a p o r t şd e î n c r u c i R a ar ep o r t u şl d e î n c r u c i a r e
G e ţn e r a i i G e nţ e r a i i l e
F o ră m a t d i n
R a p o r tţ d e m u t a i i R a p o r t uţ l d e m u t a i i
I n d i v i d c r e a r e ( ) F ş i i e r u l d e r e z u l t a t e
P a r a m e t r i i i nţ i i a l i z a r e ( ) c r e a r e ( )
d e p o t r i v i r e r e g e n e r a r e ( )
c r e a r e ( ) r u l a r e ( )
o b i e c t i v ( )
r e p r o d u c e r e ( ) Şi r
F o r m a t d i n L u n g i m e
a s o c i e r e ( )
C r o m o z o m
c r e a r e ( ) V e c t o r
î n c şr u c i a r e ( ) d e c oă d i f i c ă ( b a z )
m uţ t a i e ( ) c o dă i f i c ( nă u m r )
F o r m a t d i n

A l f a b e t
c a r a c t e r
m u l t i p l i c a r e ( )
m uţ t a i e ( )

Fig. 6.12. Ierarhia de clase pentru un algoritm genetic.


Apelul funcţiei creare(), pentru un obiect din clasa algoritm genetic, va avea
ca efect apelul funcţiei creare() pentru fiecare obiect din clasa individ ce formează
populaţia algoritmului genetic. Fiecare individ va face un apel al funcţiei creare()
pentru obiectul cromozom ataşat individului. În final, pentru crearea unui
cromozom vor fi apelate obiectele din clasa alfabet şi respectiv şir, pentru a se
încheia astfel secvenţa ierarhică de apeluri. Această secvenţă ierarhizată de apeluri
are ca efect crearea unui obiect din clasa algoritm genetic.
În cazul în care un obiect de tipul algoritm genetic este rulat pentru prima
dată, are loc transmiterea unui mesaj de tipul regenerare() către obiectul de tip
populaţie, pentru a se crea un nou astfel de obiect. Obiectul de tip populaţie işi
transmite un mesaj select() şi câte un mesaj reproducere() către fiecare individ al
populaţiei.
266 Tehnici de Inteligenţă artificială în conducerea sistemelor electroenergetice

În cazul primirii de către un individ a mesajului reproducere(), acesta va


genera la rândul lui către cromozomi două mesaje: împerechere() şi mutaţie(). În
cazul în care un cromozom primeşte un mesaj mutaţie(), acesta va apela obiectele
de tip alfabet pentru a produce o interschimbare aleatoare a genelor ce compun
cromozomul. Când o populaţie a fost regenerată, este transmis acesteia un mesaj
stare() de către obiectul din clasa algoritm genetic. La rândul său populaţia
transmite câte un mesaj funcţie_obiectiv() către fiecare obiect din clasa individ.
Indivizii îşi vor schimba valoarea funcţiei de potrivire şi, la rândul lor, vor trimite
un mesaj decodificare() către fiecare obiect din clasa vector. În final, se va aplica o
secvenţă ierarhică afişare(), care va permite vizualizarea schimbărilor făcute la
nivelul cromozomilor, indivizilor, populaţiei şi algoritmului genetic.
La toate obiectele de tip algoritm genetic, populaţie, cromozom, vector, şir şi
alfabet se ataşează, pe lângă funcţiile prezentate anterior şi cele două funcţii
specifice programării orientate pe obiecte: constructorul şi destructorul. În figura
6.13 sunt prezentate structurile detaliate pentru clasele alfabet, individ şi algoritm
genetic.
A l f a b e t I n d i v i d A l g o r i t m g e n e t i c
c a r a c t e r p o t r i v i r e g e nţ e r a i i
r a p o r t ţ d e m u t a i e
c o n s t r u c t o r c o n s t r u c t o r
r a p o r t d e
d e s t r u c t o r d e s t r u c t o r
î n c şr u c i a r e
m u l t i p l i c a r ei n ţ i i a l i z a r e
m ă r i m e
i nţ i i a l i z a r e c o p i e r e
c o p i e r e r e p r o d u c e r e c o n s t r u c t o r
a p a r ţ t ăe n e n f u ţn c i e o b i e d c e t is v t r u c t o r
m e m o r a r e f u ţn c i e p o t r ii nvţ i i r i e a l i z a r e
r e c u p e r a r e m e m o r a r e r e g e n e r a r e
a şf i a r e r e c u p e r a r e m e m o r a r e
m uţ t a i e a şf i a r e r e c u p e r a r e
s t a r e

Fig. 6.13. Structura claselor alfabet, individ şi algoritm genetic.

Bibliografie

[6.1] Back, T., Hoffmeister, F. – Extended Selection Mechanism in Genetic


Algorithms, ICGA, No. 4, 1991.
[6.2] Blickle, T., Thiele, L. – A Comparison of Selection Schemes used in Genetic
Algorithms, Tik Report, No. 11, 1995.
[6.3] Crow, J.F., Kimura, M. – An Introduction to Population Genetics Theory, Ed.
Harper and Row, 1995.
[6.4] Dumitrache, I, Buiu, C. – Algoritmi genetici. Principii fundamentale şi
aplicaţii în automatică, Editura Mediamira, Cluj-Napoca, 2000.
[6.5] Dumitrescu, D., Costin, H. – Reţele neuronale, Editura Teora, 1996.
Algoritmi genetici 267

[6.6] Eremia, M., Petricică, D., Bulac, A.I., Bulac, C., Triştiu I. – Tehnici de
Inteligenţă artificială. Concepte şi aplicaţii în sistemele electroenergetice,
Editura AGIR, Bucureşti, 2001.
[6.7] Fogel, D. B. – A Comparison of Evolutionary Programming and Genetic
Algorithms on Selected Constrained Optimisation Problems, Simulation
Review, 1996.
[6.8] Goldberg, D. – Genetic Algorithms in Search, Optimisation and Machine
Learning, Addison Wesley Publishing Company, 1989.
[6.9] Grefenstette, G. – Genetic Algorithms for Machine Learning, Springer Verlag
Academic Publisher, 1999.
[6.10] Lai, L. L. – Intelligent Application in Power System, City University,
London, 1998.
[6.11] Miranda, V., Sirnivasan, D., Ponea, L. M. – Evolutionary Computation in
Power System, IJEPES, Vol. 2, No. 2, 1998.
[6.12] Muhlenbein, H., Schlierkamp, Voosen, D. – Analysis of Selection,
Mutation and Recombination in Genetic Algorithms, GMD, 1993.
[6.13] Petricică, D., Eremia. M., Bulac, C., Olaru, C. – Tehnici ale inteligenţei
artificiale în controlul şi exploatarea reţelelor electrice, Partea a IV-a,
Algoritmi genetici: concepte şi aplicaţii, Revista Producerea, transportul şi
distribuţia energiei electrice şi termice, nr. 9, 1997.
[6.14] Rădăşanu, D. – Posibilităţi de utilizare a inteligenţei artificiale în studiul
reţelelor electrice, Teză de doctorat, Universitatea Tehnică ”Gh. Asachi”
Iaşi, 2000.
[6.15] Popa, R. – Modelarea calităţii apei din râuri, Editura HGA, Bucureşti,
1998.
[6.16] Popa, R, Popa, B. – Optimizarea exploatării amenajărilor hidrotehnice,
Editura Tehnică, Bucureşti, 2003.
[6.17] Voight, H. M., Sontibanez-Koref, I., Born, J. – Hierarchically Structured
Distributed Genetic Algorithm, PPSN, No. 2, 1992.

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