Русский
preview
Algoritmo da viagem evolutiva no tempo — Time Evolution Travel Algorithm (TETA)

Algoritmo da viagem evolutiva no tempo — Time Evolution Travel Algorithm (TETA)

MetaTrader 5Exemplos |
98 0
Andrey Dik
Andrey Dik

Conteúdo

  1. Introdução
  2. Implementação do algoritmo
  3. Resultados dos testes


Introdução

Já exploramos muitos algoritmos baseados em leis físicas, como CSS, EM, GSA, AEFA, AOSm, no entanto, o universo continua nos surpreendendo com novos fenômenos e nos alimenta com hipóteses e ideias diversas. Um dos componentes fundamentais do universo, o tempo, me levou à ideia de criar um novo algoritmo de otimização. O tempo não apenas inspira novas descobertas, como também permanece uma entidade misteriosa, difícil de compreender. Ele flui como um rio, carregando consigo momentos da nossa vida e deixando apenas lembranças. Viagens no tempo sempre foram alvo da admiração e das fantasias humanas. Para entender melhor a ideia do algoritmo, vamos imaginar a história de um cientista.

Era uma vez um físico obcecado com a ideia de se mover em direção a um futuro brilhante, afastando-se dos erros cometidos. Ao se aprofundar no estudo dos fluxos temporais, ele chegou a uma descoberta amarga: viajar para o futuro era impossível. Sem perder a esperança, voltou-se ao estudo das viagens ao passado, na expectativa de corrigir seus erros, mas também encontrou frustração.

No entanto, sua pesquisa sobre fluxos temporais hipotéticos o levou a uma descoberta impressionante: a existência de universos paralelos. Desenvolvendo um modelo teórico de máquina de deslocamento entre mundos, ele descobriu algo surpreendente: mesmo que a viagem direta no tempo fosse inviável, era possível escolher uma sequência de eventos que levasse a um ou outro universo paralelo.

Cada ação de qualquer pessoa gerava uma nova realidade paralela, mas o cientista se interessava apenas pelas realidades que envolviam diretamente a sua vida. Para navegar entre elas e distinguir os mundos entre si, ele inseriu na equação do sistema âncoras especiais, que eram pontos-chave de seu destino: família, carreira, descobertas científicas, amizades, eventos marcantes. Essas âncoras tornaram-se variáveis na sua máquina de deslocamento, permitindo escolher o caminho ideal entre os mundos probabilísticos.

Ao ativar sua invenção, ele iniciou uma jornada por mundos paralelos, mas já não buscava mais chegar a um futuro brilhante pronto e acabado. Ele compreendeu algo mais profundo, que é a possibilidade de criar esse futuro com as próprias mãos, tomando decisões no presente. Cada nova escolha traçava um caminho para aquela versão da realidade que ele mesmo queria tornar real. Assim, ele deixou de ser prisioneiro do sonho de um futuro ideal e passou a ser seu arquiteto. Sua máquina deixou de ser um meio de fuga da realidade e tornou-se uma ferramenta de criação consciente do próprio destino, por meio da escolha de decisões ótimas em cada momento do tempo.

Neste artigo, vamos analisar o Algoritmo da Viagem Evolutiva no Tempo (TETA), que implementa o conceito de deslocamento temporal e se diferencia por não conter nenhum parâmetro ou variável modificável. Esse algoritmo preserva de forma natural o equilíbrio entre a busca pela melhor solução e o seu refinamento. Normalmente, algoritmos que não possuem parâmetros externos ainda contam com parâmetros internos sob a forma de constantes que afetam sua eficácia. No entanto, o TETA não possui nem mesmo essas constantes, o que o torna único em sua categoria.


Implementação do algoritmo

Na história apresentada, o cientista descobriu uma forma de se deslocar entre universos paralelos alterando variáveis-chave de sua vida. Essa metáfora serve como base para o algoritmo de otimização proposto e, para facilitar a compreensão, vamos observar a imagem abaixo, que ilustra a ideia do algoritmo sobre os universos paralelos surgindo a cada tomada de decisão. Cada universo, contendo um espaço completo, é definido pela presença de características sob a forma de âncoras: família, carreira, conquistas etc.

Combinando as propriedades dessas âncoras, pode-se criar um novo universo, que representa a solução de um problema de otimização, no qual as âncoras são os parâmetros a serem otimizados.

TETA

Imagem 1. Universos paralelos com suas âncoras únicas (características)

