Sunteți pe pagina 1din 7

Laborator CF&CE

Problema reginelor

Student: Grigore Petre – Catalin


Grupa: MS2
Operatorul de recombinare, denumit şi operator de încrucişare sau crossover operator în
terminologia englezească, permite generarea de noi indivizi printr-un proces de încrucişare
între indivizii populaţiei intermediare rezultată prin selecţie, proces care imită încrucişarea
naturală. De regulă se utilizează o procedură de încrucişare de tipul (2-2), adică din doi părinţi
se vor obţine doi descendenţi/urmaşi. Încrucişarea realizează un schimb de informaţie între cei
doi părinţi şi, prin urmare, descendenţii obţinuţi vor moşteni caracteristici ale ambilor părinţi.
Operatorul de mutaţie este utilizat pentru păstrarea diversităţii populaţiei de la o
generaţie la alta. Prin modificarea uneia sau mai multor gene ale unui individ din baza
genetică înainte de a fi transferat în noua generaţie, mutaţia împiedică indivizii populaţiei să
devină prea asemănători unii cu alţiişi în acest fel se evită convergenţa către optime locale,
respectiv încetinirea sau chiar stagnarea evoluţiei.

Ciclul de bază al unui algoritm genetic, similar ciclului de bază al oricărei proceduri de
calcul evolutiv bazată pe evoluția biologică, este prezentat în figura. Ceea ce-l
particularizează este modalitatea de simulare a procesului evolutiv, adică generarea
populațiilor succesive. Astfel, pentru generarea unei noi populații, mai întâi se aplică
operatorul de selecție pentru a crea o populație intermediară. Apoi, asupra indivizilor din
populația intermediară se aplică, cu anumite probabilități, operatorii de recombinare și de
mutație pentru a crea o nouă generație de indivizi (soluții posibile ale problemei).
S-a implementat in Matlab urmatorul cod:
%
% Rezolva problema celor 8 regine de pe tabla de sah
%
clear all;
global Dim_Pop % Dimensiunea populatiei
global Pop_C % Populatia curenta (la generatia t)
global Pop_1 % Populatia intermediara
global Pr % Probabilitatea de recombinare
global Pm % Probabilitatea de mutatie
global Perf_Pop_C % Performanta populatiei curente
global Nr_Max_Gen % Numarul maxim de generatii
global Best % Cei mai buni indivizi
global Perf_Best % Performanta celor mai buni indivizi
global Solutii
%
% Citeste parametrii
%
Dim_Pop=input('Dimensiunea populatiei > ');
%
% Dimensiunea populatiei trebuie sa fie un nr par
%
if mod(Dim_Pop,2)
Dim_Pop=Dim_Pop+1;
end
Pr=input('Probabilitatea de recombinare > ');
Pm=input('Probabilitatea de mutatie > ');
Nr_Max_Gen=input('Numarul maxim de generatii > ');
Fl_Elitism=input('Utilizeaza elitismul? (D/N) > ','s');
Fl_Selecie=input('Tipul selectiei R sau T > ','s');
Fl_Selectie='R';
if ((Fl_Selectie == 'T') | (Fl_Selectie == 't'))
Fl_Selectie = 'T'; % Transforma in litere mari
else
Fl_Selectie = 'R';
end
Nr_Rulari= input('Numarul de rulari > ');
Solutii=zeros(Nr_Rulari,9);
for Rc=1:Nr_Rulari
%
% Initializarea parametrii AG
%
Pop_C=zeros(Dim_Pop,8); % Populatia curenta
Perf_Pop_C=zeros(Dim_Pop); % Performanta populatiei curente
Pop_1=zeros(Dim_Pop,8); % Populatia intermediara
Best=zeros(Nr_Max_Gen, 8); % Cei mai buni indivizi
Perf_Best=zeros(Dim_Pop); % Performanta celor mai performanti indivizi

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%
% %
% PASUL 1 Genereaza si evalueaza populatia initiala %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%
for i=1:Dim_Pop
Pop_C(i,:)=Creaza_Individ;
end
Eval_Pop;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% EFECTUEAZA CICLUL EVOLUTIV %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

