EO radno okruženje

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




5. Programski primjeri




5.1. Prvi programski primjer


Definira se jednostavan problem :
Neka su tražena rješenja duljine 10 bitova i u svakom su točno 3 jedinice . Evo kako bi izgledao program :

#include <stdexcept>
#include <iostream>

//potrebna zaglavlja
#include <eo>
#include <ga.h>

using namespace std;


// definiramo novi tip podataka jedinka radi lakšeg programiranja
typedef eoBit<double> jedinka;


// naša funkcija dobrote
double dobrota(const jedinka & _niz)
{
   double sum = 0;
   for (int i = 0; i <_niz.size(); i++)
   sum += _niz[i];
    return - abs(3-sum);
}

void main_function(int argc, char **argv)
{
    const unsigned int T_SIZE = 3; // velicina za turnirsku selekciju
    const unsigned int VEC_SIZE = 10; // velicina jedinke
    const unsigned int POP_SIZE = 40; // velicina populacije
    const unsigned int MAX_GEN = 40; // broj generacija prije završetka
    const float CROSS_RATE = 0.8; // postotak križanja
    const double P_MUT_PER_BIT = 0.01; // vjerojatnost mutacije bita
    const float MUT_RATE = 1.0; // postotak mutacije


rng.reseed(time(NULL));


   eoEvalFuncPtr< jedinka > evaluacija( dobrota );


   eoPop< jedinka > populacija;

    for (int i=0; i<POP_SIZE; i++)
       {
       jedinka v;
       for (int i=0; i<VEC_SIZE; i++)
       {
       v.push_back(rng.flip());
       }
       evaluacija(v);
       populacija.push_back(v);
    }

//sortiramo našu početnu populaciju
populacija.sort();

// Ispišimo našu početnu populaciju
// operator << je definiran za klasu eoPop pa možemo
// ispisati našu populaciju s jednom naredbom
cout << "Početna populacija" << endl;
cout << populacija;

// Turnirska selekcija
eoDetTournamentSelect<jedinka> selekcija(T_SIZE);

// križanje
eo1PtBitXover<jedinka> krizanje;

// mutacija
eoBitMutation<jedinka> mutacija(P_MUT_PER_BIT);

eoGenContinue<jedinka> trajanje(MAX_GEN);

// definiranje SGA algoritma
eoSGA<jedinka> algoritam(selekcija, krizanje, CROSS_RATE, mutacija, MUT_RATE,evaluacija, trajanje);

// primjena algoritma
algoritam(populacija);

//ponovno sortiramo populaciju
populacija.sort();

// ispis riješenja
cout << "Konacna populacija :\n " << populacija << endl;
}

int main(int argc, char **argv)
{

// framework ima definirane iznimke i mogućnost njihovog hvatanja

try
{
    main_function(argc, argv);
}
catch(exception& e)
{
cout << "Iznimka: " << e.what() << '\n';
}

return 1;
}




5.2. Drugi programski primjer(problem ruksaka)



Definicija problema:
Neka su proizvodi u dućanu predstavljeni kao niz elemenata. Svaki element se sastoji od dvije vrijednosti cijene i volumena proizvoda .
slika 5.
slika 5. proizvodi u dućanu


Odmah se uočava da će se kao prikaz rješenja odabrati niz bitova duljine N (broj elemenata u dućanu) . 1 će predstavljati da je taj element stavljen u ruksak ,a 0 da nije.

Potrebne datoteke:

Programski kod(zbog duljine izostavljen s ove stranice):ruksak.cpp
Konfiguracijska datoteka(parametri algoritma):config.txt
Ulazna datoteka:podaci.txt


5.3. Testovi mutacije i križanja


Na problemu ruksaka je provedeno nekoliko testova mutacije i križanja.


Test mutacije 1.
Testirao se je utjecaj parametra vjerojatnost pojave mutacije unutar jedne generacije na izvršavanje algoritma.
Dobiveni su sljedeći rezultati:
slika 6.
slika 6. promjena parametra vjerojatnost pojave mutacije

Iz dobivenih rezultata se uočava vrlo velika uloga mutacije u samom radu algoritma. Već i vrlo mala vjerojatnost znatno poboljšava rad algoritma.

Test mutacije 2.
Testirao se je utjecaj parametra vjerojatnost promjene bita na izvršavanje algoritma.
Dobiveni su sljedeći rezultati:
slika 7.
slika 7. promjena parametra vjerojatnost promjene bita

Iz dobivenih rezultata se zaključuje da je vejrojatnost promjene bita vrlo važna. Vrijednost tog parametra mora biti vrlo mala (0.01) jer u suprotnom algoritam se pretvara u slučajno pretraživanje prostora rješenja.

Test križanja
Testirao se je utjecaj parametra broj točaka prekida kod križanja na izvođenje algoritma.
Dobiveni su sljedeći rezultati:
slika 8.
slika 8. promjena parametra vjerojatnost pojave mutacije

Iz dobivenih rezultata se uočava da križanje kao operator nije presudan za izvršavanje algoritma , no njegovim finim podešavanjem možemo ubrzati rad algoritma.


Valid HTML 4.01 Transitional