Sunteți pe pagina 1din 7

Universitatea „Dunărea de Jos” din Galați

Facultatea de Automatică, Calculatoare, Inginerie Electrică și Electronică


Specializarea : Sisteme Informatice de Conducere Avansată

Temă

Sisteme informatice de optimizare avansată

Cadru didactic indrumator: Masterand:


Prof. dr. ing. Viorel Mînzu Irimia Adrian

Galați
2021
Cerință:
Utilizând un algoritm evolutiv (AE) să se determine minimul global ce
respectă restricțiile
Xi ≥0, pt. i=1,….,n
Xi ≤10, pt. i=1,….,n

Se va utiliza o incrucisare BLX-α cu α = B/10 si o mutatie neliniara.

Nume :Irimia
Vocale: v1 = i și v2 = i
Rezultă: A=g(v1) = 3
B=g(v2) = 3
Funcția aleasă pentru n = A = 3
4 2 4
f ( x 1 , x 2, x 3 )=18+2 ∙(x 1−1.7) +3 ∙ ( x 2−5 ) +2.5 ∙(x 3−2)

B=3
α = B / 10 → 0.3

Programele utilizate:

DELT.m
function [d]=DELT(y)
global g NGen;
r=random('unif',0.,1.);
d=y*(1-r^((1-g/NGen)^0.2));
end

incrucisare1.m
function incrucisare1(i,j,indice,n,xmin,xmax )
global pop;
%global ngene;
global N;
alf=0.3;
m=random('unif',-alf,1.+alf);
pop(N-indice+1,:)=pop(i,:)+m*(pop(j,:)-pop(i,:));
for k=1:n
if(pop(i,k)<xmin)
pop(i,k)=xmin;
end
if(pop(i,k)>xmax)
pop(i,k)=xmax;
end

end
end
EvalFitness.m
function J=EvalFitness(x)
J = 18+2*(x(1)-1.7)^4 + 3*(x(2)-5.)^2 + 2.5*(x(3)-2.)^4 ;
end

mutatie1.m
function mutatie1(icrom)
%MUTATIE pe cromozomul pop(i,:)
global ngene xmax xmin;
global pop;
k=randi(ngene); %for k=1:ngene
r=random('unif',0.,1.);
if r>0.5
y=xmax-pop(icrom,k);
f=1.;
else
y=pop(icrom,k)-xmin;
f=-1.;
end
de=DELT(y);
pop(icrom,k)=pop(icrom,k)+f*de;
if(xmin>=pop(icrom,k))
pop(icrom,k)= xmin;
end
if(xmax<=pop(icrom,k))
pop(icrom,k)= xmax;
end
%end
End

ScaleRank.m
function [P] = ScaleRank(R,miu,s)
% Primeste rank-urile celor miu cromozomi si
% presiunea de selectie (1. < s <2.)
P=zeros(1,miu);
for i=1:miu
P(i)=(2.-s+(2.*(R(i)-1)*(s-1.)/(miu-1)))/miu;
end
End

Sector.m
function [i]=Sector(x,A,miu)
%Gaseste pozitia sectorului pe roata
%norocului descrisa de valorile din A(miu)
%Vectorul A are miu elemente
if(x<0)
disp('eroare x<0');end
gasit=0;
i=1;
while (gasit==0)&&(i<=miu)
if x<=A(i)
gasit=1;
else i=i+1;
end
end
if(gasit==0)
disp('eroare: Nu s-a gasit');
end
end

StUnSamp.m
function [C] = StUnSamp( Fit,miu,lambda )
%Intoarce vectorul C de dimesiune lambda cu indicii
% pentru cromozomii selectati conform Stochastic
Universal Sampling
% miu: nr de cromozomi
% lambda: dimensiunea selectiei
% Fit: vector de dimensiune miu cu vaolrile fitness (sau
% echivalente) ale cromozomilor
%Generez A cu sumele partiale din Fit
A=zeros(miu,1);
B=zeros(lambda,1);
C=zeros(lambda,1);
Aim1=0; %Aim1 = A(i-1)
for i=1:miu
A(i)=Aim1+Fit(i);
Aim1=A(i);
end
a=360/A(miu);
A=a*A;
b=360/lambda;
b0=random('unif',0,b);
%Generare vector B[lambda]
for j=1:lambda
B(j)=b0+(j-1)*b;
end
%disp('B=');disp(B);
for j=1:lambda
C(j)=Sector(B(j),A,miu);
end
end

function J=EvalFitness(x)
J = 18+2*(x(1)-1.7)^4 + 3*(x(2)-5.)^2 + 2.5*(x(3)-2.)^4 ;
End

