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

 
shurick:

Vielen Dank an den Autor für die Bibliothek!

Fügen Sie die Zeile "cnt++;" in die Schleife der übergeordneten Suchfunktion ein, sonst kann sie in eine Endlosschleife geraten!

In der Tat kann es in einigen Fällen vorkommen, dass die Schleife unendlich wird - wenn es nur ein Individuum in der Population gibt.

Vielen Dank für den Beitrag, ich werde die Änderungen in Kürze vornehmen.

PS Wahrscheinlich habe ich vergessen, cnt++ einzufügen, schließlich habe ich deshalb diese Variable eingegeben. :)

Ich erinnere mich an den Wunsch, die Schleife mit dem for()-Operator zu machen, so dass es möglich wäre, die "Persistenz" der Suche nach verschiedenen Eltern zu regulieren, aber dann habe ich meine Meinung geändert, weil ich darin nicht viel Sinn sehe.

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 
@joo Ist es möglich, Ihre Bibliothek zu verwenden, um Parameter von Ishimoku-, MAKD- usw. Indikatoren zu kompilieren?
 
Graff:
@joo Ist es möglich, Ihre Bibliothek für die Auswahl der Parameter der Indikatoren Ishimoku, MAKD, etc. zu verwenden?

Wenn Sie fragen würden: "Für welche Optimierungsaufgaben des Traders ist es unmöglich, die Bibliothek zu verwenden?". - dann wüsste ich nicht, was ich antworten sollte.

Aber natürlich können Sie das.

 
joo:

Wenn Sie fragen würden: "Für welche Optimierungsaufgaben eines Händlers ist es unmöglich, die Bibliothek zu verwenden? - dann wüsste ich nicht, was ich antworten sollte.

Aber natürlich können Sie das.

Entschuldigung für die dumme Frage, ich bin kein Programmierer. Wenn möglich, teilen Sie bitte den Code, in dem Ihre Bibliothek verwendet wird, um mehrere Parameter an einen Indikator anzupassen (z.B. Ishimoku, MAKD), um die Arbeit zu verdeutlichen.
 
Graff:
Entschuldigung für eine dumme Frage, ich bin kein Programmierer. Wenn möglich, teilen Sie bitte den Code, wo Ihre Bibliothek verwendet wird, um mehrere Parameter zu einem Indikator (z. B. Ishimoku, MAKD) für Klarheit seiner Arbeit zu wählen.

Die Frage ist keineswegs dumm.

Verwenden Sie das zweite Beispiel aus dem Artikel. Anstelle des ZZ-Indikators können Sie einen beliebigen anderen Indikator verwenden. Anstelle der ZZ-Tops müssen Sie Ihre eigenen Bedingungen schreiben (MACD, zum Beispiel, erhalten Sie die gleiche Alternative Zickzack, aber nach den Regeln, die Sie festgelegt). Es ist nichts kompliziert. Probieren Sie es aus, schreiben Sie den Code. Wenn Sie scheitern, stellen Sie Fragen und zeigen Sie problematische Stellen im Code auf. Diejenigen, die sich dafür interessieren, werden Wege sehen, ihre Aufgaben zu lösen, und Sie und alle anderen werden davon profitieren. Wenn Sie die Sprache nicht lernen wollen, wenden Sie sich bitte an"Work".

 

2joo:

Könnten Sie mir bitte sagen, was es mit der Funktion RemovalDuplicates() auf sich hat? Die Frage ist folgende: Wenn wir zwei identische Chromosomen haben, sollten beide als Duplikate markiert werden, oder sollte eines von ihnen für die weitere Verwendung als Duplikat unmarkiert bleiben?

Um die Funktion zu beschleunigen, schlage ich außerdem vor, dass die Ch2-Schleife mit dem Wert Ch+1 beginnt, da es keinen Sinn macht, dass Ch2 bei Null beginnt:

      //Выбираем второй из пары...

      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)

und wenn die Antwort auf meine Frage lautet, dass beide Chromosomen als Duplikat markiert sind, dann sollte statt:

          if(cnt==GeneCount)
            chromosomeUnique[Ch2]=0;

