[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.html>


Más información sobre la lista de distribución Cconclase