#include<iostream>
#include<ctime>
#include<random>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int maxgeneration = 1000;
const int popsize = 50;
const int mutation = 1;
const double crossover = 0.8;
const int gensize = 20;
const int vl = 0;
const int vu = 4;
default_random_engine dre(time(0));
uniform_int_distribution<int> di(vl, vu);
int k = di(dre);
struct phage;
struct bacteria {
int fitness = 0;
int m[gensize] = { 1,0,0,1,0,1,1,0,0,1,1,1,1,0,0,0,1,0,1,0 };
void evaluate(phage b) {
for (int i = 0; i<gensize; i++)
fitness += m[i] == b.m[i]; // this seems impossible why?
}
void init() {
for (int i = 0; i<gensize; i++)
m[i] = di(dre);
}
void show() {
{
for (int i = 0; i<gensize; i++)
cout << m[i];
}
cout << endl << endl;
}
}b;
struct phage {
int fitness = 0;
int m[gensize] = { 1,0,0,1,0,1,1,0,0,1,1,1,1,0,0,0,1,0,1,0 };
void evaluate(bacteria b) {
for (int i = 0; i<gensize; i++)
fitness += m[i] == b.m[i];
}
void init() {
for (int i = 0; i<gensize; i++)
m[i] = di(dre);
}
void show() {
{
for (int i = 0; i<gensize; i++)
cout << m[i];
}
cout << endl << endl;
}
};
// pg is time
default_random_engine dre1(time(0));
uniform_int_distribution <int> di1(0, 19);
default_random_engine dre2(time(0)); // albatobistvis
uniform_int_distribution<int> di2(1, 100);
default_random_engine dre3(time(0)); // mutaciistvis
uniform_int_distribution<int> di3(vl, vu);
// pg is time
phage crosmut(phage p1, phage p2) {
phage shvili;
// krosoveri
for (int i = 0; i < gensize; i++)
shvili.m[i] = -1;
int k = di1(dre);
int k1 = di1(dre);
for (int i = 0; i < k1; i++)
shvili.m[i] = p1.m[i];
for (int i = k1; i < gensize; i++)
shvili.m[i] = p2.m[i];
// mutacia
for (int i = 0; i < gensize; i++)
if (di2(dre2) <= mutation) shvili.m[i] = di3(dre3);
return shvili;
}
void pg(phage population[]) {
for (int i = 25 /* popsize / 2*/; i <30 /*(popsize / 2) + (popsize / 4)*/; i++)
population[i] = population[popsize - 1];
for (int i = 31 /*(popsize / 2) + (popsize / 4)*/; i < popsize; i++)
population[i] = crosmut(population[popsize - 2], population[popsize - 3]);
for (int i = 2; i < popsize; i++)
population[i].fitness = 0;
for (int i = 0; i < popsize; i++)
population[i].evaluate(b);
sort(population, population + popsize, [](phage p, phage p1) {return p.fitness < p1.fitness; });
//for (int i = 2; i < popsize; i++)
//population[i].fitness = 0;
}
int main() {
phage population[popsize];
for (int i = 0; i < popsize; i++)
population[i].init();
for (int i = 0; i < popsize; i++)
population[i].evaluate(b);
sort(population, population + popsize, [](phage p, phage p1) {return p.fitness < p1.fitness; });
for (int i = 0; i < 100; i++) {
cout << population[popsize - 1].fitness << endl;
population[popsize - 1].show();
pg(population);
cout << population[popsize - 1].fitness << endl;
population[popsize - 1].show();
}
}