English Русский 中文 Español 日本語 Português
preview
Time Evolution Travel Algorithm (TETA)

Time Evolution Travel Algorithm (TETA)

MetaTrader 5Beispiele |
125 0
Andrey Dik
Andrey Dik

Inhalt

  1. Einführung
  2. Implementierung des Algorithmus
  3. Testergebnisse


Einführung

Wir haben uns viele Algorithmen angesehen, die auf physikalischen Gesetzen beruhen, wie CSS, EM, GSA, AEFA, AOSm, aber das Universum erfreut uns ständig mit neuen Phänomenen und erfüllt uns mit verschiedenen Hypothesen und Ideen. Eine der grundlegenden Komponenten des Universums, wie die Zeit, brachte mich auf die Idee, einen neuen Optimierungsalgorithmus zu entwickeln. Die Zeit inspiriert nicht nur zu neuen Entdeckungen, sondern bleibt auch ein geheimnisvolles Gebilde, das schwer zu begreifen ist. Sie fließt wie ein Fluss, der Momente unseres Lebens mit sich reißt und nur Erinnerungen zurücklässt. Zeitreisen waren schon immer ein Thema der menschlichen Faszination und Fantasie. Um die Idee des Algorithmus besser zu verstehen, sollten wir uns die Geschichte eines Wissenschaftlers vorstellen.

Es lebte einmal ein Physiker, der von der Idee besessen war, in eine strahlende Zukunft zu gehen, weg von den Fehlern, die er gemacht hatte. Nachdem er sich mit dem Studium der Zeitströme befasst hatte, musste er eine bittere Entdeckung machen: Reisen in die Zukunft sind unmöglich. Unbeirrt ging er dazu über, die Fähigkeit zu erforschen, in die Vergangenheit zu reisen, in der Hoffnung, seine Fehler zu korrigieren, aber auch hier wurde er enttäuscht.

Seine Untersuchung hypothetischer Zeitabläufe führte ihn jedoch zu einer verblüffenden Entdeckung: der Existenz von Paralleluniversen. Nachdem er ein theoretisches Modell einer Maschine entwickelt hatte, mit der man sich zwischen den Welten bewegen kann, entdeckte er etwas Erstaunliches: Obwohl direkte Zeitreisen unmöglich sind, ist es möglich, eine Abfolge von Ereignissen zu wählen, die zu dem einen oder anderen Paralleluniversum führt.

Jede Handlung eines Menschen ließ eine neue parallele Realität entstehen, aber der Wissenschaftler interessierte sich nur für die Universen, die sein Leben direkt beeinflussten. Um zwischen ihnen zu navigieren, hat er im Gleichungssystem besondere Ankerpunkte gesetzt (um zwischen den Welten zu unterscheiden) – Schlüsselpunkte seines Schicksals: Familie, Karriere, wissenschaftliche Entdeckungen, Freundschaften und bedeutende Ereignisse. Diese Anker wurden zu Variablen in seiner Maschine, die es ihm ermöglichten, den optimalen Weg zwischen probabilistischen Welten zu wählen.

Nachdem er seine Erfindung auf den Markt gebracht hatte, begann er eine Reise durch parallele Welten, wollte aber nicht mehr in eine vorgefertigte, strahlende Zukunft gelangen. Er erkannte etwas viel Wichtigeres: die Fähigkeit, diese Zukunft mit seinen eigenen Händen zu gestalten, indem er Entscheidungen in der Gegenwart traf. Jede neue Entscheidung ebnete den Weg zu der Version der Realität, die er selbst zum Leben erwecken wollte. So war er nicht länger Gefangener des Traums von einer idealen Zukunft, sondern wurde zu ihrem Architekten. Seine Maschine wurde nicht zu einem Mittel, um der Realität zu entfliehen, sondern zu einem Werkzeug, mit dem er sein eigenes Schicksal bewusst gestalten konnte, indem er zu jedem Zeitpunkt die optimalen Lösungen wählte.

In diesem Artikel betrachten wir den Time Evolution Travel Algorithm (TETA), der das Konzept der Zeitreise umsetzt und sich dadurch auszeichnet, dass er keine Parameter oder veränderbaren Variablen hat. Dieser Algorithmus hält natürlich ein Gleichgewicht zwischen der Suche nach der besten Lösung und deren Verfeinerung aufrecht. Typischerweise haben Algorithmen, die keine externen Parameter haben, dennoch interne Parameter in Form von Konstanten, die ihre Leistung beeinflussen. TETA verfügt jedoch auch nicht über solche Konstanten, was es in seiner Art einzigartig macht.


Implementierung des Algorithmus

In der vorgestellten Geschichte entdeckte ein Wissenschaftler eine Möglichkeit, zwischen Paralleluniversen zu reisen, indem er Schlüsselvariablen in seinem Leben veränderte. Diese Metapher bildet die Grundlage für den vorgeschlagenen Optimierungsalgorithmus. Um dies zu verdeutlichen, sehen Sie sich die folgende Abbildung an, die die Idee des Algorithmus von Paralleluniversen veranschaulicht, die bei jeder Entscheidung entstehen. Jedes Universum, das einen vollständigen Raum hat, wird durch das Vorhandensein von Merkmalen in Form von Ankern definiert: Familie, Karriere, Leistungen usw.

Durch die Kombination der Eigenschaften dieser Anker kann ein neues Universum geschaffen werden, das die Lösung eines Optimierungsproblems darstellt, bei dem die Anker die zu optimierenden Parameter sind.

