Sunteți pe pagina 1din 180

1

INTRODUCERE ÎN CALCULUL
EVOLUTIV

1.1 Specificul calculului evolutiv

În matematică optimizarea este înţeleasă ca însemnând găsirea


unei soluţii optime. În acest scop s-au obţinut rezultate importante în
calculul diferenţial, calculul variaţional, controlul optimal, cercetări
operaţionale. Drumul de la rezultatele teoretice, referitoare la teoreme
de existenţă, unicitate, caracterizare a soluţiei, etc., la optimizarea
efectivă este de multe ori prea lung, fie datorită complexităţii prea
mari a problemelor reale faţă de modelul matematic utilizat, fie
datorită complexităţii (timp, memorie) algoritmilor utilizaţi.

La mijlocul anilor '70, odată cu creşterea performanţelor


calculatoarelor şi, implicit, a complexităţii problemelor reale ce se
puteau rezolva cu ajutorul calculatorului, au devenit frecvente
situaţiile în care modelele clasice de optimizare nu mai conduceau la
soluţii acceptabile pentru probleme modelabile pe calculator. Tot mai
frecvent, probleme din biologie, climatologie, chimie, mecanică,
14
analiza datelor, etc., probleme ale căror modele includ sute sau mii de
variabile, ale căror funcţii de optimizat prezintă multiple optime locale
şi neregularităţi nestudiate din punct de vedere numeric, rămâneau
nerezolvate sau cu soluţii aproximate grosier.

Studiindu-se excelenta adaptare a fiinţelor vii, în ceea ce


priveşte forma, structura, funcţiile şi stilul de viaţă, numeroşi
cercetători au ajuns la concluzia că natura oferă soluţii optimale la
problemele sale, soluţii superioare oricăror performanţe tehnologice.
S-a demonstrat, chiar matematic, optimalitatea unor sisteme biologice:
raportul diametrilor ramificaţiilor arterelor, poziţia punctelor de
ramificare a vaselor de sânge, valoarea hematocritului (procentul
volumului particolelor solide din sânge). În consecinţă, au apărut
primele încercări de imitare a procesului de evoluţie naturală.

În anul 1970 profesorii Hans-Paul Schwefel (Dortmund) şi


Ingo Rechenberg (Berlin) având de rezolvat o problemă de mecanica
fluidelor, referitoare la optimizarea formei unui corp ce se deplasează
într-un fluid, au căutat o nouă tehnică de optimizare deoarece
metodele cunoscute până în acel moment nu conduceau la o soluţie
acceptabilă. Ideea lor a întruchipat conjectura lui Rechenberg, rămasă
până azi justificarea fundamentală a aplicării tehnicilor evolutive:
''Evoluţia naturală este, sau cuprinde, un proces de optimizare foarte
eficient, care, prin simulare, poate duce la rezolvarea de probleme
dificil de optimizat''.
15
Modelul de simulare propus de Rechenberg şi Schwefel [71,
76, 77] este cunoscut azi sub numele de ''strategii evolutive'' şi iniţial
se aplica doar problemelor de optimizare de variabilă continuă.
Soluţiile candidat x se reprezintă în virgulă mobilă iar individul i ,
căruia i se aplică procesul evolutiv, constă din această reprezentare şi
dintr-un parametru al evoluţiei, notat σ , reprezentat tot in virgulă
mobilă: i = ( x, σ ) . La fiecare pas soluţia curentă este modificată pe
fiecare componentă conform lui σ şi în cazul unei îmbunătăţiri este
înlocuită cu cea nou obţinută. Parametrul σ joacă rolul pasului din
metodele iterative clasice şi este astfel folosit încât să fie respectat
principiul "mutaţiilor mici". Pentru strategiile evolutive au fost
dezvoltate scheme de adaptare a parametrilor de control ( auto-
adaptare ).

A doua direcţie de studiu s-a conturat la Universitatea San


Diego; punctul de pornire a fost tot simularea evoluţiei biologice iar
structura de date aleasă a fost maşina cu număr finit de stări. Urmând
această abordare, Fogel [25, 28] a generat programe simple,
anticipând "programarea genetică". Populaţia este reprezentată de
programe care candidează la rezolvarea problemei. Există diverse
reprezentări ale elementelor populaţiei, una dintre cele mai utilizate
fiind aceea în care se utilizează o structură arborescentă. În anumite
aplicaţii, cum este regresia simbolică, programele sunt de fapt
expresii.
16
De exemplu, programul expresie " a + (b * c )" poate fi descris
prin (+ a (∗ b c )) . O astfel de structură poate fi uşor codificată în Lisp,
astfel că primele implementări din programarea genetică foloseau
acest limbaj.

După mai mulţi ani de studiere a simulării evoluţiei, John


Holland de la Universitatea Michigan a propus în 1975 [44] conceptul
de "algoritm genetic". Au fost abordate probleme de optimizare
discretă iar structura de date aleasă a fost şirul de biţi. Într-o
accepţiune strictă, noţiunea de algoritm genetic se referă la modelul
studiat de Holland şi de studentul său De Jong. Într-un sens mai larg,
algoritm genetic este orice model bazat pe ideea de populaţie şi care
foloseşte operatori de selecţie şi recombinare pentru a genera noi
puncte în spaţiul de căutare.

O altă direcţie o constituie „programarea evolutivă”. Iniţial, ea


a avut ca obiectiv dezvoltarea unor structuri automate de calcul
printr-un proces de evoluţie în care operatorul principal este cel de
mutaţie. Bazele domeniului au fost puse de către Fogel [28]. Ulterior,
programarea evolutivă a fost orientată către rezolvarea problemelor de
optimizare având aceeaşi sferă de aplicabilitate ca şi strategiile
evolutive.

Calculul evolutiv foloseşte algoritmi ale căror metode de


căutare au ca model câteva fenomene naturale: moştenirea genetică
şi lupta pentru supravieţuire. Cele mai cunoscute tehnici din clasa
17
calculului evolutiv sunt cele amintite anterior: algoritmii genetici,
strategiile evolutive, programarea genetică şi programarea evolutivă.
Există şi alte sisteme hibride care încorporează diferite proprietăţi ale
paradigmelor de mai sus; mai mult, structura oricărui algoritm de
calcul evolutiv este, în mare măsură, aceeaşi.

Calculul evolutiv este un domeniu al calculului inteligent în


care rezolvarea unei probleme este văzută ca un proces de căutare în
spaţiul tuturor soluţiilor posibile. Această căutare este realizată prin
imitarea unor mecanisme specifice evoluţiei în natură. În scopul
găsirii soluţiei, se utilizează o populaţie de căutare. Elementele
acestei populaţii reprezintă soluţii potenţiale ale problemei. Pentru a
ghida căutarea către soluţia problemei, asupra populaţiei se aplică
transformări specifice, inspirate din evoluţia naturală, precum:

Selecţia. Elementele populaţiei care se apropie de soluţia


problemei sunt considerate adecvate şi sunt favorizate în sensul că au
mai multe şanse de a supravieţui în generaţia următoare precum şi de a
participa la generarea de “descendenţi”.

Încrucişara. La fel ca în înmulţirea din natură, pornind de la două


sau mai multe elemente ale populaţiei (numite părinţi), se generează
noi elemente (numite descendenţi). În funcţie de calitatea acestora
(apropierea de soluţia problemei) descendenţii pot înlocui părinţii sau
alţi indivizi din populaţie.
18
Mutaţia. Pentru a asigura diversitatea populaţiei se aplică, la fel ca
în natură, transformări cu caracter aleator asupra elementelor
populaţiei, permiţând apariţia unor trăsături (gene) care doar prin
încrucişare şi selecţie nu ar fi apărut în cadrul populaţiei.

În continuare, un algoritm de rezolvare bazat pe aceste idei va fi


numit algoritm evolutiv. Principalele caracteristici ale algoritmilor
evolutivi, comparativ cu cei tradiţionali sunt:

• sunt algoritmi probabilişti ce îmbină căutarea dirijată cu cea


aleatoare;
• realizează un echilibru aproape perfect între explorarea spaţiului
stărilor şi găsirea celor mai bune soluţii;
• în timp ce metodele clasice de căutare acţionează la un moment
dat asupra unui singur punct din spaţiul de căutare, algoritmii
evolutivi menţin o mulţime (numită populaţie) de soluţii posibile;
• algoritmii evolutivi nu acţionează direct asupra spaţiului de
căutare ci asupra unei codificări a lui;
• sunt mai robuşti decât algoritmii clasici de optimizare şi decât
metodele de căutare dirijată;
• sunt simplu de utilizat şi nu cer proprietăţi importante ale
funcţiei obiectiv precum continuitate, derivabilitate, convexitate, ca în
cazul algoritmilor clasici;
• furnizează, cu o mare probabilitate, o soluţie apropiată de cea
exactă.
19

1.2 Noţiuni de bază

Principalele noţiuni care permit analogia între rezolvarea


problemelor de căutare şi evoluţia naturală sunt următoarele:

Cromozomul este o mulţime ordonată de elemente, numite gene, ale


căror valori determină caracteristicile unui individ. În genetică,
poziţiile pe care se află genele în cadrul cromozomului se numesc loci,
iar valorile pe care le pot lua se numesc alele. În calculul evolutiv
cromozomii sunt, de obicei, vectori ce conţin codificarea unei soluţii
potenţiale şi sunt numiţi indivizi. Astfel, genele nu sunt altceva decât
elementele acestor vectori.

Populaţia. O populaţie este constituită din indivizi care trăiesc într-un


mediu la care trebuie să se adapteze. În calculul evolutiv, un individ
este de cele mai multe ori identificat cu un cromozom şi reprezintă un
element din spaţiul de căutare asociat problemei de rezolvat.

Genotipul este ansamblul tuturor genelor unui individ sau chiar a


întregii populaţii. În calculul evolutiv genotipul reprezintă codificările
corespunzătoare tuturor elementelor populaţiei.

Fenotipul este ansamblul trăsăturilor determinate de către un anumit


genotip. În calculul evolutiv fenotipul reprezintă valorile obţinute prin
decodificare, adică valori din spaţiul de căutare.
20
Generaţia este o etapă în evoluţia unei populaţii. Dacă vedem evoluţia
ca un proces iterativ în care o populaţie se transformă în altă
populaţie atunci generaţia este o iteraţie în cadrul acestui proces.

Selecţia. Procesul de selecţie naturală are ca efect supravieţuirea


indivizilor cu grad ridicat de adecvare la mediu (fitness mare). Acelaşi
scop îl are şi mecanismul de selecţie de la algoritmii evolutivi şi
anume de a favoriza supravieţuirea elementelor cu grad mare de
adecvare. Aceasta asigură apropierea de soluţia problemei întrucât se
exploatează informaţiile furnizate de către cele mai bune elemente ale
populaţiei. Unul dintre principiile teoriei evoluţioniste este acela că
selecţia este un proces aleator şi nu unul determinist. Acest lucru este
întâlnit în majoritatea mecanismelor de selecţie utilizate de către
algoritmii evolutivi.

Reproducerea este procesul prin care, pornind de la populaţia curentă,


se construieşte o nouă populaţie. Indivizii noii populaţii (generaţii)
moştenesc caracteristici de la părinţii lor, dar pot dobândi şi
caracteristici noi ca urmare a unor procese de mutaţie care au un
caracter întâmplător. În cazul în care în procesul de reproducere
intervin cel puţin doi părinţi, caracteristicile moştenite de descendenţi
se obţin prin combinarea (încrucişarea) caracteristicilor părinţilor.
Mecanismele de încrucişare şi mutaţie asigură explorarea spaţiului
soluţiilor prin descoperirea de noi configuraţii.

Fitnessul sau adecvarea. În evoluţia naturală fiecare individ al


populaţiei este adaptat mai mult sau mai puţin mediului iar unul dintre
21
principiile teoriei evoluţioniste este acela că supravieţuiesc doar cei
mai buni indivizi. Fitnessul (adecvarea) este o măsură a gradului de
adaptare a individului la mediu. Scopul evoluţiei este ca toţi indivizii
să ajungă la o adecvare cât mai bună la mediu, ceea ce sugerează
legătura între un proces de evoluţie şi unul de optimizare. În calculul
evolutiv, gradul de adecvare al unui element al populaţiei este o
măsură a calităţii acestuia în raport cu problema care trebuie rezolvată.
Dacă este vorba de o problemă de maximizare atunci gradul de
adecvare va fi direct proporţional cu valoarea funcţiei obiectiv (un
element este cu atât mai bun cu cât valoarea acestei funcţii este mai
mare).
Noţiunile de adecvare şi evaluare sunt folosite în general cu
acelaşi sens; totuşi se poate face o distincţie între ele. Funcţia de
evaluare, sau funcţia obiectiv, reprezintă o măsură a performanţei în
raport cu o mulţime de parametri, în timp ce funcţia de adecvare
transformă această măsură a performanţei în alocare de facilităţi
reproductive. Evaluarea unui şir reprezentând o mulţime de parametri
este independentă de evaluarea altor şiruri. Adecvarea unui şir este,
însă, definită în raport cu alţi membri ai populaţiei curente; de
fi
exemplu, prin , unde f i este evaluarea asociată şirului i iar f este
f
evaluarea medie a tuturor şirurilor populaţiei.

Funcţia de evaluare şi codificarea sunt, de obicei, singurele


componente ale algoritmilor evolutivi care depind de problema de
22
rezolvat. Un algoritm evolutiv, folosit pentru rezolvarea unei
probleme de optimizare, poate fi privit ca o ''cutie neagră'' cu o serie
de butoane de control reprezentând diverşi parametri. Ieşirea cutiei
negre este valoarea unei funcţii indicând în ce măsură o anumită
distribuţie a parametrilor rezolvă problema dată. În termeni
tradiţionali, dorim să minimizăm (maximizăm) o funcţie
F ( x1 , x 2 ,L, x n ) . De cele mai multe ori este imposibil de tratat
independent fiecare parametru. Apariţia interacţiunilor face necesară
considerarea efectelor combinate ale parametrilor în vederea
optimizării cutiei negre. În limbajul algoritmilor genetici,
interacţiunea dintre variabile este numită epistasis.

Variabilele reprezentând parametrii sunt, de obicei, codificate


prin şiruri binare, dar există şi alte codificări: numere întregi, numere
reale, codul Gray, codificare alfabetică, arbori. Condiţiile pe care
trebuie să le îndeplinească o reprezentare bună sunt: independenţa
relativă a genelor, includerea a cât mai multe restricţii ale problemei
direct în reprezentare, complexitate scăzută a decodificării/codificării
cromozomilor. Rezolvarea problemelor de codificare este considerată,
de obicei, ca parte a construcţiei funcţiei de evaluare. Funcţia de
evaluare este parte a descrierii problemei. Precizarea funcţiei de
evaluare poate implica o simulare şi poate fi aproximativă sau parţială.
De exemplu, să considerăm o problemă de control optimal, în care
mulţimea stărilor în care se poate afla sistemul poate fi exponenţial de
mare. Folosirea unui algoritm evolutiv pentru găsirea unei strategii
23
optime de control presupune reducerea spaţiului stărilor (prin
eşantionare) şi, astfel, evaluarea realizată este aproximativă şi afectată
de perturbaţii. Funcţia de evaluare trebuie să fie uşor de calculat,
având în vedere că fiecare generaţie trebuie evaluată; deci, funcţia de
evaluare este apelată de foarte multe ori.
La aplicarea unui algoritm evolutiv pentru rezolvarea unei
probleme concrete trebuie alese în mod adecvat: modul de codificare a
elementelor, funcţia de adecvare şi operatorii de selecţie, încrucişare şi
mutaţie. Unele dintre aceste elemente sunt strâns legate de problema
de rezolvat, iar altele mai puţin.
Structura unui algoritm evolutiv este următoarea

Procedure AE
begin
t := 0
iniţializare P (t )
evaluare P (t )
while (not condiţie terminare) do
begin
t := t + 1
selectare P (t ) din P (t − 1)
modificare P (t )
evaluare P (t )
end
end.
24

1.3. Domenii de aplicabilitate

Sistemele evolutive se utilizează atunci când nu există altă


strategie de rezolvare a problemei şi este acceptat un răspuns
aproximativ. Se utilizează în special atunci când problema poate fi
formulată ca una de optimizare, însă nu numai. Algoritmii evolutivi
sunt utilizaţi în diverse domenii, precum:

Planificare. Majoritatea problemelor de planificare (de


exemplu, alegerea traseelor optime ale unor vehicule, rutarea
mesajelor într-o reţea de telecomunicaţii, planificarea unor activităţi,
etc.) pot fi formulate ca probleme de optimizare cu sau fără restricţii.
Multe din acestea sunt de tip NP, necunoscându-se algoritmi de
rezolvare care să aibă complexitate polinomială. Pentru astfel de
probleme algoritmii evolutivi oferă posibilitatea obţinerii, în timp
rezonabil, a unor soluţii sub-optimale de calitate acceptabilă.

Proiectare. Algoritmii evolutivi au fost aplicaţi cu succes în


proiectarea circuitelor digitale, a filtrelor dar şi a unor structuri de
calcul cum sunt reţelele neuronale. Ca metode de estimare a
parametrilor unor sisteme ce optimizează anumite criterii, algoritmii
evolutivi se aplică în diverse domenii din inginerie cum ar fi:
proiectarea avioanelor, proiectarea reactoarelor chimice, proiectarea
structurilor în construcţii, etc.
25
Simulare şi identificare. Simularea presupune să se determine
modul de comportare a unui sistem pornind de la un model al acestuia.
Identificarea este sarcina inversă, a determinării structurii sistemului
pornind de la modul de comportare. Algoritmii evolutivi sunt utilizaţi
atât în simularea unor probleme din inginerie dar şi din economie.
Identificarea unui model este utilă în special în efectuarea unor
predicţii în diverse domenii ( economie, finanţe, medicină, ştiinţele
mediului, etc.).

Control. Algoritmii evolutivi pot fi utilizaţi pentru a


implementa controlere on-line asociate sistemelor dinamice (de
exemplu pentru a controla roboţii mobili ).

Clasificare. Se poate considera că din domeniul calculului


evolutiv fac parte şi sistemele de clasificare. Un sistem de clasificare
se bazează pe o populaţie de reguli de asociere (reguli de producţie)
care evoluează pentru a se adapta problemei de rezolvat (calitatea unei
reguli se stabileşte pe baza unor exemple). Evoluţia regulilor are
acelaşi scop ca şi la învăţarea în reţelele neuronale. Algoritmii
evolutivi sunt aplicaţi cu succes în clasificarea imaginilor, în biologie
(pentru determinarea structurii proteinelor) sau în medicină (pentru
clasificarea electrocardiogramelor).
2
SPAŢIUL DE CĂUTARE ŞI FUNCŢIA
DE ADECVARE

La proiectarea unui algoritm evolutiv trebuie să se stabilească:

• Modul de codificare. Se specifică modul în care fiecărei


configuraţii din spaţiul de căutare i se asociază un cromozom.

• Funcţia de adecvare. Se construieşte funcţia care exprimă gradul


de adecvare la mediu, pornind de la restricţiile şi funcţia obiectiv
asociate problemei.

• Dimensiunea şi modul de iniţializare a populaţiei. Se pot utiliza


populaţii de dimensiune fixă sau de dimensiune variabilă. De cele mai
multe ori populaţia se iniţializează în manieră aleatoare cu elemente
din spaţiul de căutare.

• Mecanismul de selecţie a părinţilor şi supravieţuitorilor.

• Mecanismul de încrucişare a părinţilor pentru a genera urmaşi.

• Mecanismul de mutaţie, care asigură perturbarea indivizilor ce


compun populaţia.
28
• Criteriul de oprire. Atunci când nu se cunoaşte un criteriu specific
problemei se optează pentru un număr maxim de iteraţii. Se pot folosi
informaţii despre populaţie, cum ar fi gradul de diversitate al acesteia.

2.1. Codificarea spaţiului de căutare

Codificarea spaţiului de căutare este una dintre cele mai


importante etape ale proiectării unui algoritm evolutiv întrucât
determină modul în care se va desfăşura procesul de evoluţie. Se
referă la următoarele aspecte: structuri de date folosite, regula de
codificare şi regula de decodificare.

2.1.1. Structuri de date

În algoritmii genetici cromozomii sunt reprezentaţi prin


structuri liniare cu număr fix de elemente (tablouri) sau cu număr
variabil de elemente (liste înlănţuite). Prima variantă este cea mai
frecvent folosită. Structuri de alt tip (de exemplu, structuri
arborescente ) se folosesc în alte metode evolutive ( de exemplu în
programarea genetică ).

2.1.2. Reguli de codificare

Modul în care o configuraţie este codificată într-un cromozom


depinde de problema concretă, existând mai multe variante de
codificare.
29
2.1.2.1 . Codificarea binară

Aceasta este varianta clasică: cromozomii sunt vectori cu


elemente din {0, 1} iar spaţiul de căutare este S = {0, 1}n , cu n
numărul de gene.

Exemplul 2.1. Problema submulţimii de sumă maximă


limitată. Se consideră o mulţime W = {w1 , L, wn } de valori întregi şi
V o valoare întreagă. Se caută o submulţime S ⊂ W cu proprietatea
că suma elementelor lui S este cât mai apropiată de V , dar nu
depăşeşte această valoare. Orice submulţime S poate fi reprezentată
printr-un vector ( s1 , s 2 , L , s n ) cu s i = 0 dacă wi ∉ S şi s i = 1 dacă
n
wi ∈ S . Suma elementelor submulţimii S este ∑w s
i =1
i i .

Exemplul 2.2. Problema rucsacului. Se consideră o mulţime


de n obiecte caracterizate de greutăţile (w1 , L , wn ) şi de valorile
(v1 , L, vn ) . Se pune problema determinării unei submulţimi de
obiecte pentru a fi introduse într-un rucsac de capacitate C astfel încât
valoarea obiectelor selectate să fie maximă. O soluţie a acestei
probleme poate fi codificată ca un şir de n valori binare în felul
următor: s i = 1 dacă obiectul i este selectat, respectiv s i = 0 dacă
obiectul nu este selectat.

Exemplul 2.3. Problema împachetării. Se consideră o mulţime


de n obiecte caracterizate de dimensiunile (d1 , L, d n ) şi o mulţime de
30
m cutii având capacităţile (C1 , L , C m ) . Se pune problema plasării
obiectelor în cutii astfel încât capacitatea acestora să nu fie depăşită
iar numărul de cutii utilizate să fie cât mai mic. O posibilă
reprezentare binară pentru această problemă este următoarea: se
utilizează o matrice A cu n linii şi m coloane iar elementul aij are
valoarea 1 dacă obiectul i este plasat în cutia j şi 0 în caz contrar
(obiectul i nu este plasat în cutia j ). Prin liniarizarea matricei se
ajunge ca fiecare soluţie să fie reprezentată printr-un cromozom
conţinând m × n gene.

Exemplul 2.4. Optimizarea unei funcţii definită pe un domeniu


continuu. Se consideră o funcţie
f : D = [a1 , b1 ]× [a 2 , b2 ]× L × [a n , bn ] ⊂ R n → R
( )
şi se caută x * = x1* , L, xn* care minimizează pe f . Pentru a utiliza
codificarea binară, fiecare componentă xi ale lui x = ( x1 , L, x n ) se
transformă după regulile:
• se scalează pentru a fi adusă în intervalul [0, 1] :
xi − a i
vi =
bi − ai
• se stabileşte numărul r de biţi necesari pentru reprezentare şi se
aduce valoarea vi în mulţimea {0, 1, L, 2 r − 1}:

( )
u i = ⎣vi ⋅ 2 r − 1 ⎦ ,
31
unde ⎣ ⎦ reprezintă partea întreagă. Valoarea astfel obţinută se
reprezintă în baza 2.

De exemplu, pentru x = (1.25, 2.3) ∈ [1, 2]× [2, 3] şi r = 5 se


obţine x = (0.25, 0.3) iar cromozomul asociat va avea 2 ⋅ r = 10
componente binare: (0, 0, 1, 1, 1, 0, 1, 0, 0, 1) . Este evident că această
codificare are caracter aproximativ, motiv pentru care în cazul
variabilelor reale se preferă utilizarea codificării reale.

Utilizarea reprezentării binare în cazul în care configuraţiile


corespunzătoare problemei sunt vectori de valori reale prezintă
dezavantajul că unele valori reale aflate la distanţă mică au asociate
reprezentări binare aflate la distanţă mare (diferă în multe poziţii
binare). De exemplu, reprezentarea lui 7 pe 4 biţi este 0111 iar
reprezentarea lui 8 este 1000 . Se remarcă faptul că trecerea de la
reprezentarea lui 7 la cea a lui 8 necesită 4 modificări de biţi. O altă
variantă de codificare care evită acest dezavantaj este codificarea de
tip Gray caracterizată prin faptul că valori întregi succesive au
asociate şiruri de biţi care diferă într-o singură poziţie.

Pornind de la reprezentarea binară (b1 , L, bn ) (cifrele binare


sunt specificate începând cu cea mai semnificativă), codul Gray,
(a1 , L, an ) , se construieşte după regula:
⎧b i =1
ai = ⎨ i
⎩bi −1 ⊕ bi i >1

unde ⊕ reprezintă adunarea modulo 2.


32

Reprezentarea clasică

0 1 2 3 4 5 6 7

000 001 010 011 100 101 110 111

Codificarea Gray

0 1 2 3 4 5 6 7

