#include #include #include #include #include #include #include #include using namespace std; /* Náhodné cislo z intervalu [0, 1) */ double randdouble() { return rand()/(double(RAND_MAX)+1); } /* Parametry algoritmu */ int N = 50; // Velikost populace int D; // Velikost jedince double PK = 0.9; // Pravděpodobnost zavisle mutace double PM = 0.1; // Pravděpodobnost mutace double PB = 0.01; // Pravděpodobnost mutace na jednom bitu double PE = 0.1; // Velikost elitismus int IT = 10000; // Maximalní počet iterací int BEHY = 5; // Počet běhů celého algoritmu const int L = 10; // Jendou za kolik iterací se loguje int K; vector w; /* Jedinci */ struct Jedinec { vector geny; double fitness; /* Zařídí, že jedinci se třídí na základě fitness od největšího */ bool operator<(const Jedinec &x) const { return fitness > x.fitness; } }; /* Třída pro logování výpočtů -- té není nutné ji rozumět */ class Logovani { ofstream ofs; public: /* Otevře soubor pro logování */ void open(int x) { stringstream name; name << "beh" << x << ".log"; ofs.open(name.str().c_str()); } /* Ukončí logování */ void close() { ofs.close(); } /* Udělá zápis z generace gen z iterace it */ void write(vector gen, int it) { double maxi = 0; double total = 0; for (int i=0; i(d, 0); for (int i=0; i v(K, 0); for (int i=0; i< x.geny.size(); i++) v[x.geny[i]] += w[i]; int miny = INT_MAX; int a; int maxy = 0; int b; for (int i=0; i v(K); vector > ix(K); for (int i=0; i v[i]) { A = v[i]; a = i; } if (B < v[i]) { B = v[i]; b = i; } } // Presun predmet z nejtezsi na nejlehci x.geny[ix[b][rand()%ix[b].size()]] = a; } /* Zkříží dva jedince */ /*void krizeni(Jedinec &x, Jedinec &y) { // Náhodný bod jednobodového křížení int k = rand()%D; for (int i=k; i ruletova_selekce(vector &gen, int n) { // Spočítej celkovou fitness double total = 0; for (int i=0; i vyber; for (int i=0; i generace; for (int i=0; i vyber = ruletova_selekce(generace, N); // Zavisla mutace for (int i=0; i(vyber.begin(), vyber.begin()+N); if (generace[0].fitness > best.fitness) best = generace[0]; } log.write(generace, IT); return best; } /* Zapíše do souboru fitness a geny nejlepšího jedince */ void zaloguj_nejlepsiho(Jedinec best) { ofstream ofs("best.log"); ofs << "Fitness: " << best.fitness << endl; ofs << "Geny:" << endl; for (int i=0; i> K >> D; w = vector(D); for (int i=0; i> w[i]; // Zadejte svůj datum narození jako DDMMYYYY srand(26111990); Jedinec best; best.fitness = 0; for (int b=0; b best.fitness) { best = j; zaloguj_nejlepsiho(best); } } return 0; }