Русский Português
preview
Algoritmo de viaje evolutivo en el tiempo — Time Evolution Travel Algorithm (TETA)

Algoritmo de viaje evolutivo en el tiempo — Time Evolution Travel Algorithm (TETA)

MetaTrader 5Ejemplos |
57 0
Andrey Dik
Andrey Dik

Contenido

  1. Introducción
  2. Implementación del algoritmo
  3. Resultados de las pruebas


Introducción

Ya hemos analizado muchos algoritmos basados en leyes físicas, tales como el CSS, el EM, el GSA, el AEFA o el AOSm, sin embargo, el universo nos entretiene constantemente con nuevos fenómenos y nos llena de diferentes hipótesis e ideas. Uno de los componentes fundamentales del universo, como es el tiempo, me llevó a la idea de crear un nuevo algoritmo de optimización. El tiempo no solo inspira nuevos descubrimientos, sino que sigue siendo una entidad misteriosa difícil de comprender. Fluye como un río, llevándose consigo los momentos de nuestra vida y dejando solo los recuerdos. Los viajes en el tiempo siempre han sido objeto de la fascinación y las fantasía humanas. Para entender mejor la idea de algoritmo, deberemos imaginar la historia de un científico.

Érase una vez un científico dedicado a la física, que estaba obsesionado con la idea de avanzar hacia un futuro brillante, lejos de los errores cometidos. Tras sumergirse en el estudio de los flujos temporales, se enfrentó a un amargo descubrimiento: resulta imposible viajar al futuro. Para no desanimarse, pasó a investigar los viajes atrás en el tiempo, con la esperanza de corregir sus errores, pero también aquí se llevó una decepción.

Sin embargo, su estudio de las corrientes temporales hipotéticas le llevó a un descubrimiento sorprendente: la existencia de universos paralelos. Tras desarrollar un modelo teórico de máquina para viajar entre mundos, descubrió algo sorprendente: aunque el viaje directo en el tiempo resultaba imposible, sí que era posible elegir una secuencia de acontecimientos que conduzcan a uno u otro universo paralelo.

Cada acción de cualquier persona generaba una nueva realidad paralela, pero al científico solo le interesaban los universos que afectaban directamente a su vida. Para navegar entre ellos, fijó anclas especiales en el sistema de ecuaciones (para distinguir los mundos entre sí): los puntos clave de su destino: su familia, su carrera, algunos descubrimientos científicos, sus amistades y otros acontecimientos significativos. Estas anclas se convirtieron en variables de su máquina de movimiento, permitiéndole seleccionar el mejor camino entre mundos probabilísticos.

Tras poner en marcha su invento, empezó a viajar por mundos paralelos, pero ya no aspiraba a un futuro brillante ya preparado. Se dio cuenta de algo más importante: existía la capacidad de crear ese futuro con sus propias manos tomando decisiones en el presente. Cada nueva selección allanaba el camino hacia la versión de la realidad que él mismo quería realizar. Así dejó de ser prisionero del sueño de un futuro ideal para convertirse en su arquitecto. Su máquina no se convirtió en un medio de evasión de la realidad, sino en un instrumento de creación consciente de su propio destino gracias a la elección de decisiones óptimas en cada momento.

En este artículo analizaremos el algoritmo de viaje evolutivo en el tiempo (TETA), que implementa el concepto de viaje en el tiempo y se caracteriza por no tener parámetros ni variables modificables. Este algoritmo mantiene de forma natural un equilibrio entre la búsqueda de la mejor solución y su clarificación. Normalmente, los algoritmos que no poseen parámetros externos siguen teniendo parámetros internos en forma de constantes que afectan al rendimiento. Sin embargo, el TETA ni siquiera tiene esas constantes, lo que lo hace único en su género.


Implementación del algoritmo

En la historia presentada, el científico descubrió una forma de viajar entre universos paralelos cambiando las variables clave de su vida. Esta metáfora constituye la base del algoritmo de optimización propuesto y, para que quede claro, analizaremos la siguiente figura, que ilustra la idea del algoritmo de universos paralelos que surgen cada vez que se toman decisiones. Cada universo con un espacio completo se define por la presencia de características en forma de anclas: familia, carrera, logros, etc.

