Diskussion zum Artikel "Algorithmen zur Optimierung mit Populationen: Evolution sozialer Gruppen (ESG)" - Seite 2

 
Andrey Dik #:
Ich bezweifle, dass der Wert von GetMicrosecondCount die Werte bei wiederholten Durchläufen wiederholen kann, selbst wenn man sich Mühe gibt. Vorausgesetzt natürlich, dass die einzelnen Tests länger als eine Mikrosekunde dauern.
2024.02.03 16:11:25.824 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:25.873 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:25.873 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:25.873 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:36.957 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:37.007 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:37.007 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:37.007 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:47.218 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:47.267 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:47.267 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:47.267 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:12:49.104 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:12:49.152 AmountCycles = 5000, Repeats = 1
2024.02.03 16:12:49.152 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:12:49.152 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999

Auf der linken Seite befindet sich die Spalte mit den Skriptlaufzeiten.

 
fxsaber #:

Auf der linken Seite befindet sich eine Spalte mit den Startzeiten der Skripte.


99,99 % ist das Maximum, das mit dem gewählten Schritt erreicht werden kann, und soweit ich weiß, wird in den BGA-Einstellungen eine Genauigkeit von zwei Dezimalstellen gewählt.
Dies ist also nicht eine Folge der gleichen Initialisierung des gcc, sondern ein Ergebnis der vollen theoretisch möglichen Konvergenz innerhalb der gestellten Aufgabe.
Sie können sich davon überzeugen, wenn Sie das allererste Chromosom, das in jedem einzelnen Test erzeugt wird, ausdrucken, es werden unterschiedliche Chromosomen sein. Dies ist die erstaunliche Eigenschaft des Optimierungsalgorithmus, bei unterschiedlichen (zufälligen) Ausgangszuständen dieselbe Lösung zu finden.
 
Ich habe mir einen Test ausgedacht, um die Widerstandsfähigkeit des Algorithmus gegen das Hängenbleiben in lokalen Gebieten zu testen.
Wir müssen alle Agenten bei der ersten Iteration nicht zufällig über das gesamte Feld verteilen, sondern auf das globale Minimum. Die Aufgabe besteht darin, das globale Maximum zu finden. Ich bin mir sicher, dass viele Algos auf diese Weise im Loch bleiben werden.
Dies ist ein sehr künstlicher Fall, aber er enthält interessante Schlussfolgerungen.
 
Andrey Dik #:
Ein Test der Widerstandsfähigkeit des Algorithmus gegen das Hängenbleiben an Orten kam mir in den Sinn.
Wir müssen alle Agenten bei der ersten Iteration nicht zufällig über das gesamte Feld verteilen, sondern auf das globale Minimum. Die Aufgabe besteht darin, das globale Maximum zu finden. Ich bin sicher, dass viele Algos im Loch bleiben werden.
Dies ist ein sehr künstlicher Fall, aber er enthält interessante Schlussfolgerungen.

Die gesamte Population ist an einem Punkt eine degenerierte Population. Dies ist auch ein Test für die Auswirkungen einer abnehmenden Vielfalt in der Population, der Algorithmus sollte in der Lage sein, aus einem solchen Engpass herauszukommen.

Das ist nur lautes Denken.

 
Andrey Dik #:
Wir müssen alle Agenten in der ersten Iteration nicht zufällig über das gesamte Feld verteilen, sondern auf das globale Minimum. Die Aufgabe besteht darin, das globale Maximum zu finden.

  1. Der übliche Start ist die Suche nach dem globalen Maximum.
  2. Dann starten wir von dem gefundenen Punkt(MaxTmp), um das globale Minimum zu finden.
  3. Dann starten wir von dem gefundenen Punkt(MinTmp), um das globale Maximum zu finden.
  4. Weiter zu Schritt 2.

In den Schritten 2-3 messen wir, wie weit wir von den globalen Minima/Maxima entfernt sind(MaxGlobal - MaxTmp + MinTmp - MinGlobal). Der Durchschnitt ist die Bewertung1 des Optimierungsalgorithmus.

Der Durchschnitt der Summe von(MaxTmp[i]-MinTmp[i]) ist die Bewertung2 des Optimierungsalgorithmus.


Nun gibt es keine Funktion, die es erlaubt, den Algorithmus von einem Punkt aus zu starten.

 
fxsaber #:

  1. Normaler Start mit Suche nach dem globalen Maximum.
  2. Dann Start vom gefundenen Punkt(MaxTmp) zur Suche nach dem globalen Minimum.
  3. Dann starten Sie vom gefundenen Punkt(MinTmp) aus, um das globale Maximum zu suchen.
  4. Weiter zu Schritt 2.

In den Schritten 2-3 messen wir, wie weit wir von den globalen Minima/Maxima entfernt sind(MaxGlobal - MaxTmp + MinTmp - MinGlobal). Der Durchschnitt ist die Bewertung1 des Optimierungsalgorithmus.

Wir nehmen den Durchschnitt der Summe(MaxTmp[i]-MinTmp[i]) - rating2 des Optimierungsalgorithmus.


So kann man es machen)))

Сейчас нет функции, позволяющей запускать алгоритм из точки.

Sie können die Koordinaten der Agenten "zwangsweise" mit beliebigen Werten initialisieren, bevor der FF in der ersten Epoche gemessen wird. Die Felder der Agenten sind öffentlich. Die "Eingeweide" der Algorithmen haben versucht, sie von außen so zugänglich wie möglich zu machen, das widerspricht natürlich dem üblichen Ansatz, die Sicherheit von Feldern zu gewährleisten, aber wer sich auf jeden Fall in den Fuß schießen will, wird einen Weg finden, und so bleibt die Bequemlichkeit der Nutzung der Algorithmen erhalten.

