Sunteți pe pagina 1din 4

hc 1

function [ x, fx ] = hillclimbing( a, b, nrp, nrv, pas_i)


% implementarea algoritmului hillclimbing pentru gasirea maximului
% unei functii de o variabila
% I: a, b - capetele intervalului pe care e definita functia
% nrp - numarul de puncte initiale folosite de algoritm
% nrv - numarul de vecini pe fiecare directie (total 2*nrv vecini)
% pas - distanta intre doi vecini
% E: x - punctul de maxim, fx - valoare maxima a functiei (corespunde lui x)

% EXEMPLE PENTRU DOMENII DE DEFINITIE DIFERITE, DECI PUNCTE DE MAXIM DIFERITE


% hillclimbing(1.5,10,100,5,0.1)
% hillclimbing(-1.5,20.2,100,5,0.1)
% hillclimbing(-15,2.2,100,5,0.1)
% hillclimbing(-15,23.2,100,5,0.1)

X=zeros(1,nrp); % X, Y - coordonate puncte finale (punct, valoare) pentru


grafic
Y=zeros(1,nrp);
% pentru fiecare punct de pornire
for i=1:nrp
% aplic hillclimbing pentru un punct generat aleator din [a,b];
vc=unifrnd(a,b);
pas=pas_i;

% cel mai bun punct la momentul curent


vecmax=vc;% varful curent
local=0; % stabileste daca am gasit sau nu vecini cu o val mai buna
while ~local
% calculeaza vecinii punctului curent si valorile functiei
Nvc=vecini(vc,nrv,pas,a,b);
% calculeaza cel mai bun vecin
[valmax,pos]=max(Nvc(2,:));% max returneaza val max si toate poz pe
care apare ea ; caut max din toata linia 2
%pos vect cu toate poz de aparitie
vecmax=Nvc(1,pos);
% inlocuieste punctul curent cu cel mai bun vecin, daca este cazul
if valmax>f_obiectiv(vc)
vc=vecmax;
else
% am atins un optim local
local=1;
end;
pas=pas/2;
end;
% memoreaza cel mai bun punct gasit si valoarea functiei obiectiv
X(i)=vecmax;
Y(i)=f_obiectiv(vecmax);
end;

% determinam punctul cel mai bun si valoarea lui


[fx,pozitii]=max(Y); %s-ar putea sa gasesc mai multe val max
x=X(pozitii(1));

% afiseaza rezultatele si graficul


disp(['Valoarea maxima calculata:' num2str(fx)]);
disp(['Punctul in care este atins maximul:' num2str(x)]);
deseneaza(a,b,X,Y,x,fx);
end
d1

function [ ] = deseneaza( a, b, X, Y, xmax, ymax)


% vizualizare rezultate pentru algoritmul hill climbing
% I: a,b - intervalul pe care se lucreaza
% X, Y - vectorul cu punctele obtinute si valorile
% corespunzatoare ale functiei (punctele de desenat)
% xmax, ymax - punctul de maxim si valoarea maxima a functiei
% E: -

% deseneaza graficul si punctele de maxim obtinute


figure% produce o ferasta pe ecran unde o sa apara un desen
x=a:0.00001:b;
y=x.^3.*sin(x./3)+x.^3.*cos(x.*2)-x.*sin(x.*3)+x.*cos(x);% .forteaza
aplicarea operatorului elem cu elem ; fiecare rez se pastreaza in y
plot(x,y);% deseneaza un grafic fm din doi vect de aceeasi lungime; fct cu
lista variabila de param

% punctele de maxim
hold on;% hold off- cand desenam un elem nou, il sterge oe cel de dinainte;
hold on pastreaza ce era anterior
n=length(X);
for i=1:n
plot(X(i),Y(i),'dr');% dr- dimond red; b-blue; black-k
end;
% maximul global
plot(xmax,ymax,'sk');% sk-patratel negru
end

v2

function [v] = vecini(x,nr,pas,intx,inty)


% calculeaza vecinii unui punct (doua axe)
% I: x - punct curent (2 coordonate)
% nr - numar de vecini pe fiecare directie
% pas - distanta intre vecini consecutivi
% intx - capetele intervalului de lucru pe axa x
% inty - capetele intervalului de lucru pe axa y
% E: v - masiv vecini (3 linii: coord. x; coord. y; valoare)

