2011-04-07 13 views
6

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

+0

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? –

+0

¿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í ... –

+0

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. –

Respuesta

1

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.

+0

¡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. –

1

¿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.

+0

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. –

+0

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

+0

¡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 –

Cuestiones relacionadas