Esta es una pregunta genérica, y aunque estoy bastante seguro de que algunas de sus partes han sido respondidas, quiero opiniones en lugar de una amplia discusión . Tengo la intención de hacer una tesis de maestría en computación evolutiva y programación genética, y me gustaría opiniones de expertos en Linux/C++ si sería posible crear archivos de código fuente del programa genético, invocar gcc para compilarlos, si no lo hacen Compilar para capturar esas razones por las que fallaron, si compilan para ejecutar el programa compilado (como un nuevo proceso) y luego para poder enviar entradas a ese programa y capturar la salida y cualquier excepción planteada (o bloqueos). Entiendo que el tema es demasiado amplio, pero me gustaría saber si alguien piensa que esto no se puede hacer, que es una tontería intentarlo, o incluso que podría haber una manera mejor de hacerlo.Programación genética en C++: invocación de un enlazador/compilador, ejecución del programa compilado y entrada/salida de tubería
Respuesta
Sí, es posible hacer esto, y de hecho bastante simple. Salió el código fuente a un archivo temporal (mkstmp
), fork
/exec
un proceso de compilación (que emite a un archivo temporal), fork/exec
el programa resultante, antes dup2
y pipe
para conectar una entrada y una salida. Es una programación básica de Unix, nada realmente complicado de hacer en C aquí.
La generación de código en sí misma puede ser más difícil de corregir, pero esto depende en gran medida del proyecto.
Además, tenemos herramientas modernas desde hace un par de meses: creo que Clang definitivamente puede ser algo a tener en cuenta para este tipo de cosas. Si la generación de código que planea hacer es simple (o no simple, pero estructurado), también puede generar directamente el código LLVM. No es difícil y le permite generar código compilado justo a tiempo.
¡Muchas gracias por los enlaces! No me había pasado por la mente usar otro compilador. La generación de código en sí será un proceso de evolución de GP, por lo que si no se compila, esencialmente se muere. Si compila y bloquea, segmenta, levanta excepciones, etc. muere. Incluso si se compila y funciona sin problemas, todavía tiene que hacer lo que se requiere en cada escenario para poder sobrevivir. Supongo que podría usar Clang. La generación de código dependerá por completo de las generaciones y la complejidad de la tarea requerida. –
¿Qué estás tratando de optimizar en este programa genético? Además de solo buscar programas que se ejecutan, ¿qué criterios estarías buscando? No entiendo el punto ...
Para ser claro, la razón por la que pregunto esto es porque solo entiendo el uso de algoritmos genéticos en un intento de resolver algún tipo de problema de optimización. En este caso, tendría algún tipo de heurística en la que puede evaluar a todos los niños del proceso y luego criar nuevos descendientes según la heurística y un criterio de selección. No entiendo cuál sería el resultado deseado al generar esta fuente o cómo crearía la heurística para evaluarla.
No es un algoritmo genético que intenta optimizar algo, es un aprendizaje automático: vida artificial, experimentar para ver si una máquina puede evolucionar un código de computadora complejo, desde el cual puede aprender y evolucionar un código aún más complejo.Las funciones de los programas, las clases, etc. que se evaluarán deben ajustarse a criterios especiales en cada caso, y se espera que esto permita la creación de un "conjunto de reglas". Por ejemplo, en uno de los primeros pasos trataría de desarrollar una función que devuelva cuál de las dos entradas es mayor. Más tarde, el motor debería poder usar esa función. –
Bueno, si quieres usar un algoritmo genético, en algún momento tendrás que formar tu problema en términos de algo que quieras optimizar. También necesitará formalizar heurísticas que evalúen el código fuente que está generando. Realmente no veo por qué lo que estás haciendo tiene algo que ver con los algoritmos genéticos. Por más genial que parezca tratar de "evolucionar" una computadora cambiando aleatoriamente las líneas de código fuente, en realidad no parece haber ningún método detrás de esto. – jberg
¡Hay un método! Además, no es un algoritmo de optimización, es un algoritmo evolutivo para crear un código viable, significativo y utilizable. La evaluación se lleva a cabo por: a) comprobación de errores de compilación b) comprobación de excepciones c) incumplimiento de la meta (verificación de entrada y salida) sea lo que sea. Como dije, lo he hecho antes, mi preocupación no es la evaluación per se, sino la comunicación con el compilador y el proceso invocado para hacer la evaluación real. Además, no es un GA, es un GP, no hay una cadena de caracteres, cadenas fijas, etc. ver: http://www.genetic-programming.org –
- 1. Programación genética en C#
- 2. Parámetros de Programación Genética Inicial
- 3. Programación genética en C++, ¿sugerencias de la biblioteca?
- 4. Biblioteca de programación genética para Java
- 5. Java - Invocación y ejecución de métodos
- 6. Ejecución del programa Speed of C
- 7. Tubería de un programa que utiliza WriteConsole
- 8. Ejecutar y Capture un programa de otro
- 9. Tiempo de ejecución del programa
- 10. Tiempo transcurrido de ejecución de un programa en C
- 11. ¿Cómo interactúa un programa compilado con el sistema operativo?
- 12. Ejecución de código serie en un programa multiproceso en C++
- 13. Tiempo de ejecución variable de un programa en C
- 14. ¿Cuál es la biblioteca de programación genética más activa?
- 15. ¿Cómo depurar un programa compilado con 'make'?
- 16. ¿Java es un lenguaje de programación compilado o interpretado?
- 17. Entrada de tubería en un programa de C++ para depurar en Visual Studio
- 18. ¿Hay algún código de programación genética escrito R
- 19. Crear un árbol binario en Java para fines de programación genética
- 20. ¿Qué es Probabilidad de cruce y probabilidad de mutación en algoritmo genético o programación genética?
- 21. Horario de programación para portar un programa
- 22. ¿Es posible depurar código compilado en tiempo de ejecución?
- 23. Incrustar un lenguaje de programación en un programa
- 24. Node.js y la tubería de un ConnectionListener
- 25. Simulación de ingeniería genética
- 26. ¿Por qué assert simplemente termina un programa compilado para iPhone?
- 27. invocación de Java desde C++
- 28. Bibliotecas estáticas en el programa compilado de versión cruzada
- 29. ¿Cómo termina Eclipse un programa en ejecución?
- 30. Cálculo del tiempo transcurrido en un programa C en milisegundos
No es para nada tonto, pero requiere mucho tiempo. La parte intelectualmente desafiante es crear un buen C++ adna para evolucionar. ¿Cuáles son los temas/objetivos de tu sopa primordial? –
¿Existe alguna restricción para hacer esto es C++? Creo que quizás haya mejores opciones si va a tener un software que los cambios en sí ... –
Esto no va a funcionar. Tener una mutación sobrevive y eventualmente contribuye a la mejora es extremadamente improbable. Los compiladores no soportan los cambios de una sola letra, fueron diseñados para hacer lo contrario. –