Русский
preview
Algoritmo de busca circular — Circle Search Algorithm (CSA)

Algoritmo de busca circular — Circle Search Algorithm (CSA)

MetaTrader 5Testador |
53 0
Andrey Dik
Andrey Dik

Conteúdo

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


Introdução

O algoritmo de otimização de busca circular (Circle Search Algorithm, CSA) é um novo método de otimização inspirado nas propriedades geométricas do círculo. Sua singularidade está no uso de relações trigonométricas e princípios geométricos para explorar o espaço de busca.

A base do CSA é uma ideia interessante onde cada ponto de busca se move por uma trajetória determinada por uma tangente ao círculo, criando um equilíbrio entre a diversificação global e o refinamento local da solução. Essa abordagem é original porque o círculo possui propriedades matemáticas únicas — raio constante e derivada contínua — o que garante movimentação suave dos agentes no espaço de busca.

O algoritmo combina duas fases: intensificação e diversificação. Na fase de intensificação, os agentes se concentram em regiões promissoras, movendo-se de forma mais direcionada, enquanto na fase de diversificação eles realizam saltos mais ousados para áreas inexploradas do espaço de soluções. A transição entre as fases é regulada por um mecanismo baseado na iteração atual e em um parâmetro especial "c".

O que torna o CSA especialmente atraente é sua capacidade de operar de forma eficiente em espaços multidimensionais, mantendo uma interpretação geométrica intuitiva. Cada agente da população segue sua trajetória única, determinada por um ângulo θ, que é ajustado dinamicamente durante o processo de busca.

O algoritmo Circle Search Algorithm (CSA) foi desenvolvido pelos pesquisadores Mohammad H. Kaiys, Hany M. Hasanien e outros, e foi publicado em 2022.


Implementação do algoritmo

O algoritmo CSA (Circle Search Algorithm) tem como objetivo encontrar a solução ideal em círculos aleatórios, buscando expandir a zona de busca. Ele utiliza o centro do círculo como ponto-alvo. O processo começa com a redução gradual do ângulo entre a tangente e o círculo, o que permite que a tangente se aproxime do centro (figura 1).

Para garantir diversidade na busca e evitar que o algoritmo fique preso em ótimos locais, o ângulo de contato tangencial também é modificado de forma aleatória. No contexto do algoritmo, o ponto de contato "Xt" atua como agente de busca, enquanto o ponto central "Xc" representa a melhor solução encontrada.

circle-geometry

Figura 1. Propriedades geométricas do círculo e sua tangente

O algoritmo CSA adapta a posição do agente de busca em resposta ao movimento do ponto de contato em direção ao centro. Isso permite melhorar a qualidade da solução, enquanto a atualização aleatória do ângulo de contato tangencial funciona como um mecanismo importante para evitar quedas em mínimos locais. Os principais estágios de funcionamento do otimizador CSA estão ilustrados abaixo no esquema.


csa-visualization

Figura 2. Esquema de funcionamento do algoritmo CSA

Em seguida, é definido um ângulo para cada agente. Se a iteração atual for maior que o produto entre o limiar e o número máximo de iterações, o agente está na fase de diversificação; caso contrário, aplica-se a fase de intensificação (ver figura 2). As posições dos agentes são atualizadas, e realiza-se a avaliação da adaptabilidade de cada um deles. Os resultados são comparados com a melhor solução atual e, se for encontrada uma melhor, a posição é atualizada. A iteração termina com o incremento do contador de iterações. Quando o algoritmo conclui sua execução, ele retorna a melhor posição encontrada e seu valor de adaptabilidade.