000 001 011 010 110 111 101 100

Tabelul 1: Reprezentări binare: reprezentarea clasică în baza 2


şi codul Gray

În cazul codificării binare clasice a unei valori din intervalul


[a, b] , pentru a obţine valoarea decodificată pornind de la şirul de biţi
obţinut prin codificare se foloseşte relaţia:

b−a n
∂(s1,……,sn)= a + ∑ s j 2 j −1
2 n − 1 j =1

În cazul codificării de tip Gray decodificarea se bazează pe


relaţia:

b−a n j
∂(s1,……,sn)= a + ∑ ( ⊕ s k )2 n− j .
2 n − 1 j =1 k =1

În cazul decodificării şirul de biţi se parcurge de la dreapta la stânga.


33
2.1.2.2. Codificarea întreagă

Există mai multe posibilităţi de a reprezenta un număr întreg


nenegativ p , în funcţie de mulţimea în care ia valori.

• dacă { }
p ia valori în mulţimea 0, 1, L, 2n − 1 atunci el poate fi
reprezentat ca un şir binar b0b1 Lbn cu bi ∈ {0, 1}, 0 ≤ i ≤ n .

{ }
• dacă p ∈ m, m + 1, L, m + 2 n − 1 atunci se codifică p − m ca în
cazul anterior

• dacă p ∈ {1, 2, L, l − 1} şi nu există n astfel încât l = 2 n atunci


sunt posibile mai multe soluţii:

a) se ia n = [log2 l ] + 1 şi se transformă fiecare şir binar


(b0b1 Lbn )10 ≥ l în p = l − 1 (operaţie numită tăietură); în acest caz
fiecare număr p cuprins între 0 şi l − 2 este reprezentat printr-un şir

binar, în timp ce p = l − 1 este reprezentat prin 2 n − l şiruri

b) se ia n = [log2 l ] + 1 şi se transformă fiecare şir s = b0b1 Lbn în


s10
p= (l − 1) (operaţie numită scalare), unde s10 reprezintă
2n − 1
scrierea şirului s în baza 10.
34
2.1.2.3. Codificarea reală

Este adecvată pentru problemele de optimizare pe domenii


continue. Presupunem că se doreşte maximizarea unei funcţii de k
variabile f : R k → R ; fiecare variabilă xi ia valori într-un domeniu
Di = [ai , bi ] ⊂ R şi f ( x1 , L , xk ) > 0 pentru orice xi ∈ Di . Cerând o
precizie de 4 zecimale pentru valorile variabilelor, fiecare interval Di

va trebui divizat în 10 4 (bi − ai ) subintervale egale. Fie li cel mai mic


întreg astfel încât
10 4 (bi − ai ) ≤ 2 li − 1 .
Atunci o reprezentare a variabilei xi ca un şir binar de
lungime li va satisface precizia dorită.
Acum fiecare cromozom este reprezentat printr-un şir binar de
k
lungime l = ∑ li ; primii l1 biţi reprezintă o valoare din [a1 , b1 ] ,
i =1

următorii l 2 biţi reprezintă o valoare din [a2 , b2 ] şi aşa mai departe.


Decodificarea se face cu formula

bi − ai
xi = ai + zecimal(string2 ) ⋅
2li − 1

unde zecimal(string 2 ) reprezintă valoarea zecimală a şirului binar


string .
35
2.1.2.4. Codificarea specifică

Se alege o variantă cât mai apropiată de specificul problemei.


Majoritatea codificărilor de acest tip vor fi explicate pentru problema
comis voiajorului: se consideră o mulţime de n oraşe şi se pune
problema găsirii unui traseu care să treacă o singură dată prin fiecare
oraş şi care să aibă costul minim (dacă costul este proporţional cu
lungimea traseului atunci se caută trasee de lungime minimă).
Rezolvarea problemei constă în găsirea celei mai bune permutări a
oraşelor (v1 , L , vn ) , unde vi ∈ {1, L, n} . Pentru a fi respectată
restricţia ca fiecare oraş să fie vizitat o singură dată este necesar ca
elementele vectorului V = (v1 , L , v n ) să fie distincte.

2.1.2.4.1. Codificarea prin adiacenţă

Un cromozom (care reprezintă un traseu) este o listă de n


oraşe: oraşul j este plasat în poziţia i dacă şi numai dacă există o
muchie de la oraşul i la oraşul j . De exemplu, vectorul

(2, 4, 8, 3, 9, 7, 1, 5, 6 )
reprezintă traseul

1→ 2 → 4 → 3 → 8 → 5 → 9 → 6 → 7 .
Unele liste de adiacenţă pot reprezenta trasee ilegale, ca de exemplu

(2, 4, 8, 1, 9, 3, 5, 7, 6 )
care duce la
1 → 2 → 4 → 1,
36
adică la o ciclare (prematură) obţinută înainte de terminarea traseului.

2.1.2.4.2. Codificarea ordinală

În acest caz un traseu se reprezintă ca o listă de n oraşe,


elementul aflat pe poziţia i în listă fiind un număr din intervalul
[1, n − i + 1] . Se foloseşte o listă ordonată L a oraşelor, care serveşte ca
referinţă pentru reprezentarea ordinală. Considerând lista

L = (1, 2, 3, 4, 5, 6, 7, 8, 9 ) ,
traseul
1→ 2 → 4 → 3 → 8 → 5 → 9 → 6 → 7
va fi codificat ca o listă

l = (1, 1, 2, 1, 4, 1, 3, 1, 1)
interpretată astfel:

• primul număr din lista l este 1, aşa că primul oraş din lista L este
luat ca prim oraş al traseului şi este şters din lista L ; traseul parţial
este (1)

• următorul oraş din lista l este 1, aşa că se ia primul oraş din lista
curentă L ca oraşul următor al traseului şi se sterge din lista L ;
rezultă traseul parţial (1 → 2 )

• următorul număr din lista l este 2, deci se alege al doilea oraş din
lista curentă L ca următorul oraş al traseului şi se şterge din listă; în
acest moment traseul parţial este (1 → 2 → 4 ) .
37
În final rezultă traseul

1→ 2 → 4 → 3 → 8 → 5 → 9 → 6 → 7 .

2.1.2.4.3. Codificarea prin drumuri

Aceasta este cea mai naturală codificare a unui traseu. De


exemplu, traseul

5 → 1→ 7 → 8 → 9 → 4 → 6 → 2 → 3
este codificat simplu ca

(5, 1, 7 , 8 , 9 , 4 , 6 , 2 , 3) .

2.1.2.4.4. Codificarea prin numerotare

Considerăm din nou problema împachetării. În varianta de


codificare binară propusă în Exemplul 2.3 apare dezavantajul că pot fi
generate configuraţii care nu sunt fezabile. Acestea sunt de exemplu
matricele care conţin mai multe elemente egale cu 1 pe o linie (aceasta
ar însemna că un obiect este simultan inclus în mai multe cutii).
Pentru a evita astfel de situaţii se poate utiliza un alt tip de
reprezentare: un vector cu n componente (v1 , L, vn ) în care
vi ∈ {1, L, m} reprezintă cutia în care este inclus obiectul i .
38
2.1.2.4.5. Codificarea matriceală

Fox şi McMahon [30] au propus reprezentarea unui traseu ca


o matrice binară M în care elementul mij are valoarea 1 dacă şi numai
dacă oraşul i apare înaintea lui j în traseu. De exemplu, traseul

3 → 1→ 2 →8 → 7 → 4 → 6 → 9 → 5
este reprezentat prin matricea de mai jos.

1 2 3 4 5 6 7 8 9
1 0 1 0 1 1 1 1 1 1
2 0 0 0 1 1 1 1 1 1
3 1 1 0 1 1 1 1 1 1
4 0 0 0 0 1 1 0 0 1
5 0 0 0 0 0 0 0 0 0
6 0 0 0 0 1 0 0 0 1
7 0 0 0 1 1 1 0 0 1
8 0 0 0 1 1 1 1 0 1
9 0 0 0 0 1 0 0 0 0

În această reprezentare matricea M de dimensiune n × n


reprezintă un traseu de n oraşe (total ordonate) cu următoarele
proprietăţi:
n(n − 1)
1. numărul valorilor 1 este exact
2
2. mii = 0 pentru orice i cu 1 ≤ i ≤ n
39
3. dacă mij = 1 şi m jk = 1 atunci mik = 1 .
n(n − 1)
Dacă numărul valorilor 1 din matrice este mai mic decât
2
iar celelalte două condiţii sunt satisfăcute atunci oraşele sunt parţial
ordonate, adică există cel puţin o modalitate de completare a matricei
astfel încât să se obţină un traseu legal.

O altă reprezentare de tip matriceal a fost folosită de Seniw [84] şi


Homaifar şi Guan [45] . În această reprezentare, elementul mij ia
valoarea 1 dacă şi numai dacă există un traseu de la oraşul i direct la
oraşul j (matricea de adiacenţă).

1 2 3 4 5 6 7 8 9
1 0 1 0 0 0 0 0 0 0
2 0 0 0 1 0 0 0 0 0
3 0 0 0 0 0 0 0 1 0
4 0 0 1 0 0 0 0 0 0
5 0 0 0 0 0 0 1 0 0
6 0 0 0 0 1 0 0 0 0
7 0 0 0 0 0 0 0 0 1
8 0 0 0 0 0 1 0 0 0
9 1 0 0 0 0 0 0 0 0

Astfel, matricea anterioară reprezintă un traseu care vizitează oraşele


(1, 2 , 4 , 3, 8 , 6 , 5 , 7 , 9 ) , în această ordine. Această
reprezentare nu specifică oraşul de start, fiind valide şi alte trasee:
40
(2, 4, 3, 8, 6 , 5, 7 , 9 , 1) , (4, 3, 8, 6 , 5, 7 , 9 , 1, 2 ) ,
etc.

Un traseu complet este reprezentat printr-o matrice binară


având un singur 1 pe fiecare linie şi fiecare coloană. Totuşi, nu orice
matrice cu aceste proprietăţi reprezintă un traseu complet. Unele
matrice pot reprezenta subtrasee care nu sunt conectate între ele. De
exemplu, matricea următoare reprezintă două subtrasee:
(1, 2 , 4 , 5, 7 ) şi (3, 8, 6 , 9 ) .

1 2 3 4 5 6 7 8 9
1 0 1 0 0 0 0 0 0 0
2 0 0 0 1 0 0 0 0 0
3 0 0 0 0 0 0 0 1 0
4 0 0 0 0 1 0 0 0 0
5 0 0 0 0 0 0 1 0 0
6 0 0 0 0 0 0 0 0 1
7 1 0 0 0 0 0 0 0 0
8 0 0 0 0 0 1 0 0 0
9 0 0 1 0 0 0 0 0 0
41

2.2. Construirea funcţiei de adecvare

În procesul de evoluţie naturală se urmăreşte maximizarea


gradului de adecvare a indivizilor la mediu. Pentru a ne folosi de
analogia dintre procesele de căutare şi cele de evoluţie este util să
reformulăm problemele de optimizare ca probleme de maximizare
(orice problemă de minimizare poate fi transformată într-una de
maximizare prin schimbarea semnului funcţiei obiectiv). Pentru o
problemă de minimizare de forma: să se determine x * ∈ D cu
proprietatea că f (x * ) ≤ f ( x ) pentru orice x ∈ D , funcţia de adecvare
poate fi chiar funcţia obiectiv F ( x) = f ( x) . Lucrurile devin mai
complicate în cazul problemelor cu restricţii.

Să considerăm o problemă de minimizare cu restricţii:


să se determine x * ∈ D cu proprietatea că minimizează funcţia
obiectiv f : D → R şi satisface restricţiile:

g j ( x* ) = 0, 1 ≤ j ≤ k1 ( restricţii de tip egalitate )

h j ( x* ) ≥ 0, 1 ≤ j ≤ k 2 ( restricţii de tip inegalitate )

O variantă de a trata restricţiile este de a folosi tehnica


penalizării, care permite includerea acestora în cadrul funcţiei de
adecvare:
k1
∑ (g j (x )) 2 + b ∑ ϕ (h (x ))
k2
F( x ) = f ( x ) + a j
j =1 j =1

unde
42
⎧u 2 u <0
ϕ (u ) = ⎨
⎩0 u ≥0
iar a şi b sunt parametri pozitivi care reflectă importanţa relativă a
încălcării restricţiilor (cu cât a şi b sunt mai mari cu atât restricţia
este mai importantă şi încălcarea ei este penalizată mai mult). Dacă se
fac diferenţieri între restricţii atunci se pot utiliza mai multe valori
( a1 , L, a k1 şi b1 , L, bk2 în loc de a si respectiv b ).

Exemplul 2.5. Problema submulţimii. Un vector


s = (s1 , L , s n ) este admisibil (adică este o soluţie potenţială) dacă
n
satisface relaţia ∑ wi si ≤ M . Funcţia de adecvare depinde de starea
i =1

vectorului (admisibil sau nu):

⎧ n
⎪ ∑ wi si dacă s este admisibil

F ( s ) = ⎨ i =n1
⎪− ∑ w s dacă s nu este admisibil
⎪⎩ i =1 i i

Modul de specificare a funcţiei de adecvare sugerează că dacă


o soluţie este acceptabilă atunci ea este cu atât mai bună cu cât se
apropie mai mult de optim ( în cazul nostru înseamnă că suma este cu
atât mai apropiată de M ). Dacă soluţia nu este admisibilă atunci ea
este cu atât mai bună cu cât abaterea faţă de o soluţie admisibilă este
mai mică. Această tehnică de a trata diferit soluţiile admisibile şi cele
43
neadmisibile permite compararea între ele a soluţiilor. Regulile
naturale sunt următoarele:

• orice soluţie admisibilă este mai bună decât o soluţie care nu este
admisibilă;

• dintre două soluţii admisibile este mai bună cea care are adecvarea
mai mare (în cazul problemei submulţimii aceasta înseamnă că suma
valorilor elementelor submulţimii este mai mare)

• dintre două soluţii neadmisibile cea mai bună este cea care încalcă
mai puţin restricţiile (în cazul acestei probleme înseamnă că suma
elementelor este mai mică, adică depăşeşte cu mai puţin pragul M ).

Exemplul 2.6. Problema rucsacului. Fiind o problemă cu


restricţii, trebuie luat în considerare şi cazul configuraţiilor care nu
sunt admisibile. O posibilă funcţie de adecvare este:

⎧ n n
⎪ ∑v js j dacă ∑wjs j ≤ C
⎪ j =1 j =1
F (s) = ⎨ n n n
⎪ v s − b( w s − C ) dacă
⎪∑ j j ∑ j j ∑wjs j > C
⎩ j =1 j =1 j =1

Exemplul 2.7. Problema comis-voiajorului. În acest caz, dacă se


foloseşte o reprezentare de tip permutare restricţia problemei (trecerea
o singură dată prin fiecare oraş) este implicit satisfăcută. Dacă
matricea C conţine costurile ( c(i, j ) reprezintă costul trecerii de la
oraşul i la oraşul j ) atunci funcţia de cost poate fi descrisă prin:
44
n −1
f ( s1 ,........, s n ) = ∑ c( si , si +1 ) + c( sn , s1 )
i =1

În multe probleme ne interesează nu numai găsirea optimului


global ci şi mulţimea tuturor soluţiilor acceptabile. Dacă există un
optim global şi mai multe optime locale, populaţia va migra spre zona
optimului global. De aceea trebuie găsit un mecanism care să
favorizeze apariţia unor subpopulaţii corespunzătoare diferitelor
puncte de optim. Soluţia este oferită de conceptul biologic de nişă
ecologică, conform căruia indivizii unei populaţii se grupează în nişe
ecologice iar indivizii unei nişe împart între ei resursele.

Aplicarea acestui principiu la algoritmi genetici presupune


modificarea funcţiei de adecvare. Pentru aceasta se foloseşte funcţia
de partajare care defineşte faptul că doi indivizi ai populaţiei îşi
împart resursele. Deoarece cu cât indivizii sunt mai apropiaţi cu atât
îşi impart mai mult resursele, înseamnă că funcţia de partajare trebuie
să fie descrescătoare în raport cu distanţa dintre cromozomi.

O funcţie de partajare p : R → [0, 1] trebuie să verifice


condiţiile:
1) p este descrescătoare
2) p(0) = 1
3) lim p(d ) = 0 .
d →∞

Un exemplu de astfel de funcţie este


45

⎧ d
⎪1 − pentru d < a
p(d ) = ⎨ a
⎪⎩0 pentru d ≥ a
unde a este diametrul nişei, adică distanţa maximă dintre doi
cromozomi.
Distanţa dintre doi cromozomi se poate defini în mai multe
feluri:

• distanţa euclidiană, care realizează nişe sferice

• distanţa Hamming, care reprezintă numărul poziţiilor în care cei


doi cromozomi diferă

• distanţa Levenstein, care reprezintă numărul de ştergeri, adăugări


sau modificări efectuate asupra elementelor unui şir pentru a-l face
identic cu celălalt.

Pentru fiecare individ xi din populaţie se calculează valoarea


vi a nişei corespunzătoare lui:

vi = ∑ p (d (xi , x j ))
n

j =1

iar funcţia de adecvare partajată se defineşte prin


f ( xi )
f * ( xi ) =
vi
unde n este dimensiunea populaţiei iar f este funcţia obiectiv.
Funcţia de adecvare partajată favorizează menţinerea punctelor
de optim care au puţini reprezentanţi în populaţie. Fie M mulţimea
indivizilor unui astfel de punct; avem
46
d (xi , x j ) < a pentru xi , x j ∈ M şi
d (xi , x k ) ≥ a pentru xi ∈ M , x k ∉ M
ceea ce implică p (d ( xi , x k )) = 0 pentru xi ∈ M , x k ∉ M .
Deoarece M are puţini indivizi, valoarea vi a nişei
corespunzătoare individului xi ∈ M va fi mică în raport cu valorile
corespunzătoare altor puncte de optim. Rezultă că valorile funcţiei de
adecvare partajată f * vor fi mai mari pentru indivizii din M ceea ce
face ca în generaţia următoare să se obţină mai mulţi indivizi
corespunzători acestui optim.
3
METODE DE SELECŢIE

3.1. Introducere

Selecţia are ca scop determinarea populaţiei intermediare ce


conţine părinţii care vor fi supuşi operatorilor de încrucişare şi mutaţie
precum şi determinarea indivizilor ce vor face parte din generaţia
următoare. Criteriul de selecţie se bazează pe gradul de adecvare al
indivizilor la mediu, exprimat prin valoarea funcţiei de adecvare. Nu
este obligatoriu ca atât părinţii cât şi supravieţuitorii să fie determinaţi
prin selecţie, fiind posibil ca selecţia să fie folosită într-o singură
etapă.
Există două clase principale de metode de selecţie:

• Metode deterministe. Acestea se caracterizează prin faptul că


elementele cu grad mai mare de adecvare sunt întotdeauna selectate în
defavoarea celor cu un grad mai mic de adecvare. Un exemplu de
astfel de metodă este selecţia prin trunchiere.

• Metode aleatoare. Acestea se caracterizează prin faptul că în


procesul de selecţie intervin elemente aleatoare. Variantele cel mai
48
frecvent întâlnite se bazează pe stabilirea unor probabilităţi de selecţie
care depind de gradul de adecvare. În felul acesta elementele cu grad
mai mare de adecvare au şanse mai mari de a fi selectate, astfel că
numărul de copii ale acestora este mai mare decât al celor cu grad mai
mic de adecvare. Metodele cele mai reprezentative sunt selecţia
proporţională, selecţia pe baza rangurilor şi selecţia de tip turneu.

Calitatea selecţiei este definită de o serie de parametri, dintre


care amintim

• presiunea selectivă = probabilitatea celui mai bun individ de a fi


selectat, comparativ cu media probabilităţii de selecţie a tuturor
indivizilor

• abaterea = diferenţa în valoare absolută dintre fitnessul normalizat


al individului şi probabilitatea sa aşteptată de reproducere

• întinderea = plaja de valori posibile pentru numărul de descendenţi


ai individului

• pierderea diversităţii: proporţia de indivizi din populaţie care nu


sunt selectaţi

• intensitatea selecţiei: valoarea medie aşteptată a fitnessului


populaţiei după aplicarea metodei de selecţie la distribuţia Gauss-iană
normalizată

• varianţa selecţiei: varianţa aşteptată a distribuţiei fitnessului


populaţiei după aplicarea metodei de selecţie la distribuţia Gauss-iană
normalizată.
49

3.2. Selecţia după rang

Indivizii sunt sortaţi descrescător după valorile funcţiei


obiectiv, fitnessul atribuit fiecărui individ depinde numai de poziţia sa
în şir şi nu de valoarea funcţiei obiectiv. Fiecărui individ i se asociază
probabilitatea de a fi selectat pi astfel încât ∑p i = 1 . Există două
tipuri standard de probabilităţi:

• liniară: pi = a ⋅ i + b , cu a < 0
• exponenţială: pi = a ⋅ e b⋅i +c .
Avantajele selecţiei după rang constă în faptul că nu duce la
convergenţă prematură şi nici la stagnare.

Fie notaţiile:

• Nind - numărul de indivizi din populaţie

• Pos - poziţia unui individ în populaţie (individul cel mai


neconvenabil are Pos=1, iar cel mai bun are Pos=Nind )

• SP – presiunea selecţiei

Fitnessul unui individ se calculează astfel:

• aranjarea liniară:
Fitness( Pos ) = 2 − SP + 2( SP − 1 )( Pos − 1 ) /( Nind − 1 )
Aranjarea liniară permite valori ale parametrului SP în intervalul
[1.0, 2.0] .
• aranjarea neliniară:
50
Nind
Fitness( Pos ) = Nind ⋅ x Pos −1 / ∑ x i −1
i =1

unde x este rădăcina ecuaţiei


( SP − 1 ) X Nind −1 + SP ⋅ X Nind −2 + L + SP ⋅ X + SP = 0 .

Aranjarea neliniară permite valori ale lui SP din intervalul


[1.0, Nind − 2] .
Probabilitatea unui individ de a fi selectat este dată de fitnessul său
normalizat prin fitnessul total al populaţiei.

3.3. Metoda ruletei

Principiul ruletei reprezintă cea mai simplă metodă de selecţie,


fiind un algoritm stochastic ce foloseşte următoarea tehnică:

• indivizii sunt văzuţi ca segmente continuie pe o dreaptă, astfel încât


fiecare segment asociat unui individ este egal cu fitnessul său;

• se generează un număr aleator şi individul al cărui segment conţine


numărul respectiv va fi selectat

• se repetă pasul anterior până când este selectat numărul dorit de


indivizi.
Această tehnică este similară cu cea a ruletei, în care fiecare
segment este proporţional cu fitnessul unui individ.
51
Exemplul 3.1. Tabelul următor arată probabilitatea de selecţie
pentru 11 indivizi, folosind aranjarea liniară şi presiunea selectivă 2.
Individul 1 este cel mai bun şi ocupă intervalul cel mai mare, în timp
ce individul 10 este penultimul în şir şi ocupă intervalul cel mai mic;
individul 11, ultimul din şir, având fitnessul 0 nu poate fi ales pentru
reproducere.

nr 4 nr 2 nr 6 nr 5 nr 1 nr 3
individ

Probabilitatea în acest tabel se calculează ca fiind raportul dintre


fitnessul unui individ şi suma fitnessurilor tuturor indivizilor.

Număr 1 2 3 4 5 6 7 8 9 10
individ

Fitness 2.0 1.8 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2

Proba- 0.18 0.16 0.15 0.13 0.11 0.09 0.07 0.06 0.03 0.02
bilitate
selecţie

Dorind să selectăm 6 indivizi, se generează 6 numere aleatoare


uniform distribuite în intervalul (0, 1) . Fie acestea 0.81 , 0.32 , 0.96 ,
0.01 , 0.65 , 0.42 . Aşezând cei 10 indivizi pe o dreaptă, în ordinea
1, 2, ... ,10, individul 1 va ocupa segmentul cuprins între 0.0 şi 0.18,
52
individul 2 segmentul dintre 0.18 şi 0.34, individul 3 segmentul dintre
0.34 şi 0.49, etc. Deoarece individul 6 corespunde segmentului
delimitat de 0.73 şi 0.82 iar primul număr generat (= 0.81) cade în
acest segment, individul 6 va fi selectat pentru reproducere. În mod
similar se selectează indivizii 1, 2, 3, 5, 9; deci, populaţia selectată
este formată din indivizii 1, 2, 3, 5, 6, 9.

3.4. Metoda fitnessului proporţionat

Este metoda cea mai des utilizată şi funcţionează astfel:


• se calculează fitnessul f i al fiecărui individ i şi fitnessul mediu al
populaţiei

f =
∑f i

n
• individul i este selectat pentru reproducere cu probabilitatea
fi fi
pi = = .
∑ fi n⋅ f
• dacă trebuie selectaţi N indivizi, numărul N i al indivizilor ce vor fi
selectaţi cu probabilitatea pi va fi apoximativ egal cu N ⋅ pi .
Metoda fitnessului proporţionat poate fi implementată cu ajutorul
algoritmului ruletei.

Exemplul 3.2. Fie n = 4 indivizi având f1 = f 2 = 10 , f 3 = 15


