Frage

Ich habe nach einigen guten Beispielen für die genetische Programmierung für C# gesucht.Kennt jemand gute Online-/Buchressourcen?Ich frage mich, ob es eine C#-Bibliothek für die evolutionäre/genetische Programmierung gibt?

War es hilfreich?

Lösung

Nach der Entwicklung meine eigene didaktische Anwendung zur genetischen Programmierung, Ich habe ein vollständiges Genetic Programming Framework namens gefunden AForge.NET-Genetik.Es ist ein Teil davon Aforge.NET-Bibliothek.Es ist unter LGPL lizenziert.

Andere Tipps

MSDN veröffentlichte letztes Jahr einen Artikel über genetische Programmierung: Genetische Algorythmen:Survival of the Fittest mit Windows Forms

Ich würde davon abraten, Assemblys tatsächlich zu generieren, es sei denn, dies ist unbedingt erforderlich, insbesondere wenn Sie gerade erst mit der Implementierung des genetischen Algorithmus beginnen.

Der genetische Algorithmus lässt sich am einfachsten implementieren, wenn die Zielsprache funktional und dynamisch typisiert ist.Aus diesem Grund werden die meisten Forschungsarbeiten zu genetischen Algorithmen in LISP geschrieben.Wenn Sie es daher in C# implementieren, ist es wahrscheinlich besser, Ihre eigene Mini-„Baumsprache“ zu definieren, den Algorithmus Bäume generieren zu lassen und die Bäume einfach zu interpretieren, wenn es an der Zeit ist, jede Iteration des Algorithmus auszuführen .

