[C con Clase] ayuda con este codigo ALGORITMO GENETICO
mario Guzman Moreno
mguzman_18 en hotmail.com
Sab Mar 6 20:52:18 CET 2010
ola por favor alguien me puede explicar lo mas importante de este codigo, es un ejemplo de algoritmo genetico por cierto muy interesante, estoy empezando hacer mi tesis sobre AGs y no entiendo mucho este codigo
gracias de antemano
#pragma warning(disable:4786) // disable debug warning DESACTIVAR LA ALERTA DE DEPURACION
#include <iostream> // for cout etc.
#include <vector> // for vector class
#include <string> // for string class
#include <algorithm> // for sort algorithm PARA ALGORITMO DE ORDENACION
#include <time.h> // for random seed
#include <math.h> // for abs()
#include <stdio.h>
#include <conio.h> //getch()
#define GA_POPSIZE 2048 // ga population size TAMAÑO DE LA POBLACION
#define GA_MAXITER 16384 // maximum iterations MAXIMO DE ITERACIONES
#define GA_ELITRATE 0.10f // elitism rate TASA DE ELITISMO
#define GA_MUTATIONRATE 0.25f // mutation rate LA TASA DE MUTACION
#define GA_MUTATION RAND_MAX * GA_MUTATIONRATE
#define GA_TARGET std::string("Hola Mario!")
using namespace std; // polluting global namespace, but hey...
int i=0;
struct ga_struct
{
string str; // the string LA CADENA
unsigned int fitness; // its fitness SU APTITUD
};
typedef vector<ga_struct> ga_vector;// for brevity PARA ABREVIAR
void init_population(ga_vector &population,
ga_vector &buffer )
{
int tsize = GA_TARGET.size();
cout << tsize;
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 MATE EL RESTO
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)
{
i++;
cout << i;
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 fitness CÁLCULO DE LA APTITUD
sort_by_fitness(*population); // sort them ORDENARLOS
print_best(*population); // print the best one INPRIME EL MEJOR
if ((*population)[0].fitness == 0) break;
mate(*population, *buffer); // mate the population together
swap(population, buffer); // swap buffers BUFFERS DE INTERCAMBIO
}
getch();
return 0;
}
_________________________________________________________________
¿Te gustaría tener Hotmail en tu móvil Movistar? ¡Es gratis!
http://serviciosmoviles.es.msn.com/hotmail/movistar-particulares.aspx
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100306/24c30c57/attachment.html>
Más información sobre la lista de distribución Cconclase