TETA

Abbildung 1. Parallele Universen mit ihren eigenen einzigartigen Ankern (Merkmalen)

Der TETA-Algorithmus basiert auf dem Konzept mehrerer paralleler Universen, von denen jedes eine mögliche Lösung für ein Optimierungsproblem darstellt. In seiner technischen Ausgestaltung wird jedes dieser Universen durch einen Koordinatenvektor (a[i].c) beschrieben, wobei jede Koordinate ein Anker ist – eine Schlüsselvariable, die die Konfiguration einer bestimmten Realität bestimmt. Diese Anker können als die wichtigsten Parameter betrachtet werden, deren Einstellungen die Gesamtqualität der Lösung beeinflussen.

Um die Qualität jedes Universums zu bewerten, wird eine Fitnessfunktion (a[i].f) verwendet, die den „Komfort des Daseins“ in einer bestimmten Realität bestimmt. Je höher der Wert dieser Funktion ist, desto günstiger wird das Universum eingeschätzt. Jedes Universum speichert nicht nur Informationen über seinen aktuellen Zustand, sondern auch über die beste bekannte Konfiguration (a[i].cB), die mit einem „Gedächtnis“ für das erfolgreichste Szenario verglichen werden kann. Darüber hinaus behält der Algorithmus einen globalen besten Zustand (cB) bei, der die günstigste Konfiguration unter allen entdeckten Optionen darstellt.

Eine Population von N Individuen bildet eine Reihe von Paralleluniversen, von denen jedes durch seinen eigenen Satz von Ankerwerten beschrieben wird. Diese Universen werden ständig nach dem Wert der Fitnessfunktion geordnet, wodurch eine Art Hierarchie vom ungünstigsten zum günstigsten Zustand entsteht. Jeder Anker der Realität ist eine optimierbare Variable, und jede Veränderung dieser Variablen erzeugt eine neue Konfiguration des Universums. Der vollständige Satz von Ankern bildet einen Vektor von Variablen x = (x₁, x₂, ..., xₙ), der eine bestimmte Realität vollständig beschreibt. Außerdem werden für jede Variable die Grenzen akzeptabler Werte definiert, die als physikalische Gesetze interpretiert werden können, die die möglichen Veränderungen in jedem Universum begrenzen.

