[C con Clase] ayuda con este codigo ALGORITMO GENETICO
Jose Cabrera
josmaca en gmail.com
Dom Mar 7 23:53:54 CET 2010
Pues por lo que parece el algoritmo genetico es algo parecido a un branch
and bound, es decir un sistema por el que haces una variación y desarrollas
segun esta variación si va cumpliendo unas expectativas continuas con el
desarrollo si no descartas esa variación, de todas formas dejame un par de
dias para mirar el codigo y te comento mas en detalle.
2010/3/6 mario Guzman Moreno <mguzman_18 en hotmail.com>
> 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;
> }
>
>
>
>
>
> ------------------------------
> ¿Quieres saber qué móvil eres? ¡Descúbrelo aquí!<http://www.quemovileres.com/>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100307/e914431d/attachment-0001.html>
Más información sobre la lista de distribución Cconclase