Sie sind auf Seite 1von 3

Algoritmos genéticos y reporte de ejercicios de escalada

Guilherme de Brito Freire

1) Algoritmo genético – Introducción

Usando el algoritmo genético con valores predeterminados (pi = 50, ng = 100, pc


= 80%, pm= 1%) no obtuvo muy buenos resultados. En ninguna de las ejecuciones
fue capaz el algoritmo de Obtener la solución correcta siempre se atasca en un
máximo local. La solución para un sudoku.
Una de las 17 sugerencias es única, por lo que si el algoritmo llegara a ese
punto, sería solo uno.

Implementación

Usé una biblioteca de python llamada DEAP. Lo encontré muy bueno y fácil de
entender / usar La interfaz de esta biblioteca. Permite mucha flexibilidad para
modificar cualquier parámetro. Eso puede existir en un algoritmo genético. La
ventaja de usar esta biblioteca es que ya Viene con muchas cosas básicas y de
uso común en un AG hecho listo. Y cualquier Personalización que quiero hacer,
puedo cambiar la función utilizada dentro del algoritmo a través del
que la documentación llamada del kit de herramientas.

Inicialmente había elegido codificar el ADN de los individuos a través de un


vector 64 posiciones, donde cada posición puede asumir un valor de 1 a 9.
Inicialización de vectores fue aleatorio y las restricciones de la junta fueron
agregadas más tarde.

Sin embargo, esta versión tiene un rendimiento que juzgué mal y decidí hacer Una
segunda versión (genetic2.py). En esta versión, la inicialización se realiza de
modo que cada fila de la tabla tenga solo una instancia de cada valor del 1 al
9. Por lo tanto, ya comienzo en un estado que es mejor que un 100% aleatorio.
Con este cambio, la población inicial comenzó con una calificación de la junta
mucho más alta y, en consecuencia, alcanzó el punto de convergencia
comparativamente más rápido (máximo local). Esto también resultó en una Un poco
mejor rendimiento en términos de solución final.

Análisis de parámetros

Al analizar y modificar los parámetros de uno en uno, me di cuenta de cómo los


parámetros Influye en la búsqueda. Si aumentamos la posibilidad de que ocurra
una mutación, el algoritmo mejora considerablemente. La probabilidad del 1%
simplemente demostró ser muy baja. Sin embargo no es recomendado aumentar mucho
Esta probabilidad porque el algoritmo comienza a ser demasiado Ruidosos y
perderse en la búsqueda.

Empíricamente, puedo decir que un buen valor de mutación para Este problema con
los otros parámetros fijos es del 10%. Quizás esto se deba al hecho de que La
población tiene un tamaño estándar de 50 individuos. Como 50 individuos no
permiten un límite de búsqueda muy amplio, la mutación está a cargo de explorar
ramas más remotas arbol. Lo que nos lleva al segundo parámetro a modificar, el
tamaño de la población.

La modificación de este parámetro tiene el mayor efecto en el rendimiento del


algoritmo. Basándome en las pruebas, llegué a la conclusión de que 300
individuos es un buen tamaño para este problema con los otros hiper-parámetros
fijos (y la mutación de vuelta en un 1%). Con esta población más grande, el
algoritmo puede tener un límite de búsqueda más grande al principio, lo cual es
importante ya que hace que sea más fácil encontrar el mejor camino. Incrementar
la población mucho más tampoco significa mucho más rendimiento. Parece que cada
parámetro tiene una buen valor y cuanto más nos alejamos de él (más o menos),
peor es el resultado.

Al observar el número de iteraciones, me di cuenta de que no mejorar también


afecta en gran medida al algoritmo Con los parámetros por defecto, el algoritmo
converge muy rápido, cerca de 30 iteraciones Por lo tanto, a partir de este
valor, aumentar el número de iteraciones no mejorará la Respuesta del algoritmo,
pero acerca a los individuos entre sí. Esencialmente disminuyendo la desviación
estándar.
Finalmente, el cambio de la influencia influye tanto en la respuesta como
convergencia Con una probabilidad de cruce muy baja, el algoritmo se estabiliza
rápidamente y no progresa mucho. Mientras que aumentar la posibilidad de cruce
incrementó significativamente el rendimiento del algoritmo. Después de todo
esto, la población casi siempre se actualiza y, por lo tanto, encontrar otro
estado, posiblemente sea mejor.

Cambiando el tablero

Fue interesante cambiar la cantidad de valores fijos en el tablero. A priori,


pensé que eliminar restricciones ayudaría al algoritmo ya que ahora hay más
soluciones posible (17 es el número mínimo de “consejos” para una única
solución). Sin embargo, el El rendimiento apenas se vio afectado por la
eliminación de restricciones. Lo que cambió fue la velocidad de convergencia Con
menos restricciones, el algoritmo puede converger a cualquiera de los posibles
soluciones (y en consecuencia la cantidad de mínimos locales también aumenta).

