Diskussion zum Artikel "Genetische Algorithmen - Leicht gemacht!" - Seite 5

 
shurick:

Vielen Dank für die Klarstellung, die Frage zur Entfernung von Duplikaten ist zu meiner Zufriedenheit beantwortet. Ich füge den Skriptcode bei, der die ursprüngliche und die optimierte Funktion zeigt, was die Verringerung der Anzahl der Durchläufe in Schleifen verdeutlicht. In meinem aktuellen Kommentar weise ich NICHT auf einen Fehler in der Funktion hin, sondern schlage ihre Optimierung vor, und mein Hauptziel war es, das Prinzip der Duplikatentfernung herauszufinden, worauf ich eine umfassende Antwort erhalten habe. Nochmals vielen Dank für die Bibliothek und für die Erläuterung der Funktion.

110 und 160 sind zu viel für 20 Chromosomen.... Sie haben den Zähler an die falsche Stelle gesetzt.

Das ist die richtige Stelle:

//Wählen Sie das zweite Paar aus....
      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)
      {
        //count_cicles++; // DEBUG zählt, wie oft wir die Zyklen Ch und Ch2 passieren
        if (Ch!=Ch2 && chromosomeUnique[Ch2]!=0)
        {
          count_cicles++; // DEBUG zählt, wie oft wir Chromosomen vergleichen.
          //Lassen Sie uns die Anzahl der identischen Gene zurücksetzen
          cnt=0;
          //Prüfen Sie die Gene, sofern die Gene gleich sind.
          for (Ge=1;Ge<=GeneCount;Ge++)
          {
            if (Population[Ge][Ch]!=Population[Ge][Ch2])
              break;
            else
              cnt++;
          }
          //Wenn die Anzahl der identischen Gene gleich der Gesamtzahl der Gene ist
          //...wird das Chromosom als Duplikat erkannt.
          if (cnt==GeneCount)
            chromosomeUnique[Ch2]=0;
        }

OK. Versuchen Sie es nun mit derselben Population, mit denselben Chromosomen, aber in dieser Reihenfolge:

int m_init[20] = {7,7,7,3,9,2,4,5,3,3,5,6,2,4,3,5,10,6,2};

Was stellen wir fest?

 

zu Shurick:

In der Tat. Die Anzahl der Einzigartigkeitsprüfungen, mit allen verschiedenen Chromosomen, kann durch die Formel

(PopulChromosCount^2-PopulChromosCount)/2

In unserem Beispiel mit 20 Chromosomen (unter der Annahme, dass alle Chromosomen unterschiedlich sind), wäre die Anzahl der Prüfungen

(20*20-20)/2=190

Dies wird durch diese Prüfung bestätigt:

int  m_init[20]  = {1,2,3,4,5,6,6,7,8,9,9,10,11,12,13,14,15,16,17,18,19,20};

Wenn Duplikate abgefangen werden, gibt es noch weniger Kontrollen.

Vielen Dank für Ihre aktive Teilnahme an dem Projekt!

An der Bibliothek werden entsprechende Änderungen vorgenommen. Die Änderungen werden zwar die Suchmöglichkeiten des Algorithmus nicht beeinträchtigen, aber seine Arbeit rationeller machen.

 
joo:

Was sehen wir uns an?

Ergebnis

Obwohl die Änderungen die Suchmöglichkeiten des Algorithmus in keiner Weise beeinflussen werden

Absolut richtig, die Qualität des Algorithmus wird sich nicht ändern, obwohl ich zunächst daran gezweifelt habe, aber jetzt haben Sie es mir bewiesen, aber auf diese Zweifel eine Methode der Optimierung gefunden :)

 
Aktualisierte UGA-Bibliothek und Beispiele zum Artikel. Aktuelle kostenlose Autorenversion 1.2.1.
Dateien:
 
Update Library UGA und Beispiele für diesen Artikel. Aktuelle freie Autorenversion 1.2.1.
Dateien:
 

Ich habe den Artikel studiert und im Code eine solche Ungereimtheit gefunden: In zwei Funktionen zur Ermittlung von Bereichswerten wird die gleiche Formel verwendet:

//Replikation
void Replication
...
    //Lassen Sie uns die Grenzen für die Erstellung eines neuen Gens festlegen
    Minimum = C1-((C2-C1)*ReplicationOffset);
    Maximum = C2+((C2-C1)*ReplicationOffset);
...

/////////////////////////////////////////////