vec=[];
valv=[];
for i=-nr:nr% il va lua si pe 0
for j=-nr:nr
v_p=[x(1)+i*pas x(2)+j*pas];
if (v_p(1)>=intx(1)) && (v_p(1)<=intx(2)) && (v_p(2)>=inty(1)) &&
(v_p(2)<=inty(2))
val=f_obiectiv(v_p);
vec=[vec v_p'];% vector transpus; evit transpunerea si adaug
v_p=[x(1)+i*pas; x(2)+j*pas] mai sus
valv=[valv val];
end;
end;
end;
v=[vec; valv];
end

hc2
function [ x, fx ] = hillclimbing( intx, inty, nrp, nrv, pas)
% implementarea algoritmului hillclimbing pentru gasirea maximului
% unei functii de doua variabile
% I: intx, inty - intervalelor pe care e definita functia
% nrp - numarul de puncte initiale folosite de algoritm
% nrv - numarul de vecini pe fiecare directie
% pas - distanta intre doi vecini consecutivi
% E: x - punctul de maxim, fx - valoare maxima a functiei (corespunde lui x)

% EXEMPLE de apel
% hillclimbing([-2 -2],[-2 2],50,5,0.1);

X=zeros(1,nrp); % X, Y, Z - coordonate puncte finale (punct, valoare) pentru


grafic
Y=zeros(1,nrp);
Z=zeros(1,nrp);
% pentru fiecare punct de pornire
for i=1:nrp
% aplic hillclimbing pentru un punct generat aleator din domeniu de
vc=unifrnd([intx(1) inty(1)],[intx(2) inty(2)]);% unifrnd afla un nr
aleator din intervalul de definitie; param transmisi sunt capetele din stanga si
cele din dreapta
% cel mai bun punct la momentul curent
vecmax=vc;
local=0;
while ~local
% calculeaza vecinii punctului curent si valorile functiei
Nvc=vecini(vc,nrv,pas,intx,inty);
% calculeaza cel mai bun vecin
[valmax,pos]=max(Nvc(3,:));
vecmax=Nvc(1:2,pos);
% inlocuieste punctul curent cu cel mai bun vecin, daca este cazul
if valmax>f_obiectiv(vc)
vc=vecmax;
else
% am atins un optim local
local=1;
end;
end;
X(i)=vecmax(1);
Y(i)=vecmax(2);
Z(i)=f_obiectiv(vecmax);
end;

% determinam punctul cel mai bun si valoarea lui


[fx,pozitii]=max(Z);
x=X(pozitii(1));% iau primul max gasit
y=Y(pozitii(1));

% afiseaza rezultatele si graficul


disp(['Valoarea maxima calculata:' num2str(fx)]);
disp(['Punctul in care este atins maximul: (' num2str(x) ',' num2str(y) ')']);
deseneaza(intx,inty,X,Y,Z,x,y,fx);
end
d2
function [ ] = deseneaza( intx, inty, X, Y, Z, xmax, ymax, zmax)
% vizualizare rezultate pentru algoritmul hillclimbing 2 variabile
% I: intx, inty - intervalele pe care se lucreaza
% X, Y, Z - vectorii cu coordonatele punctelor obtinute (X,Y) si valorile
% corespunzatoare ale functiei (Z) (punctele de desenat);
% coordonatele punctelor finale calculate
% xmax, ymax, zmax - punctul de maxim si valoarea maxima a functiei
% E: -

% deseneaza graficul si punctele de maxim obtinute


pas=0.05;% ca sa deseneze numai liniile si coloreaza spatiile dintre ele
[x,y]=meshgrid(intx(1):pas:intx(2),inty(1):pas:inty(2));
% meshgrid calculeaza o retea in plan
z=exp(-x.^2-y.^2)+y.*cos(5.*x)-x.*sin(3.*y);% facem asa sau folosim un for
figure
grid on;% deseneaza caroiajul in fct de domeniul dat de meshgrid
surface(x,y,z);% deseneaza suprafata

% punctele de maxim
hold on;
% n=length(X);
% for i=1:n ; toata sectiunea deseneaza fiecare punct in parte
% plot3(X(i),Y(i),Z(i),'oy'); oy este cerculet galben
% end;
scatter3(X,Y,Z,'red');% automat construieste cerculete
% maximul global
plot3(xmax,ymax,zmax,'*b','MarkerSize',10);% putem adauga si alti parametri
end

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