şi f 4 = 25 . În practică, metoda ruletei poate fi implementată folosind
53
un vector v cu m componente şi un index aleator r , urmând ca
individul v(r ) să fie selectat la fiecare „măturare”. Luând m = 12 în
exemplul nostru, deoarece
1 1 5
p1 = p2 = , p3 = , p 4 = şi N i = m ⋅ pi ,
6 4 12
rezultă v = (1 1 2 2 3 3 3 4 4 4 4 4) . Pentru r = 6 va fi selectat
individul v(6) = 3 .

La terminarea selecţiei este posibil ca un individ să fie selectat


de mai multe ori (să aibă mai multe copii). Dacă se selectează un
număr de indivizi egal cu dimensiunea n a populaţiei, deoarece
numărul aşteptat de copii ale individului i este
fi
N i = pi n = ,
f
înseamnă că indivizii pentru care f i > f tind să aibă mai mult de o
copie. Un individ cu
f ≤ f i ≤ f max
va fi selectat într-o generaţie timpurie iar către sfârşitul rulării toţi
indivizii tind să aibă valori ale fitnessului relativ mari şi similare,
adică f i ≈ f max ∀i . În acest moment
N1 ≈ L ≈ N n ≈ 1 ,
astfel că există o presiune selectivă foarte mică.
54

3.5. Selecţia stochastică universală

Acest tip de selecţie furnizează abaterea zero şi întinderea


minimă. Indivizii sunt văzuţi ca segmente aşezate pe dreaptă ca la
metoda ruletei. Pointeri, egal depărtaţi, sunt plasaţi pe această dreaptă,
indicând indivizii ce vor fi selectaţi. Dacă N este numărul indivizilor
1
ce vor fi selectaţi, atunci distanţa dintre pointeri este iar poziţia
N
primului pointer este un număr generat aleator în intervalul [0 , 1 N ] .
De exemplu, pentru a selecta 6 indivizi, distanţa dintre pointeri este
1/6=0.167. Considerând că numărul generat aleator în intervalul
[0, 0.167] este 0.1 şi plasând pointerii pe exemplul de la metoda
ruletei se obţin următorii indivizi selectaţi: 1, 2, 3, 4, 6, 8 .

pointer 1 pointer 2 pointer 3 pointer 4 pointer 5 pointer 6


individ

număr aleator

3.6. Selecţia trunchiată

Este o metodă de selecţie artificială utilizată de crescătorii de


animale pentru a efectua selecţia la nivelul populaţiilor de dimensiuni
mari. Indivizii sunt ordonaţi după fitnessul lor şi sunt selectaţi ca
părinţi cei mai buni. Parametrul folosit pentru selecţie este pragul de
55
trunchiere Trunc. El indică proporţia populaţiei ce va fi selectată ca
părinţi şi ia valori în intervalul 50% - 10%. Indivizii aflaţi sub pragul
de trunchiere nu vor produce descendenţi. Intensitatea selecţiei este un
termen utilizat frecvent în selecţia trunchiată. Relaţia dintre pragul de
trunchiere şi intensitatea selecţiei rezultă din tabelul următor

Prag 1% 10% 20% 40% 50% 80%


Intensitate 2.66 1.76 1.2 0.97 0.8 0.34

3.7. Selecţia de tip turneu


În acest tip de selecţie, un număr de indivizi (Tur) este ales
aleator din populaţie şi, apoi, cel mai bun individ din acest grup este
selectat ca părinte. Acest procedeu este repetat ori de câte ori trebuie
ales un nou individ. Parametrul Tur al selecţiei dă dimensiunea
turneului şi ia valori din intervalul [2, Nind], unde Nind este numărul
de indivizi din populaţie.
Tabelul următor dă relaţia dintre dimeniunea turneului şi
intensitatea selecţiei.

dimensiunea 1 2 3 5 10 30
turneului
intensitatea 0 0.56 0.85 1.15 1.53 2.04
selecţiei
56

3.8. Selecţia locală


În selecţia locală fiecare individ acţionează în interiorul unui
mediu restrâns numit vecinătate locală. Indivizii interacţionează
numai în interiorul unei vecinătăţi. Vecinătatea este definită de
structura în care este distribuită populaţia şi poate fi văzută ca un grup
de potenţiali parteneri de încrucişare. Indivizii se selectează folosind
una din metodele discutate anterior, apoi se defineşte vecinătatea
locală pentru fiecare individ. În interiorul vecinătăţii se selectează un
singur individ: cel mai bun, aleator, etc.

Structura unei vecinătăţi poate fi

• liniară: grup complet sau grup incomplet

vecinătate liniară ( distanţa =2 )

grup complet

grup incomplet
57
• bidimensională : cruce completă sau cruce incompletă

Vecinătate bidimensională ( distanţa =1 )

cruce completă cruce incompletă

• tridimensională : stea completă sau stea incompletă

Vecinătate tridimensională ( distanţa =1 )

stea completă stea incompletă


58
Distanţa dintre vecini împreună cu structura aferentă determină
dimensiunea vecinătăţii. Tabelul următor dă exemplu de dimensiuni
ale vecinătăţii pentru o structură dată, în funcţie de valorile distanţei

distanţa
structura
grup complet
grup incomplet
cruce completă
cruce incompletă
stea completă
stea incompletă

Între indivizii unei populaţii există o izolare prin distanţă.


Totuşi, datorită suprapunerii vecinătăţilor au loc schimburi de
informaţii între toţi indivizii. Dimensiunea vecinătăţii determină viteza
de propagare a informaţiei între indivizii unei populaţii, trebuind ales
între propagarea rapidă şi menţinerea unei diversităţi crescute în
cadrul populaţiei. O diversitate mare este adesea dorită, prevenindu-se
astfel probleme cum ar fi convergenţa prematură spre un minim local.
Selecţia locală într-o vecinătate mică este mai performantă
decât cea într-o vecinătate mare. Vecinătatea bidimensională cu
structură stea incompletă şi distanţa 1 este recomandată în majoritatea
cazurilor. Dacă populaţia este mare (peste 100 indivizi) se recomandă
o distanţă mai mare şi o altă vecinătate bidimensională.
59

3.9. Compararea metodelor de selecţie


Numărul de generaţii necesar asigurării convergenţei unui
algoritm genetic este invers proporţional cu intensitatea selecţiei şi
direct proportional cu n , unde n este dimensiunea funcţiei obiectiv.
Această cerinţă sugerează o intensitate a selecţiei mare, pentru a avea
o schemă de selecţie bună. Totuşi, o intensitate mare duce la o
convergenţă prematură şi la o calitate slabă a soluţiei.

Numărul de generaţii necesar atingerii convergenţei, pentru


câteva scheme de selecţie, este:


• selecţia după rang: GenConv Rang =
2(PresSel Rang − 1)

π n
• selecţia trunchiată: GenConvTtrunc =
2 ∗ IntSelTrunc

• selecţia turneu:

π n
GenConvTur =
2 2 log(Tur ) − log 4.14 ∗ log(Tur )

unde am folosit notaţiile:

- GenConv = numărul de generaţii care asigură convergenţa

- PresSel = presiunea selecţiei

- IntSel = intensitatea selecţiei.


4
OPERATORI GENETICI

4.1. Încrucişarea

Încrucişarea permite combinarea informaţiilor provenite de la


doi sau mai mulţi părinţi pentru generarea unuia sau mai multor
urmaşi. Încrucişarea depinde de modul de codificare a datelor,
aplicându-se direct asupra cromozomilor.

4.1.1. Încrucişarea binară

Acest operator crează descendenţi prin combinarea unor părţi


alternative ale părinţilor.

4.1.1.1. Încrucişarea simplă

Dacă N este numărul poziţiilor binare ale unui individ, poziţia


de încrucişare k ∈ {1, 2 , L , N − 1} este selectată uniform şi aleator iar
valorile situate la dreapta acestui punct sunt schimbate între cei doi
indivizi, rezultând doi descendenţi.
62

părinţi descendenţi

Figura 4.1

Ca exemplu, considerăm următorii părinţi, având 11 biţi


fiecare, şi poziţia de încrucişare 5

p1: 01110011010
p2: 10101100101
Rezultă descendenţii :

d1: 0 1 1 1 0| 1 0 0 1 0 1
d2: 1 0 1 0 1| 0 1 1 0 1 0

4.1.1.2. Încrucişarea multiplă

În acest caz, se folosesc m > 1 puncte de încrucişare


k i ∈ {1, 2 , L , N − 1} alese aleator, diferite între ele şi sortate crescător.
Valorile aflate între puncte de încrucişare consecutive sunt schimbate
între cei doi părinţi pentru a obţine doi descendenţi.
63

părinţi descendenţi

Figura 4.2

De exemplu, indivizii
p1: 01110011010
p2: 10101100101
cu 3 puncte de încrucişare date de poziţiile : 2, 6, 10
generează descendenţii
d1: 0 1| 1 0 1 1| 0 1 1 1| 1
d2: 1 0| 1 1 0 0| 0 0 1 0| 0

Ideea încrucişării multiple este aceea că părţi ale cromozomilor


care contribuie la îmbunătăţirea performanţei unui individ nu este
necesar să fie conţinute în subşiruri adiacente. Mai mult, încrucişarea
multiplă pare să încurajeze explorarea în spaţiul de căutare mai
degrabă, decât să favorizeze convergenţa rapidă către indivizii de elită.

4.1.1.3. Încrucişarea uniformă

Încrucişarea simplă sau multiplă permite ca punctele de


încrucişare să fie plasate de la prima la penultima poziţie a
64

cromozomului. Încrucişarea uniformă generalizează această schemă


permiţând şi ultimei poziţii să fie punct de încrucişare.
O mască de încrucişare, de aceeaşi lungime cu a indivizilor
este creată aleator, iar paritatea biţilor din mască indică părintele care
va furniza descendentul corespunzător biţilor respectivi.
Considerăm părinţii
p1: 01110011010
p2: 10101100101

Descendentul 1 este obţinut luând bitul din părintele 1 dacă bitul


corespunzator din mască este 1 şi bitul din părintele 2 dacă bitul
corespunzător din mască este 0. Descendentul 2 este creat inversând
masca. Considerând măştile

masca 1: 0 1 1 0 0 0 1 1 0 1 0
masca 2: 1 0 0 1 1 1 0 0 1 0 1

indivizii anteriori dau următorii descendenţi:

d1: 11101111111
d2: 00110000000

Spears şi De Jong [87] au emis ipoteza că încrucişarea


uniformă poate fi parametrizată prin aplicarea unei probabilităţi
interschimbării biţilor.
65

4.1.1.4. Încrucişarea amestecată

Acest tip de încrucişare este similar celei simple: se selectează


o singură poziţie de încrucişare, dar înainte ca valorile să fie
schimbate între ele sunt amestecate aleator în ambii părinţi.

4.1.1.5. Algoritmul de încrucişare

Fie P (t ) populaţia curentă şi P s populaţia aleasă în urma


operaţiei de selecţie. Asupra indivizilor din P s se aplică operatorul de
încrucişare cu probabilitatea p c (indicele c provine de la termenul
crossover, folosit în limba engleză pentru încrucişare ).

Algoritmul
P1. Pentru fiecare individ din P s :
• se generează un număr aleator q ∈ 0, 1[ ]
• dacă q < p c atunci individul respectiv este reţinut pentru
încrucişare; în caz contrar nu participă la această operaţie.

P2. Fie m numărul indivizilor reţinuţi la pasul P1.


m
• dacă m este număr par, se formează aleator perechi.
2
• dacă m este impar atunci, în mod aleator, se şterge un individ

selectat sau se adaugă unul nou la P s , apoi se formează


66

perechile.

P3. Perechile formate anterior sunt supuse operaţiei de încrucişare.


• pentru fiecare pereche se stabilesc aleator punctele de
încrucişare k i , 1 ≤ k i < l , unde l este lungimea unui
cromozom.
• se execută încrucişarea pentru perechea curentă, descendenţii
devenind membri ai generaţiei urmatoare P (t + 1) , iar părinţii se
şterg din P(t )
• se adaugă la P (t + 1) indivizii rămaşi în P (t ) .

Observaţie

Probabilitatea de încrucişare are valori mici, de regulă în


intervalul [0.2, 0.95]; p c = 0.3 înseamnă că 30% din indivizi vor
suferi încrucişări.

4.1.2. Încrucişarea reală


4.1.2.1. Încrucişarea discretă

Acest operator efectuează un schimb de valori între variabilele


părinţilor şi poate fi folosit cu orice tip de variabile (binare, reale sau
simboluri).
Considerăm următorii părinţi

p1: 12 25 5
67

p2: 123 4 34
Pentru fiecare variabilă, părintele care contribuie cu variabilă la
generarea descendenţilor, este ales aleator cu probabilitate egală; de
exemplu
alegere pentru descendentul 1: 2 2 1
alegere pentru descendentul 2: 1 2 1

Noii indivizi creaţi după încrucişare sunt


d1: 123 4 5
d2: 12 4 5

În figura următoare sunt prezentate poziţiile posibile ale


descendenţilor după încrucişarea discretă :

descendent posibil
variabila 1
părinţi

variabila 2

Figura 4.3
68

4.1.2.2. Încrucişarea intermediară

Este o metodă aplicabilă numai variabilelor reale; în acest caz


valorile variabilelor descendenţilor sunt alese în jurul şi între valorile
corespunzătoare ale părinţilor.
Descendenţii sunt generaţi după regula:
descendent = părinte1 + α (părinte 2 - părinte1)
unde α este un factor de scalare ales uniform şi aleator în intervalul
[− d , 1 + d ] . În încrucişarea intermediară simplă d = 0 iar în
încrucişarea intermediară extinsă d > 0 ; o alegere bună este
d = 0.25
Fiecare variabilă din descendent este rezultatul combinării
variabilelor corespunzătoare ale părinţilor conform formulei
anterioare, cu o nouă valoare α pentru fiecare variabilă.
În figura următoare se prezintă zonele în care iau valori părinţii şi
descendenţii lor :

părinte 1 părinte 2

aria părinţilor
zona posibilă a descendeţilor

Figura 4.4
69

Considerăm următorii părinţi, cu trei variabile fiecare:

p1: 12 25 5
p2: 123 4 34
şi următoarele valori ale lui α corespunzătoare celor doi descendenţi:
exemplul 1: 0.5 1.1 - 0.1
exemplul 2: 0.1 0.8 0.5

Rezultă următorii descendenţi

d1: 67.5 1.9 2.1


d2: 23.1 8.2 19.5

Încrucişarea intermediară este capabilă să producă orice punct în


interiorul unui hipercub mai mare decât cel definit de părinţi, aşa cum
arată figura următoare

zona descendentilor

posibil descendent
variabila 2
părinte

variabila 1

Figura 4.5
70

4.1.2.3. Încrucişarea liniară

Încrucişarea liniară este similară celei intermediare, cu


deosebirea că o singură valoare a lui α este utilizată pentru toate
variabilele. Considerând părinţii

p1: 12 25 5
p2: 123 4 34
şi α corespunzător celor doi descendenţi dat de

exemplul 1: 0.5
exemplul 2: 0.1

rezultă următorii descendenţi

d1: 67.5 14.5 19.5


d2: 23.1 22.9 7.9

Încrucişarea liniară poate genera orice punct aflat pe linia


definită de părinţi:

posibil descendent
variabila 2 părinte

linia posibilului descendent


variabila 1

Figura 4.6
71

4.1.3. Încrucişarea adiacentă

Acest tip de încrucişare este specific reprezentării adiacente,


iar o problemă tipică pentru care se utilizează este cea a comis
voiajorului.

4.1.3.1. Încrucişarea prin muchii alternante

Acest tip de încrucişare construieşte un descendent prin


alegerea aleatoare a unui nod (oraş) din primul părinte apoi selectează
nodul corespunzător din al doilea părinte; adică, traseul se extinde prin
alegerea nodurilor în mod alternativ din cei doi părinţi. Dacă un nod
nou introduce un ciclu în traseul curent, operatorul de încrucişare va
selecta în locul lui – în mod aleator – un nod dintre cele rămase şi
care nu introduce cicluri. De exemplu, din părinţii

p1: 2 3 8 7 9 4 1 5 6
p2: 7 5 1 6 9 2 8 4 3

care reprezintă treseele

1− 2 − 3 − 8 − 5 − 9 − 6 − 4 − 7

şi respectiv

1− 7 − 8 − 4 − 6 − 2 − 5 − 9 − 3

se obţine descendentul
72

d1: 2 5 8 7 9 1 6 4 3

care reprezintă traseul

1− 2 − 5 − 9 − 3 − 8 − 4 − 7 − 6 .

Se procedează astfel: oraşul 2 aflat pe poziţia 1 în p1 se introduce în


d1 pe poziţia 1. Pe poziţia 2 în p2 se află oraşul 5, care va ocupa
poziţia 2 în d1. Pe poziţia 5 în p1 se află oraşul 9, care se introduce în
descendent pe poziţia 5, şi aşa mai departe; în final se introduce
aleator muchia (7, 6 ) în loc de (7, 8) care ar fi introdus un ciclu
prematur.

4.1.3.2. Încrucişarea prin subtrasee

Specificul acestei încrucişări constă în faptul că generează un


descendent alegând alternativ câte un subtraseu din fiecare părinte;
lungimea fiecărui subtraseu este aleatoare. Frecvent se lucrează cu
subtrasee de lungime 1, deci traseul se extinde prin alegerea
alternativă a muchiilor din cei doi părinţi. Dacă ultima muchie
selectată introduce un ciclu prematur, se selectează în locul ei una
nouă dintre cele rămase şi care nu introduce cicluri.

4.1.3.3. Încrucişarea euristică

Aceasta construieşte un descendent prin alegerea aleatoare a


unui oraş ca punct de start pentru traseul descendentului. Apoi
73

compară cele două muchii (din cei doi părinţi) care pleacă din acest
oraş şi selectează pe cea mai bună (scurtă). Oraşul de la celălalt capăt
al muchiei selectate va deveni punct de start pentru selectarea
următoarei muchii. Dacă la un anumit moment, o muchie nouă
introduce un ciclu în traseul parţial atunci aceasta se va înlocui cu alta
aleasă aleator din cele rămase şi care nu introduce cicluri.
În [49] se modifică încrucişarea euristică astfel: dacă cea mai
scurtă muchie a unui părinte introduce un ciclu în traseul
descendentului atunci se alege următoarea muchie mai scurtă dintre
cele rămase; dacă aceasta nu introduce cicluri se acceptă în vederea
extinderii traseului iar în caz contrar se selectează cea mai scurtă
muchie dintre q muchii selectate aleator, unde q este un parametru al
metodei. Efectul acestui operator constă în “alipirea” drumurilor
scurte din traseele părinţilor. Totuşi, această metodă poate duce la
încrucişări nedorite; de aceea, în [88] a fost introdus un operator
euristic suplimentar care acţionează astfel:
• selectează aleator două muchii (i, j ) şi (k, l )
• dacă
d (i, j ) + d (k , l ) > d (i, l ) + d (k , j )
atunci muchiile (i, j ) şi (k, l ) se înlocuiesc cu muchiile (i, l ) şi
(k, j ) .

Principalul dezavantaj al reprezentării adiacente constă în


74

faptul că rezultatele furnizate de operatori sunt relativ sărace.


Încrucişarea muchiilor alternante duce, adeseori, la distrugerea
traseelor bune. Încrucişarea prin subtrasee este mai bună decât cea a
muchiilor alternante deoarece rata distrugerii este mai mică dar
performanţele sunt încă slabe. Prin faptul că dintre două muchii se
alege cea mai scurtă, încrucişarea euristică este mai bună decât
celelalte două. Totuşi, performanţele sale nu sunt spectaculoase: în
trei experimente [41] cu 50, 100 şi 200 de oraşe au fost găsite trasee
aflate la o distanţă mai mică de 25%, 16% şi 27% de traseul optim,
după un număr de 15.000, 20.000 şi respectiv 25.000 generaţii.

4.1.4. Încrucişarea ordinală

Principalul avantaj al reprezentării ordinale constă în faptul că


permite încrucişarea clasică. Oricare doi părinţi pot fi încrucişaţi cu
orice punct de tăietură şi produc descendenţi care reprezintă trasee
legale.
De exemplu, părinţii
p1: 1 1 2 1|4 1 3 1 1
p2: 5 1 5 5|5 3 3 2 1

care corespund traseelor

1→ 2 → 4 → 3 → 8 → 5 → 9 → 6 → 7
5 → 1→ 7 → 8 → 9 → 4 → 6 → 3 → 2
75

dau descendenţii

d1: 1 1 2 1 5 3 3 2 1
d2: 5 1 5 5 4 1 3 1 1

care corespund traseelor

1→ 2 → 4 → 3 → 9 → 7 → 8 → 6 → 5
5 → 1→ 7 → 8 → 6 → 2 → 9 → 3 → 4

Se observă că traseele parţiale situate la stânga punctului de


încrucişare (reprezentat prin bara verticală) nu se schimbă în timp ce
traseele de la dreapta acestui punct sunt distruse într-un mod destul de
aleator. Unele rezultate experimentale ([41]) au arătat că
reprezentarea ordinală nu este prea indicată pentru problema comis
voiajorului. Rezultatele anterioare au fost obţinute considerăm lista
L = (1, 2, 3, 4, 5, 6, 7, 8, 9 ) .

4.1.5. Încrucişarea prin drumuri

Trei tipuri de încrucişare sunt utilizate în cazul reprezentării prin


drumuri: parţial aplicată (PMX), de ordine (OX) şi ciclică (CX).

4.1.5.1. Încrucişarea PMX

A fost propusă de Goldberg şi Lingle [37] şi construieşte un


descendent alegând un subtraseu din unul dintre părinţi şi păstrând
76

ordinea şi poziţia a cât mai multe oraşe din celălalt părinte. Subtraseul
este selectat prin alegerea a două puncte aleatoare de taietură care
definesc frontierele operaţiei de interschimbare. De exemplu, părinţii

p1: 1 2 3 | 4 5 6 7 | 8 9
şi
p2: 4 5 2 |1 8 7 6 | 9 3

vor produce descendenţi în felul următor. Mai întâi, porţiunea


cuprinsă între cele două puncte de tăietură este schimbată între cei doi
părinţi, obţinându-se descendenţii:

d1: ∗ ∗ ∗ |1 8 7 6 | ∗ ∗
şi
d2: ∗ ∗ ∗ | 4 5 6 7 | ∗ ∗

În acelaşi timp, se obţine aplicaţia

1 ↔ 4 , 8 ↔ 5 , 7 ↔ 6 şi 6 ↔ 7 .

Apoi, se copiază în locurile libere din cei doi descendenţi elementele


corespunzătoare din părinţi, dacă acestea nu generează conflicte;
rezultă
d1: ∗ 2 3 |1 8 7 6 | ∗ 9
şi
d2: ∗ ∗ 2 | 4 5 6 7 | 9 3

Primul ∗ din descendentul d1 (care ar trebui să fie 1, dar această


valoare este interzisă deoarece ea există deja în descendent) este
77

înlocuit cu 4, datorită aplicaţiei 1 ↔ 4 . În mod similar, al doilea ∗ din


descendentul d1 este înlocuit cu 5 iar caracterele ∗ din celălalt
descendent sunt înlocuite cu 1 şi 8. În final rezultă descendenţii

d1: 4 2 3 |1 8 7 6 | 5 9
şi
d2: 1 8 2 | 4 5 6 7 | 9 3

4.1.5.2. Încrucişarea OX

A fost propusă de Davis [12] şi construieşte un descendent


alegând un subtraseu în unul dintre părinţi şi păstrând ordinea relativă
a oraşelor din celălalt părinte. De exemplu, părinţii

p1: 1 2 3 | 4 5 6 7 | 8 9
şi
p2: 4 5 2 |1 8 7 6 | 9 3

vor produce descendenţi în felul următor. Mai întâi, porţiunile dintre


punctele de tăietură sunt copiate în cei doi descendenţi
d1: ∗ ∗ ∗ | 4 5 6 7 | ∗ ∗
d2: ∗ ∗ ∗ |1 8 7 6 | ∗ ∗

Apoi, pornind de la al doilea punct de tăietură al unuia dintre părinţi se


copiază oraşele din celălalt părinte, păstrând ordinea şi omiţând
oraşele care sunt deja prezente; când se ajunge la sfârşitul traseului se
78

continuă cu primul oraş. Şirul oraşelor din al doilea părinte, începând


cu al doilea punct de tăietură, este

9 − 3 − 4 − 5 − 2 − 1 − 8 − 7 − 6;

Eliminând oraşele 4, 5, 6 şi 7, care sunt deja prezente în primul


descendent, se obţine

9 − 3 − 2 − 1 − 8

Aseastă secvenţă este plasată în primul descendent, începând cu al


doilea punct de tăietură, şi rezultă

d1: 2 1 8 | 4 5 6 7 | 9 3.

Similar se obţine celălalt descendent:

d2: 3 4 5 | 1 8 7 6 | 9 2.

Pentru încrucişarea OX este importantă ordinea oraşelor şi nu poziţia


lor în reprezentare.

4.1.5.3. Variante ale încrucişării OX

Este posibil să se definească şi alţi operatori pentru


reprezentarea unui drum. Syswerda [89] a definit două variante ale
încrucişării de ordine. Prima modificare ( bazată pe ordine) selectează
aleator câteva poziţii iar ordinea oraşelor aflate în poziţiile selectate în
79

unul din părinţi este impusă oraşelor corespunzătoare din celălalt


părinte. Ca exemplu, considerăm părinţii

p1: 1 2 3 4 5 6 7 8 9
p2: 4 1 2 8 7 6 9 3 5.

