Problema reginelor
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:
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
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