[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