Population size: | 2048 |
Mutations (%): | 25 |
Elitism (%): | ten |
#include <iostream> // for cout, etc. #include <vector> // for class vector #include <string> // for string class #include <algorithm> // for the sorting algorithm #include <time.h> // for random variables #include <math.h> // for abs () #define GA_POPSIZE 2048 // Population Size #define GA_MAXITER 16384 // maximum number of iterations #define GA_ELITRATE 0.10f // Elitism #define GA_MUTATIONRATE 0.25f // mutations #define GA_MUTATION RAND_MAX * GA_MUTATIONRATE #define GA_TARGET std :: string ("Hello world!") using namespace std; struct ga_struct { string str; // line unsigned int fitness; // suitability }; typedef vector <ga_struct> ga_vector; // to be short void init_population (ga_vector & population, ga_vector & buffer) { int tsize = GA_TARGET.size (); for (int i = 0; i <GA_POPSIZE; i ++) { ga_struct citizen; citizen.fitness = 0; citizen.str.erase (); for (int j = 0; j <tsize; j ++) citizen.str + = (rand ()% 90) + 32; population.push_back (citizen); } buffer.resize (GA_POPSIZE); } void calc_fitness (ga_vector & population) { string target = GA_TARGET; int tsize = target.size (); unsigned int fitness; for (int i = 0; i <GA_POPSIZE; i ++) { fitness = 0; for (int j = 0; j <tsize; j ++) { fitness + = abs (int (population [i] .str [j] - target [j])); } population [i] .fitness = fitness; } } bool fitness_sort (ga_struct x, ga_struct y) {return (x.fitness <y.fitness); } inline void sort_by_fitness (ga_vector & population) {sort (population.begin (), population.end (), fitness_sort); } void elitism (ga_vector & population, ga_vector & buffer, int esize) { for (int i = 0; i <esize; i ++) { buffer [i] .str = population [i] .str; buffer [i] .fitness = population [i]. fitness; } } void mutate (ga_struct & member) { int tsize = GA_TARGET.size (); int ipos = rand ()% tsize; int delta = (rand ()% 90) + 32; member.str [ipos] = ((member.str [ipos] + delta)% 122); } void mate (ga_vector & population, ga_vector & buffer) { int esize = GA_POPSIZE * GA_ELITRATE; int tsize = GA_TARGET.size (), spos, i1, i2; elitism (population, buffer, esize); // Mate the rest for (int i = esize; i <GA_POPSIZE; i ++) { i1 = rand ()% (GA_POPSIZE / 2); i2 = rand ()% (GA_POPSIZE / 2); spos = rand ()% tsize; buffer [i] .str = population [i1] .str.substr (0, spos) + population [i2] .str.substr (spos, esize - spos); if (rand () <GA_MUTATION) mutate (buffer [i]); } } inline void print_best (ga_vector & gav) {cout << "Best:" << gav [0] .str << "(" << gav [0]. fitness << ")" << endl; } inline void swap (ga_vector * & population, ga_vector * & buffer) {ga_vector * temp = population; population = buffer; buffer = temp; } int main () { srand (unsigned (time (NULL))); ga_vector pop_alpha, pop_beta; ga_vector * population, * buffer; init_population (pop_alpha, pop_beta); population = & pop_alpha; buffer = & pop_beta; for (int i = 0; i <GA_MAXITER; i ++) { calc_fitness (* population); // calculate suitability sort_by_fitness (* population); // sort the population print_best (* population); // display the best population if ((* population) [0] .fitness == 0) break; mate (* population, * buffer); // mating populations swap (population, buffer); // clear buffers } return 0; }
void calc_fitness(ga_vector &population)
{
string target = GA_TARGET;
int tsize = target.size();
unsigned int fitness;
for (int i=0; i<GA_POPSIZE; i++) {
fitness = 0;
for (int j=0; j<tsize; j++) {
fitness += abs(int(population[i].str[j] - target[j]));
}
population[i].fitness = fitness;
}
}
Best: IQQte=Ygqem# (152)
Best: Crmt`!qrya+6 (148)
Best: 8ufxp+Rigfm* (140)
Best: b`hpf"woljh[ (120)
Best: b`hpf"woljh4 (81)
Best: b`hpf"woljh" (63)
Best: Kdoit!wnsk_! (24)
Best: Kdoit!wnsk_! (24)
Best: Idoit!wnsk_! (22)
Best: Idoit!wnsk_! (22)
Best: Idoit!wnsk_! (22)
Best: Idoit!wnsk_! (22)
Best: Ifknm!vkrlf? (17)
Best: Ifknm!vkrlf? (17)
Best: Gfnio!wnskd$ (14)
Best: Ffnjo!wnskd$ (14)
Best: Hflio!wnskd$ (11)
Best: Hflio!wnskd$ (11)
Best: Kflkn wosld" (8)
Best: Ifmmo workd" (6)
Best: Hfljo wosld" (5)
Best: Hflmo workd" (4)
Best: Hflmo workd" (4)
Best: Hflmo workd" (4)
Best: Iflmo world! (3)
Best: Iflmo world! (3)
Best: Hflmo world! (2)
Best: Hflmo world! (2)
Best: Hflko world! (2)
Best: Hflko world! (2)
Best: Hdllo world! (1)
Best: Hfllo world! (1)
Best: Hfllo world! (1)
Best: Helko world! (1)
Best: Hfllo world! (1)
Best: Hfllo world! (1)
Best: Hfllo world! (1)
Best: Hello world! (0)
Source: https://habr.com/ru/post/100990/
All Articles