O algoritmo utiliza o conceito de movimentação de pontos ao longo de tangentes ao círculo, onde cada agente de busca se move em um determinado ângulo θ em relação à melhor solução atual. Esse movimento é regulado por diversos parâmetros (w, a, p), que variam ao longo do tempo. Como mencionado anteriormente, o funcionamento do algoritmo é dividido em duas fases: diversificação, ou sejas, quando os agentes realizam deslocamentos mais amplos para buscar regiões promissoras, e intensificação, isto é, quando os agentes se concentram no refinamento das soluções encontradas.

        Na versão final, que proponho, há algumas diferenças que melhoram significativamente as capacidades de busca do algoritmo. A fórmula de atualização do "w" foi modificada:

        • Na versão original: w = w × rand - w
        • No código final: w = π × (1 - epochNow/epochs) Isso tornou a variação do parâmetro "w" mais previsível e linear, o que melhora a convergência do algoritmo.
        A fórmula de atualização de posição também foi modificada:
        • Na versão original: Xi = Xc + (Xc - Xi) × tan(θ)
        • Na versão final: Xi = Xc + rand × (Xc - Xi) × tan(θ) A adição do fator aleatório "rand [0.0; 1.0]" introduz estocasticidade extra na busca e melhora o desempenho em relação à versão original. 
        A fase de atualização foi otimizada:
        • Adicionado o processo de atualização da melhor solução local para cada agente
        • Melhorada a estratégia de equilíbrio entre busca global e local

          A principal diferença conceitual está no fato de que a versão final tornou o algoritmo mais "suave" e previsível em seu comportamento, mantendo ainda assim sua capacidade de busca. O algoritmo original era mais "caótico" em seu funcionamento, enquanto a versão final proporciona um processo de otimização mais controlado, especialmente na transição entre as fases de diversificação e intensificação.

          Agora podemos prosseguir com a escrita do pseudocódigo do algoritmo.

          Pseudocódigo do algoritmo Circle Search Algorithm (CSA):

          1. Inicialização:
            • Definir o tamanho da população (popSize = 50)
            • Definir a constante da fase de diversificação (constC = 0.8)
            • Inicializar os parâmetros:
              • w = π (parâmetro do ângulo)
              • a = π
              • p = 1.0
              • θ = 0 (ângulo inicial)
          2. Se for a primeira iteração (revision = false):
            • Para cada agente "i" na população:
              • Inicializar aleatoriamente as coordenadas dentro dos limites definidos
              • Ajustar as coordenadas de acordo com o passo de variação
            • Definir revision = true
            • Retornar ao início
          3. Caso contrário (laço principal de otimização):
            • Incrementar o contador de iterações (epochNow++)
            • Atualizar os parâmetros:
              • w = π × (1 - epochNow/epochs) // diminuição linear
              • a = π - π × (epochNow/epochs)²
              • p = 1 - 0.9 × √(epochNow/epochs)
          4. Para cada agente na população:
            • Determinar a fase atual:
              • Se epochNow ≤ constC × epochs: → Fase de diversificação: θ = w × random [0.0; 1.0]
              • Caso contrário: → Fase de intensificação: θ = w × p
            • Atualizar a posição do agente:
              • Para cada coordenada j: → new_pos = best_pos + random [0.0; 1.0] × (best_pos - current_pos) × tan(θ) → Ajustar new_pos dentro dos limites definidos
          5. Revisão dos resultados:
            • Para cada agente:
              • Se a adaptabilidade do agente > melhor adaptabilidade global: → Atualizar a melhor solução global
              • Se a adaptabilidade do agente > melhor adaptabilidade local: → Atualizar a melhor solução local do agente
          6. Repetir os passos 3–5 até atingir o critério de parada

          Vamos agora à implementação. A classe "C_AO_CSA" representa a implementação do algoritmo CSA e herda da classe base "C_AO". Vamos analisar seus principais elementos e estrutura:

          Construtor inicializa os parâmetros do algoritmo. Ele define o nome e a descrição do algoritmo, além de estabelecer os valores dos parâmetros:
          • popSize — tamanho da população, fixado em 50.
          • constC — constante com valor 0.8, usada na fase de diversificação.
          • w, aParam, p, theta — valores iniciais dos parâmetros que serão usados no algoritmo.
          Métodos:
          • SetParams() — método usado para definir os valores dos parâmetros com base no array de dados "params".
          • Init() — este método é implementado para inicializar os parâmetros relacionados aos limites dos valores e à quantidade de épocas nas quais o algoritmo será executado.
          • Moving() — utilizado para movimentar as partículas e executar as iterações do algoritmo.
          • Revision() — para analisar e ajustar o estado da população.

          Métodos privados:

          • CalculateW(), CalculateA(), CalculateP(), CalculateTheta() — métodos responsáveis por calcular os respectivos parâmetros.
          • IsExplorationPhase() — método que determina se o algoritmo está na fase de diversificação.
          //——————————————————————————————————————————————————————————————————————————————
          class C_AO_CSA : public C_AO
          {
            public: //--------------------------------------------------------------------
            C_AO_CSA ()
            {
              ao_name = "CSA";
              ao_desc = "Circle Search Algorithm";
              ao_link = "https://www.mql5.com/ru/articles/17143";
          
              popSize = 50;     // размер популяции
              constC  = 0.8;    // оптимальное значение для фазы исследования
              w       = M_PI;   // начальное значение w
              aParam  = M_PI;   // начальное значение a
              p       = 1.0;    // начальное значение p
              theta   = 0;      // начальное значение угла
          
              ArrayResize (params, 2);
              params [0].name = "popSize";     params [0].val = popSize;
              params [1].name = "constC";      params [1].val = constC;
            }
          
            void SetParams ()
            {
              popSize = (int)params [0].val;
              constC  = params      [1].val;
            }
          
            bool Init (const double &rangeMinP  [],  // минимальные значения
                       const double &rangeMaxP  [],  // максимальные значения
                       const double &rangeStepP [],  // шаг изменения
                       const int     epochsP = 0);   // количество эпох
          
            void Moving   ();
            void Revision ();
          
            //----------------------------------------------------------------------------
            double constC;      // константа для определения фазы поиска [0,1]
          
            private: //-------------------------------------------------------------------
            int epochs;         // максимальное число итераций
            int epochNow;       // текущая итерация
          
            // Параметры для CSA
            double w;           // параметр для вычисления угла
            double aParam;      // параметр a из формулы (8)
            double p;           // параметр p из формулы (9)
            double theta;       // угол поиска
          
            double CalculateW ();
            double CalculateA ();
            double CalculateP ();
            double CalculateTheta (double currentW, double currentP);
            bool IsExplorationPhase ();
          };
          //——————————————————————————————————————————————————————————————————————————————

          O método "Init" é destinado à inicialização dos parâmetros do algoritmo CSA. Seus parâmetros incluem o array de valores mínimos do espaço de busca "rangeMinP []", o array de valores máximos "rangeMaxP []", o array de passos de variação dos valores "rangeStepP []", além da quantidade de épocas, especificada pelo parâmetro "epochsP", que por padrão é igual a 0.

          Durante a execução do método, é chamado "StandardInit", cuja finalidade é tentar inicializar os parâmetros padrão. Em caso de sucesso na inicialização, os valores das variáveis "epochs" e "epochNow" são definidos. A variável "epochs" recebe o valor de "epochsP", enquanto "epochNow" é zerado. O método finaliza sua execução retornando "true", indicando que a inicialização dos parâmetros do algoritmo foi bem-sucedida.

          //——————————————————————————————————————————————————————————————————————————————
          bool C_AO_CSA::Init (const double &rangeMinP  [],
                               const double &rangeMaxP  [],
                               const double &rangeStepP [],
                               const int     epochsP = 0)
          {
            if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;
          
            //----------------------------------------------------------------------------
            epochs   = epochsP;
            epochNow = 0;
            return true;
          }
          //——————————————————————————————————————————————————————————————————————————————

          O método "Moving" na classe "C_AO_CSA" implementa a lógica de atualização das posições dos agentes dentro do algoritmo CSA. No início do método, ocorre o incremento do contador da época atual, o que permite acompanhar quantas iterações já foram realizadas (e esse dado é usado nas fórmulas de cálculo). Em seguida, é verificada a necessidade de inicializar as coordenadas dos agentes. Se for a primeira execução do método, são geradas coordenadas aleatórias para todos os agentes dentro dos limites definidos. Essas coordenadas são então ajustadas considerando os passos de variação estabelecidos. Após isso, o sinalizador de revisão é ativado, sendo definido como verdadeiro.

          Caso o método não esteja sendo chamado pela primeira vez, então os parâmetros principais do algoritmo, como "w", "aParam" e "p", são atualizados. Depois disso, para cada agente é calculado o ângulo "theta", que é utilizado para atualizar suas coordenadas. Cada coordenada é atualizada levando em conta as coordenadas do melhor agente, a influência de um fator aleatório e o ângulo "theta". Em seguida, os resultados são ajustados para garantir que permaneçam dentro dos limites definidos.

          //——————————————————————————————————————————————————————————————————————————————
          void C_AO_CSA::Moving ()
          {
            epochNow++;
          
            //----------------------------------------------------------------------------
            if (!revision)
            {
              for (int i = 0; i < popSize; i++)
              {
                for (int j = 0; j < coords; j++)
                {
                  a [i].c [j] = u.RNDfromCI (rangeMin [j], rangeMax [j]);
                  a [i].c [j] = u.SeInDiSp (a [i].c [j], rangeMin [j], rangeMax [j], rangeStep [j]);
                }
              }
              revision = true;
              return;
            }
          
            //----------------------------------------------------------------------------
            w      = CalculateW ();    // Обновляем w по линейному закону
            aParam = CalculateA ();    // Обновляем a
            p      = CalculateP ();    // Обновляем p
          
            for (int i = 0; i < popSize; i++)
            {
              theta = CalculateTheta (w, p);
          
              for (int j = 0; j < coords; j++)
              {
                a [i].c [j] = cB [j] + u.RNDprobab () * (cB [j] - a [i].c  [j]) * tan (theta);
                a [i].c [j] = u.SeInDiSp (a [i].c [j], rangeMin [j], rangeMax [j], rangeStep [j]);
              }
            }
          }
          //——————————————————————————————————————————————————————————————————————————————

          O método "Revision" é responsável por atualizar as melhores soluções dentro da população. Ele verifica os valores atuais das funções-objetivo dos agentes e atualiza os respectivos parâmetros quando encontra soluções melhores.

          //——————————————————————————————————————————————————————————————————————————————
          void C_AO_CSA::Revision ()
          {
            for (int i = 0; i < popSize; i++)
            {
              // Обновляем лучшее глобальное решение
              if (a [i].f > fB)
              {
                fB = a [i].f;
                ArrayCopy (cB, a [i].c, 0, 0, WHOLE_ARRAY);
              }
            }
          }
          //——————————————————————————————————————————————————————————————————————————————

          O método "CalculateW" serve para calcular o valor do parâmetro "w", que diminui de forma linear a partir do valor inicial (M_PI) até "0", conforme o número atual de épocas (epochNow) aumenta em relação ao total de épocas (epochs), retornando o valor calculado de "w". Esse parâmetro calculado participa da fórmula de cálculo do ângulo "Theta".

          //——————————————————————————————————————————————————————————————————————————————
          double C_AO_CSA::CalculateW ()
          {
            // Линейное уменьшение w от начального значения (M_PI) до 0
            return M_PI * (1.0 - (double)epochNow / epochs);
            //return w * u.RNDprobab () - w;
          }
          //——————————————————————————————————————————————————————————————————————————————
          O método "CalculateA" calcula o valor de "aParam", que diminui de "M_PI" até "0" com o aumento de "epochNow", seguindo uma dependência quadrática em relação ao total de épocas "epochs".
          //——————————————————————————————————————————————————————————————————————————————
          double C_AO_CSA::CalculateA ()
          {
            return M_PI - M_PI * MathPow ((double)epochNow / epochs, 2);
          }
          //——————————————————————————————————————————————————————————————————————————————

          O método "CalculateP" calcula o valor de "p", que diminui de "1.0" para "0.1" à medida que "epochNow" aumenta, ou seja, depende da época atual.

          //——————————————————————————————————————————————————————————————————————————————
          double C_AO_CSA::CalculateP ()
          {
            return 1.0 - 0.9 * MathPow ((double)epochNow / epochs, 0.5);
          }
          //——————————————————————————————————————————————————————————————————————————————

          O método "CalculateTheta" calcula o valor de "Theta" usando os parâmetros atuais "currentW" e "currentP".

          • Se a fase atual for de diversificação, retorna o produto de "currentW" por um número aleatório.
          • Caso contrário, retorna o produto de "currentW" por "currentP".

          //——————————————————————————————————————————————————————————————————————————————
          double C_AO_CSA::CalculateTheta (double currentW, double currentP)
          {
            // Используем параметр aParam для регулировки угла
            if (IsExplorationPhase ()) return currentW * u.RNDprobab ();
            else return currentW * currentP;
          
          }
          //——————————————————————————————————————————————————————————————————————————————

          O método "IsExplorationPhase" verifica se a iteração atual está na fase de diversificação.

          //——————————————————————————————————————————————————————————————————————————————
          bool C_AO_CSA::IsExplorationPhase ()
          {
            // Исследование в первой части итераций(constC обычно 0.8)
            return (epochNow <= constC * epochs);
          }
          //——————————————————————————————————————————————————————————————————————————————


          Resultados dos testes

          Os autores do algoritmo o apresentam como um método de otimização altamente eficaz, no entanto, após sua implementação, algumas melhorias e a realização de testes finais, os resultados obtidos não impressionam. O algoritmo conseguiu entrar na tabela de classificação, mas seus indicadores ficaram bem abaixo dos melhores algoritmos atuais.

          CSA|Circle Search Algorithm|50.0|0.8|
          =============================
          5 Hilly's; Func runs: 10000; result: 0.6656012653478078
          25 Hilly's; Func runs: 10000; result: 0.4531682514562617
          500 Hilly's; Func runs: 10000; result: 0.2912586479936386
          =============================
          5 Forest's; Func runs: 10000; result: 0.6879687203647712
          25 Forest's; Func runs: 10000; result: 0.41397289345600924
          500 Forest's; Func runs: 10000; result: 0.2052507546137296
          =============================
          5 Megacity's; Func runs: 10000; result: 0.3753846153846153
          25 Megacity's; Func runs: 10000; result: 0.2363076923076922
          500 Megacity's; Func runs: 10000; result: 0.10646153846153927
          =============================
          All score: 3.43537 (38.17%)

          Na visualização do funcionamento do algoritmo, observam-se problemas de convergência e travamento em extremos locais. Tem não obstante, o algoritmo tenta trabalhar ao máximo de suas capacidades. Apesar dos problemas de aprisionamento em armadilhas (claramente visíveis nos longos trechos horizontais no gráfico de convergência), destaca-se sua capacidade de operar com desempenho razoável em problemas de alta dimensionalidade.

          Hilly

          CSA na função de teste Hilly

          Forest

          CSA na função de teste Forest

          Megacity

          CSA na função de teste Megacity

          Com base nos resultados dos testes, o algoritmo CSA ocupa a 41ª posição na tabela de classificação.

          AO Description 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 across neighbourhood search 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 lock algorithm (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 animal migration ptimization 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) evolution strategies 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 comet tail algorithm (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 time evolution travel algorithm (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 stochastic diffusion search 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 archery algorithm 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 evolution of social groups (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 simulated isotropic annealing (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 artificial cooperative search 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 DA dialectical algorithm 0,86183 0,70033 0,33724 1,89940 0,98163 0,72772 0,28718 1,99653 0,70308 0,45292 0,16367 1,31967 5,216 57,95
          13 BHAm black hole algorithm 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
          14 ASO anarchy society optimization 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
          15 RFO royal flush optimization (joo) 0,83361 0,73742 0,34629 1,91733 0,89424 0,73824 0,24098 1,87346 0,63154 0,50292 0,16421 1,29867 5,089 56,55
          16 AOSm atomic orbital search 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
          17 TSEA turtle shell evolution algorithm (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
          18 DE differential 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
          19 CRO chemical reaction optimisation 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
          20 BSA bird swarm algorithm 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
          21 HS harmony search 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
          22 SSG saplings sowing and growing 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
          23 BCOm bacterial chemotaxis optimization 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
          24 ABO african buffalo optimization 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
          25 (PO)ES (PO) evolution strategies 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
          26 TSm tabu search 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
          27 BSO brain storm optimization 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
          28 WOAm wale optimization algorithm 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
          29 AEFA artificial electric field algorithm 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
          30 AEO artificial ecosystem-based optimization algorithm 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
          31 ACOm ant colony optimization 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
          32 BFO-GA bacterial foraging optimization - 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
          33 SOA simple optimization algorithm 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
          34 ABHA artificial bee hive algorithm 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
          35 ACMO atmospheric cloud model optimization 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
          36 ADAMm adaptive moment estimation 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
          37 ATAm artificial tribe algorithm 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
          38 ASHA artificial showering algorithm 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
          39 ASBO adaptive social behavior optimization 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
          40 MEC mind evolutionary computation 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
          41 CSA circle search algorithm 0,66560 0,45317 0,29126 1,41003 0,68797 0,41397 0,20525 1,30719 0,37538 0,23631 0,10646 0,71815 3,435 38,17
          42 IWO invasive weed optimization 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
          43 Micro-AIS micro artificial immune system 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
          44 COAm cuckoo optimization algorithm 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
          45 SDOm spiral dynamics optimization 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
          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


          Considerações finais

          A partir da análise e dos testes realizados com o algoritmo Circle Search Algorithm (CSA), é possível tirar as seguintes conclusões: apesar da elegância da proposta geométrica e do mecanismo de busca intuitivo baseado em movimentação tangencial ao círculo, o algoritmo apresenta desempenho relativamente fraco na comparação com outros métodos, ocupando o 41º lugar entre 45 na tabela de algoritmos de otimização. Essa colocação indica limitações significativas em sua implementação atual.

          Os principais problemas do algoritmo estão relacionados à sua tendência de ficar preso em extremos locais, o que é especialmente notável ao lidar com tarefas simples de baixa dimensionalidade. Isso pode estar ligado a diversos fatores: em primeiro lugar, o mecanismo de busca baseado em ângulos, embora promissor em teoria, na prática se mostra pouco eficaz para escapar de ótimos locais. Em segundo lugar, o equilíbrio entre as fases de diversificação e intensificação, regulado pelo parâmetro "constC", não garante diversificação suficiente da busca. Toda a população acaba convergindo para soluções pseudo-ótimas, ou seja, para um único ponto, e nem mesmo as tentativas de "sacudir" a população com um componente aleatório na fórmula principal de atualização da posição dos agentes no espaço de soluções foram eficazes.

          A tentativa de melhorar o algoritmo por meio da adição de um multiplicador aleatório à fórmula de atualização das posições dos agentes, embora tenha levado a um comportamento mais previsível do algoritmo, não conseguiu aumentar significativamente sua eficácia. Isso pode indicar que a ideia base do algoritmo, fundamentada nas propriedades geométricas do círculo, ou não foi completamente explorada pelos autores na implementação atual, ou possui limitações fundamentais dentro do contexto da otimização global.

          Apesar disso, o algoritmo demonstra certas capacidades de busca e pode ser eficaz para algumas tarefas específicas, especialmente aquelas em que o relevo da função-objetivo seja relativamente simples. Para melhorar a eficiência do algoritmo, posso recomendar aos usuários a continuidade das pesquisas no sentido de aprimorar o mecanismo de escape dos ótimos locais, possivelmente através da introdução de mecanismos adicionais de diversificação da busca ou pela hibridização com outros métodos de otimização (como direção prioritária, o uso dessa estratégia de busca em outros algoritmos de otimização como componente).

          Tab

          Figura 3. Gradação de cores dos algoritmos nos testes correspondentes

          Chart

          Figura 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 está o script para cálculo da tabela de classificação)


          Pontos fortes e fracos do algoritmo CSA:

          Pontos fortes:

          1. Pouquíssimos parâmetros externos
          2. Implementação simples
          3. Ideia interessante baseada nas propriedades geométricas do círculo

          Pontos fracos:

          1. Baixa precisão de convergência
          2. Fica preso em extremos locais

          Está anexado ao artigo um arquivo com 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 aprimorar suas capacidades de busca. As conclusões e opiniões apresentadas nos artigos baseiam-se nos resultados dos experimentos realizados.

          Programas utilizados no artigo

          # Nome Tipo Descrição
          1 C_AO.mqh
          Arquivo incluído
          Classe base para algoritmos populacionais de otimização
          2 C_AO_enum.mqh
          Arquivo incluído
          Enumeração dos algoritmos populacionais de otimização
          3 TestFunctions.mqh
          Arquivo incluído
          Biblioteca de funções de teste
          4
          TestStandFunctions.mqh
          Arquivo incluído
          Biblioteca de funções da bancada de testes
          5
          Utilities.mqh
          Arquivo incluído
          Biblioteca de funções auxiliares
          6
          CalculationTestResults.mqh
          Arquivo incluído
          Script para cálculo dos resultados na tabela comparativa
          7
          Testing AOs.mq5
          Script Bancada unificada de testes 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_CSA.mq5
          Script Bancada de testes para o CSA

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

          Arquivos anexados |
          CSA.ZIP (162.81 KB)
          Desenvolvendo um EA multimoeda (Parte 22): Início da transição para substituição dinâmica de configurações Desenvolvendo um EA multimoeda (Parte 22): Início da transição para substituição dinâmica de configurações
          Se decidimos automatizar a execução da otimização periódica, também precisamos cuidar da atualização automática das configurações dos EAs que já estão operando na conta de negociação. Isso também deve permitir rodar o EA no testador de estratégias e alterar suas configurações dentro de uma única execução.
          Fibonacci no Forex (Parte I): Testando relações entre preço e tempo Fibonacci no Forex (Parte I): Testando relações entre preço e tempo
          Como o mercado se movimenta com base em proporções derivadas dos números de Fibonacci? Essa sequência, em que cada número é a soma dos dois anteriores (1, 1, 2, 3, 5, 8, 13, 21...), não descreve apenas o crescimento da população de coelhos. Vamos considerar a hipótese de Pitágoras de que tudo no mundo obedece a certas proporções numéricas...
          Redes neurais em trading: Modelos bidimensionais do espaço de conexões (Chimera) Redes neurais em trading: Modelos bidimensionais do espaço de conexões (Chimera)
          Descubra o inovador framework Chimera, um modelo bidimensional do espaço de estados que utiliza redes neurais para analisar séries temporais multidimensionais. Esse método oferece alta precisão com baixo custo computacional, superando abordagens tradicionais e arquiteturas do tipo Transformer.
          Redes neurais em trading: Treinamento multitarefa baseado no modelo ResNeXt (Conclusão) Redes neurais em trading: Treinamento multitarefa baseado no modelo ResNeXt (Conclusão)
          Seguimos com a exploração do framework de aprendizado multitarefa baseado na arquitetura ResNeXt, que se destaca pela modularidade, alta eficiência computacional e pela capacidade de identificar padrões estáveis nos dados. O uso de um codificador único e de "cabeças" especializadas reduz o risco de overfitting do modelo e aumenta a qualidade das previsões.