
| 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