PRG_Principal.m
clear
clc
global n N;
global pop;
global ngene NGen;
global g;
global xmin xmax;
n=3;
ngene=n; % ngene=nr. gene maxim dintr-un cromozom
N=20; % N=nr de cromozomi din populatie
nr_fii=20;
NGen=3500; % NGen=nr de generatii
fc=zeros(N,1);
xmin=-10;
xmax=10;
pop=zeros(N,ngene);
s=1.8;
parinti=zeros(nr_fii,1);
str=sprintf('Selectie cu Stochastic Universal
Sampling,utilizare Rank si Scalare Rank');
disp(str);
str=sprintf('Replacement: in ultimele lambda pozitii din
cele N ale populatiei');
disp(str);
str=sprintf('Incrucisare: BLX-0.6');disp(str);
str=sprintf('cu cel mai bun si producerea unui singur
urmas');disp(str);
str=sprintf('Mutatie: neuniforma pe o gena cu
b=0.5');disp(str);
str=sprintf('N=%d ngene=%d NGen=%d xmin=%g xmax=
%g',N,ngene,NGen,xmin,xmax);
disp(str);
for i=1:N
for j=1:ngene
%pop(i,j)=1.;
pop(i,j)=random('unif',xmin,xmax);
end
end
for i=1:N
fc(i)=EvalFitness(pop(i,:));
end
[fc,IX]=sort(fc,1,'ascend');
pop=pop(IX,:);
R=N:-1:1; % Rangurile populatiei. Solutiile sunt
ordonate;
% miu=N
P=ScaleRank(R,N,s);%P contine rangurile scalate
lambda=nr_fii;
gasit=0;
g=1;
%CICLU MARE de T ITERAII
%
while(g<=NGen)&&(gasit==0) %&&(gasit==0)
% SELECTIE PARINTI
parinti=StUnSamp(P,N,lambda);%indicii parintilor
per=randperm(lambda);
parinti=parinti(per);%permutare aleatorie a indicilor
%INCRUCISARE
for ii=1:lambda
jj=randi(lambda);
i1=parinti(ii);
i2=parinti(jj);%=1
incrucisare1(i1,i2,ii,n,xmin,xmax); %un singur
copil
end
%MUTATIE
for irand=N-lambda+1:N
daca_mut=randi(100);
if(daca_mut<=90)
%disp(irand);
mutatie1(irand); %Fac mutatie pe pop(irand,:)
end
%LIMITARE
end
%Evaluare si reordonare
for i=N-lambda+1:N
fc(i)=EvalFitness(pop(i,:));
end
[fc,IX]=sort(fc,1,'ascend');
pop=pop(IX,:);
%Afisare intermediara
if(mod(g,100)==0)
str=sprintf('gen=%g J*=%g - %g %g %g %g',g,
fc(1),fc(2),fc(3),fc(4), fc(5));
disp(str);
end
g=g+1;
% if(g==NGen)
% c=input('Continuam ? n/d=','s');
% if c=='d'
% NGen=NGen+20;
% end
% end
end %while
%Tiparire rezultate

Avem urmatoarele rezultate:


Selectie cu Stochastic Universal Sampling,utilizare Rank si Scalare Rank
Replacement: in ultimele lambda pozitii din cele N ale populatiei
Incrucisare: BLX-0.6
cu cel mai bun si producerea unui singur urmas
Mutatie: neuniforma pe o gena cu b=0.5
N=20 ngene=3 NGen=3500 xmin=-10 xmax=10
gen=100 J*=82.2335 - 90.9427 119.151 152.49 200.307
gen=200 J*=20.2982 - 22.0494 27.6287 37.444 53.0376
gen=300 J*=29.4878 - 43.4849 75.6997 186.114 192.271
gen=400 J*=71.1229 - 105.015 131.211 157.742 289.597
gen=500 J*=27.9853 - 29.5755 54.492 73.2373 77.6714
gen=600 J*=24.5555 - 34.4078 39.3678 40.1135 102.198
gen=700 J*=50.6446 - 50.6808 69.8837 71.364 78.6624
gen=800 J*=19.434 - 57.6555 79.0821 93.6164 108.661
gen=900 J*=27.012 - 45.6883 56.6084 89.5714 111.882
gen=1000 J*=23.12 - 31.9162 39.7305 40.2473 47.8875
gen=1100 J*=18.9211 - 27.3488 28.9137 31.9221 66.6561
gen=1200 J*=19.6282 - 20.5376 22.6144 29.1267 36.0663
gen=1300 J*=21.5819 - 46.1317 63.721 80.2577 213.292
gen=1400 J*=29.885 - 56.1763 65.6039 108.567 168.281
gen=1500 J*=18.5373 - 19.3386 30.5847 36.356 37.5186
gen=1600 J*=21.2145 - 28.8989 40.0808 45.5183 64.1773
gen=1700 J*=20.6652 - 47.1892 58.0503 76.3855 86.8889
gen=1800 J*=22.0447 - 22.2688 30.6728 33.2376 40.8572
gen=1900 J*=19.5081 - 28.1151 39.2205 45.9213 47.4007
gen=2000 J*=20.9479 - 61.0997 69.7414 69.8947 86.5745
gen=2100 J*=18.1736 - 18.787 19.3436 26.9006 39.8378
gen=2200 J*=20.1562 - 44.5598 50.3322 74.0438 88.6621
gen=2300 J*=22.5581 - 30.4123 49.5314 58.4143 93.3426
gen=2400 J*=30.582 - 31.3933 35.7261 38.2892 52.5696
gen=2500 J*=20.1197 - 26.3417 34.1076 39.8608 65.5455
gen=2600 J*=28.9175 - 33.8793 43.4901 43.6635 44.4335
gen=2700 J*=20.8776 - 30.6921 31.0152 37.1338 37.6461
gen=2800 J*=20.0227 - 23.1596 24.5994 26.555 32.5345
gen=2900 J*=18.1096 - 19.4412 26.3064 29.5819 34.7514
gen=3000 J*=20.7722 - 23.551 25.8658 28.6481 45.2025
gen=3100 J*=18.2601 - 19.1145 20.1095 21.1513 30.6985
gen=3200 J*=19.8466 - 20.851 21.353 23.3584 24.4566
gen=3300 J*=23.5619 - 24.2615 25.7912 25.8677 28.7818
gen=3400 J*=29.0093 - 32.3213 37.896 44.9351 50.185
gen=3500 J*=18.2263 - 18.7562 18.8052 18.858 18.8813

S-ar putea să vă placă și