[C con Clase] ayuda con este codigo ALGORITMO GENETICO

Steven Davidson srd4121 en njit.edu
Dom Mar 7 01:31:25 CET 2010


Hola Mario,

mario Guzman Moreno wrote:
> 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

Comentaré a grandes rasgos las funciones.

> 

[CORTE]

> typedef vector<ga_struct> ga_vector;// for brevity      PARA ABREVIAR
> 

Se trata de una lista de registros los cuales contienen una cadena y una 
aptitud cada uno.

> void init_population(ga_vector &population,
>                      ga_vector &buffer )

Sirve para "poblar" la lista 'population' con ciertos caracteres 
imprimibles generadas pseudo-aleatoriamente para la cadena y 0 (cero) 
para la aptitud de cada registro.

La verdad es que cada carácter imprimible, en este algoritmo, es un 
número entero entre 32: ' ' (el espacio) y 121: el carácter, 'y'. Por lo 
tanto, se puede tratar cada cadena como una secuencia de caracteres o 
como una secuencia de enteros.

> 
> void calc_fitness(ga_vector &population)

Esta función calcula las aptitudes de la población, según la lista 
'population', y las asigna a cada registro. Este cálculo se basa en la 
suma de diferencias no negativas entre los caracteres de una cadena y 
los de la cadena "base" descrita por 'GA_TARGET'. Para no conseguir la 
diferencia negativa, se aplica el valor absoluto a la resta.

> 
> bool fitness_sort(ga_struct x, ga_struct y)
> { return (x.fitness < y.fitness); }
> 

Esta función sirve para usarse en la siguiente función para indicar el 
criterio de la ordenación.

> inline void sort_by_fitness(ga_vector &population)
> { sort(population.begin(), population.end(), fitness_sort); }
> 

Esta función ordena los registros de la población de menor a mayor, 
según su aptitud.

> void elitism(ga_vector &population,
>                 ga_vector &buffer, int esize )

Esta función copia los primeros 'esize' registros de la población a la 
lista 'buffer'.

> void mutate(ga_struct &member)

Sirve para mutar un registro en concreto, 'member'. Esto se hace 
eligiendo pseudo-aleatoriamente un carácter de la cadena y agregando una 
variación numérica, sin que se salga del intervalo: [32,121] o en 
caracteres: [' ','y'].

> void mate(ga_vector &population, ga_vector &buffer)

Esta función aparea o junta poblaciones - no las mata. Esto se hace 
eligiendo una población élite, 'buffer', invocando 'elitism()'. Se 
generan las cadenas de cada registro restante de la lista 'buffer' 
combinando dos subcadenas elegidas al azar de la lista 'population'. 
También existe una posibilidad de mutación, por lo que se invocaría 
'mutate()'.

> inline void print_best(ga_vector &gav)

Imprime el primer registro de la población, que se considera el mejor.

> inline void swap(ga_vector *&population,
>                  ga_vector *&buffer)

Intercambia los punteros. Esto implica que la información es la misma; o 
sea, no se intercambia la información. Esto sirve para generar la nueva 
población en cada iteración en 'main()'.

> 
> int main()

La función principal del programa. En cada iteración, aplicamos varias 
operaciones a la población actual apuntada por 'population': a) 
calculamos las aptitudes, b) ordenamos por aptitud, y c) imprimimos el 
mejor registro (el primero). Si la aptitud del mejor registro es 0 
(cero), entonces salimos prematuramente del procedimiento. Si no, 
entonces apareamos o combinamos las poblaciones, generando otra 
población, 'buffer'. Para preparar para la siguiente iteración, 
intercambiamos los punteros de las poblaciones actual ('population') y 
nueva ('buffer').


Espero que esto aclare las dudas.

Steven





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