Diskussion zum Artikel "Genetische Algorithmen - Leicht gemacht!" - Seite 13
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Arbeiten Sie in der freien Bibliothek des Artikels mit dem Genotyp. Arbeiten Sie mit dem Phänotyp in FF (wie in Beispiel 2).
Das bedeutet, dass die Bibliothek genauso effizient arbeitet, wenn der Phänotyp in FF bearbeitet wird, aber die Anzahl der Iterationen (FF-Durchläufe) wird deutlich höher sein, als wenn der GA direkt mit dem Phänotyp arbeitet (weil der Suchraumausschnitt zunimmt). Im Grenzfall tendiert die Suche (ohne Phänotypverfeinerung) zu einem kontinuierlichen Suchraum.
Guten Abend.
Ich möchte mich bei Ihnen für einen tollen Artikel bedanken.
Er war für mich anfangs etwas kompliziert, aber ich habe es irgendwie herausgefunden.
Bevor ich in diesem Forumsthread etwas schreibe, möchte ich für mich klären, ob ich Ihren Artikel und den Ablauf des UGA-Algorithmus richtig verstanden habe:
1) Einstellung der Eingabeparameter von UGA für eine bestimmte Aufgabe.
---UGA
2)Erzeugen einer Anfangskolonie von Eltern durch zufällige Kombination von Genen
2.2)Berechnung des Ergebnisses der FF für jede dieser Kolonien
2.3)Entfernen von Klonen.
3) Ermittlung des besten FF-Ergebnisses aus allen Individuen dieser Kolonie
4) Beginn des Zyklus zur Erzeugung einer Kolonie von Nachkommen der ersten Kolonie. Die Nachkommen werden mit Hilfe der folgenden Werkzeuge erzeugt: Crossover, künstliche und natürliche Mutation, Genreplikation und Genausleihe, wobei
Crossover - Austausch von Teilen der Chromosomen der Eltern,
Künstliche Mutation - Auswahl von Genen außerhalb des Bereichs (Gen von Elternteil 1, Gen von Elternteil 2).
Est. Mutation - Auswahl von Genen aus dem Bereich (Minimum des Genbereichs, Maximum des Genbereichs).
Replikation - Auswahl von Genen in den Bereichen, die nahe an den Werten der Elterngene liegen, aber mit einem gewissen Offset.
Ausleihe von Genen - Schaffung eines "zusammengesetzten Individuums" aus einer Anzahl von Eltern, die der Anzahl der Gene entspricht.
5 )Löschung von Klonen
6 )Berechnung des Ergebnisses der FF für jede dieser Kolonien
7)Vergleich der Ergebnisse der nachkommenden Individuen mit dem Referenzergebnis und dessen eventuelle Ersetzung. Im Falle einer Ersetzung wird der Zähler "Epochen ohne Änderung des Referenzwertes" zurückgesetzt
8)Sortierung aller Individuen vom besten zum schlechtesten.
9) -->Punkt 4
10)Wenn Epochen mit keiner Änderung von Y aufgetreten sind, dann abbrechen und den gefundenen Referenzwert ausgeben.
Ich entschuldige mich im Voraus, vielleicht ist dies eher ein Diskussionsthread als ein Tutorial, aber ich kann nirgendwo sonst um Rat fragen. Ich bin in Ihrem Artikel zum ersten Mal auf GA gestoßen (vor Ihrem Artikel habe ich nicht einmal verstanden, was die Worte "Fast(genetic algorithm)" im Terminal-Tester bedeuten), daher sind meine Kenntnisse und Erfahrungen (ich habe vor etwa 2 Monaten mit der Programmierung in MQL5 begonnen) etwas begrenzt.
Wenn ich Ihren GA-Algorithmus verstanden habe, werde ich versuchen, ihn auf OOP zu übertragen. In der Tat habe ich begonnen, mich damit zu befassen. Ich habe bereits Handelsmodelle implementiert, die sich mit direkter Suche selbst optimieren, aber noch nicht mit GA. (Modelle nach dem im Artikel https://www.mql5.com/ru/articles/217 beschriebenen Prinzip).
Vielen Dank im Voraus.
mi__x__an:
...ich möchte für mich klären, ob ich Ihren Artikel und den Verlauf des UGA-Algorithmus richtig verstanden habe
Guten Tag .
Ich danke Ihnen für Ihre prompte Antwort.
Dann habe ich einige Fragen.
Was ist hier das Chromosomen-Array? Mögliche Werte des optimierten Parameters?
Wenn wiralso z.B. die "minimale Losgröße" im Bereich von 0,1 bis 1 optimieren (mit einem minimalen Losschritt von 0,1),
dann sieht das Array wie folgt aus:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, Anzahl der Gene in Chromosom 1, Minimum 0.1 Maximum 1.0, Schritt 0.1 ? Ist das richtig?
Und eine damit zusammenhängende Frage, wie kann man in ein solches Array z.B. eingeben: Optimierter Stop Loss [10...500], Take Profit [10...500], Min. Losgröße [0.1...1.0] und Trailing Flag (Trailing verwenden oder nicht)[0...1]?
Wie sollten die Eingabedaten bei der Optimierung von Parametern mit verschiedenen Typen, Minima und Maxima möglicher Werte im Allgemeinen aussehen?
Vielen Dank im Voraus für die Antwort.
Was ist hier das Chromosomenfeld? Die möglichen Werte des optimierten Parameters?
Wenn wir zum Beispiel die "Mindestlosgröße " im Bereich von 0,1 bis 1 (mit einem Mindestlosschritt von 0,1) optimieren,
dann sieht das Array wie folgt aus:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, Anzahl der Gene in Chromosom 1, Minimum 0.1 Maximum 1.0, Schritt 0.1 ? Ist das richtig?
Und eine damit zusammenhängende Frage, wie kann man in ein solches Array z.B. eingeben: Optimierter Stop Loss [10...500], Take Profit [10...500], Minimale Losgröße [0.1...1.0] und Trailing Flag (Trailing verwenden oder nicht)[0...1]?
Wie sollten die Eingabedaten bei der Optimierung von Parametern mit verschiedenen Typen, Minima und Maxima möglicher Werte im Allgemeinen aussehen?
Vielen Dank im Voraus für die Antwort.
Nein,
Chromosome[] ist genau das, was der Kommentar sagt.
Der erste Index [0] ist der Fitnesswert des Individuums. Die anderen sind optimierte Parameter innerhalb eines bestimmten Bereichs. Dies ist der Genotyp.
Arbeiten Sie mit dem Phänotyp (Stop Losses, Take Profits, Volumina, Indikatoren oder etwas anderem) in FF (Skalierung der optimierten Parameter im Bereich der Chromosomengene):
Zum Beispiel werden die Gene im Bereich [-1;1] gesetzt, dann
Index 0: FF-Wert <---------------------------------------------------------[8;8]//Pivot auf Pi/2 Achten.
1. Index: Stop Loss [10..500] <------------------------------------------------ [-1;1]
2. Index: Gewinnmitnahme [10..500] <--------------------------------------------- [-1;1]
3. Index: Min. Losgröße [0.1...1.0] <--------------------------------------- [-1;1]
4. Index: Trailing-Flag (ob Trailing verwendet werden soll oder nicht) [0..1] <------ [-1;1]
Darüber hinaus hat das Array Chromosome[] 5 Zellen. Ein Chromosom könnte zum Beispiel so aussehen {0.2, 0.3, -0.8, 0.1, 0.9;}
Aber in diesem Fall muss die Verarbeitung der Korrektheit der Werte von nicht realen Genen in FF durchgeführt werden. D.h. wenn wir die Typen long, double und bool optimieren, wird UGA für alle diese Typen reale Werte generieren, einschließlich für bool wird es viele Variationen von Genen im Bereich von RangeMinimum bis RangeMaximum geben, mit der real möglichen Verwendung von nur zwei Werten 1 und 0. Verstehe ich richtig? Und die Auswahl der richtigen Werte wird bereits in FF vorgenommen?
Dann wäre für mich persönlich der beste Weg, diesen Nachteil zu beseitigen, eine Servicefunktion einzuführen, die die Genwerte der Chromosomen auf die Werte korrigiert, die im FF verwendet werden können.
-->Erzeugung von Nachkommen -->Anpassung der Genwerte an tatsächlich nutzbare Werte -->Löschung von Klonen -->Aufruf des FF.
Glauben Sie, dass diese Vorgehensweise einen großen Einfluss auf die Leistung von UGA haben wird? Schließlich sollte sich die Anzahl der FF-Durchläufe verringern, wenn der Schritt für die Optimierung eines Parameters größer ist als für den anderen.
Richtig, wenn dies nicht geeignet ist, dann sollten Sie einen binären genetischen Algorithmus verwenden (wie der, der im Tester implementiert ist). Dazu gibt es einen Artikel im vierten Forum.
Nein, der Punkt ist ein anderer. Der Algorithmus kann auch für solche Fälle sehr gut verwendet werden.
mi__x__an:
Aber in diesem Fall muss die Verarbeitung der Korrektheit der Werte, nicht der echten Gene, im FF erfolgen. D.h. wenn wir die Typen long, double und bool optimieren, wird UGA für alle diese Typen reale Werte generieren, auch für bool wird es viele Variationen von Genen im Bereich von RangeMinimum bis RangeMaximum geben, mit der real möglichen Verwendung von nur zwei Werten 1 und 0. Verstehe ich richtig? Und die Auswahl der richtigen Werte wird bereits in FF vorgenommen?
Alle Operationen mit dem Phänotyp sollten in FF durchgeführt werden. Es geht um die Dekodierung vom Genotyp zum Phänotyp.
Ok, nehmen wir an, dass der optimierte Parameter vom Typ bool ist und nur zwei Varianten möglich sind: true und false. Dann wird die Dekodierung etwa so aussehen:
wobei gene ein bestimmtes Gen eines Chromosoms ist.
Es stellt sich heraus, dass wir bei all der Vielfalt der möglichen Varianten dieses Gens (Genotyp) nur 2 Phänotypen erhalten werden. Dies ist auch in der lebenden Natur der Fall.
Daraus ergibt sich jedoch eine natürliche Konsequenz: Es werden mehr Chromosomen-Varianten erzeugt (und damit auch mehr FF berechnet), als zur Lösung des Problems notwendig sind. Das heißt, die Optimierung wird länger dauern. Ich habe dies bereits erwähnt. Im Falle einer binären Kodierung der Chromosomen ist es dasselbe. Sie müssen immer noch in einen aufgabenspezifischen Phänotyp dekodieren.
ABER. Sowohl im Falle der binären Kodierung als auch im Falle der Darstellung von Genen durch reelle Zahlen ist es sehr einfach, unnötige FF-Berechnungen zu vermeiden (um die Anzahl möglicher Chromosomenvarianten zu reduzieren), indem man die SUCHSCHRITTE und SCHRITTE für jeden oPTIMISIERTEN PARAMETER einstellt. D.h. unnötige Chromosomenvarianten werden im Voraus abgeschnitten (dies geschieht bereits im Standard-Optimierer mit binärer Kodierung). Dies kann auch für den GA aus dem Artikel gemacht werden, man muss ihn nur um die entsprechende Funktionalität erweitern - die Möglichkeit, die Grenzen und den Schritt für jedes Gen festzulegen, d.h. dem GA zu erlauben, direkt mit dem Phänotyp zu arbeiten.
aber die Notwendigkeit, die Grenzen und den Schritt für jedes Gen in der Bibliothek zu spezifizieren, wird ihre Flexibilität verringern.
Was wahrscheinlich nicht der beste oder sogar der schlechteste Weg ist, habe ich im Optimierer für Handelsmodelle verwendet:
1 - Klasse des optimierten Parameters - CObject inheritor
2 - virtuelle Funktion des allgemeinen Hauptmodells:
virtual CList *OptimizatedParams()Sie ermöglicht es jedem spezifischen Modell, seine eigene Liste von optimierten Parametern zu erstellen.
3. Optimierungsfunktion - sie zählt alle notwendigen Werte rekursiv auf.
Alle aufgezählten Typen können von der Optimierungsfunktion verarbeitet werden.
Nun die Frage: Es wäre rationell, CList als Eingabedaten zu machen, in der die Informationen über den optimierten Parameter durch diese Klasse des optimierten Parameters weitergegeben werden, und die UGA-Bibliothek selbst erstellt so viele Grenzen und Schritte wie nötig für jedes Gen. Dies würde ihr mehr Flexibilität verleihen und die Anzahl der unnötigen Durchläufe von FF reduzieren, um nicht genetische, sondern phänotypische Klone zu erstellen.