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.