PRIMJERI
kod za Matlab
Kako biste vidjeli kako
u Matlabu rade genetski algoritmi, kliknite
ovdje i
skinite 11 m-funkcija koje sam napisao, a prikazuju rad GA na nekoliko primjera.
Nakon što skinete i otpakirate funkcije, potrebno ih je kopirati u mapu koja je
koja je navedena kao current directory pri vrhu prozora Matlaba. To
najjednostavnije možete napraviti tako da ih kopirate u prozorčić koji se u
Matlabu nalazi u gornjem lijevom kutu. Kada ste to napravili, u liniju naredbi
trebate upisati "izbornik" i otvorit će vam se izbornik u kojem ćete moći
izabrati što želite ispitati. Bit će vam ponuđene tri funkcije, probleme ruksaka
te izbor vlastite funkcije. Ukoliko želite ispitati vlastitu funkciju, trebate
je prikazati kao m-funkciju i upisati njeno ime (bez .m) u liniju naredbi.
Koristeći ovu opciju možete potražiti ekstreme i nekih već definiranih funkcija
u Matlabu kao što su to sin, cos... Također samo trebate upisati njihovo ime.
Nakon što ste u izborniku odabrali funkciju, u novom ćete izborniku moći
izabrati želite li tražiti minimum ili maksimum funkcije. U trećem izborniku
možete birati što želite mijenjati u novim pozivima funkcije ga. Ovime ste
završili odabir postavki i Matlab kreće s pozivanjem funkcije ga. U liniji
naredbi će vam se ispisivati vrijednosti koje su dobivene u pojedinom pozivu, a
kada Matlab završi s radom, na zaslonu će se pojaviti graf na koje ćete biti
označene sve vrijednosti koje je Matlab u nekoliko poziva funkcije ga dobio kao
ekstrem. Također, bit će vam na još dva grafa prikazano kako se vrijednost i
pozicija ekstrema mijenjala u ovisnosti o promjeni parametra koji ste odabrali u
trećem izborniku da se mijenja.
primjer 1.
Budući da funkcija ga vraća
minimum funkcije cilja i da u Matlabu ne postoji funkcija koja pronalazi
maksimum funkcije cilja, maksimum ćemo tražiti tako da tražimo minimum funkcije
cilja suprotnog predznaka, tj. za tražit ćemo minimum funkcije –f(x).
No, za početak, funkciju s kojom radimo (objektnu funkciju) moramo nekako
prikazati u Matlabu. Time objektna funkcija postaje funkcija cilja, a prikazat
ćemo je kao M-funkciju. Kod M-funkcije koja predstavlja funkciju iz ovog
primjera nalazi ovdje:
M-funkcija f1(x):
function min=f1(x)
%prva ispitna funkcija za GA
pom=sin(10*pi.*x.^2)./x;
min=pom;
Prije no što započnem s traženjem ekstrema, moram stvoriti strukturu options. To
ću napraviti s naredbom:
options = gaoptimset(@ga)
Na ovaj sam način stvorio strukturu options s pretpostavljenim vrijednostima.
Kako bih pronašao minimum zadane funkcije, u liniju naredbi u Matlabu ću upisati
[x fval] = ga(@f1, 1, options).
Ne bi li se uvjerio u točnost rješenja, naredbu ću pokrenuti nekoliko puta.
Svakim novim pokretanjem mijenjaju se znamenke iza druge decimale varijable x.
To mi se ne sviđa jer sam odlučio pronaći položaj minimuma s preciznošću na 4
decimale. Kako bih to postigao, moram popraviti postavke genetskog algoritma.
Odlučio sam povećavati veličinu populacije i broj generacija. Rezultat stabilan
na 4 decimale u 10 uzastopnih poziva funkcije ga dobio sam nakon što sam
populaciju povećao s 20 na 2000 jedinki, a broj generacija sa 100 na 4000. To
sam napravio s naredbom:
options = gaoptimset('PopulationSize', 2000, 'Generations', 4000).
Za poziciju minimuma dobio sam točku (0,1926, -4,7712).
Kako bih pronašao globalni maksimum, moram promijeniti funkciju cilja. Tražit ću
minimum funkcije –f1(x). Funkcija cilja nakon promjene prikazana je ovdje:
M-funkcija -f1(x):
function max=f1(x)
%prva ispitna funkcija za GA
pom=-sin(10*pi.*x.^2)./x;
max=pom;
Funkcija ga mi nakon poziva promijenjene funkcije javlja da se minimum nalazi u točci (0,1926, -4,7712). Iz ovog rezultata odmah mogu iščitati x koordinatu maksimuma tražene funkcije. To je 0,1926. Budući da sam tražio minimum za suprotnu funkciju, predznak vrijednosti funkcije, tj. y koordinata bit će suprotnog predznaka od dobivene vrijednosti. Znači, maksimum tražene funkcije nalazi se u točci (0,1926, 4,7712).
primjer 2.
Kod M-funkcije kojom u Matlabu
predstavljamo ovu funkciju nalazi se ovdje:
M-funkcija f2(x):
function min=f2(x)
%druga ispitna funkcija za GA
pom=0.5-(1./((1+0.001.*x.*x).*(1+0.001.*x.*x)).*(sin(x).*sin(x)-0.5));
min=pom;
Kako bih odmah dobio preciznije
rezultate, odmah će veličinu populacije postaviti na 2000, a broj generacija na
4000. S tim postavkama dobivam da se minimun nalazi u točkama (-1.5692, 0.0025)
i (1.5692, 0.0025).
Maksimum ću ponovo tražiti tako da tražim minimum suprotne funkcije. Dobivam da
se maksimum nalazi u točci (0, 1).
primjer 3.
Kod M-funkcije kojom je predstavljena ova funkcija nalazi se ovdje:
M-funkcija f3(x):
function min=f3(x)
%treća ispitna funkcija za GA
pom=x.*cos(tan(sqrt(x)));
min=pom;
Skoro sa svakim novim pozivom
funkcije ga dobivam novu vrijednost minimuma. Neke od točaka koje sam dobio kao
rješenje su: (-23,8830, -36.8501), (-22,2442, -34.3203), (3,5718, -3.5482),
(-745.1753, -1149,9).
Pri traženju maksimuma s pretpostavljenim postavkama i veličinom populacije od
2000 jedinki i ponavljanjem algoritma kroz 1000 generacija dobivam da se
maksimum nalazi u točci (12,6473, 11.4413). Ovu sam vrijednost dobio čak desetak
puta za redom. No, kada se nacrta graf funkcije na širem intervalu, postaje
jasno da ta točke nije globalni maksimum. Zato sam odlučio smanjiti populaciju
na 4 jedinke i definirati početnu populaciju kao [1000; 2000; 3000; 4000] kako
bih vidio što će tada ga vratiti za maksimum funkcije. Na ovaj sam način
područje traženja genetskog algoritam proširio i dobio sam da se maksimum nalazi
u točci (4000, 3620,6). Nakon toga sam početnu populaciju odlučio smjestiti puno
dalje i postavio sam je kao [10000; 20000; 30000; 40000]. Sada dobivam da je
maksimum u točci (30000, 27097). Početnu populaciju postavio sam s naredbom:
options.InitialPopulation=[10000; 20000; 30000; 40000].
Iz ovih rezultata i iz grafa funkcije zaključujem da nema niti globalni minimum,
niti globalni maksimum, tj. da u oba smjera ide u beskonačno.
primjer 4., Rastriginova
funkcija
U primjeru ću pokazati
kako pronaći minimum Rastriginove funkcije koja se često korisiti za provjeru
genetskih algoritama.
Matlab sadrži M-funkciju rastriginsfcn.m koja računa vrijednosti Rastriginove
funkcije:
M-funkcija:
function scores =
rastriginsfcn(pop)
%RASTRIGINSFCN Compute the "Rastrigin" function.
% Copyright 2003-2004 The MathWorks, Inc.
% $Revision: 1.3.4.1 $ $Date: 2004/08/20 19:50:22 $
% pop = max(-5.12,min(5.12,pop));
scores = 10.0 * size(pop,2) + sum(pop .^2 - 10.0 * cos(2 * pi .* pop),2);
Kao što možete vidjeti na
grafu, funkcija ima mnogo lokalnih minimuma. Međutim, funkcija ima samo jedan
globalni minimum koji se nalazi u točci (0,0). Na bilo kojem drugom mjestu
vrijednost lokalnog minimuma je veća od 0.
Kako biste pronašli minimum Rastringove funkcije u liniji naredbi treba upisati:
[x fval] = ga(@rastriginsfcn, 2, options).
Primijetite da je u ovom primjeru drugi argument u funkciji ga 2, a ne 1 kao u
prva tri primjera. Drugi argument predstavlja broj ulaznih varijabli u funkciju
cilja. U prva smo tri primjera radili s funkcijama 1 varijable pa je taj
argument bio 1, no kako je Rastriginova funkcija funkcija 2 varijable, drugi po
redu argument u funkciji ga mora biti 2.
S pojačavanjem postavki, rješenja koja ćemo dobivati pomoću funkcije ga bit će
sve bliža posve točnom rješenju, no i vrijeme izvođenja funkcije će se povećati.