#include #include #include #include #include #include #include using namespace std; /* Náhodné číslo z intervalu [0, 1) */ double randdouble() { return rand()/(double(RAND_MAX)+1); } /* Parametry algoritmu */ int N = 100; // Velikost populace int D = 50; // Velikost jedince double PK = 0.9; // Pravděpodobnost křížení double PM = 0.1; // Pravděpodobnost mutace double PB = 0.02; // Pravděpodobnost mutace na jednom bitu double PE = 0.01; // Velikost elitismu int IT = 120; // Maximální počet iterací int BEHY = 10; // Počet běhů celého algoritmu const int L = 10; // Jednou za kolik iterací se loguje /* 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ů – není třeba jí 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 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); // Křížení 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 best.fitness) { best = j; zaloguj_nejlepsiho(best); } } return 0; }