Und, ist das Problem mit der Initialisierung des HCS gelöst?

 
Andrey Dik #:

99,99 % ist das Maximum, das mit dem gewählten Abstand erreicht werden kann, und soweit ich weiß, beträgt die gewählte Genauigkeit zwei Dezimalstellen in den BGA-Einstellungen.
Dies ist also nicht eine Folge der gleichen Initialisierung des gcc, sondern ein Ergebnis der vollen theoretisch möglichen Konvergenz innerhalb der gestellten Aufgabe.
Sie können sich davon überzeugen, wenn Sie das allererste Chromosom, das in jedem einzelnen Test erzeugt wird, ausdrucken, es werden unterschiedliche Chromosomen sein. Dies ist die erstaunliche Eigenschaft des Optimierungsalgorithmus, bei verschiedenen (zufälligen) Ausgangszuständen die gleiche Lösung zu finden.

Sie haben Recht, vielen Dank!

void OnStart()
{
  Print(GetMicrosecondCount());
}
2024.02.04 15:31:28.422 2142
2024.02.04 15:31:40.553 2367
2024.02.04 15:31:42.385 2326
 
Andrey Dik #:

Es ist möglich, die Koordinaten der Agenten "zwangsweise" von außen mit beliebigen Werten zu initialisieren, bevor die FF in der allerersten Epoche gemessen wird.

Bitte zeigen Sie Beispiele für Ihre beiden Algorithmen.

 
fxsaber #:

Bitte zeigen Sie Beispiele für Ihre beiden Algorithmen.

Fügen Sie in die Hauptschleife der Epochen einen Code ein, der die Koordinaten der Agenten mit den Koordinaten des globalen Minimums der Funktion überschreibt:

for (int epochCNT = 1; epochCNT <= epochCount && !IsStopped (); epochCNT++)
    {
      AO.Moving ();
      
      //--der eingefügte Code--der eingefügte Code--der eingefügte Code--der Einfüger
      if (epochCNT == 1)
      {
        for (int set = 0; set < ArraySize (AO.a); set++)
        {
          for (int i = 0; i < funcCount; i++)
          {
            AO.a [set].c [i * 2]     = f.GetMinFuncX ();
            AO.a [set].c [i * 2 + 1] = f.GetMinFuncY ();
          }
        }
      }
      //--der eingefügte Code--der eingefügte Code--der eingefügte Code--der Einfüger

      for (int set = 0; set < ArraySize (AO.a); set++)
      {
        AO.a [set].f = f.CalcFunc (AO.a [set].c, funcCount);
      }

      AO.Revision  ();

      if (Video_P)
      {
        //drawing a population--------------------------------------------------
        SendGraphToCanvas  (1, 1);

        for (int i = 0; i < ArraySize (AO.a); i++)
        {
          PointDr (AO.a [i].c, f, 1, 1, funcCount, false);
        }
        PointDr (AO.cB, f, 1, 1, funcCount, true);

        MaxMinDr (f);

        //Zeichnen eines Konvergenzdiagramms---------------------------------------------
        xConv = (int)Scale (epochCNT, 1,              epochCount,     H + 2, W - 3, false);
        yConv = (int)Scale (AO.fB,   f.GetMinFun (), f.GetMaxFun (), 2,     H - 2, true);
        Canvas.FillCircle (xConv, yConv, 1, COLOR2RGB (clrConv));

        Canvas.Update ();
      }
    }

Dieser Trick wird mit dem BGA-Algorithmus nicht funktionieren, weil wir auf diese Weise nur den Phänotyp überschreiben, während der binäre Genotyp unverändert bleibt. Dazu müssen wir in den Algorithmus eindringen, und wenn die Population noch in den Kinderschuhen steckt, müssen wir einen solchen chirurgischen Eingriff vornehmen.

Das ist das Ergebnis, wenn Sie ESG auf diese Weise initialisieren:

Erweiterung

Hier habe ich ein Video des ESG aufgenommen. Sie können sehen, wie er von einem Punkt aus aufsteigt und sich auf der Suche nach einem globalen Maximum ausbreitet. Nicht alle Algorithmen verhalten sich so, ich habe darüber in meinen Artikeln geschrieben, manche Algorithmen haben überhaupt keine Mechanismen, um "aus der Falle zu entkommen".

 
Hallo, ich fange gerade an, mich über Alternativen zum eingebauten schnellen genetischen Algorithmus zu informieren. Ich habe mich gefragt, ob Sie mir helfen können, Ihre BGA-Optimierung zum Laufen zu bringen. Ich habe mir einige Ihrer Artikel zu diesem Thema angesehen. Ich habe jedoch das Gefühl, dass ich zu spät anfange, irgendwo Informationen übersehen habe und nicht weiß, wie ich den EA tatsächlich mit einem anderen Algorithmus optimieren kann. Ich habe test_ao_bga.mq5 heruntergeladen und kompiliert. Wenn ich das Terminal lade, sagt es: "Ungültiger Programmtyp, das Laden von Test_AO_BGA.ex5 ist fehlgeschlagen". Wenn ich versuche, es auszuführen, meldet das Terminal "Test_AO_BGA.ex5 nicht gefunden". Könnten Sie mir bitte helfen, es zum Laufen zu bringen? Und wie kann ich meinen eigenen EA so konfigurieren, dass er die BGA-Optimierung verwendet? Vielen Dank!