Está en la página 1de 4

Algoritmo Genético

Algoritmos Bioinspirados
Profesora:
Abril Valeria Uriarte Arcia
Alumno:
Morales Bustamante Jorge Alfredo
El objetivo de esta práctica es desarrollar un algoritmo
genético que sirviera para maximizar una función
matemática en un rango definido.
Para su elaboración seguí una serie de pasos predefinidos
que simulan la reproducción, comenzando por la generación
de una población inicial para la que hice una función llamada
generaPoblacion() en la que se forma un arreglo de n
concatenaciones entre m valores aleatorios entre uno y
cero.
Posteriormente, el programa entra a un ciclo For que se
repite la cantidad máxima de generaciones que se tiene
como límite, en este caso 10. En cada iteración, el programa
invoca a una función llamada evolucionaGeneracion(), en la
que sucede el verdadero proceso de reproducción entre
individuos.
Dentro de dicha función de hace una copia de la población
actual como base para la población evolucionada, y se toman
a dos miembros seleccionados mediante el método de la
ruleta para su reproducción, mismos que son eliminados de
la población evolucionada. Posteriormente, se hace la cruza
de los padres para obtener a los hijos, se lleva a cabo la
mutación de los padres, la selección de los mejores
individuos para el reemplazo, y su agregación a la población
evolucionada, que es devuelta para volver a ser procesada
por el ciclo For principal hasta llegar al número máximo de
generaciones.
Ahora bien, para cada uno de los procesos necesarios para
la evolución de la generación, la función invoca a otras
funciones que desarrollan proceso por proceso.
La función que realiza el método de la ruleta primeramente
hace un recorrido de la población y asigna la frecuencia y la
frecuencia acumulada a cada individuo. Para conocer su
frecuencia, la función getFrecuencia() recorre la lista y por
cada ocurrencia de un mismo elemento, suma uno a un
contador, que es devuelto como la frecuencia del individuo
en cuestión. Posteriormente, pasa por una función llamada
getSeleccion(), que recibe un numero aleatorio y selecciona
al individuo que coincide con el rango de frecuencias
acumuladas al que pertenece el valor.
Para obtener a los hijos, se invoca a la función
cruzaUniforme(), que genera un número aleatorio que es
comparado con el porcentaje de cruza elegido. Si el número
es menor, se realiza la cruza. Para ello, por cada gen en los
padres se escoge un número aleatorio entre 0 y 1, si es
menor a 0.5, se añade al hijo uno el gen del padre 1 y al hijo 2
el gen del padre dos; si es mayor, al hijo 1 el gen de padre 2 y
al hijo 2 el gen del padre 1. Finalmente, los hijos se
devuelven en una lista.
Para la mutación de los padres se recorre gen por gen del
padre, y para cada uno se elige de igual forma un número
aleatorio que, si es menor a probabilidad de cruza,
intercambia el valor con su opuesto. Es decir, si el valor es
0, se convierte en 1 y viceversa.
Posteriormente, en la función reemplazoPoblacion() se
calcula el valor fitness de cada individuo, se organizan en
forma descendente y se toma a los dos primeros como los
más aptos, que son enviados de vuelta como los mejores
individuos. Éstos mejores individuos son añadidos a la
población, reemplazando a los dos primeros que fueron
elminados.
Ejecución del programa sin mostrar los pasos intermedios

Ejecución del programa mostrando los pasos intermedios

También podría gustarte