MODULUL 4 Algoritmi genetici
Obiective
•
Definirea algoritmilor genetici
•
Definirea reprezentării genetice
•
Înţelegerea evaluării soluţiilor-candidat
•
Definirea operatorilor genetici adecvaţi reprezentării alese
•
Înţelegerea rolului parametrilor şi rolului execuţiilor repetate ale algoritmilor genetici
Termeni cheie Individ Populaţie de indivizi Performanţă a individului Evoluţie
Reprezentare genetică Selecţie Încrucişare genetică Mutaţie genetică
142
LECŢIA 6 Algoritmi genetici Definire. Aplicabilitate Definiţie. Algoritmii genetici (AG) sunt algoritmi de căutare evolutivă, proiectaţi în scopul identificării de soluţii aproximative ale problemelor dificile, prin aplicarea în ştiinţa calculatoarelor a principiilor derivate din biologia evolutivă - moştenirea, mutaţia, selecţia naturală şi încrucişarea. AG sunt implementaţi ca simulări în care o populaţie P de reprezentări abstracte (numite cromozomi) ale soluţiilor candidat (numite indivizi) ale unei probleme de optimizare, evoluează către soluţii din ce în ce mai bune. În biologie, un cromozom este o bucată foarte lungă, continuă de ADN, care conţine multe gene, elemente regulatoare şi alte secvenţe de nucleotide. Evoluţia începe de la o populaţie complet sau parţial aleatoare şi se realizează în generaţii. Principiul de funcţionare al unui AG se bazează pe tendinţa de creştere a performanţei unei populaţii de soluţii candidat, în timp, determinată de competiţia pentru resursele mediului şi propagarea materialului genetic de către cei mai buni indivizi ai populaţiei. Noţiunea-cheie a utilităţii AG este performanţa indivizilor, determinată de funcţia obiectiv şi de restricţiile problemei. Aplicabilitate. AG se aplică cu succes: • problemelor pentru care nu se cunosc algoritmi în timp polinomial; • problemelor cu spaţii de căutare foarte mari (ex. cele combinatoriale);
143
• problemelor de optimizare multiobiectiv, mai ales dacă sunt multimodale sau deceptive. O problemă de optimizare este multimodală dacă posedă mai multe optime locale pe lângă cel global, iar căutarea poate favoriza un optim local (figura 4.1a). Deceptivitatea caracterizează cazurile în care există cel puţin două optime în spaţiul de căutare (un atractor real şi unul fals, înşelător), dar aproape întreg spaţiul favorizează optimul fals (figura 4.1 b).
a)
b)
Fig. 4.1 Exemple de funcţii de minimizare: a) multimodală; b) deceptivă.
Observaţie: • Problemele pentru care AG sunt cei mai adecvaţi şi mai eficienţi sunt acelea în care nu se cunoaşte ce succes se poate atinge pentru o sarcină anume sau nu se cunoaşte „forma” succesului. Aplicaţii frecvente ale AG: probleme de afectare, de clasificare, aplicaţii de tipul „cel mai scurt drum”, planificare a sarcinilor, probleme de flux în reţea, de localizare, probleme tip orar, optimizare în timp real, sisteme de predicţie (economică, geologică, structurală etc.), proiectarea reţelelor neuronale, stabilirea traiectoriilor roboţilor, dezvoltarea comportamentelor în jocuri.
144
Algoritmul genetic standard AG standard este prototipul algoritmilor genetici - primul algoritm de acest fel implementat de Deb în 1970. Este strict generaţional, adică fiecare populaţie înlocuieşte complet populaţia de la generaţia anterioară. Toţi AG dezvoltaţi din 1970 până în prezent se bazează pe acest algoritm. Schema logică a AG standard:
t ← 0 Iniţializare P(t)
Evaluare P(t)
Evoluţia s-a încheiat?
Da
Afişare soluţii (cei mai buni indivizi din P(t))
Nu t ← t + 1 Aplică operatorii genetici
P(t) este înlocuită cu populaţia nou obţinută
Fig. 4.2 Schema logică a AG standard. t reprezintă generaţia curentă, iar P(t) populaţia de indivizi la generaţia t.
145
Cele mai importante aspecte ale folosirii AG sunt: • definirea şi implementarea reprezentării genetice; • modul de evaluare a indivizilor; • definirea şi implementarea operatorilor genetici care dirijează inteligent căutarea.
Reprezentarea genetică Reprezentarea (codificarea) indivizilor se realizează în funcţie de problemă. Aceasta poate fi: Exemplu: Binară 001101001 Valoare (şir de caractere)
2.7, 7.4, 5.0
Permutare
4275136
sau
abcdefg
Arbore
Evaluarea indivizilor În rezolvarea problemelor uniobiectiv, performanţa (calitatea) unui individ este dată de valoarea obiectivului (care se cere minimizată sau maximizată). În schimb, în optimizarea multiobiectiv, se practică: • fie agregarea obiectivelor într-unul singur (transformarea problemei într-una uniobiectiv); • fie alternarea obiectivelor în timpul optimizării; • fie folosirea relaţiilor de dominanţă Pareto între indivizi. Pe parcursul acestui modul se va folosi agregarea obiectivelor.
146
Operatorii genetici Aplicarea operatorilor genetici asupra populaţiei curente P(t) se realizează astfel: • Mai întâi se selectează părinţii, conform modelului de selecţie ales şi pe baza ratei / probabilităţii de încrucişare (vezi secţiunea „Parametrii algoritmilor genetici”); • Apoi se aplică operatorul de încrucişare ales fiecărei perechi de părinţi; astfel se creează descendenţii; • În final se aplică mutaţia genetică unora dintre descendenţi, pe baza ratei / probabilităţii de mutaţie. AG standard presupune crearea la fiecare generaţie a unui număr de descendenţi egal cu numărul de indivizi din P(t) şi înlocuirea acestei populaţii la următoarea generaţie cu populaţia nouă, a descendenţilor, după aplicarea mutaţiei genetice. Alternative de aplicare a AG standard sunt: • adăugarea descendenţilor la populaţia curentă, a.î. dimensiunea populaţiei creşte de la generaţie la generaţie. În aplicaţiile explicate, aceasta este metoda abordată; • folosirea unei populaţii de dimensiune constantă fără înlocuirea populaţiei de la generaţia anterioară. Aceasta presupune adăugarea descendenţilor la populaţia curentă, iar după aplicarea şi a operatorului de mutaţie, se îndepărtează cei mai slabi indivizi.
147
Pentru fiecare dintre cei trei operatori genetici s-au dezvoltat mai multe modele de aplicare - generale sau specifice tipurilor de codificare. Selecţia Definiţie. Selecţia reprezintă alegerea unor indivizi din populaţia curentă pentru aplicarea încrucişării. Indivizii selectaţi, numiţi părinţi, se vor grupa în perechi. Modelele de selecţie cel mai frecvent apelate sunt:
Selecţia turneu constă în alegerea în mod aleator a k părinţi din populaţie, care vor fi supuşi unui turneu de calitate, câştigat prin comparare. Cel mai valoros, câştigătorul, va fi un părinte. În acest fel, procedura se va repeta pentru a selecta toţi părinţii necesari. Parametrul k se numeşte dimensiunea turneului; valoarea sa trebuie acordată cu dimensiunea populaţiei din care se selectează, deoarece o valoare prea mare conduce la un consum mare de timp (la extrem se confundă cu selecţia elitistă), iar o valoarea prea mică nu acordă şanse suficiente de alegere a indivizilor calitativi (la extrem se confundă cu selecţia aleatoare). Selecţia ruletă constă în simularea lansării acului unei rulete pe domeniul valorilor obiectiv pentru indivizii din populaţia curentă (vezi figura 4.3 corespunzătoare unei populaţii de 5 indivizi). Mai întâi se ordonează crescător valorile obiectiv ale indivizilor şi se realizează corespondenţa între performanţa relativă a fiecărui individ şi suprafaţa ruletei. Apoi se generează aleator un număr în [0,1], valoare care va semnifica poziţia finală a acului ruletei.
148
Astfel, probabilitatea de selecţie a unui individ este proporţională cu calitatea sa. Pas1
Pas2
Pas4 Pas3 Fig. 4.3 Ilustrarea selecţiei ruletă pentru cazul maximizării funcţiei obiectiv.
În cadrul selecţiei elitiste, indivizii din populaţia curentă se sortează după performanţă şi se aleg drept părinţi cei mai buni indivizi. După selectarea numărului de părinţi necesar (2*nrper), unde nrper este numărul de perechi rezultant, se aplică o regulă de grupare a acestora în perechi: • regula 0 – părintele k cu părintele k+nrper; ex. [0,5], [1,6], [2,7], [3,8],[4,9]; • regula 1 – părintele 2*k cu părintele 2*k+1; ex. [0,1], [2,3], [4,5], [6,7],[8,9]; • regula 2 – părintele k cu părintele 2*nrper-k-1; ex. [0,9], [1,8], [2,7], [3,6],[4,5] k∈{0,…, nrper-1}. Exemplele de grupare s-au dat pentru nrper=5.
149
Încrucişarea genetică (recombinarea) Definiţie. Încrucişarea este operatorul prin care se combină materialul genetic a doi indivizi-părinţi, în scopul creării unuia sau a doi descendenţi. Modelele de încrucişare cel mai frecvent apelate sunt:
Încrucişarea cu 1 punct funcţionează astfel: se selectează aleator un punct de încrucişare, iar cei doi descendenţi rezultă prin combinarea celor două părţi rezultate din părinţi. Exemplu:
Fig. 4.4 Exemplu de funcţionare a încrucişării cu 1 punct pentru indivizi codificaţi binar, pe 8 poziţii.
Încrucişarea cu 2 puncte funcţionează analog încrucişării cu 1 punct, cu specificarea că se aleg două puncte de încrucişare.
150
Exemplu:
Fig. 4.5 Exemplu de funcţionare a încrucişării cu 2 puncte pentru indivizi codificaţi valoare, pe 3 poziţii.
Încrucişarea aritmetică, adecvată codificării valoare reală, constă în producerea a doi descendenţi, pentru care valorile genelor se stabilesc după regula: Descendent1 = a * Părinte1 + (1- a) * Părinte2 Descendent2 = (1 – a) * Părinte1 + a * Părinte2 unde a este o valoare aleatoare, generată înaintea fiecărei aplicări a operatorului. Exemplu: Părinte1: (0.3 1.4 0.2 7.4) Părinte2: (0.5 4.5 0.1 5.6) Dacă a = 0.7, descendenţii vor fi: Descendent1: (0.360 2.330 0.170 6.860) Descendent2: (0.402 2.981 0.149 6.842). Încrucişarea euristică foloseşte valorile părinţilor pentru a determina direcţia căutării. Descendenţii se creează conform ecuaţiilor: Descendent1 = cmbp + r * (cmbp – cmsp) Descendent1 = cmbp unde r este un număr aleator între 0 şi 1, iar cmbp şi cmsp desemnează cel mai bun părinte şi respectiv cel mai slab părinte. Încrucişarea PPX (Precedence Preserving Crossover – încrucişare cu păstrarea relaţiilor de precedenţă ale părinţilor). Acest operator, specific
151
codificării permutare, foloseşte o mască uniformă pentru a selecta părintele din care va fi aleasă următoarea genă pentru unicul descendent care rezultă. Părintele selectat este scanat pentru prima valoare care nu a fost deja aleasă. Exemplu:
Fig. 4.6 Exemplu de funcţionare a operatorului PPX pentru indivizi codificaţi permutare, pe 7 poziţii.
Încrucişarea UX (Uniform Order-Based Crossover), adecvată pentru codificarea permutare, foloseşte o mască de încrucişare uniformă pentru a selecta părintele care furnizează relaţia de precedenţă. Operatorul preia genele din primul părinte, păstrându-le la locaţiile unde masca are 1, iar genele rămase sunt plasate în locaţiile libere în ordinea în care apar în al doilea părinte. Exemplu:
Fig. 4.7 Exemplu de funcţionare a operatorului UX pentru indivizi codificaţi permutare, pe 7 poziţii.
Mutaţia genetică Definiţie. Mutaţia este un operator unar care modifică minor individul căruia se aplică.
152
Pe de o parte, modificarea se impune a fi minoră pentru a respecta similaritatea cu procesele naturale, iar pe de alta, nu trebuie folosită cu o rată prea mare, pentru că AG nu este o căutare aleatoare a unei soluţii. El foloseşte procese stocastice, dar rezultatul este nealeator - este mai bun decât aleator. Mutaţia are rolul de a păstra diversitatea în populaţie şi de a îmbunătăţi local o soluţie. Modelele de mutaţie genetică sunt:
Mutaţia inversiune de biţi constă în selectarea în mod aleator a genei cromozomului căreia se aplică operatorul şi schimbarea valorii sale (dacă este 0 devine 1 şi dacă este 1 devine 0). Exemplu:
Fig. 4.8 Exemplu de funcţionare a mutaţiei inversiunii de biţi pentru un individ codificat binar, pe 8 poziţii.
Mutaţia complementară – se selectează aleator o genă a cromozomului căreia se aplică operatorul şi se schimbă valoarea sa cu complementul faţă de valoarea maximă admisă a genei. Exemplu: Înainte de mutaţie: (98, 123, 54) După mutaţie:
(98, 123, 146),
unde 146 este complementul lui 54 faţă de 200 (valoarea maximă admisă a genei 3).
153
Mutaţia mediată constă în selectarea aleatoare a unei poziţii din cromozom şi înlocuirea valorii de pe această poziţie cu media (de regulă aritmetică) a valorilor corespunzătoare din cromozomii-părinţi din care cromozomul în cauză a luat naştere. Exemplu: Înainte de mutaţie: (2.6 Părinte1: (4.0 Părinte2: (1.6 După mutaţie: (2.6
5.7 8.4 9.4 5.7
4.4 5.0 2.2 3.6
4.8) 7.2) 7.0) 4.8)
De notat că acest tip de mutaţie nu se aplică acelor indivizi care provin din populaţia iniţială (deoarece aceştia nu au rezultat din nişte părinţi) şi că folosirea sa implică memorarea pentru fiecare individ al populaţiei cel puţin a indicilor părinţilor din care a rezultat. Mutaţia adăugare – se selectează aleator o genă a cromozomului căreia se aplică operatorul şi se adaugă la valoarea sa o cantitate mică, generată aleator în intervalul [a,b], unde a şi b sunt în corespondenţă cu dimensiunea intervalului posibil al valorilor genei alese. Exemplu: Înainte de mutaţie: (98, 123, 54) După mutaţie:
(98, 123, 56),
unde 56 a rezultat prin adăugarea la 54 a valorii 2 (generate aleator în intervalul [0,3]). Mutaţia translaţie - se selectează aleator un bloc de gene (de lungime aleatoare) care se mută înapoi sau înainte cu un număr de poziţii (stabilit aleator). Exemplu:
Fig. 4.9 Exemplu de funcţionare a mutaţiei translaţie pentru un individ codificat permutare, pe 7 poziţii.
154
Mutaţia rotaţie - se selectează aleator un bloc de gene (de lungime aleatoare), în care se inversează ordinea genelor.
Fig. 4.10 Exemplu de funcţionare a mutaţiei rotaţie pentru un individ codificat permutare, pe 7 poziţii.
Observaţii: • În urma aplicării unui operator genetic, cromozomii rezultat pot fi sau nu fezabili; fezabilitatea (validitatea) unui cromozom este decisă de tipul de codificare şi restricţiile problemei. • Posibilităţi de tratare a infezabilităţilor: - aplicarea unui algoritm de „legalizare” a rezultatului infezabil; - renunţarea la aplicarea operatorului la pasul curent; - aplicarea repetată a operatorului; dacă rezultatele rămân infezabile după k încercări, fie se renunţă, fie se apelează alt model, deja implementat, al aceluiaşi operator.
Parametrii algoritmilor genetici Unui AG i se poate impune o tendinţă anume de funcţionare prin valorile parametrilor săi. Parametrii (ficşi sau variabili pe parcursul unei execuţii) sunt: • dimensiunea populaţiei (n) - reprezintă numărul de indivizi din populaţie într-o generaţie; • rata/probabilitatea încrucişării (rc/pc). Încrucişarea se aplică fie pe baza unei rate, fie pe baza unei probabilităţi. Rata reprezintă proporţia de indivizi (din n) care participă la încrucişare. Probabilitatea de încrucişare reprezintă pragul (un număr în (0,1)) stabilit drept probabilitatea ca un individ să fie părinte; se generează aleator un
155
număr în (0,1), iar dacă acesta se află sub pragul stabilit, individul este un părinte al unei perechi, altfel el se propagă în următoarea generaţie neschimbat; • rata/probabilitatea mutaţiei (rm/pm). Similar încrucişării, mutaţia genetică se aplică pe baza unei rate sau probabilităţi, cu aceeaşi semnificaţie; • parametrii pentru stabilirea condiţiilor de încheiere a evoluţiei: numărul maxim de generaţii, dimensiunea maximă a populaţiei curente, pragul calităţii medii a populaţiei, pragul calităţii celui mai bun individ din populaţia curentă etc.
Observaţii: • Valorile adecvate pentru rc/pc se situează în intervalul [0.6,1.0]. • Valorile adecvate pentru rm/pm se situează sub 0.2 (chiar 0.0001); acestea se corelează însă cu n, pentru a avea loc cel puţin o mutaţie pe generaţie. • De regulă, o dimensiune mai mare a populaţiei sau / şi un număr mai mare de generaţii vor conduce la rezultate mai bune, dar într-un timp mai mare. • În scopul creşterii şanselor de identificare a unor soluţii bune, se poate menţine o arhivă actualizată de soluţii elită care participă (sau nu) la aplicarea selecţiei pentru încrucişare. • Din cauza factorului aleator implicat în funcţionarea AG - la iniţializarea populaţiei şi aplicarea operatorilor genetici - de regulă, un algoritm se execută repetat pentru acelaşi set de valori ale parametrilor. • Rezultatele obţinute vor fi interpretate din perspectiva celei mai bune soluţii, celei mai slabe soluţii şi soluţiei medii pentru rulările efectuate. Principalele caracteristici ale AG, care se constituie în avantaje faţă de alte metode de rezolvare a problemelor complexe, exacte sau aproximative sunt:
156
Fig. 4.11 Principalele caracteristici ale AG.
Aplicaţii rezolvate cu algoritmi genetici Aplicaţia 1. Înlocuirea optimă a opt utilaje Enunţ Pentru o instalaţie de producţie constând din 8 utilaje se pune problema care dintre acestea este preferabil de înlocuit pentru optimizarea activităţii, cunoscându-se pentru fiecare dintre ele costul aferent înlocuirii (c) şi sporul de venit adus prin înlocuire (s). Reprezentare genetică Reprezentarea unui individ are forma: (g1, g2, g3, g4, g5, g6, g7, g8), unde ⎧1, daca _ i _ se _ inlocuieste gi = ⎨ ⎩0, daca _ i _ nu _ se _ inlocuieste . Fiecare individ se va implementa binar, pe un octet. Evaluarea indivizilor Calitatea individului este dată de valoarea funcţiei obiectiv, care trebuie maximizată (k=8):
157 k
∑ (s i =1
i
− ci ) .
Operatorii genetici Selecţie elitistă Încrucişare cu 1 punct Mutaţie inversiune de biţi Parametrii AG • Dimensiunea populaţiei iniţiale (n0); • Dimensiunea maximă a populaţiei (nmax); • Numărul maxim de generaţii (gmax); • Rata de încrucişare (rc). Dintre cei n*rc părinţi, perechile se formează astfel: primul şi ultimul, al doilea şi penultimul ş.a.m.d. n reprezintă dimensiunea populaţiei curente; • Rata de mutaţie (rm). Observaţii: • Populaţia are dimensiune crescătoare; la fiecare generaţie, descendenţii se adaugă populaţiei curente şi deci nu are loc eliminarea indivizilor slab calitativi. • Reevaluarea se realizează la fiecare generaţie numai pentru descendenţi şi pentru indivizii cărora s-a aplicat mutaţia. • Evoluţia se consideră încheiată la depăşirea dimensiunii maxime impuse a populaţiei sau la depăşirea numărului maxim impus de generaţii.
158
Codul sursă Vezi Anexa 1. Execuţia aplicaţiei Date de intrare: Utilaj c s
1 5 12
2 2 10
3 14 2
4 25 30
5 12 5
6 4 1
7 3 6
8 2 8
Rezultate pentru următorul set de valori ale parametrilor: Dimensiunea populaţiei iniţiale (n0) Numărul maxim de generaţii (gmax) Dimensiunea maximă a populaţiei (nmax) Rata de încrucişare (rc) Rata mutaţiei (rm) Soluţie Obţinută la generaţia Decodificare soluţie - se înlocuiesc utilajele: Performanţă soluţie ↑
5 5 20 3 5 20 150 200 400 0.6 0.7 0.5 0.3 0.1 0.01 11000111 11010111 11010011 3 6 5 1,2,6,7,8 1,2,4,6,7,8 1,2,4,7,8 21 26 29
Observaţii: • Soluţia cea mai bună este înlocuirea utilajelor 1,2,4,7,8 deoarece pentru fiecare dintre ele profitul este pozitiv. Valoarea funcţiei obiectiv pentru această soluţie este 29. Se observă că această soluţie se obţine cu AG pentru o alegere adecvată a valorilor parametrilor. • De regulă, se observă îmbunătăţirea calităţii populaţiei de la generaţie la generaţie. • Rulări repetate ale algoritmului cu aceleaşi valori ale parametrilor pot conduce la soluţii diferite şi eventual multiple (cu aceeaşi valoare a funcţiei obiectiv).
159
Aplicaţia 2. Structură optimă a producţiei Enunţ Într-un centru de producţie medicamente se fabrică trei tipuri de comprimate – analgin, paracetamol şi ascovit. Se caută o structură optimă a producţiei într-o lună, adică numărul de colete (1000 de cutii cu blistere) din fiecare tip. Optimalitatea unei soluţii presupune realizarea unui venit maxim cu un cost minim. Se cunosc veniturile obţinute de pe urma producerii unui colet din fiecare tip şi costurile aferente. Restricţii. Numărul de colete din fiecare tip trebuie să fie cel puţin 0 şi să nu depăşească un număr maxim, cunoscut, care se poate produce lunar. Reprezentare genetică Un individ, numit structură de producţie, se reprezintă sub forma (q1,q2,q3), qi codificând numărul de colete de tip i. qi va fi variabilă de tip întreg. Evaluarea indivizilor Funcţia obiectiv se scrie sub forma profitului realizat pentru o structură de producţie dată; în consecinţă, aceasta se va maximiza. 3
f = ∑ q i * (v i − c i ) i =1
Operatorii genetici Selecţie ruletă. Selecţia ruletă implementată nu garantează că părinţii selectaţi sunt diferiţi, chiar în cadrul aceleiaşi perechi de încrucişare. Încrucişare cu 1 punct Mutaţie complementară
160
Parametrii AG • Dimensiunea populaţiei iniţiale (n0); • Numărul maxim de generaţii (gmax); • Rata de încrucişare (rc). Dintre cei n*rc părinţi, perechile se formează astfel: primul cu al doilea, al treilea cu al patrulea, ş.a.m.d. n reprezintă dimensiunea populaţiei curente; • Rata de mutaţie (rm). Codul sursă Vezi Anexa 2. Execuţia aplicaţiei Date de intrare: Tip medicament
1
2
3
Cost unitar (c)
20
10
30
Venit unitar (v)
50
15
100
Număr maxim colete (qmax) 100 150 200
Rezultate pentru următorul set de valori ale parametrilor: Dimensiunea populaţiei iniţiale (n0) Numărul maxim de generaţii (gmax) Rata de încrucişare (rc) Rata de mutaţie (rm) ⎞ ⎛ nr _ colete _ ana lg in ⎟ ⎜ Soluţie ⎜ nr _ colete _ paracetamol ⎟ ⎟ ⎜ nr _ colete _ as cov it ⎠ ⎝ Performanţă soluţie ↑
5 4 0.5 0.23
6 7 0.7 0.1
89 114 172
100 71 149
15 280
13 785
Observaţie: • Dacă amplitudinea valorilor obiectiv ale indivizilor supuşi selecţiei sunt mari, selecţia ruletă favorizează numai indivizii cu valoare
161
obiectiv mare (calitativi). Acesta este cazul maximizării funcţiei obiectiv. Însă, în cazul minimizării sale, această distribuţie a indivizilor nu recomandă folosirea selecţiei ruletă, deoarece indivizii calitativi sunt selectaţi cu frecvenţă mică.
Aplicaţia 3. Proiectarea optimă a unei grinzi Enunţ O grindă trebuie sudată de altă grindă astfel încât să poată suporta la capătul liber o anumită forţă de încărcare.
Fig. 4.12 Modelul sudurii grinzilor. [6]
Se cere determinarea valorilor a patru parametri de proiectare: h - grosimea sudurii b - grosimea grindei l - lungimea sudurii t - înălţimea grindei care să satisfacă două obiective : • cost minim, dat prin funcţia f1(x) f1(x)=1.10471h2l + 0.04811tb(14.0+l); • îndoire minimă a grindei la capătul liber, dată prin funcţia f2(x): f2(x)=2.1952/(t3b) şi să respecte restricţiile: 0.125 ≤ (h,b) ≤ 5.0 0.1 ≤ (l,t) ≤ 10.0 h ≤ b.
162
Reprezentare genetică Reprezentarea este de forma (h, b, l, t), fiecare genă (parametru de optimizat) fiind un număr real, în intervalul de definiţie. Evaluarea indivizilor Un design optim din punctul de vedere al costului va presupune ca toţi parametrii să aibă valori cât mai mici, însă un astfel de design ar produce o îndoire accentuată a grindei. Invers, o soliditate mare a grindei şi a sudurii presupune valori mari ale parametrilor, valori care conduc la un cost mare. Aşadar, problema este biobiectiv, cu funcţii scop conflictuale. Cele două obiective se vor agrega într-o funcţie de forma f(x)= f1(x)* f2(x), care va trebui minimizată. Operatorii genetici Se oferă utilizatorului posibilitatea de a alege între aplicarea selecţiei elitiste şi selecţiei ruletă. Atenţie la aplicarea selecţiei ruletă în cazul minimizării funcţiei obiectiv! Încrucişare cu 1 punct Mutaţie adăugare – se selectează aleator o genă a cromozomului căreia se aplică operatorul şi se adaugă la valoarea sa o cantitate mică, generată aleator în intervalul [0.01,0.05]. Parametrii AG • Dimensiunea populaţiei iniţiale (n0); • Numărul maxim de generaţii (gmax); • Rata de încrucişare (rc). Dintre cei n*rc părinţi, perechile se formează astfel: primul cu al doilea, al treilea cu al patrulea, ş.a.m.d. n reprezintă dimensiunea populaţiei curente; • Rata de mutaţie (rm).
163
Codul sursă Vezi Anexa 3. Execuţia aplicaţiei Rezultate pentru următoarele seturi de valori ale parametrilor: Dimensiunea populaţiei iniţiale (n0) Numărul maxim de generaţii (gmax) Modelul de selecţie Rata de încrucişare (rc) Rata de mutaţie (rm) ⎛h⎞ ⎜ ⎟ ⎜b ⎟ Soluţie ⎜ ⎟ l ⎜ ⎟ ⎜t ⎟ ⎝ ⎠ Performanţă soluţie ↓
5 3 ruletă 0.6 0.1
5 3 elitistă 0.6 0.1
10 7 elitistă 0.4 0.05
10 7 elitistă 0.5 0.07
0.827 4.140 3.285 8.794
0.442 4.627 2.062 7.928
2.016 2.899 3.366 9.649
1.517 4.750 1.023 9.697
0.0066 0.0030
0.0264 0.0067
Observaţii : • Pentru aplicarea selecţiei ruletă se generează aleator un număr real între 0 şi 1 care indică poziţionarea acului ruletei. Cel mai bun individ al populaţiei va fi selectat numai pentru valoarea 1 a acestei variabile, deci foarte rar. • Selecţia elitistă conduce, de cele mai multe ori, la rezultate mai bune ale algoritmului decât selecţia ruletă, pentru aceleaşi valori parametrilor. • Observaţi diferenţele dintre valorile parametrilor de proiectare corespunzătoare celor patru rulări! • Deşi ultimul set de valori ale parametrilor conduce la rezultat într-un timp mai mare decât în cazul celei de a doua rulări, deoarece implică o populaţie iniţială de dimensiune dublă, rezultatul obţinut (cu valoarea funcţiei obiectiv 0.0264) nu este mai bun decât cel obţinut la a doua rulare (0.0030). De obicei, cauza acestei calităţi mai scăzute a soluţiei este pierderea pe parcursul evoluţiei a indivizilor de bună calitate (fie prin mutaţii genetice „ghinioniste”, fie prin încrucişări care au condus la descendenţi slabi) sau pierderea diversităţii în populaţie.
164
• Observaţi diferenţele între valorile parametrilor soluţie pentru valori ale funcţiei obiectiv apropiate!
Aplicaţia 4. Problema comis-voiajorului (cel mai scurt drum într-un graf) Enunţ Un comis-voiajor trebuie să viziteze pe drumul cel mai scurt n oraşe astfel încât, plecând din oraşul i să treacă prin toate oraşele o singură dată şi să se reîntoarcă în oraşul de plecare. Se cunosc lungimile drumurilor directe între oricare două oraşe vecine. Utilitatea AG pentru rezolvarea acestei probleme Numărul de posibilităţi de parcurgere a n oraşe este n!. Aşadar, pentru 30 de oraşe ar fi necesare 2.65*1032 testări individuale. Presupunând că se execută 1 miliard de testări pe secundă, verificarea ar dura 8,000,000,000,000,000 de ani. Adăugarea în plus a numai un oraş la cele 30 ar cauza creşterea acestui timp de calcul de 31 de ori. Evident, aceasta este o abordare imposibilă. Un AG poate găsi o soluţie într-un timp mult mai scurt. Deşi este posibil să nu găsească soluţia cea mai bună, el poate găsi o soluţie aproape optimă în mai puţin de un minut. Pentru problema comis voiajorului nu s-a găsit încă un algoritm eficient, rezolvabil în timp polinomial. Reprezentare genetică Reprezentarea unui individ, numit traseu, este o permutare a mulţimii {1,…,n}, semnificând ordinea de parcurgere a celor n oraşe. Un individ valid, fezabil, este acela pentru care traseul codificat este valid (oraşele adiacente în permutare sunt vecine). Pentru exemplul de mai jos, dat prin harta oraşelor, un individ valid este (1 4 3 5 7 2 6), iar unul invalid este (1 6 3 2 7 4 5).
165
Evaluarea indivizilor Funcţia obiectiv este lungimea totală a traseului parcurs. Performanţa unui individ se va evalua prin valoarea funcţia obiectiv, care va trebui minimizată. Operatorii genetici Selecţie elitistă Încrucişare PPX Mutaţie interschimbare – se selectează aleator două oraşe ale traseului, după care se interschimbă. Exemplu de aplicare:
Fig. 4.13 Exemplu de aplicare a mutaţiei interschimbare pentru problema comis voiajorului.
Observaţie: • Aplicarea operatorilor de încrucişare şi mutaţie nu garantează validitatea rezultatului. Aceştia se vor aplica repetat până la identificarea unui rezultat valid. Parametrii AG • Dimensiunea populaţiei iniţiale (n0); • Numărul maxim de generaţii (gmax); • Rata de încrucişare (rc). Dintre cei n*rc părinţi, perechile se formează astfel: primul cu al doilea, al treilea cu al patrulea, ş.a.m.d. n reprezintă dimensiunea populaţiei curente; • Rata de mutaţie (rm).
166
Execuţia aplicaţiei Date de intrare: n=7 oraşe, a căror configuraţie este cea din figura de mai jos. Oraşul de plecare este 3.
Fig. 4.14 Configuraţia oraşelor din datele de intrare.
Rezultate pentru următorul set de valori ale parametrilor: Dimensiunea populaţiei iniţiale (n0) Numărul maxim de generaţii (gmax) Rata de încrucişare (rc) Rata de mutaţie (rm) Soluţii (trasee) Lungimea traseului ↓
5 2 0.4 0.1
5 50 10 12 0.4 0.5 0.2 0.01 32617543 35417623 34571623 34571623 72 71 71
Observaţii: • Pentru un număr relativ mic de trasee (optime sau nu), adică pentru o reţea de conectare între oraşe puţin densă, este necesară evitarea indivizilor identici care apar la iniţializarea populaţiei, la încrucişare sau la mutaţie. Altfel, populaţia va tinde să piardă diversitatea, iar consecinţa poate fi blocarea algoritmului într-un optim local. • Dacă se obţin mai multe soluţii cu aceeaşi valoare obiectiv cea mai bună, decidentul uman va alege una dintre ele pe baza unor criterii suplimentare. • Soluţia (3 4 5 7 1 6 2 3) cu lungimea 71 este şi cea obţinută de tehnica Greedy.
167
Rezumat • Algoritmii genetici simulează procesele evolutive naturale. Ei sunt capabili să obţină rezultate satisfăcătoare pentru probleme complexe, pentru care algoritmii exacţi nu se pot aplica sau au un timp de calcul foarte mare. • Cele mai importante aspecte ale folosirii AG sunt: definirea şi implementarea reprezentării genetice, modul de evaluare a indivizilor şi definirea şi implementarea operatorilor genetici care dirijează inteligent căutarea. • Reprezentarea genetică se realizează în funcţie de problemă. • Funcţia de evaluare a performanţei indivizilor se proiectaeză a.î. să ţină cont de obiectivul (obiectivele) problemei şi de restricţiile impuse. • Operatorii genetici sunt: selecţia, încrucişarea şi mutaţia; pentru fiecare dintre aceştia există mai multe modele de aplicare. În rezolvarea unei probleme, se aleg modele conforme cu reprezentarea genetică aleasă. • Pentru problema de rezolvat, odată definită reprezentarea genetică şi funcţia de evaluare a indivizilor şi odată aleşi operatorii ce vor fi aplicaţi şi setate valorilor parametrilor, AG se execută de mai multe ori şi se compară rezultatele obţinute. • Acelaşi AG obţine rezultate diferite atât la setarea diferită a valorilor parametrilor, cât şi pentru acelaşi set de valori ale parametrilor, datorită factorului aleator inerent. • Deşi factorul aleator este implicat atât în iniţializarea populaţiei cât şi în aplicarea operatorilor genetici, identificarea regiunilor de calitate din spaţiul de căutare nu este un proces aleator, fără direcţie, ci este ghidat de principiile evolutive, în special prin funcţia de performanţă – aspectul cheie al evoluţiei. De aici, caracterul nonaleator al AG.
168
Noţiuni fundamentale
Cromozom Individ Populaţie de indivizi Iniţializare a populaţiei Evaluarea performanţei indivizilor Reprezentare genetică Modele de selecţie: ruletă, turneu, elitistă, aleatoare Modele de încrucişare: cu 1(2) punct(e) de încrucişare, aritmetică, euristică, PPX, UX Modele de mutaţie: inversiune de biţi, complementară, mediată, adăugare, translaţie, rotaţie Condiţii de stop evoluţie Parametrii algoritmilor genetici
169
Teste de autocontrol 4.1 Definiţi principiul de funcţionare al algoritmilor genetici.
4.2 Pentru ce categorii de probleme sunt adecvaţi algoritmii genetici?
4.3 Pentru a folosi un AG, care sunt elementele care trebuie definite? Selectaţi răspunsurile corecte. (a) modul de evaluare a indivizilor (b) populaţia de indivizi (c) reprezentarea genetică a indivizilor (d) operatorii genetici (e) generaţiile 4.4 Ce rol îndeplineşte evaluarea performanţei indivizilor?
4.5 Care este valoarea de adevăr a afirmaţiilor următoare? (a) Pentru a putea fi aplicat un AG este necesară cunoaşterea derivatei funcţiei obiectiv. (b) Un AG este un algoritm aleator. (c) Un avantaj al AG este acela că operează simultan cu mai multe soluţii. (d) Cu certitudine, un AG identifică soluţia optimă a unei probleme. (e) Rulând acelaşi AG de mai multe ori, cu aceleaşi valori ale parametrilor, este posibil ca acesta să identifice soluţii diferite.
170
4.6 Care sunt operatorii genetici? Care este rolul fiecăruia?
4.7 În ce constă selecţia turneu? Selectaţi răspunsul corect. (a) Realizarea unui turneu între indivizii populaţiei şi selectarea celor mai buni dintre aceştia. (b) Generarea aleatoare a unui număr în intervalul [0,1] şi selectarea acelor indivizi a căror performanţă relativă este mai mare decât acest număr. (c) Alegerea în mod aleator a k părinţi din populaţie, care vor fi supuşi unui turneu de calitate. Cel mai valoros individ - câştigătorul, va fi unul dintre părinţi. Similar, procedura se va repeta pentru a selecta toţi părinţii necesari. 4.8 Considerăm următoarea pereche de părinţi: Părinte1: (5 3 2 1 7 4 8 6) Părinte2: (1 6 5 8 4 3 2 7) Care va fi descendentul în urma aplicării operatorului PPX, cu masca (1 2 2 1 1 1 1 2)?
4.9 De ce tipul de codificare decide modelul de încrucişare?
4.10 De ce valorile rm/pm sunt sensibil mai mici decât cele ale rc/pc?
4.11 De ce este necesară rularea repetată a unui AG?
ANEXA Codul sursă al aplicaţiei 1 #include #include #include #include int n0,n,gmax,nmax,generatie,c[8],p[8],nparinti,nmutanti,parinte[800]; float pc,pm; struct cromozom{ unsigned g0,g1,g2,g3,g4,g5,g6,g7:1;//genele binare int fitness; }; typedef struct cromozom individ; individ populatie[1000]; void citireDateIntrare(){ printf("\nCosturile si sporurile de profit ocazionate de inlocuirea utilajelor:\n"); for(int i=0;i<8;i++){ printf("Utilajul %d\n",i+1); printf("\tCost=");scanf("%d",&c[i]); printf("\tSpor de profit=");scanf("%d",&p[i]); } } void citireParametri(){ printf("\nDimensiunea populatiei initiale(5..50)="); scanf("%d",&n0); printf("\nNumarul maxim de generatii="); scanf("%d",&gmax); printf("\nDimensiunea maxima a populatiei ="); scanf("%d",&nmax); printf("\nProbabilitatea de incrucisare(0.1..1.0)="); scanf("%f",&pc); printf("\nProbabilitatea de mutatie(0.01..0.8)="); scanf("%f",&pm); } int getGena(individ ind,int j){ //extrage gena cu indicele j din cromozomul ind int g; switch(j){ case 0:g=ind.g0;break; case 1:g=ind.g1;break; case 2:g=ind.g2;break; case 3:g=ind.g3;break; case 4:g=ind.g4;break; case 5:g=ind.g5;break; case 6:g=ind.g6;break; case 7:g=ind.g7;break; } return g; }
Programul P4.1 (1/4)
180
void setGena(individ* p, int j, int v){ //seteaza valoarea genei cu indicele j din cromozomul p la valoarea v switch(j){ case 0:(*p).g0=v;break; case 1:(*p).g1=v;break; case 2:(*p).g2=v;break; case 3:(*p).g3=v;break; case 4:(*p).g4=v;break; case 5:(*p).g5=v;break; case 6:(*p).g6=v;break; case 7:(*p).g7=v;break; } } void initializarePopulatie(int n0){ float s; randomize(); for(int i=0;i0) printf(" fitness=%3d",populatie[i].fitness); if(populatie[i].fitness>f) f=populatie[i].fitness; } printf("\n La generatia %d fitness maxim = generatie,f);getch(); }
Programul P4.1 (2/4)
%3d",
181
void selectieElitista(float pc){ int sort[1000],neordonat,m,i,j,val1,val2; nparinti=pc*n; if(nparinti%2==1) nparinti--; for(i=0;i
Programul P4.1 (3/4)
182
for(i=0;i=nmax)) return 1; return 0; } void afisareSolutii(){ int i,j,max=populatie[0].fitness; printf("\n-----------------------------------------"); for(i=1;i=max) max=populatie[i].fitness; printf("\n\n Solutiile cu fitness maxim(%3d), la generatia %d, sunt:\n",max,generatie); for(i=0;i
Programul P4.1 (4/4)
183
Codul sursă al aplicaţiei 2 #include #include #include #include int n0,n,gmax,generatie,c[3],v[3],qmax[3],nparinti,nmutanti,parinte[1000] ; float pc,pm; struct cromozom{ int q[3];//genele numere intregi unsigned long fitness; }; typedef struct cromozom individ; individ populatie[1000]; struct lista{ individ ind; struct lista *next; }*sol;//lista solutiilor diferite void citireDateIntrare(){ printf("\nCosturile de productie si profiturile aferente pentru un colet:\n"); for(int i=0;i<3;i++){ printf("\nProdus %d\n",i+1); printf("\tCost=");scanf("%d",&c[i]); printf("\tVenit=");scanf("%d",&v[i]); printf("\tNumarul maxim de colete:");scanf("%d",&qmax[i]); } } void citireParametri(){ printf("\nDimensiunea populatiei initiale(5..50)="); scanf("%d",&n0); printf("\nNumarul maxim de generatii="); scanf("%d",&gmax); printf("\nProbabilitatea de incrucisare(0.1..1.0)="); scanf("%f",&pc); printf("\nProbabilitatea de mutatie(0.01..0.8)="); scanf("%f",&pm); } void initializarePopulatie(int n0){ randomize(); for(int i=0;i
Programul P4.2 (1/5)
184
void evaluarePopulatie(){ int i; for(i=0;if) f=populatie[i].fitness; } printf("\nLa generatia %d fitness maxim=%7ld",generatie,f); getch(); } void selectieRuleta(float pc){ int sort[5000],neordonat,i,j,indice,m; unsigned long val1,val2,x[5000],s; float r,p; nparinti=pc*n; if(nparinti%2==1) nparinti--; for(i=0;i
Programul P4.2 (2/5)
185 for(j=0;j
Programul P4.2 (3/5)
186 int final(int gmax){ if((generatie==gmax+1)||(n>=5000)) return 1; return 0; } struct lista* adaugaSolutie(int i){ //adauga la lista solutiilor individul populatie[i] struct lista *aux; int j; aux=(struct lista*)malloc(sizeof(struct lista)); for(j=0;j<3;j++) aux->ind.q[j]=populatie[i].q[j]; aux->ind.fitness=populatie[i].fitness; aux->next=sol; sol=aux; return sol; } int exista(int i){ //verifica daca mai exista in lista solutiilor populatie[i] struct lista *aux; int j,gasit=0,nr=0; aux=sol; while((!gasit)&&(aux)){ for(j=0;j<3;j++) if(aux->ind.q[j]==populatie[i].q[j]) nr++; if(nr==3) gasit=1; aux=aux->next; } return gasit; } void afisareSolutii(){ int i,j; unsigned long max=populatie[0].fitness; struct lista *aux; printf("\n-----------------------------------------"); for(i=1;i=max) max=populatie[i].fitness; sol=NULL; for(i=0;inext){ printf("\n\tAnalgin - %3d colete",aux->ind.q[0]); printf("\n\tParacetamol - %3d colete",aux->ind.q[1]); printf("\n\tAscovit - %3d colete",aux->ind.q[2]); printf("\n"); } }
Programul P4.2 (4/5)
%7ld
187 void AG(int n0, int gmax, float pc, float pm){ generatie=0; n=n0; initializarePopulatie(n0); evaluarePopulatie(); while(!final(gmax)){ afisarePopulatie(); if(final(gmax)) break; selectieRuleta(pc); incrucisare(); mutatieCompl(pm); generatie++; } afisareSolutii(); } void main(){ citireDateIntrare(); citireParametri(); AG(n0,gmax,pc,pm); getch(); }
Programul P4.2 (5/5)
Codul sursă al aplicaţiei 3 #include #include #include #include int n,nparinti,nmutanti,np,ns;//nr curent de elemente in sort,parinti int n0,gmax,generatie,sel; float pc,pm; struct cromozom{ float h,b,l,t; float fitness; }; typedef struct cromozom individ; struct lista{ individ ind; struct lista *next; }; typedef struct lista list; list *populatie,*sol; struct indice{ int p; struct indice *next; }; typedef struct indice listind; listind *parinti,*sort;
188 void citireParametri(); float fitness(individ ind); int valid(individ ind); list *adauga(list *l, individ ind); list* setInd(int i,individ ind); float getFit(int i); individ getInd(int i); listind *adaugaIndice(listind *l,int i); void afisareIndice(listind *l); int getIndice(listind *l,int nr,int i); listind *setIndice(listind *l,int nr,int i,int p); void initializarePopulatie(int n0); void afisareInd(individ ind); void afisarePopulatie(); void selectieRuleta(float pc); void selectieElitista(float pc); individ descendent(int i1, int i2, int pos, int k); void incrucisare(); void mutatieAdaugare(float pm); int final(int gmax); int exista(int i); void afisareSolutii(); void AG(int n0, int gmax, float pc, float pm, int sel); void main(); citireParametri(); populatie=sol=NULL; AG(n0,gmax,pc,pm,sel); getch(); }
Programul P4.3 (1/1)