Por lo tanto, el algoritmo finalmente llegó a un mínimo local más rápido y se


estancó allí.

Ahora, a medida que aumentamos, el algoritmo se desempeñó mejor. Al principio


Esto parece contraintuitivo. Sin embargo, al ajustar aún más las condiciones del
problema, el espacio de búsqueda se vuelve considerablemente más pequeño y la
cantidad de máximos locales disminuye considerablemente. Los resultados de los
experimentos muestran exactamente esto: en general, el algoritmo fue exitoso
Mejor que con menos restricciones.

Elitismo

Por alguna razón, usando elitismo el rendimiento se redujo extremadamente. No


conseguí entender la razon Sin embargo, esta parte del trabajo se realizó a toda
prisa y es posible que no haya notado algo obvio o que haya hecho algo tonto
cuando se trató de actuar. De los ejemplos tomados (como se puede ver en los
gráficos generados), el rendimiento disminuyó enormemente.

Otras variaciones

Después de realizar los experimentos solicitados, decidí modificar más de un


parámetro a la vez para tratar de alcanzar el mejor resultado posible. Los
gráficos para estos. Las modificaciones están en la carpeta multi_parameters.

Después de variar mucho los parámetros, llegué a la conclusión de que una


cantidad un buen conjunto de parámetros es ng = 1000, pi = 300+, pc = 80% y pm =
10%. Con parámetros similares, obtuve buenos resultados. Los mejores de ellos
solo difieren en población con el valor 1000.

También llegué a implementar la idea dada en clase de aumentar el factor de


mutación. Cuando la población se estanca. Esto ayudó a mejorar un poco el
resultado y pudo cumplir el rol de mover a la población de una convergencia a un
máximo local y continuar a otro máximo local con una puntuación más alta.

Usando esta técnica, obtuve una puntuación de 233 de los 243 puntos posibles. Lo
que posiblemente significa que la tabla final tenía 3 cuadrados incorrectos (ya
que en mi función de aptitud cuento los errores por fila, columna y cuadrante,
permitiendo que un cuadrado incorrecto contribuya con hasta 3 errores).
2) Hill Climbing

Introducción

Inicialmente, pensé que Hill Climbing obtendría un resultado peor que el


algoritmo genético Sin embargo, me sorprendió ver que sucedía lo contrario.
Sucedió Principalmente por la forma en que escribí ambos códigos. En Hill
Climbing, a diferencia del Genético, ya que solo mis vecinos son posibilidades
de crecimiento, tengo más controlar como programador cómo seleccionar el camino
de ascenso. La táctica utilizada fue inicialmente para iniciar una matriz cuyas
líneas tienen números del 1 al 9 sin repetir en un orden aleatorio En cada paso,
permití que el algoritmo cambiara entre Dos posiciones de la misma línea. De
esta manera, garantizo que la integridad de las líneas.

Permanecerá durante toda la carrera. Y así, el crecimiento de la escalada será


bastante eficiente De hecho, la práctica ha demostrado esta teoría. Precisamente
para perder el control de la integridad de las líneas en el genético (debido al
cruce y las mutaciones), el camino a la solución.

No está tan bien controlado. Mientras que en la escalada este control se


mantiene y la progresión resultó consistente.

Aun así, Hill Climbing no pudo encontrar ninguna solución. Lo tengo Acércate
mucho, pero no en la solución.

1) Implementación

El algoritmo de escalada fue implementado por mí usando solo numpy como una
biblioteca externa.

2) Cambiando el tablero

Hice los mismos cambios en el tablero con la escalada de colinas para verificar
los cambios. Los resultados fueron consistentes con los del algoritmo genético.
Cuando eliminé las restricciones – y en consecuencia, generó más máximos
locales: la escalada de la colina se atoró al máximo ubicación más a menudo. Y
al agregar restricciones, la escalada de colinas pudo acercarse mucho a la
solución, superando todas mis expectativas para este desempeño.
algoritmo

3) Ejecución

Para ejecutar el algoritmo de escalada, simplemente abra el archivo


hill_climbing.py con python (en mi computadora siempre uso python3, así que no
sé si hay alguna incompatibilidad con python2.7). Ejecutar el algoritmo genético
es lo mismo, solo con el archivo genetic2.py. Para ejecutar genetic2.py
necesitas descargar la librería DEAP para python. Esto se puede hacer fácilmente
con pip install deap o pip3 install deap Dependiendo de la versión de python.

4) Comentarios

Las imágenes se dividen en carpetas con nombres que se explican por sí mismos y
se refieren a experimentos realizados Puede suceder que algunos títulos de
gráficos sean un poco incorrectos (mi error al hacer el gráfico). Sin embargo,
su ubicación en carpetas describe exactamente sus contenidos. Si hay una
divergencia entre el título y la ubicación, la confianza más en la ubicación.

Das könnte Ihnen auch gefallen