#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;
}
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