EO radno okruženje

Index | Uvod | Genetski algoritmi | EO radno okruženje | Naprednije mogućnosti okruženja | Programski primjeri




4. Naprednije mogućnosti okruženja





4.1. Kombiniranje više operatora

Unutar jednog programa moguće je koristiti više istovrsnih operatora (mutacija, križanja).

4.1.1. Kombiniranje više mutacija
Da bi se uključilo više mutacija unutar jednog programa koristit će se zato definirani objekt koji će te mutacije objediniti u jedan objekt i po prinicipu roullet wheel-a birati određenu mutaciju koju će izvršiti u određenom trenutku.

Konstruktor :

template < class EOT >
eoPropCombinedMonOp <EOT>::eoPropCombinedMonOp(eoMonOp<EOT> &operator, const double _vjerojatnost)


operator - vrsta mutacije koju se želi ugraditi u objekt
_vjerojatnost - vjerojatnost da ta mutacija bude odabrana prilikom izvođenja mutacije nad jedinkom

Za dodavanje više mutacija postoji metoda :

template < class EOT >
eoPropCombinedMonOp<EOT>::add(eoMonOp<EOT> &operator, const double _vjerojatnost, bool _kontrola=false)


operator - vrsta mutacije koju se želi ugraditi u objekt
_vjerojatnost - vjerojatnost da ta mutacija bude odabrana prilikom izvođenja mutacije nad jedinkom
_kontrola - ako je false tada ostavlja vjerojatnosti onakve kakve smo ih zadali , a ako je true tada računa relativnu vjerojatnost

Definirajmo sada objekt koji će sadržavati dvije mutacije :

eoBitMutation <tip_jedinke > mutacija1(0.01); // definiramo mutaciju jednog bita

eoDetBitFlip< tip_jedinke > mutacija2(5); //definiramo mutaciju točno 5 bitova

eoPropCombinedMonOp< tip_jedinke > mutacija(mutacija1, vjerojatnost1); // definiramo objekt mutacija

mutacija.add(mutacija2, vjerojatnost2, true); // dodajemo drugu mutaciju , parametar true je dovoljno dodati prilikom dodavanja zadnje mutacije



4.1.2. Kombiniranje više križanja
Postupak uključivanja više križanja unutar jednog programa je identičan postupku ukjučivanja više mutacija. Razlikuju se samo u tipu objekta koji drži operatore i odlučuje koji će koristiti.

Konstruktor :

template < class EOT >
eoPropCombinedQuadOp<EOT>::eoPropCombinedQuadOp(eoMonOp<EOT> &operator, const double _vjerojatnost)


operator - vrsta križanja koju se želi ugraditi u objekt
_vjerojatnost - vjerojatnost da to križanje bude odabrano prilikom izvođenja križanja

Za dodavanje više križanja postoji metoda :

template < class EOT >
eoPropCombinedQuadOp<EOT>::add(eoQuadOp<EOT> &operator, const double _vjerojatnost, bool _kontrola=false)


operator - vrsta križanja koju se želi ugraditi u objekt
_vjerojatnost - vjerojatnost da to križanje bude odabrano prilikom izvođenja križanja
_kontrola - ako je false tada ostavlja vjerojatnosti onakve kakve smo ih zadali , a ako je true tada računa relativnu vjerojatnost

Definirajmo sada objekt koji će sadržavati tri križanja :

eo1PtBitXover < tip_jedinke > krizanje1;

eoUBitXover < tip_jedinke > krizanje2;

eoNPtsBitXover <tip_jedinke > krizanje3(5);

eoPropCombinedQuadOp <tip_jedinke > krizanje(krizanje1, vjerojatnost1);

krizanje.add(krizanje2, vjerojatnost2);

krizanje.add(krizanje3, vjerojatnost3, true);



4.1.3. Objedinjavanje križana i mutacije u jedan objekt
Kako će se vidjeti kasnije križanje i mutaciju je potrebno objediniti unutar jednog objekta.

Konstruktor:

template<class EOT>
eoSGATransform < EOT >::eoSGATransform(eoQuadOp <EOT> &krizanje, double _vjerojatnost_kr, eoMonOp<EOT> & mutacija, double vjerojatnost_mut)



Križanje i mutaciju će se objediniti na sljedeći način :

eoSGATransform<tip_jedinke > operator(krizanje, VJEROJATNOST_KRIZANJA, mutacija, VJEROJATNOST_MUTACIJE);





4.2. Kombiniranje više kriterija zaustavljanja