do:

          if (cnt==GeneCount) {
            chromosomeUnique[Ch]=0;
            chromosomeUnique[Ch2]=0;
          }

Und wenn die Antwort lautet, dass ein Chromosom NICHT als Duplikat markiert werden soll, dann sollte die Ch2-Schleife trotzdem mit dem Wert Ch+1 beginnen.

 
shurick:

2joo:

Könnten Sie mir bitte sagen, was es mit der Funktion RemovalDuplicates() auf sich hat? Die Frage ist: Wenn wir zwei identische Chromosomen haben, sollten beide als Duplikate markiert werden, oder sollte eines von ihnen für die weitere Verwendung als Duplikat unmarkiert bleiben?

Der Algorithmus für diese Funktion sieht folgendermaßen aus:

Wir markieren alle Chromosomen mit dem Einzigartigkeitsmerkmal "1". Wir gehen davon aus, dass alle Chromosomen eindeutig sind.

Wir prüfen, ob es identische Chromosomen gibt. Dazu duplizieren wir die Population virtuell und vergleichen alle Chromosomen miteinander, wobei wir Paare mit der gleichen Sequenznummer auslassen. Die gefundenen Duplikate werden mit dem Duplikatmerkmal "0" markiert.

Anschließend werden alle verbleibenden Chromosomen, die nicht mit "0" markiert sind, in das temporäre Array kopiert. Wir erhalten ein gefülltes temporäres Array ohne Lücken, und wir wissen bereits, wie viele eindeutige Chromosomen in der Population übrig sind.

Als Nächstes müssen wir nur noch die Chromosomen zurück in die Population kopieren. Wie Sie sehen, werden keine Chromosomen gelöscht, sondern die eindeutigen Chromosomen werden lediglich an den Anfang der Population verschoben.


Um diese Funktion zu testen, schreiben Sie ein Skript und versuchen Sie, manuell erstellte knifflige Kombinationen von gefüllten Feldern einzugeben. Sie werden sehen, wie effizient/ineffizient die Funktion arbeitet. Berechnen Sie die kleinstmögliche Anzahl von Überprüfungen der Spalten im Array und vergleichen Sie diese mit der Anzahl der Überprüfungen der Spalten durch die Funktion RemovalDuplicates().

 
joo:

ZY Um diese Funktion zu testen, schreiben Sie ein Skript und versuchen Sie, manuell erstellte knifflige Kombinationen von gefüllten Feldern einzugeben. Sie werden sehen, wie wirksam/unwirksam die Funktion ist. Berechnen Sie die kleinstmögliche Anzahl von Überprüfungen der Spalten im Array und vergleichen Sie sie mit der Anzahl der Überprüfungen der Spalten durch die Funktion RemovalDuplicates().

Wenn Sie die "for (Ch2=Ch+1)"-Schleife starten, verringert sich die Anzahl der notwendigen und ausreichenden Iterationen um den Faktor 2,5 und eines der Duplikate wird nicht als Duplikat markiert. Hier habe ich mich gefragt, wie viel richtiger es wäre, ein Chromosom der Duplikate eindeutig zu lassen! D.h. die Aufgabe der Funktion ist es, identische Chromosomen zu entfernen, aber ein Exemplar der doppelten Chromosomen scheint mir besser in die Population zurückzugeben, weil das Vorhandensein seiner Duplikate nicht seine Vitalität beweist. Zum Beispiel: Wenn es eine Anordnung von Chromosomen {1,3,4,7,7,7,6,7,8,8} gibt, denke ich, dass die optimale Entfernung von Duplikaten dieses Ergebnis wäre: {1,3,4,7,6,8}. Die Chromosomen 7 und 8 werden also weiter betrachtet.
 
shurick:
Zu Beginn der Schleife "for (Ch2=Ch+1)" wird die Anzahl der notwendigen und ausreichenden Iterationen um das Zweifache reduziert und eines der doppelten Chromosomen wird nicht als Duplikat markiert. Hier habe ich mich gefragt, wie viel richtiger es wäre, ein Chromosom der Duplikate eindeutig zu lassen! D.h. die Aufgabe der Funktion ist es, identische Chromosomen zu entfernen, aber ein Exemplar der doppelten Chromosomen scheint mir besser in die Population zurückzukehren, denn das Vorhandensein seiner Duplikate beweist nicht seine Vitalität. Zum Beispiel: Wenn es eine Anordnung von Chromosomen {1,3,4,7,7,7,6,7,8,8} gibt, denke ich, dass die optimale Entfernung von Duplikaten dieses Ergebnis wäre: {1,3,4,7,6,8}. Die Chromosomen 7 und 8 werden also weiter betrachtet.