Combinando las propiedades de estas anclas, podemos crear un nuevo universo que supondrá una solución a un problema de optimización en el que las anclas serán los parámetros a optimizar.

TETA

Figura 1. Universos paralelos con sus propias anclas (características) únicas

El algoritmo TETA se basa en el concepto de múltiples universos paralelos, cada uno de los cuales representará una solución potencial a un problema de optimización. En su realización técnica, cada universo de este tipo se describe usando un vector de coordenadas (a[i].c), donde cada coordenada es un ancla, una variable clave que define la configuración de una realidad dada. Estas anclas pueden considerarse parámetros críticos cuyo ajuste afecta a la calidad global de la solución.

Para evaluar la calidad de cada universo, se usa una función de aptitud (a[i].f) que determina la "comodidad de la existencia" en una realidad determinada. Cuanto mayor sea el valor de esta función, más favorable se considerará el universo. Cada universo almacena información no solo sobre su estado actual, sino también sobre la mejor configuración conocida (a[i].cB), que puede compararse con la "memoria" de la versión más acertada de los eventos. Además, el algoritmo mantiene un mejor estado global (cB) que representa la configuración más favorable entre todas las variantes detectadas.

Una población de N individuos forma un conjunto de universos paralelos, cada uno de los cuales se describe según su propio conjunto de valores de ancla. Estos universos se clasifican continuamente según su valor de aptitud, lo que crea una especie de jerarquía de los estados menos favorables a los más favorables. Cada ancla de la realidad es una variable optimizable, y cualquier cambio en estas variables generará una nueva configuración del universo. El conjunto completo de anclas forma un vector de variables x = (x₁, x₂, ..., xₙ) que describe por entero una realidad concreta. Al mismo tiempo, para cada variable se definen los límites de los valores aceptables, que podemos interpretar como leyes físicas que limitan los posibles cambios en cada universo.

