Question

Je cherchais de bons exemples de programmation génétique pour C#.Quelqu'un connaît-il de bonnes ressources en ligne/livres ?Je me demande s'il existe une bibliothèque C# pour la programmation évolutive/génétique ?

Était-ce utile?

La solution

Après avoir développé ma propre application didactique de programmation génétique, j'ai trouvé un cadre de programmation génétique complet appelé Génétique AForge.NET.Cela fait partie du Bibliothèque Aforge.NET.Il est sous licence LGPL.

Autres conseils

MSDN a publié un article l'année dernière sur la programmation génétique : Algorithmes génétiques:Survie du plus fort avec Windows Forms

Je vous déconseille de générer des assemblages à moins que vous n'en ayez absolument besoin, en particulier si vous commencez tout juste à implémenter l'algorithme génétique.

L’algorithme génétique est plus simple à mettre en œuvre lorsque la langue cible est fonctionnelle et typée dynamiquement.C'est généralement la raison pour laquelle la plupart des recherches sur les algorithmes génétiques sont écrites en LISP.Par conséquent, si vous envisagez de l'implémenter en C#, vous feriez probablement mieux de définir votre propre mini "langage d'arbres", de laisser l'algorithme générer des arbres et d'interpréter simplement les arbres quand vient le temps d'exécuter chaque itération de l'algorithme. .

J'ai réalisé un projet comme celui-ci quand j'étais à l'université (une implémentation de l'algorithme génétique en C#), et c'est l'approche que j'ai adoptée.

En procédant de cette façon, vous aurez l'avantage de n'avoir qu'une seule représentation avec laquelle travailler (la représentation AST) qui convient de manière optimale à la fois à l'exécution et aux étapes de « reproduction » de l'algorithme génétique.

Alternativement, si vous essayez de générer des assemblys, vous finirez probablement par ajouter une grande quantité de complexité inutile à l'application.Actuellement, le CLR n’autorise pas le déchargement d’un assembly d’un domaine d’application à moins que l’intégralité du domaine d’application ne soit détruite.Cela signifierait que vous devrez créer un domaine d'application distinct pour chaque programme généré à chaque itération de l'algorithme afin d'éviter d'introduire une fuite de mémoire géante dans votre application.En général, tout cela ne ferait qu’ajouter un tas d’irritation supplémentaire.

Les AST interprétés, en revanche, sont récupérables comme n'importe quel autre objet, et vous n'auriez donc pas besoin de vous amuser avec plusieurs domaines d'application.Si, pour des raisons de performances, vous souhaitez coder le résultat final, vous pouvez ajouter la prise en charge ultérieurement.Cependant, je vous recommande de le faire en utilisant le MéthodeDynamique classe.Il vous permettra de convertir dynamiquement un AST en un délégué compilé au moment de l'exécution.Cela vous permettra de déployer une seule DLL tout en gardant la génération de code aussi simple que possible.De plus, les instances DynamicMethod sont récupérables, vous pourriez donc finir par les utiliser dans le cadre de l'algorithme génétique pour accélérer les choses également.

Vous pourrez peut-être implémenter une programmation génétique à l'aide d'arbres d'expression LINQ - il est plus susceptible de générer quelque chose d'utilisable que la génération aléatoire d'IL.

J'ai vu une bonne discussion de haut niveau à ce sujet sur Channel9 par Mike Swanson à http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/

Voulez-vous parler de programmation génétique réelle, par opposition aux algorithmes génétiques en général ?

Si tel est le cas, C#/.net n'est pas le meilleur langage pour cela.LISP, par exemple, a toujours été un pilier de GP.

Cependant, si vous le devez, vous souhaiterez probablement générer dynamiquement du CIL/MSIL.Vous pourriez le faire en utilisant Système.Réflexion.Émettre, mais je recommanderais Mono.Cécil.Il manque de bons documents (comme si la réflexion émise en avait).Mais il offre une bien meilleure émission et réflexion d’assemblage.