O algoritmo TETA é baseado na ideia de múltiplos universos paralelos, onde cada universo representa uma solução potencial para o problema de otimização. Em sua implementação técnica, cada universo é descrito por um vetor de coordenadas (a[i].c), sendo cada coordenada uma âncora, isto é, uma variável chave que define a configuração daquela realidade. Essas âncoras podem ser vistas como os parâmetros mais importantes, cuja configuração afeta diretamente a qualidade geral da solução.

Para avaliar a qualidade de cada universo, é usada uma função de fitness (a[i].f), que determina o "nível de conforto de existência" naquela realidade. Quanto maior o valor dessa função, mais favorável é considerado o universo. Cada universo armazena não apenas seu estado atual, mas também a melhor configuração conhecida até o momento (a[i].cB), o que equivale a uma "memória" da trajetória mais bem-sucedida até então. Além disso, o algoritmo mantém um melhor estado global (cB), representando a configuração mais favorável dentre todas as alternativas já encontradas.

A população de N indivíduos forma um conjunto de universos paralelos, sendo que cada um desses universos é descrito por seu próprio conjunto de valores das âncoras. Esses universos são constantemente classificados de acordo com o valor da função de fitness, o que gera uma espécie de hierarquia que vai dos estados menos favoráveis até os mais favoráveis. Cada âncora da realidade é uma variável a ser otimizada, e qualquer alteração dessas variáveis gera uma nova configuração do universo. O conjunto completo de âncoras forma um vetor de variáveis x = (x₁, x₂, ..., xₙ), que descreve completamente uma determinada realidade. Para cada variável são definidos limites de valores permitidos, que podem ser interpretados como leis físicas restringindo as possíveis alterações em cada universo.

