Pergunta

Estou procurando alguns bons exemplos de programação genética para C#.Alguém conhece bons recursos on-line/livros?Gostaria de saber se existe uma biblioteca C # para programação evolutiva/genética?

Foi útil?

Solução

Depois de desenvolver meu próprio aplicativo didático de Programação Genética, encontrei uma estrutura completa de programação genética chamada Genética AForge.NET.É uma parte do Biblioteca Aforge.NET.É licenciado sob LGPL.

Outras dicas

O MSDN publicou um artigo no ano passado sobre programação genética: Algorítmos genéticos:Sobrevivência do mais apto com Windows Forms

Eu recomendaria não gerar montagens, a menos que seja absolutamente necessário, principalmente se você estiver apenas começando a implementar o algoritmo genético.

O algoritmo genético é mais fácil de implementar quando a linguagem alvo é funcional e digitada dinamicamente.Geralmente é por isso que a maior parte das pesquisas sobre algoritmos genéticos são escritas em LISP.Como resultado, se você for implementá-lo em C#, provavelmente será melhor definir sua própria mini "linguagem de árvore", fazer com que o algoritmo gere árvores e apenas interpretar as árvores quando chegar a hora de executar cada iteração do algoritmo .

Fiz um projeto como esse quando estava na faculdade (uma implementação do algoritmo genético em C#), e foi essa a abordagem que adotei.

Fazer dessa forma lhe dará a vantagem de ter apenas 1 representação para trabalhar (a representação AST) que é ideal para as etapas de execução e de "reprodução" do algoritmo genético.

Alternativamente, se você tentar gerar assemblies, provavelmente acabará adicionando uma grande quantidade de complexidade desnecessária ao aplicativo.Atualmente, o CLR não permite que um assembly seja descarregado de um domínio de aplicativo, a menos que todo o domínio do aplicativo seja destruído.Isso significaria que você precisaria criar um domínio de aplicativo separado para cada programa gerado em cada iteração do algoritmo para evitar a introdução de um vazamento gigante de memória em seu aplicativo.Em geral, a coisa toda apenas acrescentaria um monte de irritação extra.

Os ASTs interpretados, por outro lado, são coletáveis ​​como qualquer outro objeto e, portanto, você não precisaria mexer com vários domínios de aplicativos.Se, por motivos de desempenho, você quiser gerar o código do resultado final, poderá adicionar suporte para isso mais tarde.No entanto, eu recomendaria que você fizesse isso usando o Método Dinâmico aula.Isso permitirá que você converta um AST em um delegado compilado dinamicamente em tempo de execução.Isso permitirá que você implante uma única DLL enquanto mantém o processo de geração de código o mais simples possível.Além disso, as instâncias do DynamicMethod podem ser coletadas como lixo, então você pode acabar empregando-as como parte do algoritmo genético para acelerar as coisas lá também.

Você pode implementar programação genética usando árvores de expressão LINQ - é mais provável que gere algo utilizável do que a geração aleatória de IL.

Eu vi uma boa discussão de alto nível sobre isso no canal 9 por Mike Swanson em http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/

Você quer dizer programação genética real, em oposição aos algoritmos genéticos em geral?

Nesse caso, C#/.net não é a melhor linguagem para isso.LISP, por exemplo, sempre foi um dos pilares do GP.

No entanto, se for necessário, você provavelmente desejará gerar CIL/MSIL dinamicamente.Você poderia fazer isso usando System.Reflection.Emit, no entanto, eu recomendo Mono.Cecil.Faltam bons documentos (como se a emissão de reflexão os tivesse).Mas oferece emissão e reflexão de montagem muito melhores.

Outro problema é que não é nada trivial carregar código e depois descartá-lo na estrutura .net.Pelo menos, você não pode descarregar assemblies.Você pode descarregar appdomains, mas todo o negócio de carregar código em um appdomain separado e chamá-lo externamente pode ficar bastante confuso.O material System.Addin do .NET 3.5 deve tornar isso mais fácil.

Se você estiver interessado em algoritmos genéticos ou otimização heurística em geral, você pode dar uma olhada em Laboratório Heurístico.Ele está sendo desenvolvido há vários anos, 1,5 anos desde que lançamos a nova versão.Ele é programado em C# 4 e possui uma interface gráfica agradável.Existem muitos algoritmos já disponíveis, como Algoritmo Genético, Programação Genética, Estratégia de Evolução, Pesquisa Local, Pesquisa Tabu, Otimização por Enxame de Partículas, Recozimento Simulado e muito mais.Existem também vários problemas implementados como problema de roteamento de veículos, caixeiro viajante, otimização de função real, mochila, problema de atribuição quadrática, classificação, regressão e muitos mais.Também existem tutoriais e temos buffers de protocolo integrados para que você possa se comunicar com programas externos para avaliação da solução.É licenciado sob GPL.Em 2009, o software recebeu o prêmio de inovação da Microsoft Áustria.

Também escrevemos um livro sobre o assunto: Algoritmos Genéticos e Programação Genética.

Tenho um produto gratuito que pode ajudar. A Estrutura do Algoritmo Genético .Net 4.0 é um único assembly .Net 4.0 com alguns artigos de suporte.

estou lendo Um guia de campo para programação genética agora mesmo (download gratuito em PDF).Também está disponível em brochura.Discute o uso de uma biblioteca escrita em Java chamada TinyGP.Você pode ganhar algum lucro com isso.Ainda não comecei a fazer nenhuma programação real, mas espero aplicar alguns dos conceitos em C#.

Eu bifurquei o ECJ para C# .NET 4.0 se você estiver interessado em uma estrutura de computação evolutiva completa.O pacote inclui tudo, desde o projeto Java ECJ original, incluindo todos os exemplos de trabalho.

Também escrevi 500 testes unitários para verificar muitos aspectos da conversão.Mas são necessários muitos mais testes.Em particular, os aspectos da computação distribuída não foram totalmente testados.Isso porque pretendo converter o uso simples de soquetes do ECJ para uma estratégia mais robusta usando WCF e WF.Também estarei reformulando a estrutura para utilizar TPL (Task Parallel Library).

De qualquer forma, você pode baixar a conversão inicial aqui:

http://branecloud.codeplex.com

Também estou no processo de conversão de vários outros frameworks de Java para .NET relacionados à pesquisa de "inteligência sintética" (quando tiver tempo).

Bem

Podes tentar GenéticoSharp.

Possui todas as operações clássicas do GA, como seleção, cruzamento, mutação, reinserção e terminação.

É muito extensível, você pode definir seus próprios cromossomos, função de aptidão, estratégia de geração de população e todas as operações citadas acima.

Ele pode ser usado em vários tipos de aplicativos, como bibliotecas C# e jogos Unity 3D, há exemplos de execução em um Aplicativo GTK# e Jogo de damas Unity 3D.

Também funciona em Win e OSX.

Aqui está um exemplo básico de como usar a 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();

O livro Manning:"Metaprogramação em .NET"dedica uma grande seção sobre GP por meio de árvores de expressão.

Eu mantenho uma porta do ECJ em C#.É ótimo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top