Un autre problème est qu’il est loin d’être trivial de charger du code, puis de le supprimer, dans le framework .net.Au moins, vous ne pouvez pas décharger les assemblys.Vous pouvez décharger des domaines d'application, mais toute l'activité consistant à charger du code dans un domaine d'application distinct et à l'appeler en externe peut devenir assez compliquée.Les éléments System.Addin de .NET 3.5 devraient rendre cela plus facile.

Si vous êtes intéressé par les algorithmes génétiques ou l'optimisation heuristique en général, vous voudrez peut-être jeter un œil à Laboratoire heuristique.Il est développé depuis plusieurs années, 1,5 ans depuis la sortie de la nouvelle version.Il est programmé en C# 4 et possède une belle interface graphique.De nombreux algorithmes sont déjà disponibles, tels que l'algorithme génétique, la programmation génétique, la stratégie d'évolution, la recherche locale, la recherche taboue, l'optimisation des essaims de particules, le recuit simulé et bien plus encore.Il existe également plusieurs problèmes implémentés comme un problème d'itinéraire de véhicule, un voyageur de commerce, une optimisation de fonctions réelles, un sac à dos, un problème d'affectation quadratique, une classification, une régression et bien d'autres.Il existe également des didacticiels et des tampons de protocole sont intégrés afin que vous puissiez communiquer avec des programmes externes pour l'évaluation de la solution.Il est sous licence GPL.En 2009, le logiciel a reçu le prix de l'innovation Microsoft de Microsoft Autriche.

Nous avons également écrit un livre sur le sujet : Algorithmes génétiques et programmation génétique.

J'ai un produit gratuit qui peut vous aider. Le cadre d'algorithme génétique .Net 4.0 est un seul assembly .Net 4.0 avec quelques articles de support.

je suis en train de lire Un guide de terrain sur la programmation génétique dès maintenant (téléchargement PDF gratuit).Il est également disponible en livre de poche.Il discute de l'utilisation d'une bibliothèque écrite en Java appelée PetitGP.Vous pourriez en tirer un certain profit.Je n'ai pas commencé à faire de véritable programmation mais j'espère appliquer certains des concepts de C#.

J'ai transféré ECJ vers C# .NET 4.0 si vous êtes intéressé par un framework de calcul évolutif complet.Le package comprend tout le projet ECJ Java original, y compris tous les exemples de travail.

J'ai également écrit 500 tests unitaires pour vérifier de nombreux aspects de la conversion.Mais de nombreux autres tests sont nécessaires.En particulier, les aspects du calcul distribué ne sont pas entièrement testés.C'est parce que je prévois de passer de l'utilisation simple des sockets par ECJ à une stratégie plus robuste utilisant WCF et WF.Je vais également retravailler le framework pour utiliser TPL (Task Parallel Library).

Quoi qu'il en soit, vous pouvez télécharger la conversion initiale ici :

http://branecloud.codeplex.com

Je suis également en train de convertir plusieurs autres frameworks de Java vers .NET liés à la recherche sur "l'intelligence synthétique" (quand j'en trouverai le temps).

Ben

Tu peux essayer GénétiqueSharp.

Il comporte toutes les opérations GA classiques, comme la sélection, le croisement, la mutation, la réinsertion et la terminaison.

C'est très extensible, vous pouvez définir vos propres chromosomes, votre fonction de condition physique, votre stratégie de génération de population et toutes les opérations citées ci-dessus.

Il peut être utilisé dans de nombreux types d'applications, comme les bibliothèques C# et les jeux Unity 3D. Il existe des exemples qui l'exécutent dans un Application GTK# et Jeu de dames Unity 3D.

Cela fonctionne également sous Win et OSX.

Voici un exemple de base d'utilisation de la bibliothèque :

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();

Le livre de Manning :"Métaprogrammation dans .NET" consacre une large section au GP via les arbres d'expression.

Je maintiens un portage d'ECJ en C#.C'est bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top