58

He estado buscando algunos buenos ejemplos de programación genética para C#. ¿Alguien sabe de buenos recursos en línea/libros? ¿Te preguntas si hay una biblioteca de C# disponible para programación Evolucionaria/Genética?Programación genética en C#

Respuesta

4

¿Se refiere a la programación genética real, en lugar de algoritmos genéticos en general?

Si es así, C# /. Net no es el mejor idioma para ello. LISP, por ejemplo, siempre ha sido un pilar de GP.

Sin embargo, si debe hacerlo, probablemente desee generar dinámicamente CIL/MSIL. Puede hacer esto usando System.Reflection.Emit, sin embargo, recomendaría Mono.Cecil. Carece de buenos documentos (como si el reflejo emitir los tiene). Pero ofrece una mejor emisión y reflexión de ensamblaje.

Otro problema es que es menos que trivial cargar el código, y luego deshacerse de él, en .NET Framework. Al menos, no puedes descargar ensamblajes. Puedes descargar appdomains, pero todo el asunto de cargar código en un dominio de aplicaciones separado y llamarlo externamente puede ser bastante complicado. El material System.Addin de .NET 3.5 debería facilitar esto.

+0

Especifica GP en lugar de GA, pero las etiquetas dicen ambas. –

10

Es posible que pueda implementar programación genética utilizando árboles de expresiones LINQ; es más probable que genere algo útil que la generación aleatoria de IL.

13

Recomendaría no generar ensamblajes a menos que sea absolutamente necesario, especialmente si recién está comenzando a implementar el algoritmo genético.

El algoritmo genético es más fácil de implementar cuando el idioma de destino es funcional y está tipeado dinámicamente. Por eso, generalmente, la mayoría de las investigaciones sobre algoritmos genéticos están escritas en LISP. Como resultado, si va a implementarlo en C#, probablemente sea mejor que defina su propio mini "lenguaje de árbol", que el algoritmo genere árboles, e interprete los árboles cuando llegue el momento de ejecutar cada iteración del algoritmo. .

Hice un proyecto como este cuando estaba en la universidad (una implementación del algoritmo genético en C#), y ese fue el enfoque que tomé.

Hacerlo de esa manera le dará la ventaja de tener solo 1 representación para trabajar (la representación AST) que es óptima para la ejecución y los pasos de "reproducción" del algoritmo genético.

Alternativamente, si intenta generar ensamblajes, es probable que termine agregando una gran cantidad de complejidad innecesaria a la aplicación. Actualmente, el CLR no permite que se descargue un ensamblaje de un dominio de la aplicación a menos que se destruya todo el dominio de la aplicación. Esto significa que necesitaría crear un dominio de aplicación separado para cada programa generado en cada iteración del algoritmo para evitar la introducción de una pérdida de memoria gigante en su aplicación. En general, todo esto solo agregaría un montón de irritación adicional.

Los AST interpretados, por otro lado, son objetos de colección de basura como cualquier otro objeto, por lo que no tendría que montarse con múltiples dominios de aplicación. Si, por razones de rendimiento, desea codificar el resultado final, puede agregar soporte para eso más adelante. Sin embargo, yo recomendaría que lo haga usando la clase DynamicMethod. Te permitirá convertir un AST en un delegado compilado dinámicamente en tiempo de ejecución.Eso le permitirá implementar una única DLL mientras mantiene la generación de código lo más simple posible. Además, las instancias de DynamicMethod son basura coleccionable por lo que podrías terminar empleándolas como parte del algoritmo genético para acelerar las cosas allí también.

+0

En realidad, he encontrado que los ensamblados generados funcionan bastante bien y el implementador del marco puede ocultar la mayor parte de la complejidad del implementador de GA. Podemos implementar dinámicamente ensamblados versionados en un clúster –

3

Estoy leyendo A Field Guide to Genetic Programming ahora mismo (descarga gratuita de PDF). También está disponible como libro de bolsillo. Discute el uso de una biblioteca escrita en Java llamada TinyGP. Puede sacarle provecho a eso. No he comenzado a hacer ninguna programación real, pero espero aplicar algunos de los conceptos en C#.

1

Mantengo un puerto de ECJ en C#. Es genial.

3

He bifurcado ECJ a C# .NET 4.0 si está interesado en un marco de Computación Evolutiva con todas las funciones. El paquete incluye todo desde el proyecto original de ECJ Java, incluidas todas las muestras de trabajo.

También escribí 500 pruebas unitarias para verificar muchos aspectos de la conversión. Pero se necesitan muchas más pruebas. En particular, los aspectos de computación distribuida no están completamente probados. Eso es porque planeo convertir el simple uso de tomas de corriente de ECJ a una estrategia más robusta usando WCF y WF. También revisaré el marco para utilizar TPL (Task Parallel Library).

De todos modos, se puede descargar la conversión inicial aquí:

http://branecloud.codeplex.com

También estoy en el proceso de convertir varios otros marcos de Java a .NET que se relacionan con la investigación "inteligencia sintética" (cuando puede encontrar el tiempo).

Ben

4

Si usted está interesado en algoritmos genéticos o la optimización heurística, en general, es posible que desee echar un vistazo a HeuristicLab. Está desarrollado por varios años, 1.5 años desde que lanzamos la nueva versión. Está programado en C# 4 y tiene una buena GUI. Hay muchos algoritmos ya disponibles como Algoritmo Genético, Programación Genética, Estrategia de Evolución, Búsqueda Local, Búsqueda Tabú, Optimización de Enjambre de Partículas, Recocido Simulado y más. También hay varios problemas implementados, como un problema de enrutamiento de vehículos, vendedor ambulante, optimización de funciones reales, mochila, problema de asignación cuadrática, clasificación, regresión y muchos más. También hay tutoriales y tenemos búferes de protocolo integrados para que pueda comunicarse con programas externos para la evaluación de la solución. Está licenciado bajo GPL. En 2009, el software recibió el premio a la innovación de Microsoft de Microsoft Austria.

También hemos escrito un libro sobre el tema: Genetic Algorithms and Genetic Programming.

3

Puedes probar GeneticSharp.

Tiene todas las operaciones de GA clásicas, como selección, cruce, mutación, reinserción y terminación.

Es muy extensible, puede definir sus propios cromosomas, función de adecuación, estrategia de generación de población y todas las operaciones mencionadas anteriormente.

Se puede utilizar en muchos tipos de aplicaciones, como las bibliotecas C# y los juegos Unity 3D, hay ejemplos ejecutándola en un GTK# app y Unity 3D checkers game.

También funciona en Win y OSX.

Este es un ejemplo básico de cómo utilizar la biblioteca:

var selection = new EliteSelection(); 
var crossover = new OrderedCrossover(); 
var mutation = new ReverseSequenceMutation(); 
var fitness = new YourFitnessFunction(); 
var chromosome = new YourChromosome(); 
var population = new Population (50, 70, chromosome); 

var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); 

ga.Start(); 
Cuestiones relacionadas