c# genetic-algorithm genetic-programming evolutionary-algorithm

Programación genética en C#



genetic-algorithm genetic-programming (13)

Si está interesado en algoritmos genéticos o optimización heurística en general, es posible que desee consultar 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: Algoritmos genéticos y Programación genética .

He estado buscando 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?





¿Te refieres a la programación genética real, a diferencia de los algoritmos genéticos en general?

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

Sin embargo, si debe hacerlo, probablemente desee generar dinámicamente CIL / MSIL. Podrías 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 el .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.


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


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 coleccionables como cualquier otro objeto, por lo que no necesitarías husmear con múltiples dominios de aplicaciones. Si, por razones de rendimiento, desea codificar el resultado final, puede agregar soporte para eso más adelante. Sin embargo, yo recomendaría que haga eso 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.


Estoy leyendo una guía de campo para la programación genética en este momento (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 #.


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



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 enchufes de ECJ a una estrategia más robusta utilizando WCF y WF. También revisaré el marco para utilizar TPL (Task Parallel Library).

De todos modos, puedes 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 de "inteligencia sintética" (cuando puedo encontrar el tiempo).

Ben


Puedes probar GeneticSharp .

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

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

Se puede usar en muchos tipos de aplicaciones, como las bibliotecas C # y los juegos Unity 3D, hay ejemplos que lo ejecutan en una aplicación GTK # y en el juego de damas Unity 3D .

También funciona en Win y OSX.

Aquí hay una muestra básica de cómo usar 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();