Presupunem că au fost selectate poziţiile 3, 4, 6 şi 9; oraşele aflate pe


aceste poziţii în părintele p2 sunt 2, 8, 6 şi 5. Primul descendent se
obţine copiind elementele lui p1, cu excepţia poziţiilor 2, 5, 6 şi 8:

d1: 1 ∗ 3 4 ∗ ∗ 7 ∗ 9.

Elementele rămase libere se completează cu elementele din p2, în


ordinea stabilită anterior, adică 2, 8, 6, 5; în final rezultă

d1: 1 2 3 4 8 6 7 5 9.

În mod similar se obţine celălalt descendent:

d2: 3 1 2 8 7 4 6 9 5.

A doua modificare (încrucişarea bazată pe poziţie) seamănă şi


mai mult cu încrucişarea de ordine originală. Singura diferenţă constă
în faptul că în locul unui subtraseu ce trebuie copiat în descendent se
selectează în mod aleator câteva oraşe.
Este interesant de observat că aceşti doi operatori sunt, în
unele cazuri, echivalenţi. Astfel, dacă au ca puncte de încrucişare
mulţimi complementare, ei vor produce acelaşi rezultat. Înseamnă că
80

m
dacă numărul mediu al punctelor de încrucişare este (unde m este
2
numărul oraşelor), cei doi operatori vor avea aceleaşi performanţe.

4.1.5.4. Încrucişarea CX

A fost propusă de Oliver şi colaboratorii săi [67] şi


construieşte descendenţii astfel încât fiecare oraş (şi poziţia sa)
provine din unul din părinţi. Să considerăm părinţii

p1: 1 2 3 4 5 6 7 8 9
p2: 4 1 2 8 7 6 9 3 5

Pentru a obţine primul descendent se selectează primul oraş din primul


părinte:
d1: 1 ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗

Pe prima poziţie din p2 este 4, ceea ce spune că se introduce în


descendent elementul aflat pe poziţia 4 în primul părinte; rezultă

d1: 1 ∗ ∗ 4 ∗ ∗ ∗ ∗ ∗
În continuare, valoarea 8 aflată pe poziţia 4 în p2 determină
introducerea elementului aflat pe poziţia 8 în p1:

d1: 1 ∗ ∗ 4 ∗ ∗ ∗ 8 ∗
81

Urmând această regulă se introduc oraşele 3 şi 2; dar oraşul 2


determină selectarea lui 1 care este deja introdus în descendent. În
acest moment se încheie ciclul de introducere de oraşe din p1:

d1: 1 2 3 4 ∗ ∗ ∗ 8 ∗

Poziţiile rămase libere se completează cu oraşe din celălalt părinte,


obţinându-se
d1: 1 2 3 4 7 6 9 8 5.

În mod similar se construieşte celălalt descendent

d2: 4 1 2 8 5 6 7 3 9.

4.1.6. Încrucişarea prin muchii

Whitley, Starkweather şi Fuquay [95] au dezvoltat un nou


operator de încrucişare: încrucişarea prin muchii (edge recombination
= ER), care explorează informaţia despre muchiile unui traseu
transferând peste 95% din muchiile părinţilor într-un singur
descendent. Pentru traseul

3 − 1 − 2 − 8 − 7 − 4 − 6 − 9 − 5

definit de părintele

(3, 1, 2, 8, 7, 4, 6, 9, 5),

muchiile sunt
82

(3 1) , (1 2) , (2 8) , (8 7 ) , (7 4) , (4 6) , (6 9) , (9 5) şi (5 3) .
Direcţia dată de o muchie nu este importantă; de exemplu, muchiile
(3 1) şi (1 3) semnalează faptul că oraşele 1 şi 3 sunt conectate
direct.
Ideea metodei este de a utiliza pentru fiecare oraş o listă a
oraşelor conectate cu el, aflate în cel puţin unul din părinţi. Evident, o
listă conţine cel puţin două şi cel mult patru oraşe. De exemplu,
pentru părinţii
p1: 1 2 3 4 5 6 7 8 9
p2: 4 1 2 8 7 6 9 3 5

listele sunt următoarele


oraşul 1: 9, 2, 4
oraşul 2: 1, 3, 8
oraşul 3: 2, 4, 9, 5
oraşul 4: 3, 5, 1
oraşul 5: 4, 6, 3
oraşul 6: 5, 7, 9
oraşul 7: 6, 8
oraşul 8: 7, 9, 2
oraşul 9: 8, 1, 6, 3.

Construirea unui descendent începe prin selectarea unui oraş


iniţial al unuia dintre părinţi; în [95] autorii selectează unul din oraşele
aflate pe prima poziţie ( 1 sau 4 în exemplul nostru). Se introduce în
descendent oraşul care are mai puţine muchii în lista asociată lui; dacă
83

au acelaşi număr atunci se alege unul în mod aleator. Presupunem că


am selectat oraşul 1; el este conectat cu 9, 2 şi 4, aşa că următorul
oraş este selectat dintre acestea. Oraşele 4 şi 2 au trei muchii iar 9 are
4. Are loc o alegere aleatoare între 4 şi 2; presupunem ca a fost
selectat 4. Candidatul pentru noul oraş este ales dintre 3 şi 5; este
selectat oraşul 5 care are mai puţine muchii în lista sa. Continuând în
acest mod se obţine descendentul
1 4 5 6 7 8 2 3 9,
compus în întregime din muchii aflate în cei doi părinţi. O serie de
experimente [95] au scos în evidenţă faptul că o muchie ilegală apare
destul de rar (cu o rată de 1% până la 1.5%).

4.1.7. Încrucişarea matriceală

Acest tip de încrucişare (numit MX) a fost definit în [45],


foloseşte unu sau două puncte de încrucişare şi este folosit în cazul
reprezentării cu un singur 1 pe fiecare linie şi coloană. După operaţia
de încrucişare propriu zisă sunt necesari doi algoritmi de reparare:

• unul pentru a şterge duplicările astfel încât fiecare linie şi coloană


să conţină un singur 1

• iar celălalt pentru a lega între ele eventualele subtrasee şi a produce


un traseu legal.
84

Următorul exemplu ilustrează încrucişarea cu două puncte. Cei


doi părinţi sunt daţi de matricele

1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0
2 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 0 0 1 0
3 0 0 0 0 0 0 0 1 0 3 0 0 0 0 0 1 0 0 0
4 0 0 1 0 0 0 0 0 0 4 0 0 1 0 0 0 0 0 0
5 0 0 0 0 0 0 1 0 0 5 0 0 0 0 0 0 1 0 0
6 0 0 0 0 1 0 0 0 0 6 0 0 0 0 1 0 0 0 0
7 0 0 0 0 0 0 0 0 1 7 0 1 0 0 0 0 0 0 0
8 0 0 0 0 0 1 0 0 0 8 0 0 0 0 0 0 0 0 1
9 1 0 0 0 0 0 0 0 0 9 1 0 0 0 0 0 0 0 0

şi reprezintă traseele
(1 2 4 3 8 6 5 7 9)
şi
(1 4 3 6 5 7 2 8 9) .

Alegem punctele de încrucişare între coloanele 2 şi 3 şi respectiv între


6 şi 7. Părinţii vor schimba între ei porţiunile cuprinse între cele două
puncte şi rezultă următorii descendenţi intermediari:
85

1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 0 1 0
3 0 0 0 0 0 1 0 1 0 3 0 0 0 0 0 0 0 0 0
4 0 0 1 0 0 0 0 0 0 4 0 0 1 0 0 0 0 0 0
5 0 0 0 0 0 0 1 0 0 5 0 0 0 0 0 0 1 0 0
6 0 0 0 0 1 0 0 0 0 6 0 0 0 0 1 0 0 0 0
7 0 0 0 0 0 0 0 0 1 7 0 1 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 1 0 0 1
9 1 0 0 0 0 0 0 0 0 9 1 0 0 0 0 0 0 0 0

Ambii descendenţi sunt ilegali, deşi numărul total de 1-uri


din fiecare este corect. Primul pas al algoritmului de reparare mută
unele valori 1 astfel încât în fiecare linie şi fiecare coloană să fie un
singur 1. Astfel:

• pentru primul descendent: se mută 1 din poziţia m14 în poziţia


m84 iar 1 din m38 se mută în m28
• pentru al doilea descendent: se mută 1 din m24 în m34 iar 1 din
m86 se mută în m16 .

După acest pas al algoritmului de reparare, primul descendent


reprezintă traseul valid
(1 2 8 4 3 6 5 7 9)
iar al doilea descendent defineşte două subtrasee:
86

(1 6 5 7 2 8 9 ) şi (3 4 ) .

Al doilea pas al algoritmului de reparare se aplică numai celui


de-al doilea descendent. Pentru aceasta se selectează o muchie
existentă în unul dintre părinţi şi se utilizează pentru a face joncţiunea
între cele două subtrasee; fie aceasta (2 4 ) . Traseul legal pentru al
doilea descendent este:
(1 6 5 7 2 4 3 8 9) .

4.2. Mutaţia

Mutaţia este cel mai simplu operator genetic şi constă în


schimbarea aleatoare a unor valori ale cromozomului pentru a
introduce noi soluţii. Scopul său este de a împiedica pierderea
ireparabilă a diversităţii, evitând, astfel, convergenţa prematură.
Diversitatea permite explorarea unor zone largi din spaţiul de căutare.
Mutaţia foloseşte ca parametru probabilitatea de mutaţie p m , care ia
valori mici; de obicei în intervalul [0.001, 0.01] .

4.2.1. Mutaţia binară

Dacă n este dimensiunea populaţiei iar l este lungimea unui


cromozom atunci numărul mediu de biţi ce vor suferi mutaţie este
87

N = n ⋅ l ⋅ p m . Mutaţia binară poate fi implementată sub mai multe


forme.

4.2.1.1. Mutaţia tare

Pentru fiecare poziţie a fiecărui cromozom se execută paşii:


P1: se generează un număr aleator q ∈ [0, 1]
P2: dacă q < p m atunci se schimbă poziţia respectivă, în caz contrar
nu se efectuează nimic.

4.2.1.2. Mutaţia slabă

Pentru fiecare poziţie a fiecărui cromozom se execută paşii:


P1: se generează un număr aleator q ∈ [0, 1]
P2: dacă q < p m atunci se alege aleator una din valorile 0 sau 1 şi se
atribuie poziţiei curente, în caz contrar nu se efectuează nimic.

4.2.1.3. Mutaţia neuniformă

Probabilitatea de mutaţie depinde de generaţie, descrescând cu


indicele t al acesteia. Dacă p 0 este probabilitatea de mutaţie la prima
generaţie iar β ≥ 1 este un parametru real atunci probabilitatea de
mutaţie la generaţia t va fi

pm (t ) = p0 e − βt .
88

Bäck şi Schütz [10] au definit o nouă probabilitate de mutaţie:


1
pm (t ) =
l−2 ,
2+ t
T
unde l este lungimea unui cromozom iar T este numărul maxim de
generaţii.

4.2.1.4. Mutaţia auto-adaptivă

Bäck şi Schütz [10] au definit un mecanism de auto-adaptare


pentru probabilitatea de mutaţie pm . Ideea constă în încorporarea
parametrului de mutaţie în genotipul indivizilor. Un genotip g are

forma g = ( x, pm ) , unde x = {0, 1}l este vectorul de căutare iar


p m ∈ [0, 1] .
Prin mutaţie, genotipul ( x, p m ) se transformă în (x' , p ' m )
conform relaţiilor
1
p'm = ,
1 − p m −γ ⋅N (0, 1)
1+ e
pm

⎧ xi dacă q ≥ p 'm
x 'i = ⎨
⎩1 − xi dacă q < p 'm
unde
89

• N (0, 1) este o realizare a variabilei aleatoare de medie 0 şi


dispersie 1

• γ este rata de învăţare; o valoare recomandată este γ = 0.2

• xi este componenta vectorului x care este supusă mutaţiei

• q ∈ [0, 1] este un număr aleator.

Schema anterioară poate fi generalizată prin alocarea pentru


fiecare variabilă xi a unei probabilităţi de mutaţie proprie pi . În acest
caz genotipul este de forma g = ( x, p ) cu p = ( p1 , L, pl ) .
Probabilitatea de mutaţie se modifică după regula

1
p' i = , i ∈ {1, 2 , L , l}.
1 − pi −γ ⋅Ni (0 ,1)
1+ e
pi

4.2.1.5. Mutaţia cromozomială

În această variantă, mutaţia are loc la nivelul a una sau mai


multe gene dintr-un singur cromozom. Se poate utiliza oricare din
variantele de mutaţie prezentate anterior.
90

4.2.2. Mutaţia reală

Considerăm cromozomi cu n gene exprimate prin numere reale,


pentru fiecare genă cunoscându-se domeniul valorilor posibile.

4.2.2.1. Mutaţia uniformă

Acest tip de mutaţie înlocuieşte o singură genă a unui


cromozom selectat cu un număr real generat aleator în domeniul
parametrului reprezentat de acea genă. Se consideră că toate genele au
aceeaşi probabilitate de mutaţie. Dacă x = ( x1 , L , x n ) este un
cromozom părinte, se alege aleator gena i ce va fi supusă mutaţiei şi
se obţine descendentul x' = ( x1 , L, x'i , L, x n ) , unde valoarea x'i este
aleasă aleator din domeniul parametrului de pe poziţia i .
O variantă de mutaţie uniformă este cea care perturbă toate
genele cromozomului. Această operaţie se poate efectua în mai multe
moduri:

• mutaţia aditivă normală:


x'i = xi + α i ⋅ N (0,σ i ) , i ∈ {1, L , n}
unde α i este un parametru real iar N (0, σ i ) reprezintă un număr
aleator cu repartiţia normală de medie 0 şi dispersie σ i . De obicei se
lucrează cu σ i = σ şi α i = α , i ∈ {1, L , n} .

• mutaţia multiplicativă:
91

x'i = xi ⋅ N (0,σ i ) , i ∈ {1, L , n}

• mutaţia multiplicativă lognormală:


x' = x ⋅ e β ⋅N (0 ,σ i ) , i ∈ {1, L , n}
i i

cu β parametru real.

4.2.2.2. Mutaţia neuniformă

Prin această operaţie, genele suferă modificări importante în


primele generaţii şi descresc treptat, până la atenuare, în generaţiile
următoare. Astfel se permite o explorare uniformă a spaţiului de
căutare în primele generaţii şi o căutare locală, datorată variaţiilor
mici, în ultimele generaţii.
Creşterea sau descreşterea valorii unei gene este dată de un
parametru aleator p : p = 1 indică o creştere a valorii iar p = −1
indică o descreştere. Amplitudinea schimbării este dată de funcţia

h : {0, 1, L , T } → [0, 1)

cu proprietăţile
1) h este descrescătoare
2) h(T ) = 0
unde T este numărul maxim de iteraţii.
Un exemplu de astfel de funcţie este
92

b
⎛ t ⎞
⎜1− ⎟
h(t ) = 1− r⎝ T ⎠ ,
unde r este un parametru aleator din [0, 1] iar b ≥ 1 este un parametru
ce determină gradul de neuniformitate. În acest tip de mutaţie gena i
se transformă astfel:
x'i = xi + ( xmax − xi ) ⋅ h(t ) dacă p = 1
x'i = xi − ( xi − xmin ) ⋅ h(t ) dacă p = −1
unde x max şi xmin reprezintă cea mai mare şi respectiv cea mai mică
componentă a lui x .

4.2.2.3. Mutaţia auto-adaptivă

Acest tip de mutaţie este specific strategiilor evolutive şi


lucrează la nivelul unui genotip g = (x, σ ) , unde x este variabila
obiect (fenotipul) iar σ este vectorul parametrilor strategiei. Mutaţia
de acest tip se poate efectua în mai multe feluri:

• parametrii strategiei se modifică folosind metoda multiplicativă


lognormală

σ ' i = σ i e a⋅N (0 , 1) + b⋅Ni (0 , 1) ,

sau folosind metoda aditivă


σ 'i = σ i + α i N (0, σ i )
93

unde a , b şi α i sunt parametrii reali ai metodei


• variabilele obiect se modifică folosind metoda aditivă

x'i = xi + N (0, σ 'i ) .

4.2.3. Mutaţia întreagă

Este similară mutaţiei uniforme din cazul real şi se poate


aplica astfel:

• prin înlocuirea unei valori cu alta aflată în domeniul genei care


suferă mutaţia

• prin adăugarea sau scăderea la fiecare genă a unei valori mici,


fără a se depăşi domeniul de valori al genei respective.

4.2.4. Mutaţia specifică

În cazul reprezentării specifice mutaţia nu mai poate acţiona


independent asupra fiecărei gene. Cele mai cunoscute tipuri de
mutaţie folosite în acest caz sunt:

• mutaţia prin schimbare, prin care se selectează aleator două gene


ale cromozomului şi se schimbă între ele valorile; de exemplu,
plecând de la cromozomul

(1 2 3 4 5 6 7 8 9)
94

şi alegând genele (poziţiile) 3 şi 7 rezultă cromozomul

(1 2 7 4 5 6 3 8 9)

• mutaţia prin inserare: se aleg aleator două gene şi apoi una dintre
ele se inserează lângă cealaltă; de exemplu, din

(1 2 3 4 5 6 7 8 9)

şi poziţiile 3 şi 7 se obţine

(1 2 3 7 4 5 6 8 9) .

• mutaţia prin amestec: se alege în mod aleator o porţiune din


cromozom şi se amestecă valorile din această zona; de exemplu,
plecând de la cromozomul

(1 2 3 4 5 6 7 8 9)

se poate obţine

(1 2 5 3 6 4 7 8 9) .

• mutaţia prin inversiune: se aleg aleator două poziţii din cromozom


şi se inversează valorile situate în zona definită de acestea; de
exemplu, alegând cromozomul

(1 2 3 4 5 6 7 8 9)
şi poziţiile 3 şi 6 se obţine

(1 2 6 5 4 3 7 8 9) .
95

4.3. Reinserţia

Odată ce un nou descendent a fost obţinut prin operaţiile de


selectie, încrucişare şi/sau mutaţie trebuie decis dacă el va face parte
sau nu din noua generaţie; pentru aceasta se utilizează o schemă de
reinserţie. Metoda de selecţie utilizată determină schema de inserţie ce
va fi folosită: reinserţie locală pentru selecţia locală şi reinserţie
globală în cazul tuturor celorlalte metode de selecţie.

4.3.1. Reinserţia globală

Există diferite scheme de reinserţie globală:

• reinserţia pură: se produce un număr de descendenţi egal cu cel al


părinţilor, ceea ce determină înlocuirea tuturor părinţilor cu
descendenţii lor

• reinserţia uniformă: se produc mai puţini descendenţi decât părinţi


şi se înlocuiesc unii părinţi uniform şi aleator

• reiserţia elitistă: se produc mai puţini descendenţi decât părinţi, iar


părinţii mai puţin performanţi sunt înlocuiţi de descendenţi

• reinserţia bazată pe fitness: se produc mai mulţi descendenţi decât


sunt necesari şi se reinserează descendenţii cei mai buni.

Reinserţia pură este cea mai simplă metodă, fiecare individ


trăind o singură generaţie. Combinarea între reinserţia elitistă şi cea
96

bazată pe fitness previne pierderea de informaţie şi este metoda


recomandată. La fiecare generaţie, un număr dintre părinţii cei mai
neperformanţi sunt înlocuiţi cu descendenţii cei mai buni. Schema de
inserţie bazată pe fitness implementează selecţia trunchiată între
descendenţi, indivizii elitişti putând trăi mai multe generaţii. Totuşi, la
fiecare generaţie sunt inseraţi câţiva indivizi noi. Deoarece părinţii pot
fi înlocuiţi prin descendenţi cu fitness mic, fitnessul mediu al
populaţiei poate descreşte. Totuşi, dacă descendenţii inseraţi sunt
extrem de neperformanţi ei vor fi înlocuiţi în generaţiile următoare.

4.3.2. Reinserţia locală

În selecţia locală indivizii sunt căutaţi într-o vecinătate


mărginită. Reinserţia descendenţilor are loc exact în aceeaşi vecinătate
şi, astfel, caracterul local al informaţiei se păstrează. Structurile de
vecinătate sunt aceleaşi ca la selecţia locală. Pentru selectarea
părinţilor ce vor fi înlocuiţi şi a descendenţilor de inserat sunt posibile
următoarele scheme:

• se inserează orice descendent şi se înlocuiesc indivizii din


vecinătate în mod uniform şi aleator

• se inserează orice descendent şi se înlocuiesc indivizii cei mai


neperformanţi din vecinătate
• se inserează individul mai bun decât cel mai slab individ din
vecinătate şi se elimină individual cel mai slab
97

• se inserează descendentul mai bun decât individul cel mai


neperformant din vecinătate şi se înlocuiesc indivizii din vecinătate
uniform şi aleator

• se inserează indivizii mai buni decât părinţii şi se înlocuiesc


părinţii.
5
FUNCŢIONAREA ALGORITMILOR
GENETICI

Pentru a rezolva o problemă cu ajutorul algoritmilor genetici,


trebuie ţinut cont de următoarele observaţii.

• Problema trebuie transformată mai întâi într-una de optimizare,


adică să se minimizeze sau să se maximizeze o valoare.

• Algoritmii genetici sunt algoritmi euristici, adică soluţia găsită


de ei nu este întotdeauna cea mai bună, dar se află într-o
vecinătate a soluţiei optime. Deci, dacă avem de ales între un
algoritm polinomial care rezolvă sigur problema şi un algoritm
genetic, ar fi de preferat să folosim algoritmul polinomial.

• Algoritmii genetici, de obicei, au complexitate polinomială. De


aceea ei sunt foarte des utilizaţi pentru a rezolva problemele
dificile (NP-complete). Rezultatele obţinute sunt foarte apropiate de
cele furnizate de algoritmii siguri, dar care au rulat un timp foarte
mare.
100
• Dacă problema este complexă se recomandă un algoritm
genetic şi nu o strategie evolutivă. De obicei mutaţia este un
operator de căutare slab, deci, dacă se foloseşte doar acesta,
există şanse mari să se obţină soluţii locale şi nu globale.

5.1. Maximizarea unei funcţii

Explicăm funcţionarea algoritmilor genetici pentru o problemă


de maximizare deoarece minimizarea funcţiei f este echivalentă cu
maximizarea funcţiei g = − f . În plus, presupunem că funcţia obiectiv
f ia valori pozitive, în caz contrar putându-se aduna o constantă
pozitivă C şi maximizându-se f + C .
Presupunem că se doreşte maximizarea unei funcţii de k
variabile
f : Rk → R ;
fiecare variabilă xi ia valori într-un domeniu
Di = [ai , bi ] ⊂ R
şi
f ( x1 , L , x k ) > 0 pentru ∀xi ∈ Di .
Cerând o precizie de p zecimale pentru valorile variabilelor, fiecare
interval Di va trebui divizat în (bi − ai ) ⋅10 p subintervale egale. Fie li
cel mai mic întreg astfel încât
(bi − ai ) ⋅10 p ≤ 2l i
−1 .
101
Atunci, o reprezentare a variabilei xi ca un şir binar de
lungime li va satisface precizia dorită. În plus, are loc formula
bi − ai
xi = ai + zecimal (string 2 ) ⋅
2li − 1
unde zecimal (string 2 ) reprezintă valoarea zecimală a şirului binar
string .

Acum fiecare cromozom este reprezentat printr-un şir binar de


k
lungime l = ∑ li ; primii l1 biţi reprezintă o valoare din [a1 , b1 ] ,
i =1

următorii l 2 biţi reprezintă o valoare din [a 2 , b2 ] şi aşa mai departe.


Populaţia iniţială constă din n cromozomi aleşi aleator. Totuşi dacă
avem informaţii despre optimul potenţial, ele pot fi utilizate pentru a
genera populaţia iniţială. În continuare algoritmul funcţionează astfel:

• se evaluează fiecare cromozom al fiecărei generaţii, utilizând


funcţia f

• se selectează noua populaţie conform distribuţiei de probabilitate


bazată pe fitness

• se modifică cromozomii din noua populaţie prin operatori de


mutaţie şi încrucişare

• după un număr de generaţii, când nu mai sunt observate


îmbunătăţiri substanţiale, cel mai bun cromozom este selectat ca
102
soluţie optimă; deseori algoritmul se opreşte după un număr finit de
iteraţii.

Pentru procesul de selecţie vom utiliza tehnica ruletei:

• se calculează fitnessul eval (vi ) pentru fiecare cromozom


vi , i = 1, 2, L , n

• se găseşte fitnessul total


n
F = ∑ eval (vi )
i =1

• se calculează probabilitatea de selecţie pi pentru fiecare


cromozom vi , i = 1, 2, L , n :
eval (vi )
pi =
F

• se calculează probabilitatea cumulată qi pentru fiecare cromozom


vi , i = 1, 2, L , n :
i
qi = ∑ pj
j =1

Procesul de selecţie constă în folosirea ruletei de n ori; de


fiecare dată se selectează un singur cromozom astfel:

• se generează un număr aleator a ∈ [0, 1]


103
• dacă a < q1 , se selectează primul cromozom; altfel se selectează
cromozomul vi , 2 ≤ i ≤ n , astfel încât qi −1 < a ≤ qi .

Este evident că unii cromozomi vor fi selectaţi de mai multe


