Documente Academic
Documente Profesional
Documente Cultură
i de mutaie p
m
; numrul de
gene (n reprezentare real) sau numrul de bii (n reprezentare binar) ai cromozomului.
Alegerea valorilor adecvate pentru parametrii respectivi nu este o sarcin uoar i cel
mai adesea se rezolv euristic, prin ncercri pe AG- ul folosit i problema analizat. O populaie
prea numeroas poate crea probleme de timp i memorie de calcul, pe cnd un numr limitat de
indivizi poate s nu fie reprezentativ pentru ntregul spaiu al soluiilor. Probabilitile de
ncruciare i mutaie pot s grbeasc convergena spre optime locale sau s ntrzie atingerea
unei soluii satisfctoare etc.
Operatorii
Cei trei operatori folosii n AG sunt selecia, ncruciarea i mutaia. Acetia vor fi
prezentai pe scurt n continuare. Datorit spaiului restrns, vom prezenta doar operatorii hibrizi,
cei clasici fiind deja bine cunoscui.
Selecia hibrid
Selecia reprezint pasul de supravieuire a celui mai bun, care selecteaz indivizi din
vechea populaie, n funcie de performana acestora, formnd un spaiu de mperechere sau o
generaie intermediar( baza genetic din care se va obine generaia urmtoare de soluii).
1. Selecia prin metoda roii de rulet:
Selecia roata de ruleta este cea mai cunoscuta metoda de selectare a cromozomilor prini,
cromozomi crora li se vor aplica operatorii genetici descrii mai jos.
Roata de ruleta cunoscut din jocurile de noroc este un cerc rotator mprit in 37-38
seciuni egale. Crupierul pune cercul n micare i arunc o bil in sensul opus micrii. Cnd
cercul se va opri din rotaie bila se oprete si ea intr-una din cele 37(38) seciuni.
Fiecare seciune a roii corespunde unui cromozom. Aadar, n cazul AG roata va fi
mprit n N seciuni(N este mrimea populaiei de cromozomi), dar care acum nu sunt egale,
ci limea fiecrei seciuni reprezint performana relativ a cromozomului respectiv(calitatea
61
cromozomului in cauza mprit la suma calitilor tuturor cromozomilor). Paii de realizare a
procedeului de selecie sunt:
a) Fie
( )
n
1 i
i T
x E E
- ajustarea intregii populatii,
( ) , E / x E p
T i i
'
1
]
1
+
cu t exprimat n zile.
Pe parcursul a dou zile s-au prelevat sistematic (din 3 n 3 ore) probe de ap din debitul
efluent i s-au determinat concentraiile de materie organic i respectiv de biomas bacterian
heterotrof. Rezultatele sunt trecute n urmtorul tabel:
t(ore) 0 3 6 9 12 15 18 21 24 27 30 33 36
B(mg/l
)
40.7
5
38.9 36.2 35 35.0
5
36.6 39 40.5 41 38.5 36.5 34.5 35
S(mg/l) 36.4 25 25.7 39 55.3 68.5 67 55 37 24.5 26 38.2 56
Se pune problema determinrii parametrilor caracteristici ai populaiei bacteriene (viteza
maxim de cretere, rata de dispariie, viteza consumului metabolic de substrat, factorul de
conversie biomas nou- substrat consumat, coeficientul de realimentare, constanta de
semisaturaie) din incint, tiind c domeniile n care se plaseaz de obicei aceste mrimi sunt:
[ ] [ ] [ ] ; h 0012 , 0 ; 0008 , 0 q ; h 03 , 0 ; 01 , 0 m ; h 3 , 0 ; 1 , 0
1 1 1
max
[ ] [ ] [ ] l / mg 120 ; 80 K ; gS / gB 5 , 2 ; 5 , 1 n ; gS / gB 6 , 0 ; 4 , 0 f
S
65
0.00
10.00
20.00
30.00
40.00
50.00
60.00
70.00
80.00
0.00 5.00 10.00 15.00 20.00 25.00 30.00 35.00 40.00
Schematiznd incinta ca un bazin de reacie cu amestec continuu, evoluiile de
concentraie de materie organic (substrat) S i a concentraiei populaiei bacteriene B sunt
descrise de ecuaiile:
'
+
+
+
+
mBV BV
K S
S
QB
dt
dB
V
qBV BV
n
m
BV
K S
S
f
QS QS
dt
dS
V
s
max
s
max
a
(1)
unde V este volumul bazinului, Q- debitul tranzitat, max- viteza de cretere bacterian, m-
viteza de dispariie, q- viteza de consum metabolic, f- factorul de conversie, n- coeficientul de
realimentare cu substrat metabolizabil din biomasa moart i Ks- constanta de semisaturaie n
cinetica de tip Monod.
Notand k=
V
Q
-ecuaiile (1) devin:
'
+
+
+
+
mB B
K S
S
kB
dt
dB
qB B
n
m
B
K S
S
f
kS kS
dt
dS
s
max
s
max
a
(2)
unde s-a admis ca debitul afluent nu aduce aport de bacterii heterotrofe.
66
Trebuie aflate valorile parametrilor
s max
K , n , f , q , m ,
astfel incat integrand ecuatiile (2), cu
conditiile initiale pentru S si B de la t=0 din tabel sa se obtina valori cat mai apropiate de datele
gasite experimental la momentele de prelevare 3,6,,36 h.
Se alege criteriul de optimizare
( ) ( ) ( )
'
1
]
1
+
12
1 i
2
m c
12
1 i
2
m c 1 max
i i i i
B B S S
12
1
K ,..., F min
(3)
sau
( )
'
1 max
K ,..., F
1
max
, unde
c c
B , S
sunt valorile calculate, iar
m m
B , S - cele masurate.
Ecuatiile (2) se integreaza cu Runge-Kutta de ordinul 4
( )
( )
'
2 1 2
2
2 1 1
1
C , C , t f
dt
dC
C , C , t f
dt
dC
cu conditiile initiale
( )
10 1
C 0 t C
;
( )
20 2
C 0 t C
La t t t
k 1 k
+
+
:
( )
14 13 12 11 k 1 1 k 1
k k 2 k 2 k
6
1
C C + + + +
+
( )
24 23 22 21 k 2 1 k 2
k k 2 k 2 k
6
1
C C + + + +
+
unde ( )
k 2 k 1 k i 1 i
C , C , t f t k pt. i=1,2
,
_
+ +
+
2
k
C ,
2
k
C ,
2
t
t f t k
21
k 2
11
k 1 k i 2 i
pt. i=1,2
,
_
+ +
+
2
k
C ,
2
k
C ,
2
t
t f t k
22
k 2
12
k 1 k i 3 i
pt. i=1,2
( )
23 k 2 13 k 1 k i 4 i
k C , k C , t t f t k + + +
pt. i=1,2
Integrarea se face cu pasi min 20 t , dar rezultatele calculate se pastreaza din 3 in 3 ore (cu
pasul din tabel).
2.2 Modelarea problemei cu Algoritmi Genetici
67
Pentru a transpune problema determinrii parametrilor cineticilor de cretere/ epuizare n
termenii algoritmilor genetici, este necesar s se imagineze un cromozom(individ)-soluie care s
reprezinte ansamblul celor ase parametri, de-a lungul pailor de timp ai analizei.
Modelele matematice n care se adapteaz principiul de lucru al AG la
particularitile concrete ale unei probleme date dintr-un domeniu tiinific sau tehnic oarecare,
se numesc generic modele evoluioniste (Michalewicz, 1994). Ele au avantajul c nu necesit
modificarea formei iniiale a problemei de rezolvat astfel nct s devin abordabil prin AG
clasici (cu codificare binar, folosind repetat decodarea pentru evaluarea funciei de ajustare i
apelnd la operatorii genetici valabili pentru acest tip de reprezentare). Dimpotriv, n
programele evoluioniste hibride problema de rezolvat rmne neschimbat, iar AG se adapteaz
specificului acestei probleme (ca variant de reprezentare genetic, manier de identificare a
domeniului soluiilor posibile, definirea funciei de evaluare etc).
Pentru analiza problemei formulate n subparagraful precedent (2.1) cu ajutorul
AG, s-a realizat un model evoluionist hibrid, ale crui particulariti aparinnd de AG sunt
urmtoarele:
O soluie posibil (cromozom) este format din variabilele de decizie (genele) prezentate
anterior ca necunoscute.
Reprezentarea cromozomial pentru valorile necunoscutelor s-a ales n numere reale,
deoarece acestea pot lua orice numr din domeniul de apartenen (asimilat din literatura de
specialitate).
Programul produce populaia iniial genernd aleatoriu valori ale necunoscutelor,
ncadrate n domeniile mai sus menionate. Se genereaza o populatie initiala de solutii posibile,
generand aleatoriu valori pentru cele 6 variabile
i
x :
i
x
max 1
x m x
2
q x
3
f x
4
n x
5
1 6
K x
,
_
i 7
1
x
inf
i
2,4 0,24 0,0192 0,4 1,5 80
,
_
i 7
1
x
sup
i
7,2 0,72 0,0288 0,6 2,5 120
Cu schema ( )
inf
i
sup
i
inf
i i
x x random x x + , i=1..6
Experiena de calcul a demonstrat c n problema analizat, selecia prin ordonare
geometric normalizat produce o baz genetic avantajoas pentru formarea generaiei
urmtoare, dar s-au efectuat rulri i cu selecia competiional.
Funcia de evaluare: Cu fiecare set
{ }
j i
6 , 1 i , x
se integreaza sistemul (2) rezultand
performanta
{ }
j i j
j
x F
1
cu (3) , pt. j=1..120 indivizi
Ca operator genetic de ncruciare programul folosete ncruciarea aritmetic, deci
combinarea liniar a soluiilor-prini, prin intermediul unui coeficient a ntre 0 i 1 care se
genereaz aleator. n acest fel, soluiile copii obinute prin ncruciare aparin domeniului
soluiilor admisibile. Probabilitatea de ncruciare s-a ales (n mod arbitrar i din experiena
rulrilor) 85%.
68
Operatorul de mutaie considerat adecvat n cazul de fa este mutaia neuniform de
parametru b cu o probabilitate de 5%. Datorit specificului problemei, s-a exclus folosirea
mutaiei la frontier, deoarece salturile mari ar fi putut omite soluii viabile.
Criteriul de oprire al analizei s-a fixat numrul maxim de generaii parcurse. Totui,
momentul opririi depinde si de utilizator, fiind implementat o rutin care ntreab din 2000 n
2000 de generaii dac este solicitat continuarea. Populatia initiala este apoi prelucrata de AG in
generatii succesive. Fiecare solutie copil implica integrarea lui (2) si calculul lui (3)
2.3 Prezentarea programului de calcul
Programul de calcul a fost implementat n Turbo Pascal (cu suport Borland Delphi 6) datorit
uurinei n implementare i a familiarizrii prealabile cu limbajul. Acest aspect nu influeneaz
cu nimic modul de funcionare i rulare a programului. Sursa programului, listat integral mai
jos, este inspirat din secvenele de program publicate de Goldberg (1989), dar adaptate pentru
AG hibrizi.
Listingul programului:
program ag;
{$APPTYPE CONSOLE}
uses
SysUtils;
{ Algoritm genetic cu reprezentare cromozomiala in numere reale pentru
determinarea parametrilor cineticilor de crestere/descompunere la
tratarea biologica a apelor uzate
Parametrii necunoscuti: viteza maxima de crestere; viteza de deces;
rata consumului metabolic; factorul de conversie in biomasa;
coeficientul de realimentare si constanta de semisaturatie
Criteriu: max( f(x=paramm)=1.0 / Suma patratelor diferentelor medii
intre substrat si masa bacteriana calculate si respectiv masurate
Foloseste: selectia prin ordonare geometrica normalizata,
incrucisarea euristica
mutatia neuniforma }
const maxpop=100; { Dimensiunea maxima a populatiei }
maxgene=50; { Numarul maxim de gene/variabile in cromozom }
type gene=array[1..maxgene] of real;
ivect=array[1..maxpop] of integer;
vect=array[1..maxpop] of real;
individ = record
x:gene; { fenotip=valori gene cromozom (numere reale) }
ajust,acros:real; { valoarea functie ajustare si acros }
parinte1,parinte2:integer; { parintii }
end;
populatie=array[1..maxpop] of individ;
var popv,popn:populatie; { doua populatii distincte: cea veche si noua }
dimpop,gen,maxgen,ngene,dimpm1:integer; {variabile globale intregi }
pcros,pmut,sumajust:real; {variabile globale reale }
nmut,ncros,i,crmax:integer; { intregi pentru statistica }
medie,max,min,maxglob:real; { reali pentru statistica }
paropt,limi,lims:gene;
69
fmic,sump:vect; iord:ivect;
frez:text; opt:char; numep:string[20];
{ variabile specifice problemei analizate: }
ndat:integer;
kqpv,miux,mort,qmet,fact,creal,ksemi:real;
smas,bmas:array[0..50] of real;
{ dimpop = dimensiune populatie ( <= maxpop )
ngene = numar de gene/variabile ( <= maxgene )
gen, maxgen = contor generatii, numar maxim de generatii
pcros, pmut = probabilitati de incrucisare si mutatie
nmut, ncros = contori pentru mutatii si incrucisari
medie, max, min = valori med.,max.si min.a fctiei de ajustare pe gener.
maxglob= Fctia de ajust.maxima ptr.solutia cea mai buna din toate gener.
fmic = valoarea functiei de evaluare (de maximizat) ptr.un cromozom
paropt = parametrii optimi la care se obtine maxglob
limi, lims = limitele inferioare/superioare ale valorilor genelor
dlim = domenii admise pentru valorile genelor }
Procedure FUNCTII(t,b,s:real; var bt,st:real);
{ Calculeaza membrii drepti ai sistemului de ec.diferentiale
pentru valori t, B si S specificate : }
var sa:real;
begin
{ Safl. = } sa:=150*(1+sin(Pi*(3-4*t)/2));
{ dB/dt = } bt:=b*(miux*s/(s+ksemi)-mort-kqpv);
{ dS/dt = } st:=kqpv*(sa-s)+b*(mort/creal-qmet-miux*s/fact/(s+ksemi));
end;
Procedure RK4sist2(h:real; var x,u,v:real);
{ Integreaza pe un pas h=dx, in raport cu x, un sistem de
2 ec.diferentiale cu variabilele dependente u si v - metoda RK IV }
var u1,v1,u2,v2,u3,v3,u4,v4:real;
begin
{ Calculeaza coeficientii u1, v1, ... ,v4 : }
Functii(x,u,v,u1,v1);
Functii(x+h/2,u+h/2*u1,v+h/2*v1,u2,v2);
Functii(x+h/2,u+h/2*u2,v+h/2*v2,u3,v3);
Functii(x+h,u+h*u3,v+h*v3,u4,v4);
{ Actualizeaza valorile vechi la cele noi de pe pasul de calcul : }
u:=u+h*(u1+2*u2+2*u3+u4)/6;
v:=v+h*(v1+2*v2+2*v3+v4)/6;
x:=x+h;
end;
Procedure INITIALIZARE;
var fdat:text; i,j,n,k:integer; qmic,qm1,coef,pc:real;
begin
{ Introduce datele de intrare :
- dimpop = talia populatiei
- maxgen = numar generatii de parcurs
- pcros = probab.de incrucisare (nr.mediu de incr.pe generatie
=dimpop/2*pcros )
- pmut = probab.de mutatie (nr.mediu de gene mutate pe generatie
= dimpop*ngene*pmut ) }
dimpop:=80; dimpm1:=dimpop-1; maxgen:=12000;
pcros:=0.9; pmut:=0.05;
qmic:=0.08; { probabilitatea asociata celui mai bun individ }
qm1:=1-qmic; coef:=qmic/(1-exp(dimpop*ln(qm1)));
pc:=coef; sump[1]:=pc;
for i:=2 to dimpop do
begin { Calc.probab.cumulate ptr.ordonarea geometrica normalizata }
70
pc:=pc*qm1; sump[i]:=sump[i-1]+pc;
end;
randomize;
{ Citeste datele problemei fizice dintr-un fisier : }
assignfile(fdat,'an2p2.dat'); reset(fdat);
readln(fdat,ndat,ngene,kqpv);
for i:=0 to ndat do read(fdat,bmas[i]); readln(fdat);
for i:=0 to ndat do read(fdat,smas[i]); readln(fdat);
for i:=1 to ngene do readln(fdat,limi[i],lims[i]);
closefile(fdat);
{- ndat = numar perechi date masurate ( cele de la i=0 - cond.initiale)
- ngene= numar necunoscute in problema
- kqpv = raportul debit / volum
- smas(i) - S masurat la momentul i (mg/l)
- bmas(i) - B masurat (mg/l)
- limi(i) - limita inferioara pentru domeniul genei i
- lims(i) - limita superioara}
end;
Procedure OPERARE(par:gene; var fobj:real);
{ Integreaza ec.diferentiale cu conditiile initiale
Smas(0) si Bmas(0) pentru un set de valori ale genelor
(in ordinea: vit.crestere, vit.deces, vit.consum metab.,
factor conversie, coef.realim., si const.semisat. )
Calculeaza functia de performanta }
var i,j:integer;
t,dt,b,s,dsmed,dbmed:real;
bc,sc:array[1..50] of real;
Begin
fobj:=0;
miux:=par[1]; mort:=par[2]; qmet:=par[3];
fact:=par[4]; creal:=par[5]; ksemi:=par[6];
t:=0; dt:=1.0/72; { initializare timp si pas dt (in zile )}
{ conditii initiale: }
b:=bmas[0];
s:=smas[0];
i:=0; j:=0;
repeat
i:=i+1; RK4sist2(dt,t,b,s);
{ retine valorile calculate din 3 in 3 ore }
if (i mod 9) = 0 then
begin
j:=j+1; bc[j]:=b; sc[j]:=s;
end;
until t >= 1.5;
dsmed:=0; dbmed:=0;
for i:=1 to ndat do
begin
dsmed:=dsmed+sqr(smas[i]-sc[i]);
dbmed:=dbmed+sqr(bmas[i]-bc[i]);
end;
dsmed:=dsmed/ndat; dbmed:=dbmed/ndat;
fobj:=1.0/(dsmed+dbmed);
end;
Procedure SOLOPT(par:gene);
{ Reface integrarea pentru solutia optima
si o inscrie in fisierul de rezultate
}
71
var i,j:integer;
t,dt,b,s,dsmed,dbmed,fobj:real;
bc,sc,tc:array[0..50] of real;
Begin
fobj:=0;
miux:=par[1]; mort:=par[2]; qmet:=par[3];
fact:=par[4]; creal:=par[5]; ksemi:=par[6];
t:=0; dt:=1.0/72; { initializare timp si pas dt (in zile )}
{ conditii initiale: }
b:=bmas[0];
s:=smas[0];
i:=0; j:=0;
tc[0]:=0; bc[0]:=b; sc[0]:=s;
repeat
i:=i+1; RK4sist2(dt,t,b,s);
{ retine valorile calculate din 3 in 3 ore }
if (i mod 9) = 0 then
begin
j:=j+1; bc[j]:=b; sc[j]:=s; tc[j]:=t;
end;
until t >= 1.5;
dsmed:=0; dbmed:=0;
for i:=1 to ndat do
begin
dsmed:=dsmed+sqr(smas[i]-sc[i]);
dbmed:=dbmed+sqr(bmas[i]-bc[i]);
end;
dsmed:=dsmed/ndat; dbmed:=dbmed/ndat;
fobj:=1.0/(dsmed+dbmed);
writeln(frez);
writeln(frez,' Rezultate pentru solutia finala:');
writeln(frez,'Timp(zile) B mas. / calc. S mas. / calc.');
for i:=0 to ndat do
writeln(frez,tc[i]:8:2,bmas[i]:10:2,bc[i]:7:2,smas[i]:8:2,sc[i]:7:2);
writeln(frez);
writeln(frez,'Suma dif.medii patratice:',(dsmed+dbmed):10:4);
writeln(frez,'Functie performanta :',fobj:10:2);
end;
Procedure POPINIT;
{ Initializeaza aleator o populatie de solutii posibile }
var j,j1:integer;
begin
for j:=1 to dimpop do with popv[j] do
begin
for j1:=1 to ngene do
x[j1]:=limi[j1]+random*(lims[j1]-limi[j1]);
OPERARE(x,fmic[j]);
{ for j1:=1 to ngene do writeln(x[j1]:9:3);
writeln('fmic=',fmic[j]:10:3);
readln;}
end;
for j:=1 to dimpop do with popv[j] do
begin { retine valoarea fctiei de evaluare a indivizilor }
ajust:=fmic[j]; acros:=0.0; parinte1:=0; parinte2:=0;
end;
72
end;
Procedure ANALIZA(var pop:populatie);
{ Determina parametrii statistici ai populatiei: valoarea medie
a fctiei de ajustare; cea mai mare si cea mai mica pe generatie }
var i,j,k:integer;
begin
sumajust:=0; min:=100000; max:=0; { medie:=0;}
for j:=1 to dimpop do with pop[j] do
begin
sumajust:=sumajust+ajust; { medie:=medie+ajust/dimpop;}
if ajust > max then
begin
max:=ajust; crmax:=j;
end;
if ajust < min then min:=ajust;
if ajust > maxglob then
begin { Retine individul cel mai performant din toate generatiile}
maxglob:=ajust; for i:=1 to ngene do paropt[i]:=x[i];
end;
end;
medie:=sumajust/dimpop;
{ writeln('medie=',medie:12:2); readln;}
end;
Procedure SORTARE(var pop:populatie; var isir:ivect);
{ Determina in isir rangul fiecarui individ din populatia
sortata descrescator;
in vectorul sir se gasesc si valorile functiei de ajustare
reordonate - inutil pentru A.G. ! }
var i,j,ii,k:integer; sir:vect; maxim:real;
begin
for i:=1 to dimpop do with pop[i] do
begin
sir[i]:=ajust; isir[i]:=i;
end;
for i:=1 to dimpm1 do
begin
maxim:=sir[i]; ii:=isir[i]; k:=i;
for j:=i+1 to dimpop do
if sir[j] >= maxim then
begin
maxim:=sir[j]; ii:=isir[j]; k:=j;
end;
sir[k]:=sir[i]; sir[i]:=maxim; isir[k]:=isir[i]; isir[i]:=ii;
end;
end;
Function FLIP(prob:real):boolean;
{ Returneaza TRUE cu o probabilitate prob data }
var r:real;
begin
r:=random;
if r <= prob then flip:=true
else flip:=false;
end;
Function SELGEOM:integer;
{ Alege un individ prin ordonare geometrica normalizata
sump(i) contine probabilitatile cumulate ale primilor i cei mai buni
indivizi; iord(i) contine pozitia in populatie a individului de rang i }
var prob:real; j:integer;
begin
73
prob:=random; j:=0;
repeat
j:=j+1;
until sump[j] >= prob;
selgeom:=iord[j];
end;
Function MUTNEU(i:integer; valv:real):real;
{ Realizeaza mutatia NEUNIFORMA de parametru bmic
forma Houck ptr. fg=(r2*(1-t/tmax))**b este folosita aici;
forma Michalewicz pag.103 ptr. fg=1-r**(1-t/tmax)**b difera de asta !! }
const bmic=1.75;
var r1,r2,fg:real;
begin
r1:=random; r2:=random;
if (r2 > 0) and (gen < maxgen) then
fg:=exp(bmic*ln(r2*(1-gen/maxgen)))
else fg:=0;
if r1 < 0.5 then mutneu:=valv+fg*(lims[i]-valv)
else mutneu:=valv-fg*(valv-limi[i]);
end;
Procedure CROSARIT(var parinte1,parinte2,copil1,copil2:gene; var a:real);
var j:integer; cop1,cop2:real;
begin
if FLIP(pcros) then
begin
a:=random; ncros:=ncros+1;
end
else a:=1;
for j:=1 to ngene do
begin
cop1:=a*parinte1[j]+(1-a)*parinte2[j];
if FLIP(pmut) then
begin
nmut:=nmut+1; cop1:=MUTNEU(j,cop1);
end;
copil1[j]:=cop1;
cop2:=(1-a)*parinte1[j]+a*parinte2[j];
if FLIP(pmut) then
begin
nmut:=nmut+1; cop2:=MUTNEU(j,cop2);
end;
copil2[j]:=cop2;
end;
end;
Procedure CROSEUR(var parinte1,parinte2,copil1,copil2:gene; var a:real);
{ Incrucisare euristica (vezi Houk ):
extrapoleaza parintele cu functia de ajustare mai mare (parinte1)
Daca nu se depasesc limitele genelor la copilul extrapolat, al doilea
copil va fi primul parinte
Daca dupa 5 incercari de extrapolare nu se incadreaza in limite,
se pastreaza copil1=parinte1 si copil2=parinte2.
Dupa incrucisare se aplica operatorul de mutatie }
var irep,j:integer; klim:boolean; cop1,cop2:real;
begin
irep:=0;
repeat
irep:=irep+1; klim:=true; a:=random; j:=0;
repeat
j:=j+1;
copil1[j]:=parinte1[j]+a*(parinte1[j]-parinte2[j]);;
74
if (copil1[j] < limi[j]) or (copil1[j] > lims[j]) then klim:=false;
until (j = ngene) or (klim = false);
until (klim) or (irep = 5);
if klim = false then
begin
for j:=1 to ngene do
begin
copil1[j]:=parinte1[j]; copil2[j]:=parinte2[j];
end;
end
else
for j:=1 to ngene do copil2[j]:=parinte1[j];
{ Urmeaza mutatiile }
for j:=1 to ngene do
begin
if FLIP(pmut) then
begin
cop1:=copil1[j]; nmut:=nmut+1;
cop1:=MUTNEU(j,cop1); copil1[j]:=cop1;
end;
if FLIP(pmut) then
begin
cop2:=copil2[j]; nmut:=nmut+1;
cop2:=MUTNEU(j,cop2); copil2[j]:=cop2;
end;
end;
end;
Procedure GENERATIE;
{ Creeaza o noua generatie prin selectie, incrucisare si mutatii
Incrucisarea presupune dimpop = numar par }
var j,par1,par2:integer; amic,xx:real;
begin
j:=1;
repeat
{ Alege cei doi parinti : }
par1:=SELGEOM; par2:=SELGEOM;
{ Efectueaza incrucisarea si mutatia ( inclusa in aceiasi procedura)
if popv[par1].ajust > popv[par2].ajust then
CROSEUR(popv[par1].x,popv[par2].x,popn[j].x,popn[j+1].x,amic)
else CROSEUR(popv[par2].x,popv[par1].x,popn[j].x,popn[j+1].x,amic);}
CROSARIT(popv[par1].x,popv[par2].x,popn[j].x,popn[j+1].x,amic);
with popn[j] do
begin
OPERARE(x,fmic[j]);
parinte1:=par1; parinte2:=par2; acros:=amic;
end;
with popn[j+1] do
begin
OPERARE(x,fmic[j+1]);
parinte1:=par1; parinte2:=par2; acros:=amic;
end;
j:=j+2;
until j > dimpop;
for j:=1 to dimpop do with popn[j] do ajust:=fmic[j];
{ for j:=1 to dimpop do
begin
writeln(j:3,fmic[j]:15:2);
if (j mod 20)=0 then readln;
end;}
end;
BEGIN { Program principal }
75
INITIALIZARE;
gen:=0; maxglob:=0;
{ Initializeaza nr.de generatii si ajustarea ptr.cel mai bun din toate}
nmut:=0; ncros:=0;
POPINIT; ANALIZA(popv); SORTARE(popv,iord);
repeat
gen:=gen+1; { Creiaza o noua generatie :}
{ write('Generatie=',gen:3);}
GENERATIE;
{ Analizeaza noua generatie: Fctia de ajustare maxima,minima si medie:}
ANALIZA(popn); { writeln(maxglob:12:1,medie:10:2);}
SORTARE(popn,iord); popv:=popn;
opt:='Y';
if (gen mod 2000) = 0 then
begin
writeln('Continui rularea (Y/N) ?:'); read(opt);
end;
if (gen mod 100)=0 then
begin
writeln(gen:6,maxglob:12:6,medie:15:6); { readln;}
end;
until (gen >= maxgen) or (opt = 'N');
{ Afiseaza solutia cea mai buna :}
write('Da nume fisier cu rezultate:'); readln(numep);
assignfile(frez,numep); rewrite(frez);
writeln('Maxglobal=',maxglob:10:1,' Parametrii :');
for i:=1 to ngene do writeln('param.opt[',i:2,']=',paropt[i]:8:3);
writeln(frez,'Dimens.populatie:',dimpop:3,'; Generatii parcurse/impuse:',
gen:4,' / ',maxgen:5);
writeln(frez,'Probabilitati incrucisare/mutatie:',pcros:6:3,' / ',
pmut:6:3);
writeln(frez,'Valoare fctie obj. :',maxglob:10:1);
writeln(frez,'Valori optime gene:');
for i:=1 to ngene do
begin
write(frez,paropt[i]:7:3);
if (i mod 4) = 0 then writeln(frez);
end;
SOLOPT(paropt);
closefile(frez);
END.
n prima parte a listing-ului se declar unele tipuri de variabile precum i variabilele
globale. Dintre acestea doar ultimele dou linii de variabile sunt specifice problcmei analizate,
restul fcnd parte din structura AG i fiind vaiabile pentru orice alt problem. Unele dintre
variabile sunt explicate n corpul programuui, prin comentarii.
Procedura INITIALIZARE fixeaz parametrii de control ai AG pentru rulaea curent i
calculeaz probabilitile cumulate necesare metodei de selecie utilizat aici. n continuare se
introduc datele de intrare ale problemei particulare de rezolvat. Acestea se preiau dintr-un fiier
al crui nume este specificat n procedur. De asemenea, se mai precizeaz o serie de elemente
necesare n rezolvare, n acord cu problema concret. Se deduce faptul c aceast procedur
trebuie ajustat n funcie de problema analizat.
Urmtoarele dou proceduri OPERARE i SOLOPT sunt i ele specifice fiecrui caz de
studiu. n procedura OPERARE se calcuteaz valoarea funciei de evaluare pentru o soluie
oarecare a problemei. SOLOPT stocheaz ntr-un fiier (al crui nume se solicit la
rulare) rezultatele referitoare la soluia optim.
Toate celelalte proceduri, ca i programul principal, sunt specifice AG folosit n lucrare.
76
Cu excepia unor mici ajustri, ele rmn neschtmbate n orice alta problem de minimizare care
se abordeaz prin acest AG. Pe scurt, aceste proceduri i funcii realizeaz urmtoarele:
POPINIT crceaz populaia iniial, genernd aleatoriu valori pentru gene din domeniile
permise i reinnd doar acei indivizi pentru care funcia de evaluare rezult nenegativ (acetia
avnd ansa de a respecta mai fidel toate restriciile).
ANALIZA face analiza statistic a unei populaii, determinnd valorile minim, medie i
maxim ale funciei de evaluare pe generaia respectiv; de asemenea, se depisteaz i se reine
individul cel mai performant ntlnit pn la generaia curent inclusiv. Cu excepia ultimei
funcii, celelalte analize nu sunt strict necesare n AG. Ele se realizeaz doar pentru a putea
urmri, dac se dorete, evoluia rezolvrii.
SORTARE este necesar metodei de selecie considerat, ea determinnd rangul iniial al
fiecrui individ din populaia ordonat descresctor (ca valoare a funciei de evaluare).
FLIP o funcie boolean care ntoarce valoarea TRUE dac la apelarea ei se genereaz un
numr aleatoriu din domeniul (O; 1) mai mic dect o probabilitate specificat; servete la
realizarea sau nu a operaiilor genetice asupra unor soluii prini sau copii.
SELGEOM alege aleatoriu individul care trece n baza genetic din care se va realiza
generaia viitoare. mpreun cu instruciunile corespunztoare din INITIALIZARE (necesare o
singur dat) i cu procedura SORTARE, aceast funcie transpune procedeul de selecie prin
ordonare geometric normahzat.
MUTNEU realizeaz operaia de mutaie neuniform asupra genei, creia i schimb valoarea
de la valv la inutneu.
CROSEUR efectueaz operaia de ncruciare euristic a dou soluii prini pentru a crea
dou soluii copii. Avnd n vedere c acest tip de ncruciare se poate solda cu nerealizarea
unei soluii copil mai performante (i deci cu transferul prinilor n noua generaie),
instruciunile care aplic probabilitatea de incruciare s-au eliminat din corpul procedurii, iar
acest parametru al AG este practic inoperant. n schimb, dup efectuarea ncrucirii (sau
transferul soluiilor prini) se aplic operatorul de mutaie asupra genelor noilor soluii dac
funcia FLIP rspunde TRUE la probabilitatea pmut specificat.
GENERATIE dirijeaz procesul de realizare a unei noi generaii prin alegerea aleatoare a
dou soluii prini, incruciarea acestora cu cel mai valoros printe pe prima poziie de
intrare n procedura CROSEUR i evaluarea noilor soluii. Operaiile se repet pn la realizarea
taliei dorite a populaiei. i aceast procedur conserv date care nu sunt strict necesare
funcionrii AG, dar pot fi interesante pentru alte analize (de exemplu, numerele de ordine ale
prinilor care au generat o soluie copil, parametrul aleatoriu r din relaia cu care s-a
construit soluia copil extrapolat etc.).
Se afieaz la fiecare generaie valoarea medie pe generaie a funciei de evaluare i
valoarea maxim gsit pn la generaia respectiv inclusiv. Rularea poate fi oprit opional din
2000 n 2000 de generaii dac nu se mai dorete atingerea numrului maxim de generaii
specificat n INITIALIZARE.
n partea final a programului se afieaz soluia optim gsit i se pstreaz rezultatele
ntr-un fiier al crui nume se specific la rulare.
2.4 Rezultate numerice
Programul evoluionist descris mai sus a fost rulat cu datele de intrare prezentate n
subparagraful 2.1. Sunt prezentate n continuare dou soluii suboptimale posibile.
77
Primul set de date a fost obinut prin ntreruperea programului dup primele 8000 de generaii.
Dimens.populatie: 80; Generatii parcurse/impuse:8000 / 12000
Probabilitati incrucisare/mutatie: 0.900 / 0.050
Valoare fctie obj. : 5.0
Valori optime gene:
4.750 0.480 0.021 0.498
1.913 98.712
Rezultate pentru solutia finala:
Timp(zile) B mas. / calc. S mas. / calc.
0.00 40.75 40.75 36.40 36.40
0.13 38.90 38.84 25.00 24.72
0.25 36.20 36.27 25.70 25.76
0.38 35.00 34.77 39.00 38.46
0.50 35.05 35.00 55.30 55.84
0.62 36.60 36.63 68.50 68.09
0.75 39.00 38.88 67.00 67.74
0.87 40.50 40.62 55.00 54.59
1.00 41.00 40.70 37.00 36.61
1.12 38.50 38.81 24.50 24.87
1.25 36.50 36.27 26.00 25.86
1.37 34.50 34.78 38.20 38.53
1.50 35.00 35.01 56.00 55.88
Suma dif.medii patratice: 0.1991
Functie performanta : 5.02
Al doilea set a fost obinut prin rularea a 12000 de generaii.
Dimens.populatie: 80; Generatii parcurse/impuse:12000 / 12000
Probabilitati incrucisare/mutatie: 0.900 / 0.050
Valoare fctie obj. : 5.0
Valori optime gene:
4.765 0.458 0.019 0.494
2.010 101.416
Rezultate pentru solutia finala:
Timp(zile) B mas. / calc. S mas. / calc.
0.00 40.75 40.75 36.40 36.40
0.13 38.90 38.85 25.00 24.72
0.25 36.20 36.30 25.70 25.75
0.38 35.00 34.81 39.00 38.46
0.50 35.05 35.02 55.30 55.83
0.62 36.60 36.65 68.50 68.07
0.75 39.00 38.88 67.00 67.72
0.87 40.50 40.60 55.00 54.58
1.00 41.00 40.67 37.00 36.62
1.12 38.50 38.80 24.50 24.88
1.25 36.50 36.27 26.00 25.87
1.37 34.50 34.79 38.20 38.54
1.50 35.00 35.02 56.00 55.89
Suma dif.medii patratice: 0.1984
Functie performanta : 5.04
2.5 Concluzii
Acest exemplu demonstreaz calitile AG n rezolvarea problmelor dificile de mediu (i nu
numai). Chiar dac abordarea prin AG nu garanteaz obinerea soluiei optime globale, ea
ncadreaz soluiile sale ntr-o vecintate foarte restrns a acesteia. Acest lucru este garantat de
principiul de funcionare al AG.
78
BIBLIOGRAFIE
Goldberg, D. E. (1989)- Genetic algorithms in search, optimization and machine learning,
Addison-Wesley, Mass;
Michalewicz, Z (1992)- Genetic algorithms+ data structures= evolution programs, Springer-
Verlag, NY;
Popa, R, Popa, B. (2003)- Optimizarea exploatrii amenajrilor hidrotehnice, Editura Tehnic,
Bucureti
Popa, R.(1998)- Modelarea calitii apei din ruri, Editura HGA, Bucureti
79