// Künstliche Mutation.
void ArtificialMutation
...
    //Lassen Sie uns die Grenzen für die Erstellung eines neuen Gens festlegen
    Minimum=C1-((C2-C1)*ReplicationOffset);
    Maximum=C2+((C2-C1)*ReplicationOffset);
...

D.h. es werden Daten außerhalb der Werte von zwei Genen erhalten, was charakteristisch für "künstliche Mutation" ist. Ist dies ein Fehler oder gibt es eine andere Erklärung?

Es scheint mir, dass es für die Replikationsmethode notwendig ist, die Vorzeichen zu ändern:

Minimum = C1+((C2-C1)*ReplicationOffset);

Maximum = C2-((C2-C1)*ReplicationOffset);


 
Batohov:

Ich habe den Artikel studiert und diese Unstimmigkeit im Code gefunden, zwei Funktionen verwenden dieselbe Formel, um Bereichswerte zu erhalten:

D.h. es werden Daten außerhalb der Werte von zwei Genen erhalten, was charakteristisch für "künstliche Mutation" ist. Ist dies ein Fehler oder gibt es eine andere Erklärung?

Es scheint mir, dass es für die Replikationsmethode notwendig ist, die Vorzeichen zu ändern:

Minimum = C1+((C2-C1)*ReplicationOffset);

Maximum = C2-((C2-C1)*ReplicationOffset);

Es liegt kein Fehler und keine Inkonsistenz vor. Sowohl bei der Replikation als auch bei der künstlichen Mutation sind die Grenzen des wahrscheinlichen Auftretens eines neuen Gens (die von Ihnen zitierten Codeabschnitte) auf dieselbe Weise definiert.

Aber bei der Replikation liegt der Bereich der Wahrscheinlichkeit innerhalb dieser Grenzen, bei der künstlichen Mutation - außerhalb dieser Grenzen.

Die Replikation dient der Übertragung von Merkmalen der Gene beider Elternteile (innerhalb der Grenzen).

Die künstliche Mutation dient dazu, neue Gene zu erzeugen, die sich von denen der Eltern unterscheiden (außerhalb der Grenzen).

 
joo:

Es gibt keinen Fehler und keine Inkonsistenz. Sowohl bei der Replikation als auch bei der künstlichen Mutation sind die Grenzen des wahrscheinlichen Auftretens eines neuen Gens (die von Ihnen zitierten Codeabschnitte) auf dieselbe Weise definiert.

Aber bei der Replikation liegt der Bereich der Wahrscheinlichkeit innerhalb dieser Grenzen, bei der künstlichen Mutation - außerhalb dieser Grenzen.

Die Replikation dient der Übertragung von Merkmalen der Gene beider Elternteile (innerhalb der Grenzen).

Die künstliche Mutation dient dazu, neue Gene zu erzeugen, die sich von denen der Eltern unterscheiden (außerhalb der Grenzen).

Vielen Dank für Ihre schnelle Antwort, ich verstehe Ihren Gedankengang.
 
joo:

Übrigens, es ist sehr schön, der Zerstörer eines der berühmtesten Händlermythen im Zusammenhang mit ZZ zu sein (die zweite Aufgabe im Artikel). :)

Offenbar habe ich den Wortlaut der Aufgabe nicht verstanden. Meine Aussage:

Einstiegspunkte für maximalen Gewinn mit der Bedingung, dass der Mindestumsatz N Pips beträgt, befinden sich auf den Spitzen des ZigZag mit der Bedingung des Mindestknies N + Spread Pips.

 
joo:

Ich habe einige interessante Testfunktionen im MQL4-Forum-Thread "Test Multivariable Multiextremal Function" veröffentlicht, eine davon wird im Artikel vorgestellt.

Wenn Sie möchten, können Sie versuchen, Extrema der vorgeschlagenen Funktionen mit anderen Optimierungsalgorithmen als GA zu finden und die Ergebnisse hier posten. Sie sind herzlich eingeladen, dies zu tun. Es wird für alle interessant sein und in erster Linie für mich.

Mir ist klar, dass es sehr wichtig ist, die Gültigkeit der Anpassung zu bewerten. Eine der Methoden ist das Hinzufügen von Rauschen zu den Originaldaten.

Die Quellcodes für alternative Optimierungsmethoden finden Sie hier(http://alglib.sources.ru/optimization/) und hier(http://ool.sourceforge.net/).

Es ist offensichtlich, dass jeder Optimierungsalgorithmus bei seinen eigenen Klassen von Zielfunktionen besser abschneidet.

Welche Zielfunktionen verwenden Sie in der Praxis?