A avaliação da favorabilidade de cada universo é realizada por meio da função de fitness f(x), que transforma a configuração do universo em um número real. Quanto mais alto for esse valor, mais desejável é considerada aquela realidade. Assim, estabelece-se um mecanismo matemático rigoroso para avaliar e comparar diferentes cenários de evolução dentro do conjunto de universos paralelos.

      A característica central do algoritmo é um único coeficiente probabilístico (rnd *= rnd), que determina tanto a probabilidade de um universo ser escolhido para interação quanto a intensidade da alteração nas âncoras. Isso cria um mecanismo natural de autorregulação do sistema: os universos melhores têm maior chance de serem escolhidos, mas suas âncoras sofrem alterações menores (proporcionais a rnd), enquanto os universos piores, embora menos selecionados, passam por mudanças mais intensas (proporcionais a 1.0 - rnd).

      Essa abordagem reflete uma ideia filosófica profunda: na vida, não é possível atingir a perfeição em tudo ao mesmo tempo. A melhoria ocorre por meio de um equilíbrio contínuo entre diferentes aspectos, quer dizer, às vezes, âncoras melhores podem ser levemente sacrificadas em nome do equilíbrio geral, enquanto âncoras piores tendem naturalmente à melhoria. A intensidade das mudanças é proporcional ao quão "boa" é a realidade, o que reflete a vida real, onde transformações radicais acontecem com mais frequência quando algo não vai bem.

      Como resultado, o algoritmo não apenas otimiza valores, mas sim modela o processo de busca por equilíbrio em um sistema multidimensional complexo de circunstâncias da vida, buscando não uma realidade ideal, mas sim a versão mais harmônica da realidade por meio de um ajuste sutil de todos os seus aspectos.

      Imagem 2. Linha vermelha — função de probabilidade de escolha dos universos em função de sua qualidade; linha verde — grau de alteração das âncoras para os respectivos universos

      Pseudocódigo do algoritmo:

      Inicialização:
      1. Criar uma população com N universos paralelos
      2. Para cada universo:
         - Inicializar aleatoriamente os valores das âncoras (coordenadas) dentro dos limites permitidos
         - Definir os melhores valores iniciais iguais aos valores atuais

      Ciclo principal:
      1. Ordenar os universos de acordo com a qualidade (função de fitness)
         - Os melhores universos recebem índices menores
         - Os piores universos recebem índices maiores

      2. Para cada universo i do total N:
         Para cada âncora (coordenada):
         
         a) Escolha do universo para interação:
            - Gerar um número aleatório rnd entre 0 e 1
            - Elevar rnd ao quadrado para priorizar os melhores universos
            - Selecionar o índice pair proporcionalmente a rnd
         
         b) Se o universo atual for diferente do selecionado (i ≠ pair):
            
            Se o universo atual for melhor que o selecionado (i < pair):
               - Alteração fraca da âncora proporcional a rnd
               - novo_valor = atual + rnd * (valor_selecionado - atual)
            
            Caso contrário (universo atual pior que o selecionado):
               Se (número_aleatório > rnd):
                  - Alteração forte da âncora proporcional a (1 - rnd)
                  - novo_valor = atual + (1 - rnd) * (valor_selecionado - atual)
               Caso contrário:
                  - Cópia total do valor da âncora do universo melhor
                  - novo_valor = valor_selecionado
         
         c) Caso contrário (interação consigo mesmo):
            - Busca local via distribuição gaussiana
            - novo_valor = GaussDistribution(melhor_atual)
         
         d) Correção do novo valor da âncora dentro dos limites permitidos

      3. Atualização dos melhores valores:
         Para cada universo:
         - Se a solução atual for melhor que a melhor pessoal, atualizar o melhor pessoal
         - Se a solução atual for melhor que a melhor global, atualizar o melhor global

      4. Repetir o ciclo principal até que o critério de parada seja atendido

      Agora temos tudo pronto para implementar a máquina de deslocamento entre universos paralelos em código. Vamos escrever a classe "C_AO_TETA", que será derivada da classe "C_AO". Aqui está sua descrição resumida:

      • Construtor — inicializa o nome, a descrição e a referência ao algoritmo, além de definir o tamanho da população.
      • Método SetParams — define os parâmetros utilizando os valores do array "params".
      • Métodos Init, Moving,Revision — declarados, mas serão implementados em outro trecho 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/ru/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: //-------------------------------------------------------------------
      };
      //——————————————————————————————————————————————————————————————————————————————
      

      Inicialização do método "Init" da classe "C_AO_TETA" realiza a configuração inicial do algoritmo. 

      Parâmetros do método:
      • rangeMinP — array com os valores mínimos das âncoras.
      • rangeMaxP — array com os valores máximos das âncoras.
      • rangeStepP — array com os passos de variação das âncoras.
      • epochsP — número de épocas da busca (padrão 0).
      Inicialização padrão:
      • O método chama "StandardInit", realizando a verificação e o ajuste dos intervalos para as âncoras. Se essa inicialização falhar (retorna false), o processo não segue adiante.
      Retorno de valor:
      • Se todas as verificações e ajustes forem concluídos com sucesso, o método retorna "true", indicando a inicialização bem-sucedida do algoritmo.
      //——————————————————————————————————————————————————————————————————————————————
      // 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;
      }
      //——————————————————————————————————————————————————————————————————————————————

      O método "Moving" da classe "C_AO_TETA" é responsável pela alteração das âncoras nos universos paralelos para criar novas versões dentro do algoritmo.

      Verificação do estado da revisão:
      • Se "revision" for igual a "false", o método inicializa os valores das âncoras para todos os universos paralelos, utilizando valores aleatórios dentro dos intervalos definidos e aplicando funções que ajustam os valores aos limites permitidos (com base no passo definido).
      Atualização dos valores das âncoras:
      • Se a revisão já tiver sido feita, o algoritmo percorre todos os universos paralelos. Para cada âncora, é gerada uma probabilidade e calculado seu novo valor:
        • Se o universo atual for mais favorável, a âncora é ligeiramente ajustada positivamente para buscar melhor equilíbrio.
        • Se o universo atual for menos favorável, a verificação da probabilidade pode resultar em uma alteração significativa da âncora ou em sua substituição completa pela de um universo mais bem-sucedido.
        • Se os universos forem equivalentes, realiza-se um ajuste local da âncora por meio de distribuição gaussiana.
      • Após o novo valor ser calculado, a âncora é ajustada para se manter dentro do intervalo permitido.

        Na prática, esse método é responsável pela adaptação e aprimoramento das soluções (universos paralelos), o que representa uma parte fundamental do algoritmo de otimização. 

        //——————————————————————————————————————————————————————————————————————————————
        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]);
            }
          }
        }
        //——————————————————————————————————————————————————————————————————————————————
        

        O método "Revision" da classe "C_AO_TETA" realiza a atualização das configurações das âncoras nos universos paralelos e a ordenação desses universos de acordo com sua qualidade. A seguir, os detalhes:

          Atualização da melhor configuração global:
          • O método percorre todos os universos paralelos (de 0 até popSize).
          • Se o valor da função f do universo atual (a[i].f) for maior que o valor global atual "fB", então:
            • "fB" é atualizado com o valor de (a[i].f).
            • A configuração das âncoras do universo atual é copiada para a configuração global "cB".
            Atualização da melhor configuração conhecida para cada universo:
            • Se o valor da função "f" do universo atual for maior que o seu melhor valor conhecido (a[i].fB), então:
              • (a[i].fB) é atualizado com o valor de (a[i].f).
              • A configuração das âncoras do universo atual é copiada para sua melhor configuração conhecida (a[i].cB).
            Ordenação dos universos:
            • É declarado um array estático "aT" para armazenar os agentes.
            • O tamanho do array é ajustado para "popSize".
            • Os universos são ordenados com base em suas melhores características conhecidas individuais por meio da função "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 dos testes

              Resultados do funcionamento do 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%)

              Resultado final: 5.79704 (64,41%). Considerando a complexidade das funções de teste, esse é um excelente resultado. O algoritmo identifica rapidamente as regiões importantes da superfície com ótimos promissores e imediatamente começa o refinamento dessas regiões, o que pode ser observado em cada visualização do funcionamento do algoritmo.

              Hilly

              TETA na função de teste Hilly

              Forest

               TETA na função de teste Forest

              Megacity

              TETA na função de teste Megacity

              Vale destacar que, nos testes realizados com a função GoldsteinPrice, que faz parte do conjunto de funções de teste padrão para algoritmos de otimização, o algoritmo alcança o melhor desempenho entre todos os algoritmos avaliados, superando inclusive o líder entre os algoritmos populacionais, o ANS.

              GoldsteinPrice

              TETA na função de teste GoldsteinPrice (disponível para seleção na lista de funções de teste)

              Resultados na função 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

              Ao final da bateria de testes, o algoritmo TETA entra para o top 10 dos melhores algoritmos de otimização, ocupando o respeitável 6º lugar.

              AO Description HillyHilly final ForestForest 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)
              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 ptimization 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
              14AOSmatomic orbital search 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
              32ABHAartificial 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
              44BBBCbig 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
              RWrandom walk0,487540,321590,257811,066940,375540,219440,158770,753750,279690,149170,098470,527342,34826,09


              Considerações finais

              Durante o desenvolvimento do algoritmo TETA, meu objetivo constante foi criar algo simples e eficiente. A metáfora dos universos paralelos e das viagens no tempo parecia, a princípio, apenas uma ideia elegante, mas ao longo do processo ela se transformou organicamente em um mecanismo eficaz de otimização.

              A característica central do algoritmo foi a ideia de que não é possível atingir a perfeição em tudo ao mesmo tempo, já que é preciso buscar o equilíbrio. Na vida, estamos constantemente equilibrando família, carreira e conquistas pessoais, e foi exatamente essa lógica que introduzi no algoritmo por meio do sistema de âncoras. Cada âncora representa um aspecto essencial a ser otimizado, mas sem prejudicar os demais.

              A solução técnica mais interessante foi estabelecer a relação entre a probabilidade de um universo ser escolhido e a intensidade da sua influência sobre os outros. Isso gerou um mecanismo natural, em que as melhores soluções têm mais chance de serem selecionadas, e sua influência é proporcional à sua qualidade. Essa abordagem garante um equilíbrio entre a exploração de novas possibilidades e a exploração de boas soluções já encontradas.

              Os testes do algoritmo trouxeram resultados surpreendentemente bons. Isso torna o algoritmo especialmente valioso para aplicações práticas com recursos computacionais limitados. Além disso, o algoritmo apresenta resultados consistentemente excelentes em diferentes tipos de funções, demonstrando sua versatilidade. O que é particularmente gratificante, dado que é a sua implementação compacta. Com cerca de 50 linhas de código essencial, sem parâmetros configuráveis, e ainda assim, com tamanha eficiência. É realmente uma solução bem-sucedida, em que simplicidade de implementação se combina com alto desempenho.

              No fim das contas, o TETA superou minhas expectativas iniciais. A partir de uma metáfora sobre viagens no tempo, nasceu uma ferramenta prática e eficiente de otimização, com potencial de aplicação nas mais diversas áreas. Isso mostra que, às vezes, soluções simples, baseadas em analogias naturais compreensíveis, podem ser extremamente eficazes. O algoritmo foi criado literalmente em um só fôlego — da ideia à implementação — e estou muito satisfeito com o trabalho realizado. Trata-se de um algoritmo que pode se tornar um excelente aliado para pesquisadores e profissionais na busca rápida por soluções ótimas. 

              Tab

              Imagem 3. Graduação de cores dos algoritmos conforme os respectivos testes

              Chart

              Imagem 4. Histograma dos resultados de teste dos algoritmos (em uma escala de 0 a 100, quanto maior, melhor, onde 100 é o resultado teórico máximo possível, no arquivo compactado está o script para cálculo da tabela de classificação)

              Pontos fortes e fracos do algoritmo TETA:

              Pontos fortes:

              1. O único parâmetro externo é o tamanho da população.
              2. Implementação simples.
              3. Muito rápido.
              4. Resultados equilibrados tanto em problemas de pequena quanto de grande dimensionalidade.

              Pontos fracos:

              1. Alta variação nos resultados em tarefas discretas de baixa dimensionalidade.

              O artigo vem acompanhado de um arquivo compactado contendo as versões atualizadas dos códigos dos algoritmos. O autor do artigo não se responsabiliza pela precisão absoluta na descrição dos algoritmos canônicos, pois muitos deles foram modificados para melhorar sua capacidade de busca. As conclusões e interpretações apresentadas nos artigos são baseadas nos resultados dos experimentos realizados.

              Programas utilizados no artigo

              #NomeTipoDescrição
              1C_AO.mqh
              Arquivo incluído
              Classe base dos algoritmos populacionais de otimização
              2C_AO_enum.mqh
              Arquivo incluído
              Enumeração dos algoritmos populacionais de otimização
              3TestFunctions.mqh
              Arquivo incluído
              Biblioteca de funções de teste
              4
              TestStandFunctions.mqh
              Arquivo incluído
              Biblioteca de funções do banco de testes
              5
              Utilities.mqh
              Arquivo incluído
              Biblioteca de funções auxiliares
              6
              CalculationTestResults.mqh
              Arquivo incluído
              Script para cálculo de resultados na tabela comparativa
              7
              Testing AOs.mq5
              ScriptBanco de testes unificado para todos os algoritmos populacionais de otimização
              8
              Simple use of population optimization algorithms.mq5
              Script
              Exemplo simples de uso dos algoritmos populacionais de otimização sem visualização
              9
              Test_AO_TETA.mq5
              ScriptBanco de testes para o TETA

              Traduzido do russo pela MetaQuotes Ltd.
              Artigo original: https://www.mql5.com/ru/articles/16963

              Arquivos anexados |
              TETA.ZIP (154.13 KB)
              Indicador de previsão de volatilidade usando Python Indicador de previsão de volatilidade usando Python
              Vamos prever a volatilidade extrema futura com ajuda da classificação binária. Criamos um indicador de previsão de volatilidade extrema com uso de aprendizado de máquina.
              Algoritmo evolutivo de trading com aprendizado por reforço e extinção de estratégias não lucrativas (ETARE) Algoritmo evolutivo de trading com aprendizado por reforço e extinção de estratégias não lucrativas (ETARE)
              Apresentamos um algoritmo de trading inovador que combina algoritmos evolutivos com aprendizado profundo por reforço para operar no mercado Forex. O algoritmo utiliza um mecanismo de extinção das estratégias ineficientes, com o objetivo de otimizar a estratégia de negociação.
              Neurônio biológico para previsão de séries temporais financeiras Neurônio biológico para previsão de séries temporais financeiras
              Estamos construindo um sistema de neurônios biologicamente fiel para prever séries temporais. A introdução de um meio semelhante ao plasma na arquitetura da rede neural criou uma espécie de "inteligência coletiva", onde cada neurônio influencia o funcionamento do sistema não apenas por meio de conexões diretas, mas também por meio de interações eletromagnéticas de longo alcance. Como esse sistema neural modelando o cérebro irá se comportar no mercado?
              Do básico ao intermediário: Eventos em Objetos (II) Do básico ao intermediário: Eventos em Objetos (II)
              Neste artigo iremos ver como funciona os três últimos tipos de eventos que podem ser disparados por um objeto. Entender isto será algo muito divertido. Já que no final faremos algo que para muitos pode parecer um tanto quanto insanidade. Porém que é perfeitamente possível de ser feito, e tem um resultado bastante surpreendente.