for g=1:Nr_Max_Gen

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% PASUL 2: Efectueaza selectia si %
% incrucisarea simultan %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if Fl_Selectie == 'T'
Sel_Rec_Tur; % Metoda de selectie turnir
else
Sel_Rec_Rul; % Metoda de selectie ruleta
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% PASUL 4: Efectueaza mutatia %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Mutatie;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% PASUL 5: Evalueaza populatia curenta %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Eval_Pop;
%
% Identifica cel mai bun individ din populatia curenta
%
[Max, Ind_Best]=max(Perf_Pop_C(:,1));
Best(g,1:8)=Pop_C(Ind_Best,:);
Perf_Best(g,1)=Perf_Pop_C(Ind_Best,1);
%
% Aplica principiul elitismului de la generatia a II-a
%
if ((Fl_Elitism == 'D') | (Fl_Elitism == 'd'))
if g > 1
Best_A=Perf_Best(g-1,1);
Best_C=Perf_Best(g,1);
if Best_A >= Best_C
Ind_E=randi(Dim_Pop,1);
Pop_C(Ind_E,:)=Best(g,:);
Perf_Pop_C(Ind_E,1)=Perf_Best(g,1);
end
end
end
end
%
% Identifica si retine solutia rularii curente (cel mai bun individ)
[Solutia_Rc, Ind_Solutie]=max(Perf_Pop_C(:,1));
Solutii(Rc,1:8)=Pop_C(Ind_Solutie,:);
Solutii(Rc,9)=Solutia_Rc;
end
%
% Extrage solutiile corecte
%
Solutii_Corecte=[];
Nr_Sol_Corecte=0;
for s=1:Nr_Rulari
if Solutii(s,9) == 100
Nr_Sol_Corecte=Nr_Sol_Corecte+1;
Solutii_Corecte(Nr_Sol_Corecte,1:9)=Solutii(s,1:9);
end
end
%
% Extrage solutiile unice
%
Nr_Sol_Corecte
Solutii_Corecte
Solutii_Unice=unique(Solutii_Corecte,'rows');
[Nr_Sol_Unice, Col]=size(Solutii_Unice);
Nr_Sol_Unice
Solutii_Unice
 Cazul 1:
Dimensiunea populatiei > 25
Probabilitatea de recombinare > 30
Probabilitatea de mutatie > 15
Numarul maxim de generatii > 10
Utilizeaza elitismul? (D/N) > D
Tipul selectiei R sau T >R
Numarul de rulari > 35
S-au obtinut urmatoarele valori:

Nr. solutii corecte   2                


4 1 5 8 6 3 7 2 100
Solutii corecte
5 7 2 6 3 1 8 4 100
Nr. Solutii unice   2                
4 1 5 8 6 3 7 2 100
Solutii unice
5 7 2 6 3 2 8 4 100

 Cazul 2:
Dimensiunea populatiei > 30
Probabilitatea de recombinare > 45
Probabilitatea de mutatie > 14
Numarul maxim de generatii > 25
Utilizeaza elitismul? (D/N) > D
Tipul selectiei R sau T >R
Numarul de rulari > 16

S-au obtinut urmatoarele valori:


Nr. solutii
corecte   1                
Solutii
 
corecte 4 6 8 2 7 1 3 5 100
Nr. Solutii
unice   1                
Solutii unice   4 6 8 2 7 1 3 5 100

 Cazul 3:
Dimensiunea populatiei > 60
Probabilitatea de recombinare > 25
Probabilitatea de mutatie > 35
Numarul maxim de generatii > 40
Utilizeaza elitismul? (D/N) > D
Tipul selectiei R sau T >R
Numarul de rulari > 40
Nr. solutii corecte   9                
7 4 2 5 8 1 3 6 100
6 2 7 1 4 8 5 3 100
5 2 6 1 7 4 8 3 100
3 5 2 8 1 7 4 6 100
Solutii corecte 5 7 1 3 8 6 4 2 100
8 3 1 6 2 5 7 4 100
7 2 6 3 1 4 8 5 100
2 5 7 1 3 8 6 4 100
6 3 7 2 4 8 1 5 100
Nr. Solutii unice   9               100
2 5 7 1 3 8 6 4 100
3 5 2 8 1 7 4 6 100
5 2 6 1 7 4 8 3 100
5 7 1 3 8 6 4 2 100
Solutii unice 6 2 7 1 4 8 5 3 100
6 3 7 2 4 8 1 5 100
7 2 6 3 1 4 8 5 100
7 4 2 5 8 1 3 6 100
8 3 1 6 2 5 7 4 100