genetische Algorithmen sind ein Programm, das die beste Lösung für das Problem sucht, indem natürliche Evolutionsprozesse wie "Überleben des Fittest", das Chromosomenkreuzung und die Mutation simuliert werden. In diesem Artikel wird kurz die Schreibmethoden genetischer Algorithmen vorgestellt, einige wichtige Faktoren erörtert, die beim Schreiben Ihrer eigenen Algorithmen berücksichtigt werden müssen, und einige Beispiele für praktische Anwendungen genetischer Algorithmen angeben.
Schlüsselpunkte
Unbekannte Informationen
Die Zeit beträgt 2369 Jahre und Menschen haben sich auf dem Meer der Sterne ausgebreitet. Sie sind ein junger und intelligenter Arzt, der in einer geschäftigen Tiefensternbasis stationiert ist und mit interstellaren Reisenden, Händlern und gelegentlichen Outlaws gefüllt ist. Kurz nach Ihrer Ankunft interessierte sich ein Ladenbesitzer an der Basis für Sie. Er behauptet, er sei nur ein einfacher Schneider, aber Gerüchte sagen, er sei ein Geheimagent, der für ein besonders böses Regime arbeitet.
Sie beginnen jede Woche zusammen zu Mittag zu essen und über Themen von Politik bis Gedichten zu diskutieren. Auch nach ein paar Monaten sind Sie sich immer noch nicht sicher, ob er romantische Gefühle ausdrückt oder Geheimnisse nimmt (Sie haben sicherlich keine Geheimnisse). Vielleicht beides.
Eines Tages beim Mittagessen forderte er Sie heraus: "Ich habe eine Nachricht, die Sie sagen sollten, lieber Arzt! Ich kann Ihnen sicher nicht sagen, was es ist. Aber ich sage Ihnen, es sind 12 Charaktere lang. Diese Charaktere können irgendjemand sein Buchstaben, Platz oder Interpunktion
Sie kehrten ins Büro in der medizinischen Kabine zurück und überlegten immer noch, was er gerade gesagt hat. Plötzlich gab Ihnen ein Gensequenzierungssimulationsexperiment, das Sie zuvor auf einem nahe gelegenen Computer durchgeführt hatten, eine Idee. Sie sind kein Kennwortentschlüsselungsexperte, aber vielleicht können Sie Ihr Fachwissen in der Genetik verwenden, um seine Informationen zu entschlüsseln!
Einige Theorien
Wie ich zu Beginn erwähnt habe, ist ein genetischer Algorithmus ein Programm, das Operationen verwendet, die die Entwicklung nach Lösungen vorantreiben. Nach vielen Iterationen wählt der Algorithmus die besten Kandidaten aus einer Reihe möglicher Lösungen aus, rekombiniert sie und prüft, welche Kombinationen es näher an der Lösung bringen. Arme Kandidaten werden verworfen.
In der obigen Szene kann jeder Charakter in der geheimen Nachricht A-Z, Raum oder grundlegende Interpunktion sein. Angenommen, dies gibt uns die folgenden 32 Zeichen "Alphabet": Abcdefghijklmnopqrstuvwxyz -.,!? sie sind korrekt. Es dauert zu lange, um jede Möglichkeit zu überprüfen. Stattdessen wählt der genetische Algorithmus zufällig 12 Zeichen aus und bittet den Schneider/Spion, wie nahe das Ergebnis an seinen Informationen liegt. Dies ist effektiver als Brute Force-Suche, da die Punktzahlen es uns ermöglichen, zukünftige Kandidaten zu optimieren. Durch Feedback können wir die Fitness jeder Vermutung messen und hoffentlich die Zeitverschwendung in einer Sackgasse vermeiden. Angenommen, wir haben drei Vermutungen vorgenommen: Homlk? WSRZDJ, BGK Ka! Der erste Kandidat erzielte 248,2, der zweite betrug 632,5 und der dritte betrug 219,5. Die Art und Weise, wie die Bewertungen berechnet werden, hängt von der Situation ab, die wir später diskutieren werden, aber nun nehmen wir an dasselbe), eine höhere Punktzahl bedeutet eine größere Abweichung. Die Vermutungen mit Punktzahlen von 248,2 und 219,5 liegen näher am Inhalt der geheimen Informationen als die Vermutung mit 635,5. Die zukünftige Vermutung erfolgt durch die Kombination der besten Versuche. Es gibt viele Möglichkeiten, Kandidaten zu kombinieren, aber jetzt betrachten wir einen einfachen Crossover-Ansatz: Jeder Charakter in der neuen Vermutung hat eine 50-50-Wahrscheinlichkeit, die vom ersten oder zweiten Elternkandidaten kopiert wurde. Wenn wir die beiden Vermutungen von Homlk? WSRZDJ und Xelpocv.xlf! bald. Der Nachkommen kann Hallo sein? W.RLD!.
generieren neue Kandidaten durch Crossover
Wenn wir jedoch nur die Werte des übergeordneten Kandidaten verwenden, kann es in mehreren Iterationen ein Problem geben: mangelnde Vielfalt. Wenn wir einen Kandidaten haben, besteht aus allen A und der andere aus allen B, dann bestehen alle durch Crossover erzeugten Nachkommen nur aus A und B. Wenn die Lösung C enthält, wären wir unglücklich.
Zeigen Sie mir einen Code! Ich vermute, dass Sie angesichts der erweiterten Übersicht und der Begriffsliste möglicherweise versucht sind, einen Code zu sehen. Schauen wir uns also einen JavaScript -Code an, der unser geheimes Informationsproblem löst. Während des Lesevorgangs lade ich Sie ein, darüber nachzudenken, welche Methoden als "Boilerplate -Code" angesehen werden können und welche Implementierungen enger mit dem Problem zusammenhängen, das wir lösen möchten: Wir definieren zuerst ein Kandidatendatenobjekt, um Chromosomen mit ihren Fitnesswerten zu kombinieren. Zur Bequemlichkeit ist auch eine statische Sortiermethode beigefügt. Der Konstruktor verwendet Objekte, die verschiedene für die Simulation erforderliche Parameter lösen. Es bietet eine Möglichkeit, genetisches Alphabet, Zielnachrichten und andere Parameter anzugeben, die die Einschränkungen definieren, unter denen die Simulation ausgeführt wird. Im obigen Beispiel erwarten wir eine Bevölkerung von 100 Kandidaten pro Generation. Aus diesem Grund werden nur 40 Chromosomen zur Reproduktion ausgewählt. Wir haben eine 3% ige Chance, eine Mutation einzuführen, und wenn sie auftritt, werden wir bis zu zwei Gene ändern. Der Wert von MaxGenerationen wird als Schutzmaßnahme verwendet. Es ist erwähnenswert, dass die Bevölkerung, die Auswahlgröße und die maximale Anzahl von Altersgruppen beim Ausführen des Algorithmus recht klein sind. Komplexere Probleme erfordern möglicherweise einen größeren Suchraum, was wiederum die Speicherverwendung des Algorithmus und die Zeit zum Laufen erhöht. Es wird jedoch dringend empfohlen, kleinere Variantenparameter zu verwenden. Wenn sie zu groß werden, verlieren wir aufgrund von Fitness den Vorteil von Zuchtkandidaten, und die Simulation wird zu einer zufälligen Suche. Methoden wie Randomint (), Init () und Run () können als Kesselplatte betrachtet werden. Aber nur weil es eine Kesselplatte gibt, heißt das nicht, dass es keinen praktischen Einfluss auf die Simulation hat. Zum Beispiel verwenden genetische Algorithmen Zufälligkeit stark. Während die integrierte Mathematik.Random () -Funktion für unsere Zwecke geeignet ist, benötigen Sie für andere Probleme einen genaueren Zufallsgenerator. Crypto.getrandomvalues () liefert stärkere kryptografische Zufallswerte. Leistung ist ebenfalls eine Überlegung. Ich bemühe mich, in diesem Artikel klar und leicht zu verstehen, aber denken Sie daran, dass die Operation wiederholt wird. Möglicherweise müssen Sie den Code in einer Schleife mikrooptimieren, effizientere Speicherdatenstrukturen verwenden und den Code in Line investieren, anstatt ihn in Funktionen/Methoden zu trennen, alle ohne Rücksicht auf Ihre Implementierungssprache. Die Implementierung von CalcFitness (), Select (), Reproce () und sogar Stop () -Methoden ist spezifisch für das Problem, das wir lösen möchten. calcFitness () gibt einen Wert zurück, der die Fitness eines Chromosoms basierend auf bestimmten erwarteten Kriterien misst - in unserem Fall ist es, wie gut es einer geheimen Nachricht entspricht. Die Berechnung der Fitness ist fast immer situationsspezifisch. Zum Beispiel kann ich den Hamming -Abstand oder den Levinstein -Abstand zwischen zwei Werten berechnen und sogar mehrere Messungen kombinieren. Letztendlich ist es wichtig, dass die Fitnessfunktion nützliche Messungen zurückgibt, die auf dem vorliegenden Problem basieren, nicht nur die Boolesche "Anpassung"/"nicht passend". select () Methode zeigt eine Elite -Auswahlstrategie - nur die am besten geeigneten Kandidaten in der gesamten Bevölkerung werden für die Zucht ausgewählt. Wie ich bereits erwähnt habe, gibt es andere Strategien wie die Turnierauswahl, die den am besten geeigneten Kandidaten aus dem Satz einzelner Kandidaten in der Bevölkerung und der Boltzmann -Selektion auswählen, die die Auswahl des Drucks der Kandidaten immer größere und größere Kandidaten auferlegt. Der Zweck dieser unterschiedlichen Methoden besteht darin, sicherzustellen, dass Chromosomen die Möglichkeit haben, Gene zu liefern, die sich später als vorteilhaft erweisen können, auch wenn dies möglicherweise nicht sofort ersichtlich ist. Eingehende Beschreibungen dieser und anderer Auswahlstrategien sowie Beispielimplementierungen sind leicht online zu finden.
Praktische Anwendung des genetischen Algorithmus
Bisher sollten Sie ein grundlegendes Verständnis dafür haben, welche genetischen Algorithmen mit ihrem Vokabular vertraut genug sind, um alle Ressourcen zu interpretieren, denen Sie möglicherweise in Ihrer eigenen Forschung begegnen. Das Verständnis von Theorien und Begriffen ist jedoch nur die Hälfte der Arbeit. Wenn Sie vorhaben, Ihren eigenen genetischen Algorithmus zu schreiben, müssen Sie auch Ihr spezifisches Problem verstehen. Bevor Sie beginnen, finden Sie hier einige wichtige Fragen, die Sie sich stellen sollten: Ich hoffe, ich helfe Ihnen auch, zu verstehen, wie Programme inspiriert werden - nicht nur in Form, sondern auch in Prozess und Funktion. Fühlen Sie sich frei, Ihre eigenen Gedanken im Forum zu teilen. Häufig gestellte Fragen zu genetischen Algorithmen Um dieses Risiko zu mildern und die Vielfalt aufrechtzuerhalten und gleichzeitig den Umfang der Lösungen einzuschränken, können wir leichte Änderungen vornehmen. Anstatt direkt eine 50-50-Segmentierung durchzuführen, lassen wir eine geringe Wahrscheinlichkeit, einen Wert im Alphabet zu ersetzen. Durch diese Mutation kann die Nachkommen zu Hello World!.
// ... (Candidate class and GeneticAlgorithm class code as provided in the original text) ...
Beschreibung der K-Punkt-Kreuzungsstrategie
Das obige ist der detaillierte Inhalt vonEine Einführung in genetische Algorithmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!