ori, cromozomii cei mai buni generând mai multe copii.
După selecţie se aplică operatorul de încrucişare. Folosind
probabilitatea de încrucişare pc se determină numărul pc ⋅ n de
cromozomi supuşi încrucişării. Se procedează astfel, pentru fiecare
cromozom din noua populaţie:

• se generează un număr aleator a ∈ [0, 1]

• dacă a < pc , cromozomul curent se selectează pentru


încrucişare.

În continuare se împerechează aleator cromozomii şi pentru


fiecare pereche se generează un numar aleator întreg pos ∈ [1, l − 1] , l
fiind lungimea unui cromozom iar pos este poziţia de încrucişare.
Doi cromozomi
b1b2 Lb pos b pos +1 L bl
şi
c1c 2 L c pos c pos +1 L cl

sunt înlocuiţi prin descendenţii

b1b2 Lb pos c pos +1 L cl


104
şi
c1c 2 L c pos b pos +1 Lbl .
Se aplică, apoi, operatorul de mutaţie. Probabilitatea de mutaţie p m dă
numărul p m ⋅ l ⋅ n al biţilor ce vor suferi mutaţie. Pentru fiecare bit al
fiecărui cromozom au loc operaţiile:

• se generează un număr aleator a ∈ [0, 1]

• dacă a < p m , bitul va suferi mutaţie.

În urma operaţiilor de selecţie, încrucişare şi mutaţie, noua


populaţie este gata pentru următoarea evaluare.

Următorul exemplu [59] ne arată modul de funcţionare.


Presupunem că vrem sa maximizăm funcţia

f ( x1 , x 2 ) = 21.5 + x1 ⋅ sin (4πx1 ) + x 2 ⋅ sin (20πx 2 )


unde
− 3.0 ≤ x1 ≤ 12.1 şi 4.1 ≤ x 2 ≤ 5.8 .

Vom lucra cu o populaţie de dimensiune n = 20 , cu probabilitatea de


încrucişare pc = 0.25 şi probabilitatea de mutaţie p m = 0.01 .
Cerem ca precizia să fie de patru zecimale pentru fiecare variabilă.
Deoarece domeniul lui x1 are lungimea 15.1 , precizia cerută implică

divizarea intervalului [− 3.0, 12.1] în cel puţin 15.1 ∗ 10 4 subintervale


egale. Înseamnă că sunt necesari 18 biţi pentru a reprezenta prima
105
parte a cromozomului: 217 < 151000 ≤ 218 . Domeniul lui x 2 are
lungimea 1.7 iar precizia impusă determină împărţirea intervalului
[4.1, 5.8] în cel puţin 1.7 ∗ 10 4 subintervale egale. Înseamnă că pentru
partea a doua a cromozomului vor fi utilizaţi 15 biţi:
214 < 17000 ≤ 215 . Lungimea totală a unui cromozom este
l = 18 + 15 = 33 biţi; Primii 18 biţi codifică pe x1 iar ultimii 15 pe
x2 .
Fie, de exemplu, cromozomul

010001001011010000111110010100010 .

Primii 18 biţi
010001001011010000

reprezintă pe
12.1 − (− 3.0)
x1 = −3.0 + zecimal (010001001011010000 2 ) ⋅ =
218 − 1
15.1
= −3.0 + 70352 ⋅ = −3.0 + 4.052426 = 1.052426 .
262143

Următorii 15 biţi
111110010100010

reprezintă pe
5.8-4.1
x2 = 4.1 + zecimal (111110010100010 2 ) =
215 -1
1.7
= 4.1 + 31906 = 4.1 + 1.655330 = 5.75533.
32767
106
Astfel cromozomul

010001001011010000111110010100010

corespunde valorilor
( x1 , x 2 ) = (1.052426 , 5.755330) .

Valoarea fitnessului pentru acest cromozom este

f (1.052426, 5.755330) = 20.25264 .

Iniţializăm o populaţie cu 20 de cromozomi şi 33 de biţi fiecare, aleşi


aleator, şi obţinem

v1 = (100110100000001111111010011011111)
v 2 = (111000100100110111001010100011010)
v3 = (000010000011001000001010111011101)
v 4 = (100011000101101001111000001110010)
v5 = (000111011001010011010111111000101)
v6 = (000101000010010101001010111111011)
v7 = (001000100000110101111011011111011)
v8 = (100001100001110100010110101100111)
v9 = (010000000101100010110000001111100)
v10 = (000001111000110000011010000111011)
v11 = (011001111110110101100001101111000)
v12 = (110100010111101101000101010000000)
107
v13 = (111011111010001000110000001000110)
v14 = (010010011000001010100111100101001)
v15 = (111011101101110000100011111011110)
v16 = (110011110000011111100001101001011)
v17 = (011010111111001111010001101111101)
v18 = (011101000000001110100111110101101)
v19 = (000101010011111111110000110001100)
v20 = (101110010110011110011000101111110)

Decodificând fiecare cromozom şi evaluând fitnessul obţinem:

eval (v1 ) = f (6.084492 , 5.652242) = 26.019600


eval (v 2 ) = f (10.348434 , 4.380264) = 7.580015
eval (v3 ) = f (-2.516603, 4.390381) = 19.526329
eval (v 4 ) = f (5.278638, 5.593460) = 17.406725
eval (v5 ) = f (-1.255173, 4.734458) = 25.341160
eval (v6 ) = f (-1.811725, 4.391937) = 18.100417
eval (v7 ) = f (-0.991471, 5.680258) = 16.020812
eval (v8 ) = f (4.910618, 4.703018) = 17.959701
eval (v9 ) = f (0.795406, 5.381472) = 16.127799
eval (v10 ) = f (-2.554851, 4.793707) = 21.278435
108
eval (v11 ) = f (3.130078, 4.996097) = 23.410669
eval (v12 ) = f (9.356179, 4.239457) = 15.011619
eval (v13 ) = f (11.134646, 5.378671) = 27.316702
eval (v14 ) = f (1.335944, 5.151378) = 19.876294
eval (v15 ) = f (11.089025, 5.054515) = 30.060205
eval (v16 ) = f (9.211598, 4.993762) = 23.867227
eval (v17 ) = f (3.367514, 4.571343) = 13.696165
eval (v18 ) = f (3.843020, 5.158226) = 15.414128
eval (v19 ) = f (-1.746635, 5.395584) = 20.095903
eval (v 20 ) = f (7.935998, 4.757338) = 13.666916

Se observă că cromozomul v15 este cel mai bun iar v 2 este cel
mai neperformant. Utilizăm metoda ruletei pentru selecţie. Fitnessul
total al populaţiei este
20
F = ∑ eval (vi ) = 387.776822
i =1

Probabilitatea de selecţie pi pentru fiecare cromozom


vi , i ∈ {1, 2, ..., 20} este:

eval (v1 ) eval (v 2 )


p1 = = 0.067099 p2 = = 0.019547
F F

eval (v3 ) eval (v 4 )


p3 = = 0.050355 p4 = = 0.044889
F F
109
eval (v5 ) eval (v 6 )
p5 = = 0.065350 p6 = = 0.046677
F F

eval (v7 ) eval (v8 )


p7 = = 0.041315 p8 = = 0.046315
F F

eval (v9 ) eval (v10 )


p9 = = 0.041590 p10 = = 0.054873
F F

eval (v11 ) eval (v12 )


p11 = = 0.060372 p12 = = 0.038712
F F

eval (v13 ) eval (v14 )


p13 = = 0.070444 p14 = = 0.051257
F F

eval (v15 ) eval (v16 )


p15 = = 0.077519 p16 = = 0.061549
F F

eval (v17 ) eval (v18 )


p17 = = 0.035320 p18 = = 0.039750
F F

eval (v19 ) eval (v 20 )


p19 = = 0.051823 p 20 = = 0.035244
F F

Probabilităţile cumulate qi pentru fiecare cromozom sunt

q1 = 0.067090 , q 2 = 0.086647 , q3 = 0.137001 ,


q 4 = 0.181890 , q5 = 0.247240 , q 6 = 0.293917 ,
q 7 = 0.335232 , q8 = 0.381546 , q9 = 0.423137 ,
q10 = 0.478009 , q11 = 0.538381 , q12 = 0.577093 ,
110
q13 = 0.647537 , q14 = 0.698794 , q15 = 0.776314 ,
q16 = 0.837863 , q17 = 0.873182 , q18 = 0.912932 ,
q19 = 0.964756 , q 20 = 1.000000

Acum se poate aplica tehnica ruletei de 20 de ori, selectând de


fiecare dată câte un cromozom. Presupunem că au fost generate
următoarele numere aleatoare din [0, 1] :

0.513870 , 0.175741 , 0.308652 , 0.534534 , 0.947628 ,


0.171736 , 0.702231 , 0.226431 , 0.494773 , 0.424720 ,
0.703899 , 0.389647 , 0.277226 , 0.368071 , 0.983437 ,
0.005398 , 0.765682 , 0.646473 , 0.767139 , 0.780237 .

Primul număr a = 0.513870 satisface relaţia q10 < a < q11 , deci
cromozomul v11 este selectat pentru noua populaţie. Pentru al doilea
număr a = 0.175741 avem q3 < a < q 4 , deci se selectează
cromozomul v 4 , etc.
În final, noua populaţie va conţine indivizii

v'1 = v11 , v' 2 = v 4 , v'3 = v7 , v' 4 = v11 , v'5 = v19 , v' 6 = v 4 , v' 7 = v15 ,
v'8 = v5 , v'9 = v11 , v'10 = v3 , v'11 = v15 , v'12 = v9 , v'13 = v6 , v'14 = v8 ,
v'15 = v 20 , v'16 = v1 , v'17 = v10 , v'18 = v13 , v'19 = v15 , v' 20 = v16 .
111
Acum putem aplica operatorul de încrucişare indivizilor din
noua populaţie. Luăm probabilitatea de încrucişare pc = 0.25 .
Procedăm astfel:

• pentru fiecare cromozom din noua populaţie, se generează un


număr aleator a ∈ [0, 1]

• dacă a < 0.25 , individul respectiv va fi selectat.

Presupunem ca au fost selectate următoarele secvenţe de


numere:

0.822951 , 0.151932 , 0.625477 , 0.314685 , 0.346901 ,


0.917204 , 0.519760 , 0.401154 , 0.606758 , 0.785402 ,
0.031523 , 0.869921 , 0.166525 , 0.674520 , 0.758400 ,
0.581893 , 0.389248 , 0.200232 , 0.355635 , 0.826927 .

Înseamnă că, pentru încrucişare, se selectează indivizii


v' 2 , v'11 , v'13 , v'18 . Indivizii selectaţi se împerechează aleator; de
exemplu (v' 2 , v'11 ) şi (v'13 , v'18 ) . Pentru fiecare pereche se generează
numărul pos ∈ [1, 32], care indică poziţia punctului de încrucişare.
Pentru prima pereche

v' 2 = (100011000 | 101101001111000001110010 )


v'11 = (111011101 | 101110000100011111011110 )

şi pos = 9 rezultă descendenţii


112
v"2 = (100011000 | 101110000100011111011110 )
v"11 = (111011101 | 101101001111000001110010 )
A doua pereche de indivizi este

v'13 = (00010100001001010100 | 1010111111011)


v'18 = (11101111101000100011 | 0000001000110)

şi pos = 20 . Ei vor fi înlocuiţi prin descendenţii

v"13 = (00010100001001010100 | 0000001000110)


v"18 = (11101111101000100011 | 1010111111011)

Acum, populaţia curentă este:

v'1 , v"2 , v'3 , v' 4 , v'5 , v' 6 , v' 7 , v'8 , v'9 , v'10 , v"11 , v'12 ,
v"13 , v'14 , v'15 , v'16 , v'17 , v"18 , v'19 , v' 20 .

În continuare se aplică operatorul de mutaţie cu probabilitatea


p m = 0.01 . Pentru fiecare bit se generează un număr aleator a ∈ [0, 1]
şi dacă a < 0.01 atunci el va suferi operaţia de mutaţie.

Generăm l ⋅ n = 33 ⋅ 20 = 660 numere aleatoare; dintre ele 5 sunt mai


mari decât 0.01 : aceste valori sunt prezentate în tabelul care urmreză.
Tabelul al doilea arată numărul individului şi poziţia bitului ce va
suferi operaţia de mutaţie.
113
Poziţia bitului numărul aleator
112 0.000213
349 0.009945
418 0.008809
429 0.005425
602 0.002836

poziţie bit nr. individ Nr. bit în individ


112 4 13
349 11 19
418 13 22
429 13 33
602 19 8

Deci, patru cromozomi sunt afectaţi de operatorul de mutaţie, unul


dintre ei având doi biţi schimbaţi.

În final rezultă următoarea populaţie:

v1 = (011001111110110101100001101111000 )
v 2 = (100011000101110000100011111011110 )
v3 = (001000100000110101111011011111011)
v4 = (011001111110 | 0 | 10101100001101111000 )
114
v5 = (000101010011111111110000110001100)
v6 = (100011000101101001111000001110010)
v7 = (111011101101110000100011111011110)
v8 = (000111011001010011010111111000101)
v9 = 011001111110110101100001101111000
v10 = (000010000011001000001010111011101)
v11 = (111011101101101001 | 0 | 11000001110010 )
v12 = (010000000101100010110000001111100 )
v13 = (000101000010010101000 | 1 | 0000100011 | 1 |)
v14 = (100001100001110100010110101100111)
v15 = (101110010110011110011000101111110)
v16 = (100110100000001111111010011011111)
v17 = (000001111000110000011010000111011)
v18 = (111011111010001000111010111111011)
v19 = (11101110 | 0 | 101110000100011111011110)
v 20 = (110011110000011111100001101001011)
unde biţii cuprinşi între linii verticale sunt cei care au rezultat în urma
mutaţiei. S-a încheiat o iteraţie a algoritmului, putându-se trece la
următoarea.
115

5.2. Problema comis voiajorului

Prezentăm o nouă aplicaţie a algoritmilor genetici:


“Fiind dată o colecţie de oraşe şi costul trecerii între fiecare
pereche de oraşe, atunci, problema comis voiajorului este de a găsi
cel mai ieftin mod de a vizita toate oraşele şi de întoarcere în oraşul
de start”.
Aceasta este o binecunoscută problemă NP-completă, echivalentă cu
găsirea, într-un graf, a unui circuit hamiltonian de cost minim.
O problemă NP-completă nu poate fi rezolvată într-un timp rezonabil
decât prin folosirea unor algoritmi nedeterminişti. Există, însă, riscul
de a găsi un minim local, apropiat mai mult sau mai puţin ca valoare
de minimul global.

Specificul problemei comis voiajorului a dus la crearea unor


noi modalităţi de reprezentare a cromozomilor şi noi tipuri de
operatori genetici, aşa cum s-a precizat anterior.

Reprezentarea problemei:

Funcţia de evaluare:
Vom lua ca funcţie de evaluare suma distanţelor euclidiene dintre
două oraşe consecutive:
N
Fitness = ∑ ( xi − xi −1 )2 + ( y i − y i −1 )2
i =1

Reprezentarea datelor:
116
O reprezentare a traseului este cea în care oraşele sunt listate în
ordinea în care ele sunt vizitate; de exemplu

3, 0, 1, 4, 2, 5 sau 0, 5, 1, 4, 2, 3 .

Operatori genetici:

Încrucişarea

Încrucişarea tradiţională nu este potrivită pentru problema


comis voiajorului deoarece descendenţii pot să nu respecte restricţia
de a se trece o singură dată prin fiecare oraş. De exemplu, din părinţii

1 2 3 4 5 0 şi 2 0 5 3 1 4

luând poziţia de încrucişare pos = 3 , rezultă descendenţii

1 2 3 3 1 4 şi 2 0 5 4 5 0.
Vom folosi o încrucişare de tip euristic, inventată de Grefenstette în
1985 [38].
Fie doi părinţi
123450 şi 413205
• pentru a genera un descendent utilizând al doilea părinte ca şablon
selectăm primul oraş din şablon ca prim oraş al descendentului şi
obţinem 4 x x x x x

• apoi găsim muchiile care au ca primă extremitate oraşul 4 în ambii


părinţi, comparăm lungimile lor şi reţinem pe cea mai scurtă: dintre
117
(4, 5) şi (4, 1), presupunând că oraşul 4 este mai apropiat de 1, alegem
muchia (4, 1) şi selectăm oraşul 1 ca fiind următorul oraş al
descendentului 1: 4 1 x x x x

• găsim apoi muchiile ce pleacă din oraşul 1: acestea sunt (1, 2) şi


(1, 3). Dacă oraşul 1 este mai apropiat de oraşul 2 , selectăm oraşul 2
ca următorul oraş al traseului: 4 1 2 x x x

• din oraşul 2 pleacă muchiile (2, 3) şi (2, 0). Dacă distanţa dintre
oraşul 2 şi oraşul 0 este mai scurtă, selectăm oraşul 0: 4 1 2 0 x x

• muchiile ce au ca primă extremitate oraşul 0 sunt (0, 1) şi (0, 5).


Deoarece oraşul 1 apare deja în descendent, selectăm oraşul 5 ca oraş
următor: 4 1 2 0 5 x

• muchiile ce au ca primă extremitate oraşul 5 sunt (5, 0) şi (5, 4),


dar oraşele 4 şi 0 apar ambele în descendent. Selectăm un oraş
neselectat, care este oraşul 3 şi astfel producem un descendent legal: 4
12053

Utilizând aceeaşi metodă, generăm celălalt descendent: 1 2 0 5 4 3

Mutaţia

Din acelaşi motiv ca la încrucişare, nu putem utiliza mutaţia


tradiţională. De aceea vom folosi mutaţia prin interschimbare:
selectăm aleator doi biţi dintr-un cromozom şi le interschimbăm
valorile. De exemplu, din 1 2 3 4 5 0 obţinem 1 5 3 4 2 0.
118
Selecţia

Când folosim metoda tradiţională de selecţie bazată pe


principiul ruletei, cel mai bun individ are cea mai mare probabilitate
de supravieţuire, dar nu supravieţuieşte neapărat. De aceea, vom
utiliza selecţia CHC [17] care ne asigură că cel mai bun individ va
supravieţui întotdeauna în noua generaţie.

.
lungimea

modelul ruletei

generaţii

Figura 5.1. Comparaţie între selecţia pe modelul ruletei şi


selecţia CHC
119

Procedeul este următorul:

• dacă dimensiunea populaţiei este N, se generează N descendenţi


folosind metoda ruletei

• se sortează după fitness mulţimea formată din părinţi şi


descendenţi
• se aleg cei mai buni N indivizi, care vor forma generaţia
următoare.

Selecţia CHC asigură o convergenţă mai rapidă în comparaţie


cu metoda ruletei. Pentru a preveni convergenţa la un optim local,
metoda se va modifica astfel: după ce s-a ajuns la convergenţă, se
salvează cei mai buni indivizi iniţializând aleator restul populaţiei şi
reluând procesul.

5.3. Aplicaţii în probleme de algebră

Ne vom ocupa de rezolvarea unei ecuaţii diofantice. O ecuaţie


diofantică este o ecuaţie cu mai multe necunoscute, coeficienţi întregi
şi soluţie întreagă. Să luăm ca exemplu ecuaţia x + 2 y + 3 z + 4t = 30 .
Se poate obţine soluţia prin încercarea tuturor valorilor x, y, z , t ce
satisfac restricţia 1 ≤ x , y , z , t ≤ 30 . Algoritmii genetici permit ca
soluţia să fie obţinută mai rapid, deoarece soluţiile „mai bune” au
120
şanse mai mari de supravieţuire şi reproducere, în opoziţie cu
parcurgerea tuturor soluţiilor posibile şi testarea validităţii fiecăreia.
Vom lucra cu o populaţie de 5 indivizi ce satisfac restricţia
precizată anterior:

individul1: v1 = (1, 28, 15, 3)


individul2: v 2 = (14, 9, 2, 4 )
individul3: v3 = (13, 5, 3, 3)
individul4: v 4 = (23, 8, 16, 19 )
individul5: v5 = (9, 13, 5, 2)

Fiind dat cromozomul v = (a, b, c, d ) definim fitnessul său ca


fiind
1
eval (v ) =
a + 2b + 3c + 4d − 30

şi obţinem

1 1
eval (v1 ) = = = 0.011904
114 − 30 84

1 1
eval (v 2 ) = = = 0.041666
54 − 30 24
1 1
eval (v3 ) = = = 0.038461
56 − 30 26
121
1 1
eval (v 4 ) = = = 0.007518
163 − 30 133
1 1
eval (v5 ) = = = 0.035714 .
58 − 30 28

Fitnessul total al populaţiei este


5
F = ∑ eval (vi ) = 0.135266
i =1

iar probabilităţile de selecţie asociate fiecărui individ sunt:

eval (v1 ) eval (v 2 )


p1 = = 0.088 , p2 = = 0.308 ,
F F

eval (v3 ) eval (v 4 )


p3 = = 0.284 , p4 = = 0.056 ,
F F

eval (v5 )
p5 = = 0.264 .
F

Folosind metoda ruletei selectăm următoarele cinci perechi de


indivizi:
(3, 1) , (5, 2) , (3, 5) , (2, 5) , (5, 3) .
Încrucişăm cei doi părinţi ai fiecărei perechi şi, pentru a
menţine dimensiunea populaţiei, reţinem doar unul din cei doi
descendenţi. De exemplu, plecând de la părinţii

(a1 | b1, c1, d1) şi (a2 | b2, c2, d2)


122
şi luând punctul de încrucişare în poziţia precizată de bara verticală,
reţinem descendentul

(a1 | b2, c2, d2) .


Astfel obţinem:

• părinţii (13 | 5, 7, 3) şi (1 | 28, 15, 3) dau descendentul


(13, 28, 15, 3)
• părinţii (9, 13| 5, 2 ) şi (14, 9 | 2, 4 ) dau descendentul (9, 13, 2, 4 )

• părinţii (13, 5, 7 | 3) şi (9, 13, 5 | 2 ) dau descendentul (13, 5, 7, 2 )

• părinţii (14 | 9, 2, 4 ) şi (9 | 13, 5, 2 ) dau descendentul (14, 13, 5, 2 )

• părinţii (13, 5 | 7, 3) şi (9, 13 | 5, 2 ) dau descendentul (13, 5, 5, 2 )

Nu mai folosim mutaţia, aşa că descendenţii obţinuţi formează


noua populaţie; aceasta va fi supusă în continuare aceloraşi prelucrări.
Algoritmul se termină la găsirea unei soluţii, ecuaţia având mai multe.
De exemplu, (7, 4, 1, 3) şi (2, 6, 0, 4 ) sunt soluţii ale ecuaţiei din
exemplul nostru.

5.4. Orarul unei şcoli


Problema orarului este una dintre cele mai cunoscute probleme
de algoritmică, până în prezent necunoscându-se nici un algoritm
eficient pentru rezolvarea ei. Formularea ei este următoarea:
123
Se dă matricea încadrărilor, precizând pentru fiecare profesor
numărul de ore la fiecare clasă. Cerinţa principală este aceea de a se
obţine un orar, adică o repartizare a profesorilor la clase, pentru
fiecare dintre zilele săptămânii şi, în cadrul fiecărei zile, pentru
fiecare oră, astfel încât într-o aceeaşi oră (dintr-o anumită zi a
săptămânii) fiecare profesor să intre la cel mult una din clasele
asociate lui prin matricea de încadrare şi la fiecare clasă să intre cel
mult câte unul din profesorii asociaţi clasei.

Vom considera următoarele date de intrare:


• NrC : numărul de clase din şcoală;
• NrO : numărul maxim de ore pe zi ale unui elev;
• NrZ : numărul de zile în care sunt ore;
• NrP : numărul de profesori;
• matricea încadrărilor: încadrarea profesorilor este dată printr-o
matrice A cu NrP linii şi NrC coloane. Profesorii vor fi codificaţi cu
numere i ∈ {1, 2, L , NrP}, iar clasele cu numere j ∈ {1, 2 ,L , NrC} ;
• elevii din clasele 9-10 învaţă după-amiaza, iar cei din clasele 11-
12 dimineaţa.

