Estoy tratando de implementar un algoritmo genético que calculará el mínimo de Rastrigin functon y estoy teniendo algunos problemas.
Necesito representar el cromosoma como una cadena binaria y como la función de Rastrigin toma una lista de números como parámetro, ¿cómo se puede decodificar el cromosoma a una lista de números?
También el Rastrigin quiere que los elementos en la lista sean -5.12 < = x (i) < = 5.12 ¿Qué sucede si cuando genero el cromosoma producirá un número que no está en ese intervalo?Algoritmos genéticos
Respuesta
Está buscando implementar un Algoritmo Genético. Su implementación debe ser tal que funcione para cualquier problema genérico de minimización (o maximización) y no solo la función Rastrigin. Puede decidir implementar un GA binario codificado o un GA codificado real. Ambos tienen sus propios usos y aplicaciones de nicho. Pero para usted, sugeriría implementar un GA codificado Real. Según su pregunta con respecto a qué hacer, si los valores de las variables generadas están fuera de [-5.12: 5.12], un GA con código real y un código binario GA lo manejarán de manera diferente.
Tener un código de referencia siempre es bueno antes de comenzar a implementar su propia versión. Si está buscando una implementación C, el source section de lab tiene una implementación de GA codificado real, que nosotros y otros utilizamos ampliamente para nuestro trabajo de investigación. Te sugiero que juegues con él y pruebes algunos de los problemas simples de optimización que se ofrecen allí.
Pyevolve es una biblioteca de Python para Algoritmos Genéticos y Programación Genética.
Ahora que hemos hablado sobre la implementación, ¿está claro su entendimiento de GA? De lo contrario, consulte este tutorial, que presenta GA desde un punto de vista de optimización. Tenga en cuenta que la explicación del cruce y la mutación para una GA codificada en binario no se transfiere automágicamente a una GA con código real. La GA codificada real tiene sus propias complejidades, por lo que necesitará tiempo para leer algunos documentos y comprenderlos.No hay prisa, pero con un esfuerzo de tiempo completo deberías poder ponerte en marcha fácilmente.
Supongo que está programando en C. Los enteros (int para el lenguaje C) se pueden empaquetar como una matriz de 4 bytes/char (32 bits). por lo que si la matriz es
char* chrom_as_bytes=(...)
su puede obtener el valor i-ésimo de fundición a int *
int ith=3;
value=((int*)chrom_as_bytes)[ith];
si un valor no está en el rango de -5,12 < x 5,12 < que, a su La función de fidelidad debería devolver un valor muy malo y este paso en la evolución debería descartarse en la próxima generación.
Consulte también el artículo en Wikipedia.
¿Por qué necesita representar el cromosoma como una cadena binaria? Puede escribir algoritmos evolutivos que usan otros tipos. Podría usar una lista de números.
En cuanto a la restricción de los valores, cuando genere los miembros iniciales de la población, asegúrese de que los números aleatorios estén dentro del rango que necesita. Restringir el operador de su mutación para evitar producir valores fuera de este rango (puede truncar valores que están fuera de este rango, o puede tenerlos ajustados).
Si realmente tiene que usar una cadena binaria, eche un vistazo a Gray Code, que es una forma de codificar valores numéricos en binario haciéndolos más susceptibles a mutaciones.
Para manejar restricciones (como tener valores dentro de algunos límites), es probable que arruinar o truncar desordene la optimización, básicamente agrega un ruido fuerte ... Un esquema de penalización (agregue una penalización a la aptitud, proporcional a la violación de restricción) Will hace las cosas mucho más graciosas. Si realmente no desea una violación en absoluto, puede volver a muestrear, es decir, volver a intentar una mutación hasta que la persona resultante no viole ninguna restricción. – Monkey
Si le interesa, he hecho una implementación usando Pyevolve: http://pyevolve.sourceforge.net/examples.html#example-7-the-rastringin-function Lo siento por el error tipográfico en el nombre.
La codificación de soluciones de problemas reales como una cadena de bits no es realmente el camino a seguir. Cuando tienes números como cadenas de bits, estás usando números de punto fijo para representar los números. Una vez que su algoritmo se acerque al óptimo, hasta la precisión de su codificación de punto fijo, no progresará más. Puede usar más bits, pero luego tendrá una convergencia más lenta. En la práctica, en problemas serios, tal enfoque es de varias órdenes de magnitud más lenta que un algoritmo competente que trabaja en valores de coma flotante.
Usar números en coma flotante le permitiría acercarse mucho más al óptimo, digamos 1e-10, mientras utiliza los números típicos de 64 bits. Además, el algoritmo evolutivo moderno usa un esquema adaptativo para ajustar el paso de la mutación durante la optimización. Tal mecanismo permite una mayor velocidad de convergencia, en comparación con un paso de mutación fija. Verifique esto para ver qué optimizadores evolutivos típicos logran en la función Rastrigin: http://coco.gforge.inria.fr/doku.php?id=bbob-2010
- 1. Uso de algoritmos genéticos para redes neuronales
- 2. Algoritmos genéticos de programación y búsqueda
- 3. Cuándo usar Algoritmos genéticos vs. cuándo usar redes neuronales?
- 4. ¿Cuál es la diferencia entre los algoritmos genéticos y evolutivos?
- 5. ¿Cómo configuro las restricciones de algoritmos genéticos de Matlab?
- 6. ¿Qué es el "Hola mundo"? de algoritmos genéticos bueno para?
- 7. ¿Qué biblioteca/bibliotecas de Java para Algoritmos Genéticos?
- 8. ¿Cuáles son las diferencias reales entre los algoritmos genéticos y los algoritmos evolutivos?
- 9. ¿Cómo se representa un cronograma para el problema de la tabla de tiempo en algoritmos genéticos?
- 10. ¿Cuáles son las diferencias entre los algoritmos genéticos y las estrategias de evolución?
- 11. Algoritmos de estrategia de construcción de ciudades
- 12. algoritmos Diff
- 13. Comparar algoritmos de similitud
- 14. eligiendo entre los algoritmos
- 15. Algoritmos para City Simulation?
- 16. Algoritmos de gráfico incremental
- 17. Algoritmos de comparación C#
- 18. Algoritmos en C
- 19. Algoritmos para laberintos 3D
- 20. Algoritmos de sincronización
- 21. ¿Nuevos algoritmos criptográficos?
- 22. Análisis de algoritmos (complejidad)
- 23. acelerómetro Smartphone gestos algoritmos
- 24. Solicitud de libro: algoritmos distribuidos
- 25. Algoritmos de cadena de búsqueda
- 26. Algoritmos de personalización del perfil
- 27. Ruta de trama siguiente algoritmos
- 28. haciendo algoritmos genéricos en go
- 29. Algoritmos de detección de acordes?
- 30. Algoritmos de similitud de cadenas?
En un GA, cuando se da un rango de valores de un parámetro, generalmente es una práctica (en mi humilde opinión), tener en cuenta en la población inicial en sí, es decir, mi garantía de que mi población inicial consiste en variables que siguen el rango asignado. Durante las operaciones de cruce y mutación, si se excede el rango, hay más de una forma en que se puede manejar. Lo que sugiere es el enfoque de "penalización". ¿Derecha? –