Kao što smo već pokazali uvjet zaustavljanja može biti maksimalan broj genracija. Također može se definriati još neke uvjete zaustavljanja kao što su : zaustavljanje kada se ne pojavljuje poboljšanje u nakon određenog broja genracija , ili dok se ne pojavi jedinka s maksimalnom vrijednošću dobrote.

// već objašnjeni uvjet zaustavljanja kod dostizanja max broja generacija
eoGenContinue < tip_jedinke > genCont(MAX_GEN);

// prolazak kroz MIN_GEN broj generacija , a nakon toga zaustavljanje kada prođe STEADY_GEN broj generacija // bez promjene
eoSteadyFitContinue < tip_jedinke > steadyCont(MIN_GEN, STEADY_GEN);

// zaustavljanje kad jedinka dosegne zadanu dobrotu
eoFitContinue < tip_jedinke > fitCont(0);

// kombiniranje zadanih uvjeta eoCombinedContinue < tip_jedinke > continuator(genCont);
continuator.add(steadyCont);
continuator.add(fitCont);



4.3 Definiranje selekcije i zamjene

Da bi se dobila potpuna selekcija određenu selekciju (definiranu u poglavlju 3.7.) mora se ugraditi u objekt koji će kao parametar (uz selekciju) imati i postotak populacije koji se selektira.

// definiramo našu selekcija
eoDetTournamentSelect< tip_jedinke > selekcija1(3);

//ugrađujemo ju u objekt s 100% izborom populacije
eoSelectPerc< tip_jedinke > selekcija(selekcija1);


Ako se ne želi ograničiti samo na generacijsku zamjenu ( ugrađena u SGA) može se definirati i neka druga zamjena (ponuđena u okruženju). Također može se definirati i elitizam (čuvanje najboljih jedinki) , objediniti zamjenu i elitizam u jedan objekt te tako dobiti potpunu zamjenu koja će čuvati najbolje jedinke.

// definira se zamjena
eoGenerationalReplacement< tip_jedinke > genzamjena;

//definira se elitizam i u njega ugrađuje generacijska zamjena
eoWeakElitistReplacement< tip_jedinke > zamjena(genzamjena);





4.4. Parser

Da se ne bi moralo uvijek kada se mijenja jedan parametar algoritma prevoditi program na raspolaganju je parser: Upotreba parsera je vrlo jednostavna i nadasve korsna jer nakon što se isprogramira program iz jedne datoteke može se učitavati parametre. Što je još zanimljivije imena varijabli parametara definira programer te si na taj način dodatno olakšava korištenje parsera.

Prvo će se definirati pravila parsiranja datoteke :

Konstruktor klase eoValueParam:

template < class Value Type >
eoValueParam < Value Type >::eoValueParam(ValueType _defaultValue, std::string _longName, std::string _description="No description", char _shortHand=0, bool _required=false)


_defaultValue - default vrijednost parametra , biti će upotrijebljena ako se ne navede druga
_longName - dugo ime varijable , omogućuje navođenje ime_varijable = vrijednost
_description - opis varijable , biti će naveden ako se zatraži help
_shortHand - kratko ime varijable , omogućeje navođenje v=vrijednost
_required - ako je true tad ta varijabla mora postojati u našoj datoteci

Jednostavan programski odsječak :

// definiramo parser eoParser parser(argc, argv,"Opis","proba.in");

// definiramo objekt koji će sadržavati veličinu jedinke , njegovu default vrijednost dugo i kratko ime
eoValueParam<unsigned int> vecVelicina(8, "vecVel", "Veličina jedinke",'V');

// stvaramo par vrijednost - ime
parser.processParam( vecVelicina, "Predstavljanje jedinke" );

// dodjeljujemo vrijdnost doređenoj varijabli koju ćemo koristiti
unsigned vecSize = vecVelicina.value();




4.5. Kontrolne točke

Kontrolne točke omogućuju obavljanje određenih akcija (računanje statistike) unutar svake generacije. Kontrolna točka je implementirana kao objekt koji sadrži uvjete zaustavljanja, statistiku, ispis na ekran i updatanje. Te operacije (koje su definirane) izvršava za svaku generaciju .

Da bi se generirala određena statistika mora se definirati potrebne objekte :

// definira se kontrolna točka i ugrađuju se uvjeti završetka
eoCheckPoint<tip_jedinke> kontrolna_tocka(continuator);

// izdvajat će vrijednost najbolje jedinke svake generacije
eoBestFitnessStat<tip_jedinke> najbolji;

// računat će prosjek i standardnu devijaciju svake generacije
eoSecondMomentStats<tip_jedinke> par;

//dodavanje u kontrolnu točku
kontrolna_tocka.add(najbolji);
kontrolna_tocka.add(par);





Valid HTML 4.01 Transitional