Exemplu
• NrC = 40 ; 40 de clase - acestea ar putea fi clasele 9A, ..., 9J, 10A,
..., 10J, 11A, ..., 11J, 12A, ..., 12J;
• NrO = 6 (şase ore pe zi);
• NrZ = 5 (cinci zile pe săptămână);
124
• NrP = 80 (80 de profesori - se păstrează şi o listă cu numele lor:
Aldea, Andrei, ..., Voicu);
Un exemplu de informaţie conţinută de o linie a matricei
încadrărilor este: profesorul Aldea are: 5 ore la 10B, 4 ore la 11A, 3
ore la 12 C, 3 ore la 12D, 3 ore la 12E.
Orarul de funcţionare se poate modela printr-o matrice cu NrP
linii şi 2 ∗ NrO ∗ NrZ coloane. Indicele liniei reprezintă codul
profesorului, iar indicele coloanei reprezintă un anumit moment de
timp (zi şi oră). Un element al acestei matrice va fi codul unei clase. O
linie a matricei va indica programul pe zile al unui profesor, iar o
coloană va indica profesorii ce au ore la momentul respectiv.
Condiţiile pe care trebuie să la îndeplinească un orar sunt
următoarele:
• trebuie să fie conform cu încadrarea (linia de orar trebuie să
exprime exact încadrarea profesorului);
• la un anumit moment de timp (zi şi oră), la o anumită clasă trebuie
să predea cel mult un profesor;
• un profesor nu poate preda simultan la mai multe clase;
• elevii nu vor avea ferestre (ore libere între două ore la care li se
predă).
Vom numi un astfel de orar ca fiind un orar valid. Pe lângă
cele patru condiţii absolut necesare ar fi de dorit ca profesorii să aibă
un număr cât mai mic de ferestre, iar elevii să aibă cel mult două ore
la aceeaşi disciplină în aceeaşi zi. Un orar valid cu număr mic de
125
ferestre pentru profesori va fi numit un orar bun. Vom prezenta o
posibilitate de întocmire a orarului folosind algoritmi genetici [91].
Pentru început va trebui să găsim un orar valid de pornire.
Vom prefera o variantă de generare aleatoare a unui asemenea orar de
pornire. Pentru fiecare linie se utilizează un algoritm de generare a
unui aranjament aleator de ore conform cu matricea încadrărilor.
După generarea orarului de pornire, acesta trebuie optimizat în
raport cu numărul de ferestre. Un orar valid poate fi considerat ca
fiind o matrice B cu NrP linii şi 2 ∗ NrO ∗ NrZ coloane. Pentru
exemplul considerat vor fi 80 de linii şi 60 de coloane; 30 dintre
coloane vor reprezenta ore de dimineaţă iar celelalte 30 ore de după-
amiază. Un element al acestei matrice va fi codul unei clase (de la 1 la
NrC ) sau valoarea 0 dacă pe linia profesorului p , la timpul t nu este
planificată desfăşurarea unei ore.
O linie a matricei B va fi considerată cromozom. Pentru
exemplul ales, lungimea cromozomului este 60. O genă va putea lua
valori cuprinse între 0 şi NrC . Vor putea fi 41 de valori distincte
pentru gene. Dimensiunea populaţiei este egală cu NrP . În cazul
acestui exemplu, valoarea este 80.
Ca operator de evoluţie se foloseşte mutaţia încrucişată. Fie
profesorii p1 şi p 2 care la timpii t1 şi t 2 au ore la clasele c1 şi c 2 ;
cu alte cuvinte avem B( p1, t1) = B( p 2, t 2) = c1 şi B( p1, t 2) = B( p 2 , t1) = c 2 ;
cromozomii corespunzători liniilor p1 şi p 2 se vor încrucişa
interschimbând genele de pe poziţiile t1 şi t 2 ; operaţia poate fi
reprezentată grafic astfel:
126

Observăm că prin astfel de mutaţii se păstrează validitatea


orarelor. Este greu de găsit un tip de mutaţie simplă care să conserve
proprietatea unui orar de a fi valid . Funcţia de minimizat este funcţia
care calculează numărul de ferestre ale unui profesor. Această funcţie
se poate eventual pondera, în sensul ca o fereastră de două ore să fie
echivalentă, de exemplu, cu trei ferestre de câte o oră.
Construirea unui orar bun va însemna optimizarea prin
algoritmul genetic a unui orar valid de pornire. Optimizarea are ca
scop reducerea numărului de ferestre ale profesorilor.
În cele ce urmează vom prezenta câteva modificări care ar
putea fi aduse algoritmului prezentat. Fie P0 , P1 , P2 ......, şirul de orare
generate de algoritm. Pg va reprezenta populaţia din generaţia g . O
posibilitate de optimizare implică introducerea a încă doi parametri
întregi pozitivi p şi δ . Fie g generaţia curentă. În cadrul buclei
repetitive se vor executa următoarele operaţii:
• salvarea populaţiei corespunzătoare generaţiei curente Pg ;
127
• generarea a δ noi populaţii conform algoritmului prezentat; noile
orare vor fi identificate prin Pg +1 , Pg + 2 , L , Pg +δ ;
• păstrarea celei mai valoaroase generaţii, care va deveni generaţia
Pg +1 ;
• creşterea numărului de generaţii: g ← g + 1 .
O a doua posibilitate de optimizare implică introducerea
parametrului întreg δ şi a unui parametru S care este un şir
descrescător de numere naturale care conţine Ne elemente. În cadrul
buclei repetitive se vor executa următoarele operaţii:
• salvarea populaţiei corespunzătoare generaţiei curente Pg ;
• generarea a δ noi populaţii conform algoritmului prezentat; noile
orare vor fi identificate prin Pg +1 , Pg + 2 , L , Pg +δ ;
• repetarea pasului anterior până când numărul total de ferestre scade
sub valoarea S (g ) ; populaţia corespunzătoare devine generaţia Pg +1
• creşterea numărului de generaţii: g ← g + 1 .

5.4. O problemă de proiectare

Considerăm o cutie de conserve cilindrică, cu doi parametri:


diametrul d şi înălţimea h (evident, pot fi consideraţi şi alţi
parametri, cum ar fi grosimea, proprietăţi ale materialului,
forma, e t c . , dar sunt suficienţi doar cei doi parametri pentru a
ilustra modul de lucru) [42].
128
Să considerăm că această conservă trebuie să aibă un volum
de cel puţin 300 ml şi obiectivul este de a minimiza costul
materialului folosit la fabricarea conservei. Putem formula
problema astfel: să se minimizeze valoarea funcţiei

⎛ πd 2 ⎞
f (d , h ) = c⎜⎜ + πdh ⎟⎟
⎝ 2 ⎠

unde c reprezintă costul materialului conservei pe cm 2 , iar


expresia din paranteză reprezintă suprafaţa conservei. Mai trebuie
îndeplinită şi condiţia ca volumul cutiei să fie cel puţin 300 ml:

πd 2 h
g (d , h ) = ≥ 300 ,
4

cu parametrii d şi h variind între anumite limite:

d min ≤ d ≤ d max şi hmin ≤ h ≤ hmax .

Reprezentarea soluţiei

Vom folosi reprezentarea binară, utilizând câte 5 biţi pentru a


reprezenta fiecare din parametrii d şi h . De exemplu, şirul
0100001010 reprezintă o conservă cu diametrul de 8 cm
(corespunzător primilor 5 biţi) şi înălţimea de 10 cm
(corespunzătoare ultimilor 5 biţi). În aceste condiţii,

d min = hmin = 0 şi d max = hmax = 31 .

Lungimea unui cromozom fiind 10, există 210 soluţii posibile ale
129
problemei.

Funcţia fitness

Funcţia de optimizat va fi f , unde vom lua π = 3.14 şi c = 0.0654 .


Pentru valorile parametrilor d şi h din exemplul anterior , costul
cutiei este de 23 de unităţi. Scopul problemei este de a minimiza
costul. O soluţie trebuie să satisfacă cerinţa impusă de funcţia g ; cele
care încalcă această restricţie vor fi penalizate ca în exemplul
următor. Considerăm o populaţie de 6 indivizi având evaluările

23, 26, 30, 24, 11, 9;

cutiile corespunzătoare ultimelor două valori nu satisfac restricţia


impusă de funcţia g , de aceea vor fi penalizate astfel încât să devină
mai puţin promiţătoare decât oricare dintre soluţiile acceptabile. După
penalizare noile evaluări sunt:

23, 26, 30, 24, 11+28, 9+35.

Selecţia

Folosim selecţia de tip turneu cu mărimea turneului egală cu 2:


• se aleg aleator doi cromozomi,
• se calculează performanţele lor,
• se selectează cel mai bun, introducându-se în populaţia
intermediară.
De exemplu,
• dintre cromozomii cu evaluările 23 şi 30 se selectează cel cu
130
evaluarea 23
• dintre cromozomii cu evaluările 26 şi 11+28 se selectează cel cu
evaluarea 26
• dintre cromozomii cu evaluările 24 şi 9+35 se selectează cel cu
evaluarea 24
• dintre cromozomii cu evaluările 24 şi 26 se selectează cel cu
evaluarea 24
• dintre cromozomii cu evaluările 11+28 şi 23 se selectează cel cu
evaluarea 23
• dintre cromozomii cu evaluările 9+35 şi 30 se selectează cel cu
evaluarea 30.

Se observă că soluţiile cele mai promiţătoare au mai multe copii în


populaţia intermediară.

Operatori de evoluţie

Vom folosi încrucişarea cu un singur punct de tăietură. De exemplu,


considerând punctul de încrucişare în poziţia 3, din cromozomii ce
definesc cutiile cu
fitness = 23, h = 8, d = 10
şi respectiv
fitness = 26 , h = 14, d = 6
vor rezulta descendenţii cu
fitness = 22 , h = 10, d = 6
şi respectiv
fitness = 38, h = 12, d = 10 :
131
010 M 0001010 010 M1000110

011M1000110 011M 0001010

Se foloseşte mutaţia tare: de exemplu, din soluţia cu fitnessul 22 prin


mutaţia bitului din poziţia 4 se obţine o soluţie cu fitnessul 16.
6
SCHEME ŞI BLOCURI

O problemă importantă în studiul algoritmilor genetici este


legată de similitudinile care există între diferiţi cromozomi ai unei
populaţii. Mai precis, ne interesează în ce măsură un cromozom este
reprezentativ pentru o clasă de cromozomi, la nivelul poziţiilor
genelor.

6.1. Scheme: definiţie, proprietăţi

O schemă este un şablon care descrie o submulţime de


cromozomi având asemănări în anumite poziţii. Schema se obţine
prin introducerea caracterului ∗ (cu semnificaţia indiferent, nu ştiu
care, etc.) în alfabetul general, obţinând astfel o cale compactă de a
analiza similitudinile bine definite între cromozomi. Vom considera,
în continuare, că lucrăm cu alfabetul binar {0, 1} şi cu cromozomi de

lungime m ; atunci, un cromozom este un element al spaţiului {0 ,1}m

iar schema este un element al spaţiului {0 ,1, ∗}m .


134
Un cromozom este o instanţă a unei scheme dacă fiecărei
poziţii din cromozom diferită de ∗ îi corespunde o poziţie din schemă
având aceeaşi valoare. De exemplu, schema 0 ∗1 ∗ ∗ defineşte 8
cromozomi. În general, pentru un alfabet de cardinalitate k există
(k + 1)m scheme, m fiind lungimea cromozomului. De asemenea, un

cromozom de lungime m aparţine la 2 m scheme diferite, deoarece


fiecare poziţie a sa poate lua fie valoarea curentă fie simbolul ∗ .

Unui şir de lungime m îi corespund 3m scheme posibile iar


într-o populaţie de dimensiune n pot fi reprezentate între 2 m şi n ⋅ 2 m
scheme diferite. În acest fel, populaţii cu dimensiune moderată aduc o
informaţie importantă cu privire la similitudinile semnificative dintre
indivizi.
Dacă m este lungimea cromozomilor, aceştia pot fi priviţi ca
puncte într-un spaţiu de căutare de dimensiune m ; cu alte cuvinte sunt
vârfurile unui hipercub, vârfurile vecine fiind reprezentate prin şiruri
ce diferă printr-un bit. Ca exemplu să considerăm cromozomi de
lungime 3 (Figura 6.1). Planul din faţă conţine toate punctele ce încep
cu 0 , şirul “ 000 ” reprezentând originea. Acest plan poate fi
reprezentat prin schema “ 0 ∗ ∗ ”; deci o schemă corespunde unui
hiperplan în spaţiul de căutare.

Trecerea la un hipercub de dimensiune mai mare se face ca în


Figura 6.2, unde este ilustrat un spaţiu 4-dimensional reprezentat ca un
cub “atârnând” în interiorul altui cub.
135

110 111

011
010

100 101

000 001

Figura 6.1

0110
0111

1110 1111
0010
0011
1010 1011

1100 1101

1000 1001

0100 0101

0000 0001

Figura 6.2
136
Etichetarea punctelor se face astfel: punctele cubului interior şi
punctele cubului exterior se reprezintă ca în cazul 3-dimensional apoi
punem 1 în faţa fiecărui şir din cubul interior şi 0 în faţa fiecărui şir
din cubul exterior. În felul acesta, două şiruri adiacente diferă printr-
un bit. Cubul interior aparţine schemei “ 1 ∗ ∗ ∗ ”, în timp ce cubul
exterior corespunde schemei “ 0 ∗ ∗ ∗ ”. Este uşor de văzut că “ ∗ 0 ∗ ∗ ”
corespunde planului din faţă al fiecărui cub iar schema “ 10 ∗ ∗ ”
corespunde planului din faţă al cubului interior.

Un şir de biţi aparţine unei scheme particulare dacă poate fi


obţinut din aceasta prin înlocuirea semnului ∗ cu biţi corespunzători.
Fiecare şir binar este un cromozom ce aparţine unui vârf al
hipercubului. Un şir binar aparţine la 2 m − 1 hiperplane diferite, unde
m este lungimea cromozomilor; şirul cu toate simbolurile ∗
corespunde întregului spaţiu şi nu se consideră hiperplan. Cum fiecare
poziţie din cele m poate conţine un bit sau caracterul ∗ , înseamnă că
sunt 3 m − 1 hiperplane pe întreg spaţiul de căutare.

Faptul că un şir aparţine la 2 m − 1 hiperplane nu aduce foarte


multă informaţie dacă fiecare punct este examinat izolat. Acesta este
motivul pentru care noţiunea de căutare bazată pe populaţie este
esenţială în algoritmi genetici.

Vom folosi următoarele notaţii:

• θ (S ) = ordinul schemei S , adică numărul poziţiilor fixate; deci


ocupate cu 0 sau 1 . De exemplu, pentru schemele
137
S1 = (∗ ∗ ∗ 001 ∗110 )

S 2 = (∗ ∗ ∗ ∗00 ∗ ∗0 ∗)

S 3 = (11101 ∗ ∗001)
avem θ (S1 ) = 6, θ (S 2 ) = 3, θ (S 3 ) = 8 ; deci S 3 este cea mai specifică.

O schemă de ordin θ reprezintă 2 m−θ şiruri diferite.

• δ (S ) = lungimea schemei S şi reprezintă distanţa dintre prima şi


ultima poziţie fixate. Pe exemplul anterior avem:

δ (S1 ) = 10 − 4 = 6 , δ (S 2 ) = 9 − 5 = 4 şi δ (S 3 ) = 10 − 1 = 9 .

O schemă cu o singură poziţie fixată are lungimea 0 . Lungimea unei


scheme este o măsură a numărului de puncte de încrucişare aflate în
porţiunea semnificativă a schemei. Dacă se foloseşte încrucişarea
δ (S )
simplă, atunci este o măsură a probabilităţii ca punctul de
m −1
încrucişare să aparţină porţiunii semnificative a schemei.

O populaţie cu n cromozomi de lungime m conţine între 2 m


(
şi min n ⋅ 2 m , 3 m ) scheme, astfel că algoritmii genetici operează
implicit pe un număr de scheme mult mai mare decât dimensiunea
populaţiei (proprietate numită paralelism intrinsec). De exemplu,
pentru m = 6 şi n = 20 numărul de scheme este cuprins între 64 şi 729
iar pentru m = 100 şi n = 300 va fi între 1.267650 × 10 30 şi
3.802951× 10 32 .
138

6.2. Teorema schemei

Simularea procesului de evoluţie într-un algoritm genetic


constă în repetarea a patru paşi:

t := t + 1

selectează P (t ) din P(t − 1)

recombină P (t )

evaluează P (t )

Principalul fenomen din procesul de evoluţie apare în paşii de


selecţie şi recombinare; de aceea discutăm efectul lor [59].
Considerăm o populaţie de dimensiune PopSize = 20 şi lungimea
unui individ m = 33 . Considerăm că populaţia curentă (la iteraţia t )
constă din următorii indivizi

v1 = (100110100000001111111010011011111)

v2 = (111000100100110111001010100011010 )

v3 = (000010000011001000001010111011101)

v4 = (100011000101101001111000001110010 )

v5 = (000111011001010011010111111000101)

v6 = (000101000010010101001010111111011)
139
v7 = (001000100000110101111011011111011)

v8 = (100001100001110100010110101100111)

v9 = (010000000101100010110000001111100)

v10 = (000001111000110000011010000111011)

v11 = (011001111110110101100001101111000 )

v12 = (110100010111101101000101010000000 )

v13 = (111011111010001000110000001000110)

v14 = (010010011000001010100111100101001)

v15 = (111011101101110000100011111011110)

v16 = (110011110000011111100001101001011)

v17 = (011010111111001111010001101111101)

v18 = (011101000000001110100111110101101)

v19 = (000101010011111111110000110001100)

v20 = (101110010110011110011000101111110)

Notăm cu ξ (S, t ) numărul indivizilor din populaţie care se potrivesc


cu schema S la momentul t . De exemplu, pentru schema

S 0 = (∗ ∗ ∗ ∗111∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗)
140
ξ (S 0 , t ) = 3 deoarece v13 , v15 şi v16 se potrivesc cu schema S 0 .

O altă proprietate a schemei este evaluarea la momentul t ,


eval (S , t ) , definită ca fiind media evaluărilor indivizilor din populaţie
care se potrivesc cu schema S . Dacă p indivizi vi1 ,L, vi p { } se
potrivesc cu schema S la momentul t atunci

∑ eval (v )
p

ij

eval (S , t ) =
j =1
.
p

În timpul selecţiei este creată o nouă populaţie, fiecare individ


fiind copiat de 0, 1 sau mai multe ori, în funcţie de evaluarea sa.
Notând cu F (t ) evaluarea întregii populaţii la momentul t ,

PopSize
F (t ) = ∑ eval (vi ) ,
i =1

probabilitatea ca individul vi să fie selectat este

eval (vi )
pi = .
F (t )

Deoarece

• probabilitatea de selectare a indivizilor care se potrivesc cu schema


S este

eval (S , t )
F (t )
141
• numărul indivizilor ce se potrivesc cu schema S la momentul t
este ξ (S, t )

• numărul indivizilor selectaţi este PopSize

rezultă că numărul indivizilor care se potrivesc cu schema S la


momentul t + 1 este

ξ (S , t ) ⋅ PopSize ⋅ eval (S , t )
ξ (S , t + 1) = .
F (t )

Ţinând seama că evaluarea medie a populaţiei este

F (t )
F (t ) = ,
PopSize
formula anterioară devine

ξ (S , t ) ⋅ eval (S , t )
ξ (S , t + 1) =
F (t )

adică numărul indivizilor care se potrivesc cu schema la momentul


t + 1 creşte în funcţie de raportul dintre evaluarea schemei şi evaluarea
medie al populaţiei. Înseamnă că o schema “deasupra mediei” duce la
creşterea numărului de indivizi iar una “sub medie” determină
scăderea numărului lor. Presupunând că schema rămâne deasupra
mediei cu ε %, adică

eval (S , t ) = F (t ) + ε ⋅ F (t ) ,
atunci
ξ (S , t ) = ξ (S ,0 )(1 + ε ) t ,
142
adică schema aflată “deasupra mediei” duce chiar la o creştere
exponenţială a numărului de indivizi care se potrivesc cu ea în
generaţiile următoare.

Pentru a explica teorema schemei, considerăm exemplul de


funcţionare a algoritmilor genetici prezentat în capitolul anterior.
Întorcându-ne la schema S 0 , deoarece trei şiruri se potrivesc cu
schema, avem

27.316702 + 30.060205 + 23.867227


eval (S 0 , t ) = = 27.081378
3

iar evaluarea medie al întregii populaţii este


20

∑ eval (v ) i
387.776822
F (t ) = i =1
= = 19.388841 .
PopSize 20

Raportul dintre evaluarea schemei S 0 şi evaluarea medie a populaţiei


este
eval ( S 0 , t )
= 1.396751
F (t )

adică schema S 0 este deasupra mediei.


La momentul t + 1 vor fi 3 × 1.396751 = 4.19 şiruri ce se potrivesc
cu S 0 (adică, probabil 4 sau 5) iar la momentul t + 2 vor fi
3 × 1.3967512 = 5.85 şiruri (deci, foarte probabil 6).
Simulând procesul de selecţie, rezultă următoarea populaţie
143
v'1 = v11 , v'2 = v4 , v'3 = v7 , v'4 = v11 , v'5 = v19 , v'6 = v4 ¸ v'7 = v15 ,
v'8 = v5 , v'9 = v11 ¸ v'10 = v3 , v'11 = v15 , v'12 = v9 , v'13 = v6 , v'14 = v8 ,
v'15 = v20 ¸ v'16 = v1 , v'17 = v10 , v'18 = v13 , v'19 = v15 , v'20 = v16 .

Într-adevar, în noua populaţie există 5 şiruri : v'7 , v'11 , v'18 , v'19 şi


v'20 , care se potrivesc cu schema S 0 .

Totusi, selecţia singură nu introduce şiruri noi în populaţie,


determinând doar copierea unor şiruri pentru a forma populaţia
intermediară. Sarcina introducerii de şiruri noi revine recombinării,
prin operatorii de încrucişare şi mutaţie. Pentru a analiza încrucişarea
considerăm schemele

S 0 = (∗ ∗ ∗ ∗111∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗)

S1 = (111 ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗10 )

Presupunând că şirul v'18 a fost ales pentru încrucişare cu poziţia


pos = 20 , schema S 0 va supravieţui încrucişării deoarece unul din
descendenţi va conţine secvenţa “ 111 ”. Şirurile

v'18 = (11101111101000100011|0000001000110 )

v'13 = (00010100001001010100 |1010111111011)

vor produce descendenţii

v"18 = (11101111101000100011| 1010111111011)


144
v"13 = (00010100001001010100 | 0000001000110) .

Pe de altă parte, schema S1 va fi distrusă deoarece secvenţele


fixate “ 111 ” şi “ 10 ” vor fi plasate în descendenţi diferiţi. Rolul
principal în distrugerea sau supravieţuirea unei scheme îl are lungimea
de definire; δ (S 0 ) = 2 iar δ (S1 ) = 32 . În general, punctul de
încrucişare este selectat uniform şi aleator dintre cele m − 1 poziţii.
Rezultă că probabilitatea de distrugere a schemei S este

δ (S )
pd (S ) =
m −1

iar probabilitatea de supravieţuire este

δ (S )
p s (S ) = 1− .
m −1

Pe exemplul anterior avem

2 30 32
p d (S 0 ) = , p s (S 0 ) = , p d (S1 ) = = 1 , p s (S1 ) = 0 ,
32 32 32

rezultate ce corespund cu predicţia.

Deoarece numai unii indivizi vor fi supuşi încrucişării, dacă


pc este probabilitatea de încrucişare, rezultă că probabilitatea ca
schema să supravieţuiască este de fapt

δ (S )
p s (S ) = 1− pc
m −1
145
Pentru schema S 0 şi pc = 0.25 avem

2 63
p s (S 0 ) = 1 − 0.25 ⋅ = = 0.984375 .
32 64

Chiar dacă punctul de încrucişare este selectat între poziţiile


fixate ale schemei, este posibil ca schema să supravieţuiască. De
exemplu, dacă ambele şiruri v'18 şi v'13 încep cu “111” şi se termină
cu “10”, atunci schema S1 va supravieţui încrucişării. Rezultă că
formula care dă probabilitatea de supravieţuire a unei scheme trebuie
modificată în

δ (S )
p s (S ) ≥ 1− pc .
m −1

Combinând efectele selecţiei şi încrucişării rezultă formula

eval (S , t ) ⎛ δ (S ) ⎞
ξ (S , t + 1) ≥ ξ (S , t ) ⎜1 − p c ⎟
F (t ) ⎝ m −1 ⎠

Pentru schema S 0 avem

eval (S 0 , t ) ⎛ δ (S ) ⎞
⎜1 − p c ⎟ = 1.396751 × 0.984375 = 1.374927
F (t ) ⎝ m −1⎠

şi deci

• la generaţia t + 1 ne aşteptăm să avem 3 × 1.374927 = 4.12 şiruri


ce se vor potrivi cu S 0 ; se obţine, deci, o valoare mai mică decât 4.19
când se consideră numai selecţia.
146

• la generaţia t + 2 avem 3 × 1.374927 2 = 5.67 şiruri ce se vor potrivi


cu S 0 ; se obţine o valoare mai mică decât 5.85 .

Următorul operator considerat este mutaţia. Considerăm


schema S 0 şi şirul

v'19 = (111011101101110000100011111011110) .

Se observă că orice mutaţie care afectează biţii 1− 4 sau 8 − 33


permite supravieţuirea schemei S 0 , în timp ce orice mutaţie pe unul
din biţii 5, 6 sau 7 va distruge schema. Biţii care duc la distrugerea
schemei sunt cei “importanţi” iar numărul lor coincide cu ordinul
schemei. Probabilitatea de alterare a unui bit fiind pm , rezultă că
probabilitatea de supravieţuire a unui bit este 1 − pm ; deci
probabilitatea de supravieţuire a schemei este

p s (S ) = (1 − pm )θ (S ) .

Deoarece pm ≤ 1 , probabilitatea poate fi aproximată prin

p s (S ) ≈ 1 − θ (S ) ⋅ pm .

Referindu-ne la schema S 0 şi luând pm = 0.01 obţinem

p s (S 0 ) ≈ 1 − 3 × 0.01 = 0.97

Combinând efectele selecţiei, încrucişării şi mutaţiei rezultă


147
eval (S , t ) ⎛ δ (S ) ⎞
ξ (S , t + 1) ≥ ξ (S , t ) ⎜1 − p c − θ (S ) ⋅ p m ⎟ ,
F (t ) ⎝ m −1 ⎠

relaţie ce constituie teorema schemei.

Pentru schema S 0 avem