La favorabilidad de cada universo se evalúa usando una función de aptitud f(x), que asigna la configuración del universo a un número real. Cuanto más alto sea este valor, más favorable se considerará una realidad determinada. De este modo, se crea un mecanismo matemáticamente riguroso para evaluar y comparar distintas variantes de desarrollo de eventos en un conjunto de universos paralelos.

      Una característica clave del algoritmo es el único coeficiente de probabilidad (rnd *= rnd) que determina tanto la probabilidad de elegir un universo con el que interactuar como la fuerza del cambio de anclas. Esto crea un mecanismo natural de autoequilibrio para el sistema: los mejores universos tienen más posibilidades de ser seleccionados, pero sus anclas cambian de forma más débil (proporcional a rnd), mientras que los peores universos, aunque se seleccionan con menos frecuencia, sufren cambios más fuertes (proporcional a 1,0 - rnd).

      Este planteamiento refleja la profunda idea filosófica de que en la vida es imposible alcanzar la perfección en todo al mismo tiempo. La mejora se produce gracias al equilibrio constante de distintos aspectos: a veces, las mejores anclas pueden deteriorarse un poco para lograr el equilibrio general, mientras que las peores anclas tienden a mejorar. El poder del cambio es proporcional a lo "bueno" que sea el universo, lo cual refleja la vida real, donde es más probable que se produzcan cambios drásticos cuando algo va mal.

      Como resultado, el algoritmo no se limita a optimizar valores, sino que modela el proceso de búsqueda del equilibrio en un complejo sistema multidimensional de circunstancias vitales, tratando de encontrar no un ideal, sino la versión más armoniosa de la realidad mediante un delicado equilibrio de todos sus aspectos.

      Figura 2. La línea roja es la función de probabilidad de seleccionar universos dependiendo de su calidad, la línea verde es el grado de cambio en las anclas para los respectivos universos

      Pseudocódigo del algoritmo:

      Inicialización:
      1. Creamos una población de N universos paralelos
      2. Para cada universo:
         - Inicializamos aleatoriamente los valores de las anclas (coordenadas) dentro de límites aceptables.
         - Fijamos los mejores valores iniciales como iguales a los actuales

      Ciclo principal:
      1. Clasificación de los universos según su calidad (función de aptitud)
         - Los mejores universos reciben índices más pequeños
         - Los peores universos reciben índices más grandes

      2. Para cada universo i de N:
         Para cada ancla (coordenadas):
         
         (a) Se selecciona el universo para la interacción:
            - Se genera un número aleatorio rnd de 0 a 1
            - Se cuadra rnd para reforzar la priorización de los mejores universos
            - Se selecciona un índice de pares proporcional a rnd
         
         b) Si el universo actual no coincide con el universo seleccionado (i ≠ pair):
            
            Si el universo actual es mejor que el universo seleccionado (i < pair):
               - El cambio de ancla débil será proporcional a rnd
               - Nuevo_valor = actual + rnd * (valor_seleccionado - actual)
            
            En caso contrario (el universo actual es peor que el universo elegido):
               Si (número_aleatorio > rnd):
                  - El cambio de ancla fuerte será proporcional a (1 - rnd)
                  - Nuevo_valor = actual + (1-rnd) * (valor_seleccionado - actual)
               De lo contrario:
                  - Se copiará al completo el valor de ancla del universo mejor
                  - Nuevo_valor = valor_seleccionado
         
         c) De otro modo (interacción con uno mismo):
            - Se realizará la búsqueda local mediante una distribución gaussiana
            - Nuevo_valor = GaussDistribution(mejor_actual)
         
         d) Se corregirá el nuevo valor del ancla dentro de los límites permitidos

      3. Actualización de los mejores valores:
         Para cada universo:
         - Si la solución actual es mejor que la mejor personal, se actualizará la mejor personal
         - Si la solución actual es mejor que la mejor solución global, se actualizará la mejor solución global

      4. El ciclo principal se repetirá hasta que se cumpla el criterio de parada

      Ahora estamos listos para implementar una máquina para viajar por universos paralelos en código. Vamos a escribir la clase "C_AO_TETA", que derivará de la clase "C_AO". He aquí una breve descripción de la misma:

      • Constructor — inicializa el nombre, la descripción y la referencia al algoritmo, y establece el tamaño de la población.
      • Método SetParams — establece los parámetros usando los valores del array "params".
      • Métodos Init, Moving,Revision — están declarados, pero serán implementados en otro fragmento de código.
      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/es/articles/16963";
      
          popSize = 50; // количество параллельных вселенных в популяции
      
          ArrayResize (params, 1);
          params [0].name = "popSize"; params [0].val = popSize;
        }
      
        void SetParams ()
        {
          popSize = (int)params [0].val;
        }
      
        bool Init (const double &rangeMinP  [],  // минимальные значения для якорей
                   const double &rangeMaxP  [],  // максимальные значения для якорей
                   const double &rangeStepP [],  // шаг изменения якорей
                   const int     epochsP = 0);   // количество эпох поиска
      
        void Moving ();
        void Revision ();
      
        private: //-------------------------------------------------------------------
      };
      //——————————————————————————————————————————————————————————————————————————————
      

      La inicialización del método "Init" de la clase "C_AO_TETA" realizará el ajuste inicial del algoritmo. 

      Parámetros del método:
      • rangeMinP — array de valores mínimos para las anclas.
      • rangeMaxP — array de valores máximos para las anclas.
      • rangeStepP — array de pasos de cambio de anclas.
      • epochsP — número de épocas de búsqueda, por defecto es 0).
      Inicialización estándar:
      • El método llama a "StandardInit" y efectúa la validación y el establecimiento de rangos para los anclas. Si esta inicialización falla (retorna false).
      Valor de retorno:
      • Si todas las comprobaciones y ajustes se realizan correctamente, el método retornará "true", lo cual indicará que el algoritmo se ha inicializado correctamente.
      //——————————————————————————————————————————————————————————————————————————————
      // TETA - Time Evolution Travel Algorithm
      // Алгоритм оптимизации, основанный на концепции перемещения между параллельными вселенными
      // через изменение ключевых якорей (событий) жизни
      
      //——————————————————————————————————————————————————————————————————————————————
      bool C_AO_TETA::Init (const double &rangeMinP  [], // минимальные значения для якорей
                            const double &rangeMaxP  [], // максимальные значения для якорей
                            const double &rangeStepP [], // шаг изменения якорей
                            const int     epochsP = 0)   // количество эпох поиска
      {
        if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;
      
        //----------------------------------------------------------------------------
        return true;
      }
      //——————————————————————————————————————————————————————————————————————————————

      El método "Moving" de la clase "C_AO_TETA" se encargará de cambiar las anclas en universos paralelos para crear otras nuevas dentro del algoritmo.

      Comprobación del estado de la revisión:
      • Si "revision" es "false", el método inicializará los valores de ancla iniciales para todos los universos paralelos utilizando valores aleatorios del rango dado y aplicando funciones para convertirlos a valores válidos (basados en el paso).
      Actualización de los valores de ancla:
      • Si la revisión ya se ha realizado, se iterará por todos los universos paralelos. Para cada ancla, se generará una probabilidad y se calculará su nuevo valor:
        • Si el universo actual es más favorable, el ancla cambiará ligeramente en sentido positivo para encontrar un mejor equilibrio.
        • Si el universo actual es menos favorable, la comprobación de probabilidades podría dar lugar a un cambio significativo del ancla o a su adopción completa a partir de un universo más exitoso.
        • Si los universos coinciden, se producirá un ajuste local del ancla mediante una distribución gaussiana.
      • Tras calcular el nuevo valor, el ancla se situará en el intervalo admisible.

        En la práctica, este método se encarga de adaptar y mejorar las soluciones (universos paralelos), lo cual constituye una parte fundamental del algoritmo de optimización. 

        //——————————————————————————————————————————————————————————————————————————————
        void C_AO_TETA::Moving ()
        {
          //----------------------------------------------------------------------------
          if (!revision)
          {
            // Инициализация начальных значений якорей во всех параллельных вселенных
            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++)
            {
              // Генерация вероятности, которая определяет как шанс выбора вселенной,
              // так и силу изменения якорей
              rnd  = u.RNDprobab ();
              rnd *= rnd;
        
              // Выбор вселенной для обмена опытом
              pair = (int)u.Scale (rnd, 0.0, 1.0, 0, popSize - 1);
        
              if (i != pair)
              {
                if (i < pair)
                {
                  // Если текущая вселенная более благоприятна:
                  // Небольшое изменение якоря (пропорционально rnd) для поиска лучшего баланса
                  val = a [i].c [c] + (rnd)*(a [pair].cB [c] - a [i].cB [c]);
                }
                else
                {
                  if (u.RNDprobab () > rnd)
                  {
                    // Если текущая вселенная менее благоприятна:
                    // Значительное изменение якоря (пропорционально 1.0 - rnd)
                    val = a [i].cB [c] + (1.0 - rnd) * (a [pair].cB [c] - a [i].cB [c]);
                  }
                  else
                  {
                    // Полное принятие конфигурации якоря из более успешной вселенной
                    val = a [pair].cB [c];
                  }
                }
              }
              else
              {
                // Локальная настройка якоря через гауссово распределение
                val = u.GaussDistribution (cB [c], rangeMin [c], rangeMax [c], 1);
              }
        
              a [i].c [c] = u.SeInDiSp  (val, rangeMin [c], rangeMax [c], rangeStep [c]);
            }
          }
        }
        //——————————————————————————————————————————————————————————————————————————————
        

        El método "Revision" de la clase "C_AO_TETA" se encarga de actualizar las configuraciones de ancla en universos paralelos y de clasificar dichos universos según su calidad; concretamente:

          Actualización de la mejor configuración a nivel global:
          • El método itera todos los universos paralelos (de 0 a popSize).
          • Si el valor de la función f del universo actual (a[i].f) es mayor que el mejor valor global "fB", entonces:
            • "fB" se actualizará al valor de (a[i].f).
            • La configuración de ancla del universo actual se copiará en la configuración global "cB".
            Actualización de la mejor configuración conocida para cada universo:
            • Si el valor de la función "f" del universo actual es mayor que su mejor valor conocido (a[i].fB), entonces:
              • (a[i].fB) se actualizará al valor de (a[i].f).
              • La configuración de ancla del universo actual se copiará en su mejor configuración conocida (a[i].cB).
            Clasificación de universos:
            • Se declara un array estático "aT" para almacenar agentes.
            • El tamaño del array se cambia a "popSize".
            • Los universos se clasifican según su mejor propiedad individual conocida mediante la función "u.Sorting_fB".
              //——————————————————————————————————————————————————————————————————————————————
              void C_AO_TETA::Revision ()
              {
                for (int i = 0; i < popSize; i++)
                {
                  // Обновление глобально лучшей конфигурации якорей
                  if (a [i].f > fB)
                  {
                    fB = a [i].f;
                    ArrayCopy (cB, a [i].c);
                  }
              
                  // Обновление лучшей известной конфигурации якорей для каждой вселенной
                  if (a [i].f > a [i].fB)
                  {
                    a [i].fB = a [i].f;
                    ArrayCopy (a [i].cB, a [i].c);
                  }
                }
              
                // Сортировка вселенных по степени их благоприятности
                static S_AO_Agent aT []; ArrayResize (aT, popSize);
                u.Sorting_fB (a, aT, popSize);
              }
              //——————————————————————————————————————————————————————————————————————————————


              Resultados de las pruebas

              Resultados del algoritmo TETA:

              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%)

              Conclusión: 5.79704 (64.41%). Teniendo en cuenta la complejidad de las funciones de la prueba, se trata de una puntuación excelente. El algoritmo detecta con gran rapidez área importantes de la superficie con óptimos prometedores y comienza inmediatamente a afinarlos, lo cual puede apreciarse en cada visualización del funcionamiento del algoritmo.

              Hilly

              TETA en la función de prueba Hilly

              Forest

                TETA en la función de prueba Forest

              Megacity

              TETA en la función de prueba Megacity

              Nos gustaría señalar que, según los resultados, la función GoldsteinPrice, incluida de ejemplo en el conjunto de funciones de prueba sobre las que se pueden probar algoritmos de optimización, obtiene el mejor resultado entre todos los algoritmos de optimización, superando al líder del grupo de algoritmos poblacionales: el ANS.

              GoldsteinPrice

              TETA en la función de prueba GoldsteinPrice (disponible para la selección en la lista de funciones de prueba)

              Resultados en 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

              Al final de las pruebas, el algoritmo TETA se encuentra entre los diez mejores algoritmos de optimización y ocupa un honroso sexto puesto.

              AO Description HillyHilly final ForestForest final Megacity (discrete)Megacity final Final result % de 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)
              1ANSacross neighbourhood search0,949480,847760,438572,235811,000000,923340,399882,323230,709230,634770,230911,574916,13468,15
              2CLAcode lock algorithm (joo)0,953450,871070,375902,200420,989420,917090,316422,222940,796920,693850,193031,683806,10767,86
              3AMOmanimal migration optimization M0,903580,843170,462842,209590,990010,924360,465982,380340,567690,591320,237731,396755,98766,52
              4(P+O)ES(P+O) evolution strategies0,922560,881010,400212,203790,977500,874900,319452,171850,673850,629850,186341,490035,86665,17
              5CTAcomet tail algorithm (joo)0,953460,863190,277702,094350,997940,857400,339492,194840,887690,564310,105121,557125,84664,96
              6TETAtime evolution travel algorithm (joo)0,913620,823490,319902,057010,970960,895320,293242,159520,734620,685690,160211,580525,79764,41
              7SDSmstochastic diffusion search M0,930660,854450,394762,179880,999830,892440,196192,088460,723330,611000,106701,441035,70963,44
              8AAmarchery algorithm M0,917440,708760,421602,047800,925270,758020,353282,036570,673850,552000,237381,463235,54861,64
              9ESGevolution of social groups (joo)0,999060,796540,350562,146161,000000,828630,131021,959650,823330,553000,047251,423585,52961,44
              10SIAsimulated isotropic annealing (joo)0,957840,842640,414652,215130,982390,795860,205071,983320,686670,493000,090531,270205,46960,76
              11ACSartificial cooperative search0,755470,747440,304071,806981,000000,888610,224132,112740,690770,481850,133221,305835,22658,06
              12BHAmblack hole algorithm M0,752360,766750.345831,864930.935930.801520,271772,009230.650770.516460,154721,321955.19657.73
              13ASOanarchy society optimization0,848720,746460,314651,909830,961480,791500,238031,991010,570770,540620,166141,277525,17857,54
              14AOSmbúsqueda de orbitales atómicos M0,802320,704490,310211,817020,856600,694510,219961,771070,746150,528620,143581,418355,00655,63
              15TSEAturtle shell evolution algorithm (joo)0,967980,644800,296721,909490,994490,619810,227081,841390,690770,426460,135981,253225,00455,60
              16DEdifferential evolution0,950440,616740,303081,870260,953170,788960,166521,908650,786670,360330,029531,176534,95555,06
              17CROchemical reaction optimisation0,946290,661120,298531,905930,879060,584220,211461,674730,758460,426460,126861,311784,89254,36
              18BSAbird swarm algorithm0,893060,649000,262501,804550,924200,711210,249391,884790,693850,326150,100121,120124,80953,44
              19HSharmony search0,865090,687820,325271,878180,999990,680020,095901,775920,620000,422670,054581,097254,75152,79
              20SSGsaplings sowing and growing0,778390,649250,395431,823080,859730,624670,174291,658690,646670,441330,105981,193984,67651,95
              21BCOmbacterial chemotaxis optimization M0,759530,622680,314831,697040,893780,613390,225421,732590,653850,420920,144351,219124,64951,65
              22ABOafrican buffalo optimization0,833370,622470,299641,755480,921700,586180,197231,705110,610000,431540,132251,173784,63451,49
              23(PO)ES(PO) evolution strategies0,790250,626470,429351,846060,876160,609430,195911,681510,590000,379330,113221,082554,61051,22
              24TSmtabu search M0,877950,614310,291041,783300,928850,518440,190541,637830,610770,382150,121571,114494,53650,40
              25BSObrain storm optimization0,937360,576160,296881,810410,931310,558660,235371,725340,552310,290770,119140,962224,49849,98
              26WOAmwale optimization algorithm M0,845210,562980,262631,670810,931000,522780,163651,617430,663080,411380,113571,188034,47649,74
              27AEFAartificial electric field algorithm0,877000,617530,252351,746880,927290,726980,180641,834900,666150,116310,095080,877544,45949,55
              28AEOartificial ecosystem-based optimization algorithm0,913800,467130,264701,645630,902230,437050,214001,553270,661540,308000,285631,255174,45449,49
              29ACOmant colony optimization M0,881900,661270,303771,846930,858730,586800,150511,596040,596670,373330,024720,994724,43849,31
              30BFO-GAbacterial foraging optimization - ga0,891500,551110,315291,757900,969820,396120,063051,428990,726670,275000,035251,036924,22446,93
              31SOAsimple optimization algorithm0.915200.469760.270891,655850.896750.374010.169841,440600.695380.280310.108521,084224.18146,45
              32ABHartificial bee hive algorithm0,841310,542270,263041,646630,878580,477790,171811,528180,509230,338770,103970,951974.12745,85
              33ACMOatmospheric cloud model optimization0,903210,485460,304031,692700,802680,378570,191781,373030,623080,244000,107950,975034,04144,90
              34ADAMmadaptive moment estimation M0.886350.447660,266131.600140.844970.384930.168891,398800,661540.270460.105941,037944.03744.85
              35ATAmartificial tribe algorithm M0.717710.553040,252351,523100.824910.559040,204731,588670,440000,186150.094110.720263.83242.58
              36ASHAartificial showering algorithm0,896860,404330,256171,557370,803600,355260,191601,350460,476920,181230,097740,755893,66440,71
              37ASBOadaptive social behavior optimization0,763310,492530,326191,582020,795460,400350,260971,456770,264620,171690,182000,618313.65740,63
              38MECmind evolutionary computation0,695330,533760,326611,555690,724640,330360,071981,126980,525000,220000,041980,786983,47038,55
              39IWOinvasive weed optimization0,726790,522560,331231,580580,707560,339550,074841,121960,423330,230670,046170,700173,40337,81
              40Micro-AISmicro artificial immune system0,795470,519220,308611,623300,729560,368790,093981,192330,376670,158670,028020,563353,37937,54
              41COAmcuckoo optimization algorithm M0,758200,486520,313691,558410,740540,280510,055991,077040,505000,174670,033800,713473,34937,21
              42SDOmspiral dynamics optimization M0,746010,446230,296871,489120,702040,346780,109441,158260,428330,167670,036630,632633,28036,44
              43NMmNelder-Mead method M0,738070,505980,313421,557470,636740,283020,082211,001970,446670,186670,040280,673623,23335,92
              44BBCbig bang-big crunch algorithm0.605310.452500.312551,370360.523230.354260,204171,081660.397690,194310.112860.704863.15735.08
              45CPAcyclic parthenogenesis algorithm0,716640,400140,255021,371800,621780,336510,192641,150930,343080,167690,094550,605323,12834,76
              R.W.random walk0.487540.321590.257811,066940.375540,219440,158770,753750.279690,149170.098470.527342.34826.09


              Conclusiones

              Mientras trabajaba en el algoritmo TETA, me esforzaba constantemente por crear algo sencillo y eficiente. La metáfora de los universos paralelos y los viajes en el tiempo parecía al principio solo una bella idea, pero durante el desarrollo se convirtió orgánicamente en un eficaz mecanismo de optimización.

              La característica clave del algoritmo era la idea de que resulta imposible alcanzar la perfección en todo a la vez: hay que buscar un equilibrio. En la vida, estamos constantemente conciliando la familia, la carrera profesional y los logros personales, y es en este concepto en el que he basado el algoritmo a través del sistema de anclas. Cada ancla representa un aspecto importante que hay que optimizar, pero no en detrimento de los demás.

              La solución técnica más interesante era la relación entre la probabilidad de seleccionar un universo y la fuerza de su influencia en otros universos. Esto ha creado un mecanismo natural en el que las mejores soluciones tienen más posibilidades de ser seleccionadas, y su impacto depende de la calidad. Este planteamiento establece un equilibrio entre la exploración de nuevas oportunidades y el uso de las buenas soluciones ya encontradas.

              Las pruebas del algoritmo arrojan resultados inesperadamente excelentes. Esto hace que el algoritmo resulte especialmente valioso para problemas prácticos con recursos computacionales limitados. Al mismo tiempo, el algoritmo muestra resultados notables y constantes en diferentes tipos de funciones, lo cual demuestra su versatilidad. Lo que resulta especialmente agradable es el carácter compacto de la aplicación. Solo unas 50 líneas de código clave, sin parámetros personalizables y, sin embargo, los resultados son ya eficaces. De hecho, supone una solución acertada cuando la sencillez de la aplicación se combina con un alto rendimiento.

              Al final, el TETA ha superado mis expectativas iniciales. De la metáfora del viaje en el tiempo ha surgido una herramienta de optimización práctica y eficaz que puede utilizarse en campos muy diversos. Esto demuestra que a veces las soluciones sencillas basadas en analogías naturales comprensibles pueden resultar muy eficaces. El algoritmo se ha creado literalmente en un suspiro: de la idea a la aplicación. Estoy muy satisfecho con el trabajo realizado sobre el algoritmo, que puede ser un buen ayudante para que investigadores y profesionales encuentren rápidamente soluciones óptimas. 

              Tab

              Figura 3. Clasificación por colores de los algoritmos según las pruebas respectivas

              Chart

              Figura 4. Histograma con los resultados de las pruebas de los algoritmos (en una escala de 0 a 100, cuanto más mejor, donde 100 es el máximo resultado teórico posible, el script para calcular la tabla de puntuación está en el archivo)

              Ventajas e inconvenientes del algoritmo TETA:

              Ventajas:

              1. El único parámetro externo es el tamaño de la población.
              2. Implementación sencilla.
              3. Gran rapidez.
              4. Rendimiento equilibrado en tareas de pequeñas y grandes dimensionalidades.

              Desventajas:

              1. Dispersión de resultados en problemas discretos de baja dimensionalidad.

              Adjuntamos al artículo un archivo con las versiones actuales de los códigos de los algoritmos. El autor de este artículo no se responsabiliza de la exactitud absoluta de la descripción de los algoritmos canónicos, muchos de ellos han sido modificados para mejorar las capacidades de búsqueda. Las conclusiones y juicios presentados en los artículos se basan en los resultados de los experimentos realizados.

              Programas usados en el artículo

              #NombreTipoDescripción
              1#C_AO.mqh
              Archivo de inclusión
              Clase padre de algoritmos de optimización basados en la población
              2#C_AO_enum.mqh
              Archivo de inclusión
              Enumeración de los algoritmos de optimización basados en la población
              3TestFunctions.mqh
              Archivo de inclusión
              Biblioteca de funciones de prueba
              4
              TestStandFunctions.mqh
              Archivo de inclusión
              Biblioteca de funciones del banco de pruebas
              5
              Utilities.mqh
              Archivo de inclusión
              Biblioteca de funciones auxiliares
              6
              CalculationTestResults.mqh
              Archivo de inclusión
              Script para calcular los resultados en una tabla comparativa
              7
              Testing AOs.mq5
              ScriptBanco de pruebas único para todos los algoritmos de optimización basados en la población
              8
              Simple use of population optimization algorithms.mq5
              Script
              Ejemplo sencillo de utilización de algoritmos de optimización basados en la población sin visualización
              9
              Test_AO_TETA.mq5
              ScriptBanco de pruebas para TETA

              Traducción del ruso hecha por MetaQuotes Ltd.
              Artículo original: https://www.mql5.com/ru/articles/16963

              Archivos adjuntos |
              TETA.ZIP (154.13 KB)
              Utilizando redes neuronales en MetaTrader Utilizando redes neuronales en MetaTrader
              En el artículo se muestra la aplicación de las redes neuronales en los programas de MQL, usando la biblioteca de libre difusión FANN. Usando como ejemplo una estrategia que utiliza el indicador MACD se ha construido un experto que usa el filtrado con red neuronal de las operaciones. Dicho filtrado ha mejorado las características del sistema comercial.
              Algoritmo de trading evolutivo con aprendizaje por refuerzo y extinción de individuos no rentables (ETARE) Algoritmo de trading evolutivo con aprendizaje por refuerzo y extinción de individuos no rentables (ETARE)
              Hoy le presentamos un innovador algoritmo comercial que combina algoritmos evolutivos con aprendizaje profundo por refuerzo para la negociación de divisas. El algoritmo utiliza un mecanismo de extinción de individuos ineficaces para optimizar la estrategia comercial.
              Particularidades del trabajo con números del tipo double en MQL4 Particularidades del trabajo con números del tipo double en MQL4
              En estos apuntes hemos reunido consejos para resolver los errores más frecuentes al trabajar con números del tipo double en los programas en MQL4.
              Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 4): Analytics Forecaster EA Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 4): Analytics Forecaster EA
              Estamos pasando de simplemente ver las métricas analizadas en gráficos a una perspectiva más amplia que incluye la integración de Telegram. Esta mejora permite que los resultados importantes se envíen directamente a tu dispositivo móvil a través de la aplicación Telegram. Acompáñenos en este viaje que exploraremos juntos en este artículo.