Ihre vorherige Bemerkung über cnt++ war fair. Aber dieses Mal liegen Sie falsch. Ich empfehle Ihnen, nicht zu spekulieren "Was passiert, wenn...?", sondern ein Skript zu schreiben, die Funktion zu testen und das Ergebnis zu demonstrieren.

Ein einziges einzigartiges Chromosom bleibt übrig, der Rest seiner exakten Kopien wird als Duplikate erkannt und "gelöscht".

Dies ist wahrscheinlich eine der moskauerischsten Funktionen des gesamten UGA-Algorithmus. Sie hat mich die meiste Zeit gekostet. Aber es sind keine Fehler enthalten.


PS Die Hauptsache ist, dass es keine wiederholten Überprüfungen derselben Chromosomen geben sollte - das wird gemacht.

Die Anzahl der Prüfungen auf Einzigartigkeit ist das notwendige Minimum. Wenn Sie von der Anzahl der Durchläufe im for()-Operator sprechen, können Sie diese reduzieren (während die Anzahl der Einzigartigkeitsprüfungen gleich bleibt - das Minimum, das möglich ist), indem Sie eine zusätzliche Variable einführen, die jedes Mal um eins in der verschachtelten Variable erhöht wird. Dies wird die Funktion verlangsamen.

PPS Wenn Sie auf betonen:

shurick:

....

wie viel richtiger wäre es, ein Chromosom aus den Duplikaten eindeutig zu lassen! D .h. die Aufgabe der Funktion ist es, identische Chromosomen zu entfernen, aber ein Exemplar der doppelten Chromosomen scheint mir besser in die Population zurückzugeben, denn das Vorhandensein ihrer Duplikate beweist nicht ihre Vitalität.

Die Funktion hat die Aufgabe, Duplikate zu entfernen. Das ist die Aufgabe der Funktion. Es geht nicht darum, identische Chromosomen zu entfernen. Sehen Sie den Unterschied? Diese Funktion unterscheidet nicht zwischen Chromosomen aufgrund ihrer Lebensfähigkeit. Das Ergebnis ist, dass nur einzigartige Chromosomen übrig bleiben und keine Duplikate.

PPPS Ich werde noch eine weitere Klarstellung vornehmen, nur für den Fall.

Angenommen, wir haben eine Population, die aus 20 Chromosomen besteht (der Einfachheit und Klarheit halber mit einem einzigen ganzzahligen Gen), das Maximierungsproblem:

|7|2|3|9|2|4|5|3|3|5|6|2|4|3|5|10|6|7|7|2|

Das heißt, in einer Population von Chromosomen, die das Gen

2 - 4 Stück

3 - 4 Stück

4 - 2 Stück

5 - 3 Stück

6 - 2 Stück

7 - 3 Stück

9 - 1 Stück

10 - 1 Stück.

Insgesamt - 20 Stück Chromosomen.

Nach dem Entfernen der Duplikate sieht die Population wie folgt aus, mit 8 verbleibenden Chromosomen:

|7|2|3|9|4|5|6|10|

Es bleibt also ein einziges Chromosom übrig, der Rest sind Duplikate und werden "gelöscht"

nach dem Funktionsaufruf "gelöscht".

PopulationRanking();

am Ende der Funktion.

RemovalDuplicates()

Die Population sieht dann wie folgt aus:

|10|9|7|6|5|4|3|2|

 
joo:

PPPS Ich werde vorsichtshalber eine weitere Klarstellung vornehmen.

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, die die Verringerung der Anzahl der Durchläufe in Schleifen veranschaulicht. 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 die Erklärungen zur Funktion.

Ergebnis des Skripts zur Überprüfung der Funktionsoptimierung

Dateien: