Sunteți pe pagina 1din 4

PEAG-algoritmi

1. Pentru problema rucsacului[0,1]:-pe biletul 2


% citirea datelor din fisier
function [val,cost,costM]=citeste_date(nume);
f=fopen(nume);
m=fscanf(f,'%d',1);
val=fscanf(f,'%lg',[m,1]);
cost=fscanf(f,'%lg',[m,1]);
costM=fscanf(f,'%lg',1);
fclose(f);
end
% generarea populaiei iniiale-cam asta e ceea ce ne trebuie, mai ales
function [pop,val,cost,costM]=genereza_ini(nume,N);
[val,cost,costM]=citeste_date(nume);
[m,p]=size(val);
pop=zeros(N,m);
i=0;
while(i<N)
%se lucreaza pe m biti, generez R, un numar intre 1 si 2^m
%si consideram reprezentarea binara
R=unidrnd(2^m);
x=repr_bin(R-1,m);
[ok,sum]=verifica(x,cost,costM);
if(ok)
i=i+1;
pop(i,:)=x;
end;
end;
end
% obtinerea reprezentarii binare a unui numar
function [y]=repr_bin(x,m);
y=bitget(x,m:-1:1);
end
% verificarea admisibilitatii unei solutii potentiale
function [OK,sum]=verifica(x,cost,costM);
sum=x*cost;
OK = sum<=costM;
End
% operatorul de mutatie
function [y]=mutatie(x,poz);
y=x;
y(poz)=not(x(poz));
end

% operatorul de incrucisare
function [y1,y2]=crossover(x1,x2,poz);
[m,p]=size(x1);
y1=x1;y2=x2;
y1(1:poz)=x1(1:poz);
y1(poz+1:m)=x2(poz+1:m);
y2(1:poz)=x2(1:poz);
y2(poz+1:m)=x1(poz+1:m);
end

2. Pentru problema 1 din bilet.


a)
function [pop]=genereaza_ini(dim,var);
pop=zeros(dim,9);
for i=1:dim
x=unidrnd(350)-1;pop(i,1:8)=repr_Gray(n);
pop(i,9)=f_obiectiv(x);
end;
end
function [val]=f_obiectiv(x);
val=x^2;
end
function [ gray ] =repr_Gray( n )
N = 2^n;
x = unidrnd(N)-1;
disp(x);
bin = bitget(x,n:-1:1);
disp(bin);
gray(1,1) = bin(1,1);
for i=n:-1:2
if (bin(1,i) == bin(1,i-1))
gray(1,i) = 0;
else gray(1,i) = 1;
end;
end;
end
b)
function [p]=rang_l(pop,s);
[dim,c]=size(pop); %populatia este sortata functie de merit
p=zeros(1,dim);
for i=1:dim
p(i)=(2-s)/dim+(2*i*(s-1)/(dim*(dim+1)));
end;
end
function [parinti,p,q]=selectie_SUS_rang_l(dim,s);
[pop]=genereaza_ini(dim); pop=sortrows(pop,9); [p]=rang_l(pop,s);
[dim,m]=size(pop); q=zeros(dim,1);
for i=1:dim
q(i)=sum(p(1:i));

end;
parinti=zeros(dim,m);
i=1;k=1;r=unifrnd(0,1/dim);
while(k<=dim)
while(r<=q(i))
parinti(k,1:m)=pop(i,1:m);
r=r+1/dim; k=k+1;
end;
i=i+1;
end;
end
3. function [parinti]=selectie_turneu(pop,val,cost,costM);-pentru biletul 2,cel cu rucsacul
[N,m]=size(pop);
parinti=zeros(N,m);
i=0;
for i=1:N
p1=unidrnd(N);
p2=unidrnd(N);
%functia de fitness - suma vi*gi, gi=1,
%daca a fost ales obiectul i, 0 altfel
if(pop(p1,:)*val>=pop(p2,:)*val)
parinti(i,:)=pop(p1,:);
else
parinti(i,:)=pop(p2,:);
end;
end;
end
4. Ruleta pentru cea cu rucsacul
function [p]=rang_exp(pop,s);
[dim,c]=size(pop); %populatia este sortata functie de merit
p=zeros(1,dim);
for i=1:dim
p(i)=(1-exp(-i))/c;
end;
end
function [parinti,p,q]=selectie_parinti_ruleta_FPS(dim);
[pop]=genereaza_ini(dim); pop=sortrows(pop,9);[p]=rang_exp(pop,s);
[dim,m]=size(pop); q=zeros(dim,1);
for i=1:dim
q(i)=sum(p(1:i));
end;
parinti=zeros(dim,m);
for k=1:dim
r=unifrnd(0,1); pozitie=1;
for i=1:dim
if(r<=q(i))
pozitie=i; break;
end;
end;
parinti(k,1:m)=pop(pozitie,1:m);
end;
end.

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