eval (S 0 , t ) ⎛ δ (S ) ⎞
⎜1 − p c − θ (S 0 ) ⋅ p m ⎟ = 1.396751 × 0.954375 = 1.333024
F (t ) ⎝ m −1 ⎠

şi deci

• la generaţia t + 1 ne aşteptăm ca 3 × 1.333024 ≈ 4 şiruri să se


potrivească cu S 0 , adică nu mai mult de 4.19 cât au rezultat
considerând numai selecţia şi nu mai mult de 4.12 cât au rezultat prin
folosirea selecţiei şi a încrucişării

• la generaţia t + 2 vom avea 3 × 1.333024 2 ≈ 5.33 astfel de şiruri,


deci nu mai mult de 5.85 respectiv 5.67

Observaţie. Formula stabilită funcţionează în cazul când


funcţia de optimizat f ia numai valori positive.

Relaţiile de mai sus ne permit să formulăm

Teorema schemei. Schemele de ordin mic, lungime de


definiţie mică şi fitness peste media populaţiei sunt reprezentate în
generaţiile successive de un număr crescând de cromozomi; creşterea
148
este exponenţiată dacă fitnessul schemei este constant peste media
populaţiei.

Teorema schemei pune un mare accent pe rolul încrucişării în


selecţia hiperplanelor. Pentru a maximiza păstrarea hiperplanelor după
selecţie este necesar să se micşoreze efectul distructiv al încrucişării şi
mutaţiei. Pentru aceasta trebuie ca mutaţia să fie folosită puţin sau de
loc. După câteva generaţii este posibil ca selecţia să conducă la fixarea
unei singure valori pentru o anumită poziţie: fie 0 fie 1 ; aceasta duce
la convergenţa prematură, situaţie întâlnită frecvent când se lucrează
cu populaţii de dimensiune mică.

Fără mutaţie este imposibil să se reintroducă valoarea pierdută


a bitului; mutaţia acţionează ca un operator de reamintire, permiţând
recuperarea unor valori pierdute. O altă problemă legată de
convergenţa prematură este necesitatea scalării fitnessului populaţiei.
Când evaluarea medie a şirurilor creşte, dispersia în fitness scade.
Între cel mai bun şi cel mai slab individ din populaţie poate fi o
diferenţă mică după câteva generaţii iar presiunea selecţiei bazată pe
fitness va fi corespunzător redusă. În acest caz se calculează valoarea
medie a şirurilor şi fitnessul, folosind evaluarea ajustată, crescând
presiunea selecţiei. Alternativ, se poate folosi selecţia după rang.

6.3. Blocuri

O categorie specială de scheme sunt blocurile. Acestea sunt


scheme cu valori mari ale evaluării, ordin mic şi lungime de definire
149
redusă. Ipoteza blocurilor afirmă că încrucişarea orientează căutarea
către găsirea blocurilor (soluţii parţiale) pe care le combină în soluţii
globale mai bune. Totuşi, ipoteza blocurilor poate fi violată. Să
considerăm schemele

S1 = (111 ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗)

S 2 = (∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗11)

situate deasupra mediei şi să presupunem că schema

S 3 = (111∗ ∗ ∗ ∗ ∗ ∗11)

rezultată prin încrucişare este mai puţin potrivită decât

S 4 = (000 ∗ ∗ ∗ ∗ ∗ ∗00) .

Dacă şirul optim este

v0 = (11111111111) ,

care se potriveşte cu S 3 , un algoritm genetic va avea dificultăţi în a


converge către v0 deoarece va tinde să găsească şirul

(00011111100) .
Acest fenomen poartă numele de decepţie şi este strâns legat
de cel numit epistasis care, în termenii algoritmilor genetici, înseamnă
o interacţiune puternică între genele unui cromozom. O posibilitate de
a înlătura decepţia constă în folosirea altui operator genetic:
inversiunea, care va inversa biţii dintre două poziţii selectate aleator.
150
De exemplu, schema

S 3 = (111∗ ∗ ∗ ∗ ∗ ∗11)

poate fi regrupată prin inversiune în

S'3 = (11111 ∗ ∗ ∗ ∗ ∗ ∗) ,

care reprezintă un bloc important.


7
VARIANTE DE ALGORITMI
GENETICI

7.1. Probleme de convergenţă

Studiul convergenţei algoritmilor genetici este una din cele


mai dificile probleme. De aceea s-au încercat diferite metode de
soluţionare a ei. Pentru a evalua a priori viteza de convergenţă şi
precizia unui algoritm genetic s-au introdus mărimi care să măsoare
omogenitatea spaţiului de căutare şi corelaţia fitness-distanţă.
În ambele cazuri se consideră că funcţia fitness coincide cu cea de
evaluare.

a) Omogenitatea spaţiului de căutare

Dificultatea funcţiei de optimizat este reflectată de deviaţia


standard s care arată modul în care este acoperit spaţiul soluţiilor
admisibile
1 n

n i =1
( )
f ( xi ) − f ( x )
2

s=
f (x )
152

unde
n
∑ f ( xi )
i =1
f(x)=
n

iar n este dimensiunea populaţiei.


Studiile empirice asupra mărimii lui s au arătat că o funcţie
pentru care s are o valoare apropiată de s 0 = 0.1 este uşor de
optimizat prin algoritmi genetici.
Valoarea s se calculează o singură dată, de obicei înaintea
rulării programului, pe o populaţie generată aleator. Pentru valori ale
lui s mult mai mari sau mai mici decât s 0 sunt necesare tehnici de
scădere sau de mărire a presiunii de selecţie.

b) Corelaţia fitness-distanţă

Jones şi Forrest [50] au propus o altă mărime pentru predicţia


comportării unui algoritm genetic: corelaţia dintre valoarea funcţiei
fitness şi distanţa dintre cromozom şi soluţia optimală.
Dezavantajul metodei constă în faptul că nu se cunoaşte soluţia
optimală. Pentru a depăşi acest impas, Schoenauer a propus să se
utilizeze ca optim cromozomul cel mai bun din generaţia respectivă.
Fie F = { f 1 , f 2 , L , f n } mulţimea valorilor fitness pentru populaţia
curentă şi D = {d1 , d 2 , L , d n } mulţimea distanţelor de la fiecare
cromozom la cel mai bun din generaţia respectivă. Pentru şiruri de biţi
153
este uşor de lucrat cu distanţa Hamming care numără biţii pe care
diferă cele două şiruri. Corelaţia fitness-distanţă se defineşte prin
c FD
r=
sF ⋅ sD
unde

c FD =
1 n
( )(
∑ fi − f di − d
n i =1
)
este covarianţa F − D , s F şi s D sunt deviaţiile standard iar f şi d
sunt mediile lui F şi respectiv D . Mărimea r măsoară dificultatea
rezolvării unei probleme de maximizare: o valoare a lui r apropiată
de − 1 (valoarea minimă) indică o problemă uşor de rezolvat folosind
algoritmi genetici iar o valoare apropiată de + 1 indică o problemă
foarte dificilă. Semnificaţiile lui r sunt inversate pentru probleme de
minimizare. Toate studiile experimentale au confirmat aceste ipoteze.
Diverşi autori au studiat problema convergenţei algoritmilor
genetici din diverse perspective. Majoritatea au utilizat lanţuri Markov
finite, alţii au definit probabilitatea de convergenţă.

O altă abordare posibilă constă în folosirea tehnicilor de punct


fix. Primul pas în această direcţie a fost făcut de Szalas şi
Michalewicz [90] care au demonstrat matematic o idee intuitivă a
convergenţei: singura cerinţă este o îmbunătăţire a populaţiei, fără să
fie necesară o îmbunătăţire a celui mai bun individ.
Deşi teoria algoritmilor genetici oferă explicaţii cu privire la
atingerea optimului căutat, aplicaţiile practice nu urmează întotdeauna
teoria datorită următoarelor motive:
154
• codificarea problemei determină algoritmul să lucreze într-un
spaţiu diferit de cel al problemei;
• există limite cu privire la numărul iteraţiilor şi dimensiunea
populaţiei.
Una din implicaţiile observaţiilor de mai sus este incapacitatea
algoritmilor genetici de a găsi, în anumite condiţii, soluţia optimă,
ducând la convergenţă prematură. Există unele metode de a combate
convergenţa prematură: utilizarea încrucişării uniforme, detectarea
indivizilor duplicaţi din populaţie.

Un rol important în determinarea vitezei de convergenţă îl are


diversitatea populaţiei, care depinde de metoda de selecţie. Este
recomandată selecţia după rang în detrimentul celei după fitness care
promovează superelitele.

7.2. Algoritmul genetic modificat

Rudolph [72] a demonstrat că algoritmul clasic nu converge


niciodată la soluţia optimă, dar versiunea modificată, care menţine cea
mai bună soluţie în populaţie, face acest lucru.
Algoritmul genetic modificat (modGA) se obţine din cel
clasic, prin modificarea pasului de selecţie.

algoritmul modGA
begin
t := 0
iniţializează P (t )
155
evaluează P (t )
while not (condiţie-terminare) do
begin
t := t + 1
selectează părinţii din P (t − 1)
selectează indivizii ce vor fi eliminaţi din P (t − 1)
formează P(t ) prin reproducerea părinţilor
evaluează P(t )
end
end

În cei doi paşi de selecţie se selectează r cromozomi (nu


neapărat distincţi) pentru a fi reproduşi şi r cromozomi distincţi care
vor fi eliminaţi. Metoda de selecţie este cea a fitnessului relativ. Noua
populaţie P (t + 1) va consta din adăugarea la P (t ) , în locul indivizilor
eliminaţi, a r descendenţi rezultaţi din cei r părinţi.

Se procedează astfel:

Pasul 1. Se selectează r părinţi din P (t ) . Fiecare individ selectat


este marcat ca aplicabil la exact o operaţie genetică.

Pasul 2. Se selectează N − r indivizi distincţi din P (t ) şi se copiază


în P (t + 1) , unde N este dimensiunea populaţiei.
156
Pasul 3. Cei r părinţi selectaţi dau naştere la r descendenţi care vor
fi incluşi în P (t + 1) .

Selectarea din paşii 1 şi 2 se face după fitness; astfel, un


individ deasupra mediei are şanse mari de a fi selectat ca părinte şi în
acelaşi timp de a face parte din noua populaţie. Pentru a aplica un
tratament uniform tuturor operatorilor genetici, nu vom aplica doi
operatori asupra aceluiaşi cromozom.

7.3. Algoritmul hillclimbing

Spaţiul de căutare este format din cromozomi de lungime L .


Există mai multe versiuni ale algoritmului hillclimbing, care diferă
între ele prin modul de selectare a unui nou individ. O versiune a
acestui algoritm (pentru o problemă de maximizare), folosind iteraţia
MAX, este următoarea [59]:

algoritmul hillclimbing
begin
t := 0
iniţializează P (t )
repeat
local:= FALSE
selectează aleator un individ curent ic
evaluează ic
157
repeat
generează L descendenţi ai lui ic prin mutaţia unui bit în ic
selectează dintre descendenţi individul in care are cea mai
mare valoare a funcţiei obiectiv
if f (ic ) < f (in )
then ic := in
else local:= TRUE
until local
t := t + 1
until t = MAX
end

Iniţial toţi cei L descendenţi sunt luaţi în consideraţie, dar


numai in este selectat pentru a concura cu ic . Dacă f (ic ) < f (in )
atunci noul individ ia locul celui curent. Altfel nu este posibilă o
îmbunătăţire locală: algoritmul îşi atinge optimul (local sau global),
adică local := TRUE . În acest caz se trece la iteraţia următoare pentru
a selecta aleator un nou individ.
Succesul sau eşecul algoritmului depinde de cromozomul de
start. Justificăm această afirmaţie pe exemplul următor. Spaţiul de
căutare este format din cromozomi de lungime 30 iar funcţia ce
urmează a fi maximizată este
f (v ) = 11 ⋅ unu (v ) − 150 ,
unde funcţia unu( v ) întoarce numărul de cifre 1 ce apar în vectorul
v ataşat unui cromozom. De exemplu, următoarele 3 şiruri
158
v1 = (110110101110101111111011011011)
v 2 = (111000100100110111001010100011)
v3 = (000010000011001000000010001000)
vor avea evaluările
f (v1 ) = 11 ⋅ 22 − 150 = 92 (unu (v1 ) = 22)
f (v 2 ) = 11 ⋅ 15 − 150 = 15 (unu (v2 ) = 15)
f (v3 ) = 11 ⋅ 6 − 150 = 84 (unu (v3 ) = 6)
Funcţia are un maxim global pentru
v g = (111111111111111111111111111111)
egal cu
( )
f v g = 11 ⋅ 30 − 150 = 180
şi un maxim local pentru
vl = (000000000000000000000000000000)
egal cu
f (vl ) = 11 ⋅ 0 − 150 = 150 .
Dacă cromozomul iniţial are cel mult 13 de 1 atunci
algoritmul se termină prin găsirea unui maxim local, deoarece:
• dacă sunt 13 de 1, valoarea funcţiei obiectiv este 7
• dacă se creşte numărul de 1-uri la 14 atunci valoarea funcţiei
obiectiv descreşte la 4
• un cromozom cu 12 de 1 dă valoarea 18 iar unul cu 11 dă
valoarea 29, etc.
Deci, trecând de la o iteraţie la alta cu paşi ”mici” se merge într-o
direcţie greşită, către un maxim local.
159

7.4. Algoritmul călire simulată

Structura acestui algoritm este următoarea [59]:

algoritmul călire simulată


begin
t := 0
iniţializează P (t )
iniţializează temperatura T
selectează aleator un individ curent ic
evaluează ic
repeat
repeat
selectează un nou individ in prin mutaţia unui bit în ic
if f (ic ) < f (in )
then ic := in

⎧ f (i ) − f (ic ) ⎫
else if random[0, 1) < exp⎨ n ⎬
⎩ T ⎭
then ic := in
until (condiţie-terminare)
T := g (T , t )
t := t + 1
until (criteriu de oprire)
end
160

Funcţia random[0, 1) întoarce un număr aleator din [0, 1) .


Condiţia de terminare verifică dacă a fost atins echilibrul termic, adică
distribuţia de probabilitate a noului individ aproximează distribuţia
Boltzmann. Totuşi, în multe aplicaţii, acest pas este executat de k ori,
k fiind un parametru al metodei.
Temperatura este micşorată în pasul

T := g (T , t ) unde g (T , t ) < T ∀t .

Algoritmul se termină pentru valori mici ale lui T : criteriul de


oprire verifică dacă sistemul „îngheaţă”. Algoritmul de călire simulată
poate evita optimul local. Considerăm aceeaşi funcţie ca la algoritmul
hillclimbing. Fie individul i4 definit de şirul

v 4 = (111000000100110111001010100000 )

cu 12 de 1, având evaluarea

f (v 4 ) = 11 ⋅ 12 − 150 = 18 .
Aşa cum am arătat anterior, algoritmul hillclimbing găseşte
maximul local
vl = (000000000000000000000000000000) .

Pe de altă parte, algoritmul de călire simulată va accepta un şir cu 13


de 1 ca un şir curent, cu probabilitatea

⎛ f (i ) − f (ic ) ⎞ ⎛ 7 − 18 ⎞
p = exp⎜ n ⎟ = exp⎜ ⎟
⎝ T ⎠ ⎝ T ⎠
161
care, pentru temperatura T = 20 dă

⎛ 11 ⎞
p = exp⎜ − ⎟ = 0.57695
⎝ 20 ⎠

adică schimbarea este acceptată cu mai mult de 50%.


Două şiruri relativ sărace

v5 = (111110000000110111001110100000)
şi
v6 = (000000000001101110010101111111) ,
fiecare având evaluarea 16, pot produce descendenţi mult mai buni
dacă încrucişarea are loc între a 5-a şi a 12-a genă:

v7 = (111110000001101110010101111111) .

Noul descendent v7 are evaluarea


f (v7 ) = 11 ⋅ 19 − 150 = 59 .

7.5. Algoritmi de tip contracţie

O posibilitate de studiere a proprietăţilor de convergenţă a


algoritmilor genetici constă în folosirea teoremei de punct fix a lui
Banach, care lucrează cu aplicaţii de tip „contracţie” pe spaţii metrice.

Definiţia 7.1.
Dacă R este mulţimea numerelor reale, o mulţime X cu o aplicaţie
d : X × X → R este spaţiu metric, notat (X , d ) , dacă următoarele
162
condiţii sunt verificate pentru orice x, y ∈ X :
i) d (x, y ) ≥ 0 şi d (x, y ) = 0 ⇔ x=y
ii) d (x, y ) = d ( y, x )
iii) d (x, y ) + d ( y, z ) ≥ d ( x, z ) .

Definiţia 7.2.
Fie ( X , d ) un spaţiu metric. O aplicaţie f : X → X este contracţie
dacă şi numai dacă există o constantă c ∈ (0, 1) astfel încât pentru
orice
x, y ∈ X : d ( f ( x ) , f ( y )) ≤ c ∗ d ( x , y ) .

Definiţia 7.3.
Şirul x0 , x1 ,L de elemente din spaţiul metric ( X , d ) este şir Cauchy
dacă şi numai dacă pentru orice ε > 0 există k astfel încât pentru
orice m, n > k , d (x m , x n ) < ε . Un spaţiu metric este complet dacă
orice şir Cauchy x0 , x1 , L, x n ,L are o limită x = lim x n .
n →∞

Teorema 7.1.
Fie ( X , d ) un spaţiu metric complet şi f : X → X o contracţie de
constantă c . Atunci:
i) f are un punct fix unic x * : f x * = x * ( )
ii) dacă x0 este un element oarecare din X atunci şirul
aproximaţiilor succesive x0 , x1 = f (x0 ), L, x n = f ( x n−1 ), L este

convergent şi are ca limită pe x * .


163
iii) are loc estimarea

( )
d xn , x * ≤
cn
1− c
d ( x0 , x1 )

Algoritmii genetici pot fi definiţi ca transformări între


populaţii. Dacă construim un spaţiu metric ( X , d ) , având populaţii ca
elemente, şi o aplicaţie f care satisface condiţiile unei teoreme de
punct fix atunci putem demonstra convergenţa unui algoritm genetic
la un punct fix, indiferent de alegerea populaţiei iniţiale [90].
Fără a restrânge cu nimic generalitatea, presupunem că lucrăm
cu probleme de maxim, adică probleme pentru care o soluţie xi este
mai bună decât soluţia x j dacă şi numai dacă eval ( xi ) > eval x j , ( )
unde funcţia eval dă fitnessul unui individ din populaţie.
Pentru o populaţie P considerăm funcţia de evaluare Eval ; de
exemplu, pentru P = {p1 , p 2 , L, p n } putem defini

1 n
Eval (P ) = ∑ eval ( pi ) .
n i =1

Teorema 7.2.
Fie X mulţimea tuturor populaţiilor P şi aplicaţia d : X × X → R
definită prin

⎧0, pentru P1 = P2
d (P1 , P2 ) = ⎨
⎩ 1 + M − Eval (P1 ) + 1 + M − Eval (P2 ) , pentru P1 ≠ P2
164
unde M este limita superioară a funcţiei eval în domeniul de interes.
Atunci ( X , d ) este spaţiu metric complet.
Demonstraţie.
Din eval ( x) ≤ M pentru orice individ x , rezultă Eval ( P) ≤ M pentru
orice populaţie P . Proprietăţile de spaţiu metric se verifică imediat:
• d (P1 , P2 ) ≥ 0 pentru orice populaţii P1 şi P2 ; în plus,

d (P1 , P2 ) = 0 dacă şi numai dacă P1 = P2


• d (P1 , P2 ) = d (P2 , P1 )

• d (P1 , P2 ) + d (P2 , P3 ) = 1 + M − Eval (P1 ) + 1 + M − Eval (P2 ) +

1 + M − Eval (P2 ) + 1 + M − Eval (P3 ) ≥

1 + M − Eval (P1 ) + 1 + M − Eval (P3 ) = d (P1 , P3 )


În plus, spaţiul metric ( X , d ) este şi complet, deoarece: pentru orice
şir Cauchy P1 , P2 , L de populaţii există k astfel încât pentru orice
n > k , Pn = Pk ; ultima egalitate rezultă din faptul că algoritmii
genetici lucrează cu spaţii finite, deci există un număr finit şi mărginit
de populaţii. Înseamnă că orice şir Cauchy este convergent.

În continuare vom defini pe mulţimea tuturor populaţiilor o


aplicaţie f care să fie contracţie. Pentru aceasta, plecând de la o
populaţie P (t ) vom rula selecţia şi încrucişarea până când se obţine o
populaţie P' ce satisface o anumită relaţie în raport cu P (t ) şi vom
lua P(t + 1) = P' .
165
Teorema 7.3.
Fie ( X , d ) spaţiul metric complet definit în teorema precedentă
şi aplicaţia f : X → X definită prin f (P (t )) = P(t + 1) dacă şi numai
dacă Eval (P(t )) < Eval (P(t + 1)) .
Atunci f are un punct fix unic şi acesta poate fi obţinut prin metoda
aproximaţiilor succesive plecând de la orice populaţie iniţială
P ( 0) ∈ X .
Demonstraţie. Considerăm două iteraţii consecutive în care funcţia
f realizează o îmbunătăţire a populaţiei în raport cu funcţia Eval :

Eval (P1 (t )) < Eval ( f (P1 (t ))) = Eval (P1 (t + 1))


Eval (P2 (t )) < Eval ( f (P2 (t ))) = Eval (P2 (t + 1)) ;
atunci

d ( f (P1 (t )), f (P2 (t ))) = 1 + M − Eval ( f (P1 (t ))) + 1 + M − Eval ( f (P2 (t ))) <

1 + M − Eval (P1 (t )) + 1 + M − Eval (P2 (t )) = d (P1 (t ), P2 (t )) .

Înseamnă că funcţia
P(t ) ⎯⎯→
f
P(t + 1)

este contracţie şi, conform Teoremei 7.1, avem

P * = lim f i (P(0)) ,
i →∞

unde cu f i am notat aplicarea funcţiei f de i ori. Rezultă că


algoritmul genetic care funcţionează pe principiul contracţiei converge
la populaţia P* , care este unicul punct fix din mulţimea populaţiilor.
166

Observaţie. Din definiţia funcţiei Eval rezultă că punctul fix


P* este obţinut când toţi indivizii acestei populaţii dau aceeaşi valoare,
care coincide cu maximul global.

Structura algoritmului de tip contracţie (C-GA) este


următoarea

algoritmul C-GA
begin
t := 0
iniţializează P (t )
evaluează P (t )
while not (condiţie-terminare) do
begin { se construieşte contracţia}
t := t + 1
selectează P (t ) din P (t − 1)
recombină P(t )
evaluează P(t )
if Eval (P(t − 1)) ≥ Eval (P(t ))
then t := t − 1
end
end
Alte abordări pot fi găsite în [46, 47].
167

7.6. Algoritmi cu dimensiunea variabilă a


populaţiei

Performanţele metodelor bazate pe evoluţie depind de


diversitatea populaţiei şi de presiunea selecţiei, care la rândul lor sunt
influenţate de mărimea populaţiei. Diverse studii efectuate asupra
dimensiunii populaţiei au arătat că algoritmii cu dimensiunea variabilă
a populaţiei dau rezultate destul de bune. Grefenstette [39] a aplicat un
meta-algoritm genetic pentru a controla parametrii altui algoritm,
inclusiv dimensiunea populaţiei. Goldberg [32] a efectuat un studiu
teoretic al dimensiunii optime a populaţiei. Studii experimentale au
fost efectuate în [49] .

Vom discuta acest tip de algoritmi genetici urmând rezultatele


din [1]. Numărul indivizilor de la generaţia t , notat PopSize(t ) , va fi
influenţat de cel de la generaţia anterioară

PopSize(t + 1) = PopSize(t ) + AuxPopSize(t ) − D(t ) ,

unde AuxPopSize reprezintă populaţia intermediară care apare în


pasul de recombinare iar D(t ) reprezintă numărul de indivizi ce nu
vor supravieţui în generaţia următoare.
Dimensiunea populaţiei intermediare se calculează cu formula

AuxPopSize(t ) = PopSize(t ) ∗ ρ ,
168
unde ρ este un parametru al algoritmului, numit rată de reproducere.
Toţi indivizii unei generaţii au aceeaşi probabilitate de a fi selectaţi
pentru reproducere.
Deoarece fitnessul nu influenţează selecţia, vor fi folosiţi alţi
parametri: VÂRSTA şi VIAŢ A . VÂRSTA reprezintă numărul de
generaţii în care un individ a supravieţuit iar VIAŢ A se atribuie o
singură dată unui individ, după iniţializare sau după recombinare, şi
păstrează o valoare constantă. Un individ este menţinut în populaţie
atâta timp cât VÂRSTA nu depăşeşte VIAŢ A .

Structura algoritmului AG-DVP (Algoritm Genetic cu


Dimensiunea Variabila a Populaţiei) este următoarea.

algoritmul AG-DVP
begin
t := 0
iniţializează P (t )
evaluează P (t )
while not (condiţie-terminare) do
begin
t := t + 1
VÂRSTA := VÂRSTA + 1 pentru fiecare individ din populaţie
recombină P(t )
elimină din P (t ) toţi indivizii pentru care
VÂRSTA > VIAŢ A
169
evaluează P(t )
end
end

Parametrul VIAŢ A depinde de starea curentă a căutării genetice;