Die Bewertung der Beliebtheit jedes Universums erfolgt durch die Fitnessfunktion f(x), die die Konfiguration des Universums auf eine reelle Zahl abbildet. Je höher dieser Wert ist, desto mehr wird eine bestimmte Realität als vorteilhaft angesehen. Auf diese Weise wird ein mathematisch strenger Mechanismus geschaffen, um verschiedene mögliche Entwicklungen in mehreren Paralleluniversen zu bewerten und zu vergleichen.

      Das Hauptmerkmal des Algorithmus ist ein einziges Wahrscheinlichkeitsverhältnis (rnd *= rnd), das sowohl die Wahrscheinlichkeit der Auswahl eines Universums für die Interaktion als auch die Stärke der Veränderung der Anker bestimmt. Dadurch entsteht ein natürlicher Selbstausgleichsmechanismus für das System: Die besten Universen haben eine höhere Chance, ausgewählt zu werden, aber ihre Anker ändern sich weniger (proportional zu rnd), während die schlechtesten Universen, obwohl sie seltener ausgewählt werden, stärkeren Änderungen unterliegen (proportional zu 1,0 – rnd).

      Dieser Ansatz spiegelt den tiefen philosophischen Gedanken wider, dass es unmöglich ist, in allen Bereichen gleichzeitig Perfektion zu erreichen. Die Verbesserung erfolgt durch ein ständiges Abwägen der verschiedenen Aspekte: Manchmal können sich die besten Anker im Interesse des Gesamtgleichgewichts etwas verschlechtern, während die schlechtesten nach Verbesserungen streben. Die Stärke der Veränderung ist proportional dazu, wie „gut“ das Universum ist, was das wirkliche Leben widerspiegelt, in dem dramatische Veränderungen wahrscheinlicher sind, wenn etwas schief läuft.

      Infolgedessen optimiert der Algorithmus nicht einfach nur Werte, sondern simuliert den Prozess der Gleichgewichtsfindung in einem komplexen multidimensionalen System von Lebensumständen und strebt nicht nach einem Ideal, sondern nach der harmonischsten Version der Realität durch ein subtiles Gleichgewicht aller ihrer Aspekte.

      Abbildung 2. Die rote Linie ist die Wahrscheinlichkeitsfunktion für die Auswahl von Universen in Abhängigkeit von ihrer Qualität, die grüne Linie ist der Grad der Veränderung der Anker für die entsprechenden Universen

      Pseudocode des Algorithmus:

      Initialisierung:
      1. Schaffen einer Population von N Paralleluniversen
      2. Für jedes Universum:
         - Zufällige Initialisierung der Ankerwerte (Koordinaten) innerhalb akzeptabler Grenzen
         - Setzen der besten Anfangswerte gleich den aktuellen Werten

      Hauptschleife:
      1. Sortierung der Universen nach Qualität (Fitnessfunktionen)
         - Die besten Universen erhalten niedrigere Indizes
         - Schlechteste Universen erhalten höhere Indizes

      2. Für jedes Universum i von N:
         Für jeden Anker (Koordinate):
         
         a) Wähle ein Universum für die Interaktion aus:
            - Erzeuge eine Zufallszahl rnd von 0 bis 1
            - Quadratisches rnd, um die Priorität der besten Universen zu erhöhen
            - Wähle den Index von „pair“ proportional zu rnd
         
         b) Wenn das aktuelle Universum nicht mit dem ausgewählten Universum übereinstimmt (i ≠ Paar):
            
            Wenn das aktuelle Universum besser ist als das ausgewählte (i < Paar):
               - Eine leichte Veränderung des Ankers ist proportional zu rnd
               - New_value = current + rnd * (selected_value – current)
            
            Andernfalls (das aktuelle Universum ist schlechter als das ausgewählte):
               If (random_number > rnd):
                  - Starke Veränderung des Ankers proportional zu (1 – rnd)
                  - New_value = current + (1-rnd) * (selected_value – current)
               Andernfalls:
                  - Vollständiges Kopieren des Ankerwertes aus dem besten Universum
                  - New_value = selected_value
         
         c) Ansonsten (Interaktion mit sich selbst):
            - Lokale Suche mit Gaußscher Verteilung
            - New_value = GaussDistribution(current_best)
         
         d) Korrektur des neuen Ankerwertes innerhalb akzeptabler Grenzen

      3. Aktualisierung der besten Werte:
         Für jedes Universum:
         - Wenn die aktuelle Lösung besser ist als die persönliche Bestleistung, aktualisiere die persönliche Bestleistung
         - Wenn die aktuelle Lösung besser ist als die global beste, aktualisiere die global beste

      4. Wiederhole die Hauptschleife, bis das Abbruchkriterium erfüllt ist.

      Jetzt haben wir alles vorbereitet, um die Paralleluniversums-Reisemaschine in Code umzusetzen. Schreiben wir die Klasse C_AO_TETA, die von der Klasse C_AO abgeleitet werden soll. Hier ist eine kurze Beschreibung:

      • Konstruktor – initialisiert den Namen, die Beschreibung und den Link zum Algorithmus und legt die Populationsgröße fest
      • SetParams-Parameter – setzt Parameter mit Werten aus dem Array „params“.
      • Die Methoden Init, Moving und Revision sind deklariert, werden aber in einem anderen Teil des Codes implementiert.
      class C_AO_TETA : public C_AO
      {
        public: //--------------------------------------------------------------------
        ~C_AO_TETA () { }
        C_AO_TETA ()
        {
          ao_name = "TETA";
          ao_desc = "Time Evolution Travel Algorithm";
          ao_link = "https://www.mql5.com/en/articles/16963";
      
          popSize = 50; // number of parallel universes in the population
      
          ArrayResize (params, 1);
          params [0].name = "popSize"; params [0].val = popSize;
        }
      
        void SetParams ()
        {
          popSize = (int)params [0].val;
        }
      
        bool Init (const double &rangeMinP  [],  // minimum values for anchors
                   const double &rangeMaxP  [],  // maximum values for anchors
                   const double &rangeStepP [],  // anchor change step
                   const int     epochsP = 0);   // number of search epochs
      
        void Moving ();
        void Revision ();
      
        private: //-------------------------------------------------------------------
      };
      //——————————————————————————————————————————————————————————————————————————————
      
      

      Die Initialisierung der Init-Methode der Klasse C_AO_TETA führt die Ersteinrichtung des Algorithmus durch. 

      Parameter der Methode:
      • rangeMinP – Array der Mindestwerte der Anker.
      • rangeMaxP – Array der Höchstwerte der Anker.
      • rangeStepP – Array der Ankerwechselschritte.
      • epochsP – Anzahl der Suchepochen (Standardwert 0).
      Standard-Initialisierung:
      • Die Methode ruft StandardInit auf, führt die Prüfung durch und setzt die Bereiche für die Anker. Wenn die Initialisierung fehlschlägt, wird „false“ zurückgegeben.
      Rückgabewert:
      • Wenn alle Überprüfungen und Einstellungen erfolgreich sind, gibt die Methode „true“ zurück und zeigt damit die erfolgreiche Initialisierung des Algorithmus an.
      //——————————————————————————————————————————————————————————————————————————————
      // TETA - Time Evolution Travel Algorithm
      // An optimization algorithm based on the concept of moving between parallel universes
      // through changing the key anchors (events) of life
      
      //——————————————————————————————————————————————————————————————————————————————
      bool C_AO_TETA::Init (const double &rangeMinP  [], // minimum values for anchors
                            const double &rangeMaxP  [], // maximum values for anchors
                            const double &rangeStepP [], // anchor change step
                            const int     epochsP = 0)   // number of search epochs
      {
        if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;
      
        //----------------------------------------------------------------------------
        return true;
      }
      //——————————————————————————————————————————————————————————————————————————————
      

      Die Methode Moving der Klasse C_AO_TETA ist dafür zuständig, Anker in Paralleluniversen zu ändern, um neue innerhalb des Algorithmus zu schaffen.

      Überprüfung des Revisionsstands:
      • Wenn „revision“ „false“ ist, initialisiert die Methode die anfänglichen Ankerwerte für alle Paralleluniversen mit Zufallswerten aus dem angegebenen Bereich und wendet Funktionen an, um sie auf gültige Werte zu bringen (basierend auf dem Schritt).
      Aktualisierung der Ankerwerte:
      • Wurde die Revision bereits durchgeführt, erfolgt eine Iteration über alle Paralleluniversen hinweg. Für jeden Anker wird eine Wahrscheinlichkeit erzeugt und sein neuer Wert berechnet:
        • Wenn das aktuelle Universum positiver ist, dann wird der Anker leicht in eine positive Richtung korrigiert, um ein besseres Gleichgewicht zu finden.
        • Wenn die aktuelle Grundgesamtheit ungünstiger ist, kann ein Wahrscheinlichkeitstest zu einer signifikanten Änderung des Ankers oder zu einer vollständigen Übernahme des Ankers aus der günstigeren Grundgesamtheit führen.
        • Wenn die Universen übereinstimmen, erfolgt eine lokale Ankeranpassung unter Verwendung einer Gaußschen Verteilung.
      • Nach der Berechnung des neuen Wertes wird der Anker in den zulässigen Bereich gebracht.

        Diese Methode ist in der Praxis für die Anpassung und Verbesserung von Lösungen (Paralleluniversen) verantwortlich, was ein wesentlicher Bestandteil des Optimierungsalgorithmus ist. 

        //——————————————————————————————————————————————————————————————————————————————
        void C_AO_TETA::Moving ()
        {
          //----------------------------------------------------------------------------
          if (!revision)
          {
            // Initialize the initial values of anchors in all parallel universes
            for (int i = 0; i < popSize; i++)
            {
              for (int c = 0; c < coords; c++)
              {
                a [i].c [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]);
                a [i].c [c] = u.SeInDiSp  (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
              }
            }
        
            revision = true;
            return;
          }
        
          //----------------------------------------------------------------------------
          double rnd  = 0.0;
          double val  = 0.0;
          int    pair = 0.0;
        
          for (int i = 0; i < popSize; i++)
          {
            for (int c = 0; c < coords; c++)
            {
              // Generate a probability that determines the chance of choosing a universe,
              // as well as the anchor change force
              rnd  = u.RNDprobab ();
              rnd *= rnd;
        
              // Selecting a universe for sharing experience
              pair = (int)u.Scale (rnd, 0.0, 1.0, 0, popSize - 1);
        
              if (i != pair)
              {
                if (i < pair)
                {
                  // If the current universe is more favorable:
                  // Slightly change the anchor (proportional to rnd) to find a better balance
                  val = a [i].c [c] + (rnd)*(a [pair].cB [c] - a [i].cB [c]);
                }
                else
                {
                  if (u.RNDprobab () > rnd)
                  {
                    // If the current universe is less favorable:
                    // Significant change of anchor (proportional to 1.0 - rnd)
                    val = a [i].cB [c] + (1.0 - rnd) * (a [pair].cB [c] - a [i].cB [c]);
                  }
                  else
                  {
                    // Full acceptance of the anchor configuration from a more successful universe
                    val = a [pair].cB [c];
                  }
                }
              }
              else
              {
                // Local anchor adjustment via Gaussian distribution
                val = u.GaussDistribution (cB [c], rangeMin [c], rangeMax [c], 1);
              }
        
              a [i].c [c] = u.SeInDiSp  (val, rangeMin [c], rangeMax [c], rangeStep [c]);
            }
          }
        }
        //——————————————————————————————————————————————————————————————————————————————
        
        

        Die Methode Revision der Klasse C_AO_TETA ist für die Aktualisierung der Ankerkonfigurationen in Paralleluniversen und die Sortierung dieser Universen nach ihrer Qualität zuständig. Weitere Einzelheiten:

          Aktualisierung der global besten Konfiguration:
          • Die Methode durchläuft alle Paralleluniversen (von 0 bis popSize).
          • Wenn der Wert der Funktion f des aktuellen Universums (a[i].f) größer ist als der globale Bestwert fB, dann:
            • fB wird durch den Wert von (a[i].f) aktualisiert.
            • Die Ankerkonfiguration des aktuellen Universums wird in die globale cB-Konfiguration kopiert.
            Aktualisieren der besten bekannten Konfiguration für jedes Universum:
            • Wenn der Wert der Funktion f des aktuellen Universums größer ist als ihr bester bekannter Wert (a[i].fB), dann:
              • (a[i].fB) wird durch den Wert von (a[i].f) aktualisiert.
              • Die Ankerkonfiguration des aktuellen Universums wird in seine beste bekannte Konfiguration (a[i].cB) kopiert.
            Universen sortieren:
            • Das statische Array aT wird zum Speichern von Bearbeitern deklariert.
            • Die Arraygröße wird in popSize geändert.
            • Die Universen werden mit Hilfe der Funktion u.Sorting_fB nach ihren besten bekannten individuellen Eigenschaften sortiert.
              //——————————————————————————————————————————————————————————————————————————————
              void C_AO_TETA::Revision ()
              {
                for (int i = 0; i < popSize; i++)
                {
                  // Update globally best anchor configuration
                  if (a [i].f > fB)
                  {
                    fB = a [i].f;
                    ArrayCopy (cB, a [i].c);
                  }
              
                  // Update the best known anchor configuration for each universe
                  if (a [i].f > a [i].fB)
                  {
                    a [i].fB = a [i].f;
                    ArrayCopy (a [i].cB, a [i].c);
                  }
                }
              
                // Sort universes by their degree of favorability
                static S_AO_Agent aT []; ArrayResize (aT, popSize);
                u.Sorting_fB (a, aT, popSize);
              }
              //——————————————————————————————————————————————————————————————————————————————
              


              Testergebnisse

              TETA-Ergebnisse:

              TETA|Time Evolution Travel Algorithm|50.0|
              =============================
              5 Hilly's; Func runs: 10000; result: 0.9136198796338938
              25 Hilly's; Func runs: 10000; result: 0.8234856192574587
              500 Hilly's; Func runs: 10000; result: 0.3199003852163246
              =============================
              5 Forest's; Func runs: 10000; result: 0.970957820488216
              25 Forest's; Func runs: 10000; result: 0.8953189778250419
              500 Forest's; Func runs: 10000; result: 0.29324457646900925
              =============================
              5 Megacity's; Func runs: 10000; result: 0.7346153846153844
              25 Megacity's; Func runs: 10000; result: 0.6856923076923078
              500 Megacity's; Func runs: 10000; result: 0.16020769230769372
              =============================
              All score: 5.79704 (64.41%)

              Final result: 5.79704 (64.41%). In Anbetracht der Komplexität der Testfunktionen ist dies ein hervorragendes Ergebnis. Der Algorithmus erkennt sehr schnell wichtige Bereiche der Oberfläche mit vielversprechenden Optima und beginnt sofort mit deren Verfeinerung, was in jeder Visualisierung der Algorithmusoperation zu sehen ist.

              Hilly

              TETA mit der Testfunktion Hilly

              Forest

                TETA mit der Testfunktion Forest

              Megacity

              TETA mit der Testfunktion Megacity

              Insbesondere erzielt der Algorithmus das beste Ergebnis unter allen Optimierungsalgorithmen und überholt den führenden Algorithmus der Gruppe der Populationsalgorithmen bei der Goldstein-Preis-Funktion, die in der Reihe der Testfunktionen enthalten ist, mit denen die Optimierungsalgorithmen getestet werden können.

              GoldsteinPrice

              TETA auf GoldsteinPrice Testfunktion (verfügbar zur Auswahl aus der Liste der Testfunktionen)

              Ergebnisse auf GoldsteinPrice:

              5 GoldsteinPrice's; Func runs: 10000; result: 0.9999786723616957
              25 GoldsteinPrice's; Func runs: 10000; result: 0.9999750431600845
              500 GoldsteinPrice's; Func runs: 10000; result: 0.9992343490683104

              Am Ende des Tests befand sich der TETA-Algorithmus unter den zehn besten Optimierungsalgorithmen und belegte einen respektablen sechsten Platz.

              # AO Beschreibung Hilly Hilly final Forest Forest final Megacity (discrete) Megacity final Final result % of MAX
              10 p (5 F) 50 p (25 F) 1000 p (500 F) 10 p (5 F) 50 p (25 F) 1000 p (500 F) 10 p (5 F) 50 p (25 F) 1000 p (500 F)
              1 ANS Suche über die gesamte Nachbarschaft 0.94948 0.84776 0.43857 2.23581 1.00000 0.92334 0.39988 2.32323 0.70923 0.63477 0.23091 1.57491 6.134 68.15
              2 CLA Code-Sperr-Algorithmus (joo) 0.95345 0.87107 0.37590 2.20042 0.98942 0.91709 0.31642 2.22294 0.79692 0.69385 0.19303 1.68380 6.107 67.86
              3 AMOm Optimierung der Tiermigration M 0,90358 0,84317 0,46284 2,20959 0,99001 0,92436 0,46598 2,38034 0,56769 0,59132 0,23773 1,39675 5.987 66,52
              4 (P+O)ES (P+O) Entwicklungsstrategien 0.92256 0.88101 0.40021 2.20379 0.97750 0.87490 0.31945 2.17185 0.67385 0.62985 0.18634 1.49003 5.866 65.17
              5 CTA Kometenschweif-Algorithmus (joo) 0.95346 0.86319 0.27770 2.09435 0.99794 0.85740 0.33949 2.19484 0.88769 0.56431 0.10512 1.55712 5.846 64.96
              6 TETA Zeit-Evolutions-Reise-Algorithmus (Joo) 0.91362 0.82349 0.31990 2.05701 0.97096 0.89532 0.29324 2.15952 0.73462 0.68569 0.16021 1.58052 5.797 64.41
              7 SDSm stochastische Diffusionssuche M 0.93066 0.85445 0.39476 2.17988 0.99983 0.89244 0.19619 2.08846 0.72333 0.61100 0.10670 1.44103 5.709 63.44
              8 AAm Algorithmus für das Bogenschießen M 0.91744 0.70876 0.42160 2.04780 0.92527 0.75802 0.35328 2.03657 0.67385 0.55200 0.23738 1.46323 5.548 61.64
              9 ESG Entwicklung sozialer Gruppen (joo) 0.99906 0.79654 0.35056 2.14616 1.00000 0.82863 0.13102 1.95965 0.82333 0.55300 0.04725 1.42358 5.529 61.44
              10 SIA Simuliertes isotropes Glühen (Joo) 0.95784 0.84264 0.41465 2.21513 0.98239 0.79586 0.20507 1.98332 0.68667 0.49300 0.09053 1.27020 5.469 60.76
              11 ACS künstliche, kooperative Suche 0.75547 0.74744 0.30407 1.80698 1.00000 0.88861 0.22413 2.11274 0.69077 0.48185 0.13322 1.30583 5.226 58.06
              12 BHAm Algorithmus für schwarze Löcher M 0.75236 0.76675 0.34583 1.86493 0.93593 0.80152 0.27177 2.00923 0.65077 0.51646 0.15472 1.32195 5.196 57.73
              13 ASO Anarchische Gesellschaftsoptimierung 0,84872 0,74646 0,31465 1,90983 0,96148 0,79150 0,23803 1,99101 0,57077 0,54062 0,16614 1,27752 5.178 57,54
              14 AOSm Suche nach atomaren Orbitalen M 0.80232 0.70449 0.31021 1.81702 0.85660 0.69451 0.21996 1.77107 0.74615 0.52862 0.14358 1.41835 5.006 55.63
              15 TSEA Schildkrötenpanzer-Evolutionsalgorithmus (joo) 0.96798 0.64480 0.29672 1.90949 0.99449 0.61981 0.22708 1.84139 0.69077 0.42646 0.13598 1.25322 5.004 55.60
              16 DE differentielle Evolution 0.95044 0.61674 0.30308 1.87026 0.95317 0.78896 0.16652 1.90865 0.78667 0.36033 0.02953 1.17653 4.955 55.06
              17 CRO Optimierung chemischer Reaktionen 0.94629 0.66112 0.29853 1.90593 0.87906 0.58422 0.21146 1.67473 0.75846 0.42646 0.12686 1.31178 4.892 54.36
              18 BSA Vogelschwarm-Algorithmus 0.89306 0.64900 0.26250 1.80455 0.92420 0.71121 0.24939 1.88479 0.69385 0.32615 0.10012 1.12012 4.809 53.44
              19 HS Harmoniesuche 0.86509 0.68782 0.32527 1.87818 0.99999 0.68002 0.09590 1.77592 0.62000 0.42267 0.05458 1.09725 4.751 52.79
              20 SSG Setzen, Säen und Wachsen 0.77839 0.64925 0.39543 1.82308 0.85973 0.62467 0.17429 1.65869 0.64667 0.44133 0.10598 1.19398 4.676 51.95
              21 BCOm Optimierung mit der bakteriellen Chemotaxis M 0.75953 0.62268 0.31483 1.69704 0.89378 0.61339 0.22542 1.73259 0.65385 0.42092 0.14435 1.21912 4.649 51.65
              22 ABO Optimierung des afrikanischen Büffels 0.83337 0.62247 0.29964 1.75548 0.92170 0.58618 0.19723 1.70511 0.61000 0.43154 0.13225 1.17378 4.634 51.49
              23 (PO)ES (PO) Entwicklungsstrategien 0.79025 0.62647 0.42935 1.84606 0.87616 0.60943 0.19591 1.68151 0.59000 0.37933 0.11322 1.08255 4.610 51.22
              24 TSm Tabu-Suche M 0.87795 0.61431 0.29104 1.78330 0.92885 0.51844 0.19054 1.63783 0.61077 0.38215 0.12157 1.11449 4.536 50.40
              25 BSO Brainstorming-Optimierung 0.93736 0.57616 0.29688 1.81041 0.93131 0.55866 0.23537 1.72534 0.55231 0.29077 0.11914 0.96222 4.498 49.98
              26 WOAm Wal-Optimierungsalgorithmus M 0.84521 0.56298 0.26263 1.67081 0.93100 0.52278 0.16365 1.61743 0.66308 0.41138 0.11357 1.18803 4.476 49.74
              27 AEFA Algorithmus für künstliche elektrische Felder 0.87700 0.61753 0.25235 1.74688 0.92729 0.72698 0.18064 1.83490 0.66615 0.11631 0.09508 0.87754 4.459 49.55
              28 AEO Algorithmus zur Optimierung auf der Grundlage künstlicher Ökosysteme 0.91380 0.46713 0.26470 1.64563 0.90223 0.43705 0.21400 1.55327 0.66154 0.30800 0.28563 1.25517 4.454 49.49
              29 ACOm Ameisen-Kolonie-Optimierung M 0.88190 0.66127 0.30377 1.84693 0.85873 0.58680 0.15051 1.59604 0.59667 0.37333 0.02472 0.99472 4.438 49.31
              30 BFO-GA Optimierung der bakteriellen Futtersuche — ga 0.89150 0.55111 0.31529 1.75790 0.96982 0.39612 0.06305 1.42899 0.72667 0.27500 0.03525 1.03692 4.224 46.93
              31 SOA einfacher Optimierungsalgorithmus 0.91520 0.46976 0.27089 1.65585 0.89675 0.37401 0.16984 1.44060 0.69538 0.28031 0.10852 1.08422 4.181 46.45
              32 ABHA Algorithmus für künstliche Bienenstöcke 0.84131 0.54227 0.26304 1.64663 0.87858 0.47779 0.17181 1.52818 0.50923 0.33877 0.10397 0.95197 4.127 45.85
              33 ACMO Optimierung atmosphärischer Wolkenmodelle 0.90321 0.48546 0.30403 1.69270 0.80268 0.37857 0.19178 1.37303 0.62308 0.24400 0.10795 0.97503 4.041 44.90
              34 ADAMm adaptive Momentabschätzung M 0.88635 0.44766 0.26613 1.60014 0.84497 0.38493 0.16889 1.39880 0.66154 0.27046 0.10594 1.03794 4.037 44.85
              35 ATAm Algorithmus für künstliche Stämme M 0.71771 0.55304 0.25235 1.52310 0.82491 0.55904 0.20473 1.58867 0.44000 0.18615 0.09411 0.72026 3.832 42.58
              36 ASHA Algorithmus für künstliches Duschen 0.89686 0.40433 0.25617 1.55737 0.80360 0.35526 0.19160 1.35046 0.47692 0.18123 0.09774 0.75589 3.664 40.71
              37 ASBO Optimierung des adaptiven Sozialverhaltens 0.76331 0.49253 0.32619 1.58202 0.79546 0.40035 0.26097 1.45677 0.26462 0.17169 0.18200 0.61831 3.657 40.63
              38 MEC Evolutionäre Berechnung des Geistes 0.69533 0.53376 0.32661 1.55569 0.72464 0.33036 0.07198 1.12698 0.52500 0.22000 0.04198 0.78698 3.470 38.55
              39 IWO Optimierung mit invasiven Unkräutern 0.72679 0.52256 0.33123 1.58058 0.70756 0.33955 0.07484 1.12196 0.42333 0.23067 0.04617 0.70017 3.403 37.81
              40 Micro-AIS Künstliches Mikro-Immunsystem 0.79547 0.51922 0.30861 1.62330 0.72956 0.36879 0.09398 1.19233 0.37667 0.15867 0.02802 0.56335 3.379 37.54
              41 COAm Kuckuck-Optimierungsalgorithmus M 0.75820 0.48652 0.31369 1.55841 0.74054 0.28051 0.05599 1.07704 0.50500 0.17467 0.03380 0.71347 3.349 37.21
              42 SDOm Optimierung der Spiraldynamik M 0.74601 0.44623 0.29687 1.48912 0.70204 0.34678 0.10944 1.15826 0.42833 0.16767 0.03663 0.63263 3.280 36.44
              43 NMm Nelder-Mead-Verfahren M 0.73807 0.50598 0.31342 1.55747 0.63674 0.28302 0.08221 1.00197 0.44667 0.18667 0.04028 0.67362 3.233 35.92
              44 BBBC Big-Bang-Big-Crunch-Algorithmus 0.60531 0.45250 0.31255 1.37036 0.52323 0.35426 0.20417 1.08166 0.39769 0.19431 0.11286 0.70486 3.157 35.08
              45 CPA Algorithmus für die zyklische Parthenogenese 0.71664 0.40014 0.25502 1.37180 0.62178 0.33651 0.19264 1.15093 0.34308 0.16769 0.09455 0.60532 3.128 34.76
              RW Random Walk 0.48754 0.32159 0.25781 1.06694 0.37554 0.21944 0.15877 0.75375 0.27969 0.14917 0.09847 0.52734 2.348 26.09


              Zusammenfassung

              Während der Arbeit am TETA-Algorithmus war ich ständig bestrebt, etwas Einfaches und Effizientes zu schaffen. Die Metapher der Paralleluniversen und Zeitreisen schien zunächst eine einfache, nette Idee zu sein, aber während der Entwicklung entwickelte sie sich organisch zu einem effektiven Optimierungsmechanismus.

              Das Hauptmerkmal des Algorithmus war die Idee, dass es unmöglich ist, in allem gleichzeitig Perfektion zu erreichen – man muss ein Gleichgewicht finden. Im Leben balancieren wir ständig zwischen Familie, Karriere und persönlichen Errungenschaften, und genau dieses Konzept habe ich mit dem Ankersystem zur Grundlage des Algorithmus gemacht. Jeder Anker stellt einen wichtigen Aspekt dar, der optimiert werden muss, aber nicht auf Kosten anderer.

              Die interessanteste technische Lösung war der Zusammenhang zwischen der Wahrscheinlichkeit, ein Universum zu wählen, und der Stärke seines Einflusses auf andere Universen. So entstand ein natürlicher Mechanismus, bei dem die besten Lösungen eine höhere Chance haben, ausgewählt zu werden, und ihr Einfluss von ihrer Qualität abhängt. Dieser Ansatz bietet ein Gleichgewicht zwischen der Erkundung neuer Möglichkeiten und der Nutzung bereits gefundener guter Lösungen.

              Die Erprobung des Algorithmus führte zu unerwartet guten Ergebnissen. Dies macht den Algorithmus besonders wertvoll für praktische Probleme mit begrenzten Berechnungsressourcen. Darüber hinaus zeigt der Algorithmus durchweg hervorragende Ergebnisse bei verschiedenen Arten von Funktionen, was seine Vielseitigkeit unter Beweis stellt. Besonders erfreulich ist die Kompaktheit der Umsetzung. Der Schlüsselcode benötigt nur etwa 50 Zeilen, keine anpassbaren Parameter, und ist doch so effektiv. Dies ist eine wirklich erfolgreiche Lösung, bei der eine einfache Implementierung mit hoher Leistung kombiniert wird.

              Letztendlich hat TETA meine ursprünglichen Erwartungen übertroffen. Die Zeitreise-Metapher hat ein praktisches und effektives Optimierungsinstrument hervorgebracht, das in einer Vielzahl von Bereichen eingesetzt werden kann. Dies zeigt, dass manchmal einfache Lösungen, die auf klaren natürlichen Analogien beruhen, sehr effektiv sein können. Der Algorithmus wurde buchstäblich in einem Atemzug erstellt – vom Konzept bis zur Implementierung – und ich bin sehr zufrieden mit der Arbeit an dem Algorithmus, der Forschern und Praktikern bei der schnellen Suche nach optimalen Lösungen eine gute Hilfe sein kann. 

              Tabelle

              Abbildung 3. Farbabstufung der Algorithmen nach den entsprechenden Tests

              Histogramm

              Abbildung 4. Histogramm der Algorithmus-Testergebnisse (Skala von 0 bis 100, je höher, desto besser, wobei 100 das maximal mögliche theoretische Ergebnis ist; im Archiv befindet sich ein Skript zur Berechnung der Bewertungstabelle)

              Vor- und Nachteile von TETA:

              Vorteile:

              1. Der einzige externe Parameter ist die Größe der Population.
              2. Einfache Umsetzung.
              3. Sehr schneller EA.
              4. Ausgewogene Metriken für klein- und großdimensionale Probleme.

              Nachteile:

              1. Streuung der Ergebnisse bei niedrigdimensionalen diskreten Problemen.

              Der Artikel wird von einem Archiv mit den aktuellen Versionen der Codes der Algorithmen begleitet. Der Autor des Artikels übernimmt keine Verantwortung für die absolute Richtigkeit der Beschreibung der kanonischen Algorithmen. An vielen von ihnen wurden Änderungen vorgenommen, um die Suchmöglichkeiten zu verbessern. Die in den Artikeln dargelegten Schlussfolgerungen und Urteile beruhen auf den Ergebnissen der Versuche.

              Programme, die im diesem Artikel verwendet werden

              # Name Typ Beschreibung
              1 #C_AO.mqh
              Include
              Übergeordnete Klasse von Populationsoptimierungsalgorithmen
              2 #C_AO_enum.mqh
              Include
              Enumeration der Algorithmen zur Populationsoptimierung
              3 TestFunctions.mqh
              Include
              Bibliothek mit Testfunktionen
              4
              TestStandFunctions.mqh
              Include
              Bibliothek mit Funktionen für den Prüfstand
              5
              Utilities.mqh
              Include
              Bibliothek mit Hilfsfunktionen
              6
              CalculationTestResults.mqh
              Include
              Skript zur Berechnung der Ergebnisse in der Vergleichstabelle
              7
              Testing AOs.mq5
              Skript Der einheitliche Prüfstand für alle Algorithmen zur Populationsoptimierung
              8
              Simple use of population optimization algorithms.mq5
              Skript
              Ein einfaches Beispiel für die Verwendung von Algorithmen zur Populationsoptimierung ohne Visualisierung
              9
              Test_AO_TETA.mq5
              Skript TETA-Prüfstand

              Übersetzt aus dem Russischen von MetaQuotes Ltd.
              Originalartikel: https://www.mql5.com/ru/articles/16963

              Beigefügte Dateien |
              TETA.zip (155.82 KB)
              Entwicklung fortschrittlicher ICT-Handelssysteme: Implementierung von Signalen in den Indikator "Order Block" Entwicklung fortschrittlicher ICT-Handelssysteme: Implementierung von Signalen in den Indikator "Order Block"
              In diesem Artikel erfahren Sie, wie Sie den Indikator „Order Block“ auf der Grundlage des Orderbuchvolumens (Markttiefe) entwickeln und ihn mithilfe von Puffern optimieren können, um die Genauigkeit zu verbessern. Damit ist die aktuelle Phase des Projekts abgeschlossen und die nächste Phase vorbereitet, die die Implementierung einer Risikomanagementklasse und eines Handelsroboters umfasst, der die vom Indikator generierten Signale nutzt.
              Analyse des Binärcodes der Börsenkurse (Teil II): Umwandlung in BIP39 und Schreiben des GPT-Modells Analyse des Binärcodes der Börsenkurse (Teil II): Umwandlung in BIP39 und Schreiben des GPT-Modells
              Fortsetzung der Versuche, die Preisbewegungen zu entschlüsseln... Wie steht es mit der linguistischen Analyse des „Marktwörterbuchs“, das wir durch die Umwandlung des binären Preiscodes in BIP39 erhalten? In diesem Artikel befassen wir uns mit einem innovativen Ansatz für die Analyse von Börsendaten und untersuchen, wie moderne Techniken der natürlichen Sprachverarbeitung auf die Marktsprache angewendet werden können.
              Automatisieren von Handelsstrategien in MQL5 (Teil 24): London Session Breakout System mit Risikomanagement und Trailing Stops Automatisieren von Handelsstrategien in MQL5 (Teil 24): London Session Breakout System mit Risikomanagement und Trailing Stops
              In diesem Artikel entwickeln wir ein London Session Breakout System, das Ausbrüche vor der Londoner Handelsspanne identifiziert und schwebende Aufträge mit anpassbaren Handelsarten und Risikoeinstellungen platziert. Wir integrieren Funktionen wie Trailing Stops, Risiko-Ertrags-Verhältnisse, maximale Drawdown-Grenzen und ein Kontrollpanel für die Überwachung und Verwaltung in Echtzeit.
              Post-Factum-Handelsanalyse: Auswahl von Trailing-Stops und neuen Stoppstufen im Strategietester Post-Factum-Handelsanalyse: Auswahl von Trailing-Stops und neuen Stoppstufen im Strategietester
              Wir setzen das Thema der Analyse von geschlossenen Handelsgeschäften im Strategietester fort, um die Qualität des Handels zu verbessern. Schauen wir uns an, wie die Verwendung verschiedener Trailing-Stops unsere bisherigen Handelsergebnisse verändern kann.