Pregunta

He estado buscando algunos buenos ejemplos de programación genética para C#.¿Alguien conoce buenos recursos en línea/libros?¿Me pregunto si existe una biblioteca de C# para programación evolutiva/genética?

¿Fue útil?

Solución

Después de desarrollar mi propia aplicación didáctica de Programación Genética, encontré un marco de programación genética completo llamado Genética AForge.NET.Es parte del Biblioteca Aforge.NET.Tiene licencia LGPL.

Otros consejos

MSDN publicó un artículo el año pasado sobre programación genética: Algoritmos genéticos:La supervivencia del más apto con Windows Forms

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á escrito dinámicamente.En general, esa es la razón por la que la mayoría de las investigaciones sobre algoritmos genéticos se escriben en LISP.Como resultado, si va a implementarlo en C#, probablemente sea mejor definir su propio mini "lenguaje de árbol", hacer que el algoritmo genere árboles y simplemente interpretar 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 con la que trabajar (la representación AST) que sea óptima tanto para la ejecución como para los pasos de "reproducción" del algoritmo genético.

Alternativamente, si intentas generar ensamblajes, probablemente terminarás agregando una gran cantidad de complejidad innecesaria a la aplicación.Actualmente, CLR no permite descargar un ensamblado de un dominio de aplicación a menos que se destruya todo el dominio de la aplicación.Esto significaría que necesitaría crear un dominio de aplicación separado para cada programa generado en cada iteración del algoritmo para evitar introducir una pérdida de memoria gigante en su aplicación.En general, todo esto añadiría un montón de irritación extra.

Los AST interpretados, por otro lado, son recolectables como cualquier otro objeto, por lo que no necesitarías jugar con múltiples dominios de aplicaciones.Si, por razones de rendimiento, desea generar código para el resultado final, puede agregar soporte para eso más adelante.Sin embargo, te recomendaría que lo hagas usando el Método dinámico clase.Le 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 se pueden recolectar como basura, por lo que podría terminar empleándolas como parte del algoritmo genético para acelerar las cosas allí también.

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.

Vi una buena discusión de alto nivel al respecto en el canal 9 por Mike Swanson en http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/

¿Se refiere 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 es necesario, probablemente querrá generar CIL/MSIL dinámicamente.Podrías hacer esto usando Sistema.Reflexión.Emitir, sin embargo lo recomendaría mono.cecil.Carece de buenos documentos (como si la reflexión los tuviera).Pero ofrece una emisión y reflexión de montaje mucho mejores.

Otro problema es que no es nada trivial cargar código y luego eliminarlo en el marco .net.Al menos, no se pueden descargar ensamblajes.Puede descargar dominios de aplicación, pero todo el asunto de cargar código en un dominio de aplicación separado y llamarlo externamente puede resultar bastante complicado.El material System.Addin de .NET 3.5 debería facilitar esto.

Si está interesado en los algoritmos genéticos o la optimización heurística en general, es posible que desee echar un vistazo a Laboratorio heurístico.Se ha desarrollado durante varios años, 1,5 años desde que lanzamos la nueva versión.Está programado en C# 4 y tiene una bonita GUI.Ya hay muchos algoritmos 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 ruta de vehículos, un viajante de comercio, una optimización de funciones reales, una mochila, un problema de asignación cuadrática, una clasificación, una regresión y muchos más.También hay tutoriales y tenemos buffers de protocolo integrados para que pueda comunicarse con programas externos para la evaluación de soluciones.Tiene licencia 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.

Tengo un producto gratuito que puede ayudar. El marco del algoritmo genético .Net 4.0 es un único ensamblado .Net 4.0 con algunos artículos de apoyo.

Estoy leyendo Una guía de campo para la programación genética ahora mismo (descarga gratuita de PDF).También está disponible en edición de bolsillo.Se analiza el uso de una biblioteca escrita en Java llamada pequeñogp.Podrías sacar algo de provecho de eso.No he empezado a hacer ninguna programación real, pero espero aplicar algunos de los conceptos de C#.

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 Java original del Tribunal de Justicia de la Unión Europea, 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 la computación distribuida no se prueban completamente.Esto se debe a que planeo pasar del uso simple de sockets del TJCE a una estrategia más sólida que utiliza WCF y WF.También reelaboraré el marco para utilizar TPL (Biblioteca paralela de tareas).

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 tenga tiempo).

ben

Puedes probar GenéticoSharp.

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

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

Se puede usar en muchos tipos de aplicaciones, como bibliotecas C# y juegos Unity 3D, hay ejemplos que lo ejecutan en un Aplicación GTK# y Juego de damas Unity 3D.

También funciona en Win y OSX.

Aquí hay un ejemplo básico 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();

El libro de Manning:"Metaprogramación en .NET" dedica una gran sección a GP mediante árboles de expresión.

Mantengo un puerto del TJCE en C#.Es genial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top