pentru aceasta se utilizează următorii parametri:
• AvgFit = media fitnessului populaţiei curente
• MaxFit = valoarea maximă a fitnessului în generaţia curentă
• MinFit = valoarea minimă a fitnessului în generaţia curentă
• AbsFitMax şi AbsFitMin = valoarea maximă şi respectiv minimă
a fitnessului, obţinută până în momentul curent.

Pentru un individ i , viaţa lui VIAŢ A(i ) poate fi definită în mai


multe feluri:
• alocare proporţională:
⎛ fitness (i ) ⎞
VIAŢ A(i ) = min⎜⎜ MinLT + η , MaxLT ⎟⎟
⎝ AvgFit ⎠
• alocare liniară
fitness (i ) − AbsFitMin
VIAŢ A(i ) = MinLT + 2η
AbsFitMax − AbsFitMin
• alocare biliniară
170
⎧ fitness (i ) − MinFit
⎪MinLT + η AvgFit − MinFit

⎪ dacă AvgFit ≥ fitness (i )
⎪1 fitness (i ) − AvgFit

VIAŢ A(i ) = ⎨ (MinLT + MaxLT ) + η
⎪2 MaxFit − AvgFit


⎪ dacă AvgFit < fitness (i )
⎪⎩

unde MaxLT şi MinLT reprezintă v aloarea maximă şi respectiv


minimă a parametrului VIAŢ A iar
1
η= (MaxLT − MinLT ) .
2
Alocarea proporţională este inspirată din selecţia după metoda
ruletei: valoarea parametrului VIAŢ A este proporţională cu fitnessul,
în limitele MinLT şi MaxLT . În cazul alocării liniare, VIAŢ A este
calculată prin raportare la fitnessul cel mai bun până în momentul
prezent. În cazul când în populaţie există indivizi al căror fitness este
egal sau apropiat de fitnessul maxim absolut, VIAŢ A va lua valori
mari, ceea ce duce la mărirea dimensiunii populaţiei. Alocarea
biliniară face un compromis între celelalte două, luând în considerare
valorile extreme din generaţia curentă.

Funcţii recomandate pentru a testa algoritmul AG-DVP sunt:


• f1 ( x ) = − x sin (10πx ) + 1, − 2 ≤ x ≤ 1
care este o funcţie cu multe maxime locale
171
• f 2 (x ) = integer (8 x ) / 8, 0 ≤ x ≤ 1 , care nu poate fi optimizată prin
metode de tip gradient

• f 3 ( x) = x ⋅ sign( x), − 1 ≤ x ≤ 2 , care reprezintă o problemă


„deceptivă”.

Se pot alege următoarele valori pentru parametri:


• dimensiunea populaţiei =20
• ρ = 0.4
• probabilitatea de mutaţie: pm = 0.015
• probabilitatea de încrucişare: pc = 0.65
• lungimea unui cromozom = 20
• MaxLT = 7 , MinLT = 1
Algoritmul se poate opri când nu se mai obţin ameliorări ale
celei mai bune valori într-un număr precizat de iteraţii.

7.7. Algoritmi cu constrângeri

Există mai multe modalităţi de a mânui constrângerile:


1) rezolvarea problemei făcând abstracţie de constrângeri şi
eliminarea, apoi, a soluţiilor care nu verifică constrângerile. Aceste
soluţii vor determina o penalizare a funcţiei de evaluare; cea mai
simplă formă de penalizare constă în eliminarea soluţiilor
nerealizabile
2) utilizarea unor metode de „reparare” a soluţiei nerealizabile
172
dar, uneori, aceste metode sunt la fel de dificile ca şi rezolvarea
problemei
3) utilizarea unor metode de decodificare care să garanteze sau
să mărească foarte mult şansele de obţinere a unor soluţii realizabile.

Exemplificăm rezolvarea unor astfel de probleme considerând


problema rucsacului [56]: „fiind date ponderile W [i ] , profiturile P[i ]
şi capacitatea C , să se găsească vectorul binar x = ( x[1], L, x[n]) astfel
încât
n
∑ x[i]⋅W [i] ≤ C
i =1

şi
n
P ( x ) = ∑ x[i ]⋅ P[i ]
i =1

are valoarea maximă.”


Trei tipuri de algoritmi sunt frecvent utilizaţi: algoritmi bazaţi pe
funcţii de penalizare ( Ap [i] ), algoritmi bazaţi pe metode de reparare
( Ar [i] ) şi algoritmi bazaţi pe decodificare ( Ad [i ] ), unde i este
indicele unui algoritm particular din clasa respectivă.

Algoritmii Ap [i ]
În cadrul acestor algoritmi soluţia este reprezentată printr-un şir
binar de lungime n . Funcţia de evaluare a unui şir x este
n
eval( x) = ∑ x[i ]⋅ P[i ] − Pen( x )
i =1
173
unde functia de penalizare Pen(x) are valoarea zero pentru soluţiile
realizabile x , adică pentru soluţiile care satisfac relaţia
n
∑ x[i]⋅W [i] ≤ C ,
i =1

şi este mai mare ca zero în caz contrar.

Sunt mai multe posibilităţi de definire a funcţiei de penalizare;


vom prezenta trei metode:

• metoda logaritmică Ap [1] : ( )


⎛ ⎛ n ⎞⎞
Pen(x ) = log 2 1 + ρ ⎜⎜ ∑ x[i ]⋅W [i ] − C ⎟⎟ ⎟

⎜ ⎟
⎝ ⎝ i =1 ⎠⎠

(
• metoda liniară Ap [2] : )
⎛ n ⎞
Pen(x ) = ρ ⎜⎜ ∑ x[i ]⋅W [i ] − C ⎟⎟
⎝ i =1 ⎠

• metoda pătratică Ap [3] :( )


2
⎛ n ⎞
Pen(x ) = ρ ⎜ ∑ x[i ] ⋅ W [i ] − C ⎟
2

⎝ i =1 ⎠
În toate cazurile,
⎧ P[i ] ⎫
ρ = max⎨ ⎬.
i =1, n ⎩W [i ]⎭
174
Algoritmii Ar [i]

La fel ca în cazul anterior, soluţia este reprezentată printr-un


şir binar de lungime n . Fitnessul unui şir x se defineşte ca fiind
n
eval( x) = ∑ x' [i ]⋅ P[i ]
i =1

unde vectorul x' este versiunea reparată a vectorului original x .


Apar două probleme:
• există mai multe metode de reparare
• numai o parte din cromozomii reparaţi îi vor înlocui pe cei
originali în populaţie. Orvosh şi Davis [68] au aratat că cea mai bună
rată de înlocuire este 5% .

Procedura generală de reparare este

Algoritm repar ( x )
begin
rucsac-plin:= false
x':= x
n
if ∑ x'[i]⋅W [i] > C
i =1

then rucsac-plin:=true
while (rucsac-plin) do
begin
i = un obiect selectat din rucsac
schimbă valoarea obiectului selectat: x' [i ] := 0
175
n
if ∑ x'[i]⋅W [i] ≤ C
i =1

then rucsac-plin:=false
end
end

Există două variante ale acestui algoritm, în funcţie de modul


de efectuare a selecţiei:
• repararea aleatoare ( Ar [1]) : se alege, în mod aleator, un obiect din
rucsac
• repararea greedy ( Ar [2]) : obiectele se ordonează descrescător
după raportul profit pondere şi se selectează ultimul element.

Algoritmii Ad [i]

Aceştia folosesc o reprezentare de tip întreg, componenta a i -


a, x[i ] , a unui cromozom fiind un întreg din intervalul [1, n − i + 1] . De
fapt, reprezentarea este de tip ordinal, în sensul că pe lângă vectorul x
se foloseşte şi o listă de obiecte; vectorul este decodificat prin
selectarea obiectului corespunzător din lista curentă. De exemplu,
pentru lista L = (1, 2, 3, 4, 5, 6) vectorul (4, 3, 4, 1, 1, 1) este decodificat
în următoarea secvenţă: 4, 3, 6 (deoarece 6 este al 4-lea element din
lista curentă după ce au fost eliminate elementele de pe poziţiile 4 şi
3), 1, 2 şi 5. Operatorii genetici acţionează ca în cazul general, cu mici
176
adaptări. De exemplu, mutaţia elementului de pe poziţia i va
determina înlocuirea acestuia cu un număr din intervalul [1, n − i + 1] .

Algoritmul de decodificare este următorul:

Algoritm decod (x )
begin
construct lista de obiecte L
i := 1
SumProfit := 0
SumPonderi := 0
while i ≤ n do
begin
j := x[i ]
elimină elementul aflat pe poziţia j în lista L
if SumPonderi + W [ j ] ≤ C then
begin
SumPonderi := SumPonderi + W [ j ]
SumProfit := SumProfit + P[ j ]
end
i := i + 1
end
end

În funcţie de modul de definire a procedurii construct există


două tipuri de algoritmi:
177
• Ad [1] , în care lista L este construită în mod aleator
• Ad [2], în care lista L se construieşte ordonând descrescător
elementele după raportul profit pondere ; de exemplu, x[i ] = 23 este
interpretat ca al 23-lea element (în ordinea descrescătoare a raportului
profit pondere ) din lista curentă.

7.8. Algoritmi genetici dezordonaţi

Algoritmii de acest tip au fost introduşi pentru a creşte


performanţele algoritmilor genetici prin păstrarea blocurilor în urma
aplicării operatorilor de evoluţie. Aşa cum am văzut, blocul este o
succesiune de gene (biţi) cu semnificaţie specială în cadrul
cromozomului. Pentru a evita distrugerea, legăturile dintre gene
trebuie să fie suficient de puternice în interiorul blocului.

Goldberg, Korb şi Deb [34] au propus o generalizare a


algoritmilor genetici, cunoscută sub numele de algoritmi genetici
dezordonaţi (messy genetic algorithms), care folosesc cromozomi de
dimensiune variabilă cu gene care pot fi aranjate în orice ordine; de
aici denumirea de dezordonaţi. Fiecare genă este reprezentată printr-o
pereche de forma (poziţia genei, valoarea genei). De exemplu,
cromozomul codificat binar

c = (1 0 0 1 0 )

se transformă în noua reprezentare în


178
c' = ((1, 1) (2, 0) (3, 0) (4, 1) (5, 0)) .

Această reprezentare are următoarele avantaje:

• ordinea perechilor poate fi schimbată fără ca semnificaţia


cromozomului să aibă de suferit

• se poate lucra cu informaţie incompletă, dată de absenţa unor


gene – fenomen numit subspecificare. În acest caz apare următoarea
întrebare: cum se evaluează un cromozom incomplet? Un posibil
răspuns este următorul: se asimilează acest cromozom cu cel complet
aflat cel mai aproape

• permite prezenţa multiplă a unei gene în cromozom, fenomen


numit supraspecificare; de exemplu, în cromozomul
c = ((1, 1) (2, 0) (3, 0 ) (4, 1) (3, 1))
gena de pe poziţia 3 apare de două ori cu valorile contradictorii 0 şi 1.

Acest conflict poate fi rezolvat în mai multe feluri; de exemplu, se ia


în consideraţie apariţia cea mai din stânga a genei.

Operatorii evolutivi utilizaţi de algoritmii genetici dezordonaţi


derivă din cel clasici.

Incrucişarea se desfăşoară astfel:

• în fiecare din cei doi părinţi se stabileşte câte un punct de


încrucişare care „taie” cromozomul în două subşiruri; cele două
puncte de încrucişare se aleg independent

• subşirurile obţinute anterior se „alipesc” în orice ordine sau


combinaţie pentru a obţine un nou individ
179
Fie cromozomii
x : a1a2 | b1b2 b3b4 şi y : c1c2 c3 | d1
unde simbolul „|” reprezintă punctul de încrucişare (taietură).
Prin încrucişare rezultă următorii descendenţi
a − d : a1a 2 | d1
a − c : a1a2 | c1c2 c3
c − a : c1c2 c3 | a1a2
c − b : c1c2 c3 | b1b2b3b4
d − a : d1 | a1a 2
d − b : d1 | b1b2 b3b4
d − c : d1 | c1c2 c3
b − a : b1b2 b3b4 | a1a2
b − c : b1b2 b3b4 | c1c2 c3
b − d : b1b2 b3b4 | d1
unde prin a, b, c şi d am notat subşirurile definite de punctele de
tăietură din cei doi cromozomi. Încrucişarea de acest tip implică şi un
anumit tip de inversiune: cromozomii b − a şi d − c se obţin inversând
subşirurile determinate de punctele de tăietură.

Mutaţia acţionează ca în cazul clasic, folosind oricare din


variantele utilizate în acest caz.

Diverse experimente [35] au scos în evidenţă faptul că


algoritmii dezordonaţi găsesc întotdeauna soluţia optimă chiar dacă
180
timpul de căutare creşte polinomial în raport cu numărul de variabile.

7.9. Algoritmi virali

Cunoscuţi şi sub numele de metoda VEGA (Virus –


Evolutionary Genetic Algorithm) , algoritmii virali au fost introduşi
[85] pentru a preveni convergenţa prematură generată de absenţa
diversităţii populaţiei. Algoritmii virali lucrează simultan cu două
populaţii:
• populaţia gazdă, care, la fel ca în cazul algoritmilor clasici,
reprezintă mulţimea soluţiilor posibile
• populaţia virală, care este o mulţime de subşiruri ale indivizilor
din populaţia gazdă; rolul său este de a realiza infecţia virală.

Un virus este un subşir ce conţine trei caractere {0, 1, ∗} şi are


aceeaşi lungime cu individul gazdă. Caracterele diferite de *
reprezintă informaţia transportată de virus.

Există doi operatori de infecţie virală:

• transcrierea inversă: virusul scrie informaţia sa peste cea a


individului gazdă pentru a genera un nou individ.
De exemplu,
individul gazdă 1 0 011
şi
virusul ∗1 0 ∗ 0
181
dau
un nou individ gazdă 11 01 0

• încorporarea, care are rolul de a genera noi viruşi şi se realizează


în două moduri:
- prin copierea într-un virus a unor gene dintr-un individ gazdă
infectat, folosind o probabilitate de copiere.
De exemplu,
virusul ∗1 0 ∗ 0
şi
individul gazdă 1 0 011
generează, prin copiere,
un nou virus 11 0 ∗ 0
- prin înlocuirea unor gene din virus cu caracterul *, folosind o
probabilitate de înlocuire.
De exemplu,
virusul ∗1 0 ∗ 0
generează, prin încorporarea de tip înlocuire,
un nou virus ∗ ∗ 0 ∗ 0

Fiecare virus i este caracterizat de puterea de infectare fitvi .


Notăm cu fithinit j şi fithfin j valorile fitness ale individului j
înainte şi respectiv după infectare. Îmbunătăţirea obţinută prin
infectarea individului j cu virusul i este
fitvi , j = fithfin j − fithinit j .
Acum puterea de infectare a virusului i se calculează ca fiind
182
fitvi = ∑ fitvi, j
j ∈S

unde S este mulţimea indivizilor gazdă infectaţi cu virusul i . Un alt


parametru important este rata de infecţie infri , care se defineşte prin
una din formulele
⎧(1 + α ) ⋅ infri ,t dacă fitvi > 0
infri ,t +1 = ⎨
⎩( 1 − α ) ⋅ infri ,t în caz contrar

⎧⎪α −1 ⋅ infri ,t dacă fitvi > 0


infri ,t +1 =⎨
⎪⎩α ⋅ infri ,t în caz contrar
unde α este un coeficient pozitiv iar t este numărul generaţiei. În
plus,
dacă infri , t +1 > Max _ rată
atunci infri , t +1 ← Max _ rată .
Fiecare virus are o putere de supravieţuire în generaţia următoare dată
de
lifei , t +1 = r ⋅ lifei , t + fitvi
unde r este rata de reducere a vieţii. După infectarea indivizilor
gazdă, viruşii evoluează prin încorporare:
• dacă fitvi > 0 , virusul evoluează prin operaţia de copiere
(extinderea încorporării) aplicată unui individ infectat
• dacă fitvi ≤ 0 , se execută operaţia de înlocuire (micşorarea
încorporării).
183
Lungimea unui virus se modifică în concordanţă cu
probabilitatea de încorporare Pinc . După calcularea puterii de viaţă,
dacă lifei , t +1 < 0 , virusul elimină un nou subşir dintr-un individ gazdă
infectat, selectat aleator (generarea încorporării). Infecţia virală se
desfăşoară conform schemei din figura de mai jos.

Algoritmul metodei VEGA este următorul:

Algoritmul VEGA
begin
iniţializare
repeat
selecţie
încrucişare
mutaţie
infecţie virală
înlocuire
until (condiţie terminare)
end.
184

SELECTIE
INDIVIZI GAZDA

INFECTIE

EVALUARE INDIVIZI GAZDA

CALCULEAZA fitvi

DA NU
IF fitv i > 0

CRESTE RATA DE DESCRESTE RATA DE


INFECTIE INFECTIE

CALCULEAZA lifei
CALCULEAZA lifei

NU
DA
IF life i

EXTIDE MICSOREAZA GENEREAZA


INCORPORAREA INCORPORAREA INCORPORAREA

Figura 7.1. Schema infecţiei virale


185

Prin iniţializare se generează aleator populaţia gazdă iar


indivizii de tip virus se obţin ca subşiruri ale indivizilor gazdă.
Arhitectura de bază a metodei se bazează pe modelul SSGA ( Steady-
State Genetic Algorithm) care înlocuieşte indivizii cei mai slabi cu o
pereche de descendenţi obţinuţi prin încrucişare şi mutaţie. După
infecţie, părintele va fi înlocuit cu individul virusat dacă fitnessul său
este mai bun decât al părintelui.

7.10. Algoritmul delta

Algoritmul delta are rolul de a îmbunătăţii performanţele


referitoare la timp şi precizie. Fiecare soluţie posibilă, reprezentată
printr-un vector x ∈ R n , are asociat un vector δ ∈ R n al perturbaţiilor
care pot îmbunătăţi soluţia curentă. Se lucrează cu două tipuri de
populaţii: cea a soluţiilor posibile şi cea a perturbaţiilor, ceea ce
impune câte un nivel de căutare pentru fiecare populaţie. Un
mecanism similar se întâlneşte şi la strategiile evolutive, dar în acest
caz cele două nivele sunt mai puţin separate.

Modul de lucru este dat de următorul algoritm.

Algoritmul delta
begin
• se iniţializează o populaţie de soluţii potenţiale
while (not condiţie terminare) do
186
begin
• se foloseşte un algoritm genetic (notat AGS) pentru a obţine o
soluţie x*
• se iniţializează o populaţie de perturbaţii aleatoare
• se foloseşte un algoritm genetic (notat AGP) pentru a obţine
perturbaţia optimă δ *
• se actualizează soluţia x* : x1* = x * + δ *
• se compară x * cu x1* şi se reţine soluţia mai performantă
end
end

În majoritatea implementărilor algoritmii genetici AGS şi AGP


sunt identici, din motive de simplitate. În anumite situaţii este mai
convenabil ca ei să fie diferiţi sau chiar să fie înlocuiţi (ambii sau doar
unu) cu strategii evolutive.

7.11. Studiul calitativ al algoritmilor


genetici

Algoritmii genetici, fiind algoritmi nedeterminişti, nu pot fi


studiaţi cu instrumentele specifice algoritmilor clasici. În general,
studiul agoritmilor evolutivi se face cu metode statistice [55], care
• evaluează acurateţea şi robusteţea algoritmului studiat
187
• compară performanţele a doi algoritmi genetici folosiţi pentru a
rezolva aceeasi problemă.

Prima direcţie implică studiul unor statistici ale uneia sau mai
multor variabile aleatoare, care dau informaţii cu privire la valoarea
medie a soluţiei optimale şi la robusteţea sa (constanţa aproximării în
rulări diferite). Generaţia n a unui algoritm genetic poate fi
interpretată ca fiind un eşantion al unei variabile aleatoare X n , pentru
care se pot lua în calcul diferite statistici t ( X n ) : fitnessul celui mai
bun cromozom, fitnessul mediu al populaţiei, etc. După k rulări ale
algoritmului (în condiţii identice) se obţin k valori (Y1 , L, Yk ) ale
variabilei Y = t ( X n ) . Pentru aceste valori se pot calcula:
k

∑Y i
• media: M = i =1
=Y
k
k

∑ (Y − M )
2
i
• dispersia: D 2 = i =1

k −1
• deviaţia standard: s = D 2
• intervalul de încredere pentru medie
• intervalul de încredere pentru dispersie.
Intervalul de încredere pentru medie se calculează cu statistica
Student cu k − 1 grade de libertate: intervalul de încredere pentru
media μ cu nivelul de încredere α este
⎡ a⋅s a⋅s⎤
⎢Y − ,Y + ⎥
⎣ k k⎦
188
unde a se obţine din tabelele distribuţiei Student astfel încât să fie
îndeplinită condiţia
⎛ Y −μ ⎞
P⎜⎜ − a < < a ⎟⎟ = α .
⎝ s k ⎠
Intervalul de încredere pentru dispersie se calculează cu
statistica χ k2−1 : pentru nivelul de încredere α şi valorile a şi b extrase
din tabelele distribuţiei χ k2−1 astfel încât
1−α 1−α
( )
P χ k2−1 > a =
2
(
şi P χ k2−1 < b =) 2
intervalul de încredere pentru dispersie este
⎡ (k − 1)D 2 (k − 1)D 2 ⎤
⎢ b
,
a ⎥.
⎣ ⎦

Pentru a rezolva o problemă dată se pot folosi diverşi algoritmi


genetici, diversitatea fiind determinată de: structura generală a
algoritmului, modul de codificare, populaţia iniţială, funcţia fitness,
condiţia de oprire, metoda de selecţie, operatorii genetici, valorile
parametrilor. În mod firesc, apare întrebarea: care este cel mai bun
algoritm genetic pentru rezolvarea unei probleme date? Se pot
comparea doi algoritmi genetici verificând ipoteze statistice cu privire
la medie şi dispersie.
Fie X şi Y variabilele aleatoare ce descriu evoluţia a doi
algoritmi genetici, ambele obţinute prin calcularea aceleeaşi statistici
(
în generaţia n : X = t ( X n ) , Y = t (Yn ) . Pentru k1 valori X 1 , L, X k1 )
( )
ale variabilei X şi k 2 valori Y 1 , L, Y k2 ale variabilei Y calculăm
189
k1 k2

∑Xi ∑Y i

X= i =1
, Y= i =1
,
k1 k2

SX =
1 k1

k1 − 1 i −1
(
Xi −X )2
, SY =
1 k2 i
∑ Y −Y
k 2 − 1 i −1
( )
2

S X −Y =
(k 1 )
− 1 S X2 + (k 2 − 1)SY2 1 1
+ .
k1 + k 2 − 2 k1 k 2
Asupra mediei, se verifică ipotezele:

H 0 : μ X = μ Y , care spune că cei doi algoritmi dau, în medie, aceleaşi


valori ale soluţiei optimale; deci nu există, din punct de vedere
statistic, o diferenţă de comportament între cei doi algoritmi.
H 1 : μ X ≠ μ Y , adică cei doi algoritmi dau, în medie, soluţii optimale
diferite pentru problema în discuţie.

Pentru verificarea acestor ipoteze se foloseşte statistica


(X − Y )− (μ X
− μY )
S X −Y
a cărei distribuţie este t k + k2 −2
. Pentru a verifica cele două ipoteze se
1

foloseşte algoritmul următor

Algoritmul: ipoteze asupra mediei

P1. Se stabileşte nivelul de încredere α , cu următoarea semnificaţie:


dacă ipoteza este adevărată atunci din 100 de teste, în 100(1 − α )
cazuri ipoteza poate fi respinsă
190
P2. Pentru nivelul de încredere α şi k1 + k 2 − 2 grade de libertate se
găseşte, din tabelele corespunzătoare statisticii t , valoarea a

P3. Se calculează valoarea t =


(X − Y ) − 0 , deoarece se verifică
S X −Y
ipoteza H 0 .
P4. Dacă − a < t < a atunci se acceptă ipoteza H 0 ; în caz contrar se
acceptă ipoteza H 1 .

Asupra dispersiilor se verifică ipoteze similare mediilor


H 0 : σ X2 = σ Y2 ,
H 1 : σ X2 ≠ σ Y2 ,
unde σ X2 şi σ Y2 sunt dispersiile corespunzătoare variabilei X şi
S X2
respectiv Y ; se foloseşte statistica care are distribuţia F cu
S Y2
(k1 − 1, k 2 − 1) grade de libertate. Se urmează paşii algoritmului
următor.

Algoritmul: ipoteze asupra dispersiei

P1. Se stabileşte nivelul de încredere α


P2. Pentru nivelul de încredere α şi gradele de libertate (k1 − 1, k 2 − 1)
se determină, din tabelele corespunzătoare distribuţiei F , valorile
a şi b astfel încât
1−α 1−α
P (F < a ) = şi P(F > b ) =
2 2
191
S X2
P3. Se calculează valoarea f = , prin raportarea dispersiei mai
S Y2
mari la cea mai mică
P4. Dacă a < f < b atunci se acceptă ipoteza H 0 ; în caz contrar se
acceptă ipoteza H 1 .

Acceptarea ipotezei H 0 spune că cei doi algoritmi au dispersii


statistic egale, deci sunt la fel de robuşti. Acceptarea ipotezei H 1
spune că dispersiile celor doi algoritmi sunt statistic diferite, deci cel
cu dispersia mai mică este mai robust.
Evident aceleaşi metode pot fi folosite pentru a compara orice
algoritmi evolutivi.

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