Ich habe während meines Studiums ein Projekt wie dieses gemacht (eine Implementierung des genetischen Algorithmus in C#), und das war der Ansatz, den ich gewählt habe.

Auf diese Weise haben Sie den Vorteil, dass Sie nur mit einer Darstellung (der AST-Darstellung) arbeiten können, die sowohl für die Ausführung als auch für die Schritte der „Reproduktion“ des genetischen Algorithmus optimal geeignet ist.

Wenn Sie alternativ versuchen, Assemblys zu generieren, werden Sie der App wahrscheinlich eine große Menge an unnötiger Komplexität hinzufügen.Derzeit lässt die CLR nicht zu, dass eine Assembly aus einer App-Domäne entladen wird, es sei denn, die gesamte App-Domäne wird zerstört.Dies würde bedeuten, dass Sie für jedes generierte Programm in jeder Iteration des Algorithmus eine separate App-Domäne einrichten müssten, um zu vermeiden, dass Ihre App einen riesigen Speicherverlust verursacht.Im Allgemeinen würde das Ganze nur noch eine Menge zusätzlicher Irritationen hervorrufen.

Interpretierte ASTs hingegen können wie jedes andere Objekt im Müll gesammelt werden, sodass Sie sich nicht mit mehreren App-Domänen herumschlagen müssen.Wenn Sie aus Leistungsgründen das Endergebnis per Code generieren möchten, können Sie die Unterstützung dafür später hinzufügen.Ich würde Ihnen jedoch empfehlen, dies mit dem zu tun DynamischeMethode Klasse.Damit können Sie einen AST zur Laufzeit dynamisch in einen kompilierten Delegaten konvertieren.Dadurch können Sie eine einzelne DLL bereitstellen und gleichzeitig die Codegenerierung so einfach wie möglich halten.Außerdem sind DynamicMethod-Instanzen Garbage Collector, sodass Sie sie möglicherweise als Teil des genetischen Algorithmus verwenden, um die Dinge auch dort zu beschleunigen.

Möglicherweise können Sie die genetische Programmierung mithilfe von LINQ-Expressionsbäumen implementieren – es ist wahrscheinlicher, dass etwas Verwertbares generiert wird, als bei der zufälligen IL-Generierung.

Ich habe eine gute, hochrangige Diskussion darüber auf Kanal 9 von Mike Swanson unter gesehen http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/

Meinen Sie tatsächliche genetische Programmierung im Gegensatz zu genetischen Algorithmen im Allgemeinen?

Wenn ja, ist C#/.net nicht die beste Sprache dafür.LISP zum Beispiel war schon immer eine tragende Säule der GP.

Wenn es jedoch sein muss, möchten Sie wahrscheinlich CIL/MSIL dynamisch generieren.Sie können dies mit tun System.Reflection.Emit, würde ich jedoch empfehlen Mono.Cecil.Es fehlen gute Dokumente (als ob Reflection Emit diese hätte).Aber es bietet eine viel bessere Montageemission und -reflexion.

Ein weiteres Problem besteht darin, dass es alles andere als einfach ist, Code im .net-Framework zu laden und später zu entsorgen.Zumindest können Sie keine Baugruppen entladen.Sie können App-Domänen entladen, aber die ganze Angelegenheit, Code in eine separate App-Domäne zu laden und ihn extern aufzurufen, kann ziemlich chaotisch werden.Das System.Addin-Material von .NET 3.5 sollte dies einfacher machen.

Wenn Sie sich für genetische Algorithmen oder heuristische Optimierung im Allgemeinen interessieren, sollten Sie einen Blick darauf werfen HeuristicLab.Es wurde mehrere Jahre lang entwickelt, 1,5 Jahre seit der Veröffentlichung der neuen Version.Es ist in C# 4 programmiert und verfügt über eine schöne GUI.Es sind bereits viele Algorithmen verfügbar, wie z. B. genetischer Algorithmus, genetische Programmierung, Evolutionsstrategie, lokale Suche, Tabu-Suche, Partikelschwarmoptimierung, simuliertes Annealing und mehr.Es sind auch mehrere Probleme implementiert, wie z. B. ein Fahrzeugroutenproblem, ein Handlungsreisender, eine echte Funktionsoptimierung, ein Rucksack, ein quadratisches Zuordnungsproblem, eine Klassifizierung, eine Regression und viele mehr.Es gibt auch Tutorials und wir haben Protokollpuffer integriert, damit Sie zur Lösungsbewertung mit externen Programmen kommunizieren können.Es ist unter der GPL lizenziert.Im Jahr 2009 wurde die Software mit dem Microsoft-Innovationspreis von Microsoft Österreich ausgezeichnet.

Wir haben auch ein Buch zu diesem Thema geschrieben: Genetische Algorithmen und genetische Programmierung.

Ich habe ein kostenloses Produkt, das helfen könnte. Das Genetic Algorithm Framework .Net 4.0 ist eine einzelne .Net 4.0-Assembly mit einigen unterstützenden Artikeln.

ich lese Ein Leitfaden zur genetischen Programmierung jetzt verfügbar (kostenloser PDF-Download).Es ist auch als Taschenbuch erhältlich.Es wird die Verwendung einer in Java geschriebenen Bibliothek namens „ TinyGP.Davon könnten Sie vielleicht etwas profitieren.Ich habe noch nicht mit der eigentlichen Programmierung begonnen, hoffe aber, einige der Konzepte in C# anwenden zu können.

Ich habe ECJ auf C# .NET 4.0 umgestellt, wenn Sie an einem voll ausgestatteten Framework für evolutionäre Berechnungen interessiert sind.Das Paket enthält alles aus dem ursprünglichen ECJ-Java-Projekt, einschließlich aller Arbeitsbeispiele.

Außerdem habe ich 500 Unit-Tests geschrieben, um viele Aspekte der Konvertierung zu überprüfen.Es sind jedoch noch viele weitere Tests erforderlich.Insbesondere die Aspekte der verteilten Berechnung wurden nicht vollständig getestet.Das liegt daran, dass ich vorhabe, von der einfachen Verwendung von Sockets durch EuGH auf eine robustere Strategie mit WCF und WF umzusteigen.Ich werde auch das Framework überarbeiten, um TPL (Task Parallel Library) zu nutzen.

Wie auch immer, Sie können die erste Konvertierung hier herunterladen:

http://branecloud.codeplex.com

Ich bin auch dabei, mehrere andere Frameworks von Java auf .NET zu konvertieren, die sich auf die Forschung im Bereich „Synthetische Intelligenz“ beziehen (sofern ich Zeit dafür finde).

Ben

Du kannst es versuchen GeneticSharp.

Es verfügt über alle klassischen GA-Operationen wie Selektion, Crossover, Mutation, Reinsertion und Termination.

Es ist sehr erweiterbar, Sie können auch Ihre eigenen Chromosomen, Fitnessfunktionen, Populationsgenerierungsstrategien und alle oben genannten Operationen definieren.

Es kann in vielen Arten von Apps verwendet werden, wie z. B. C#-Bibliotheken und Unity 3D-Spielen, es gibt Beispiele, in denen es ausgeführt wird GTK#-App Und Unity 3D-Dame-Spiel.

Es funktioniert auch unter Win und OSX.

Hier ist ein grundlegendes Beispiel für die Verwendung der Bibliothek:

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

Das Manning-Buch:"Metaprogrammierung in .NET" widmet GP über Ausdrucksbäume einen großen Abschnitt.

Ich pflege eine Portierung von ECJ in C#.Es ist großartig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top