English Русский
preview
Algoritmos de otimização populacionais: algoritmo de baleias (Whale Optimization Algorithm, WOA)

Algoritmos de otimização populacionais: algoritmo de baleias (Whale Optimization Algorithm, WOA)

MetaTrader 5Exemplos | 6 agosto 2024, 16:24
14 0
Andrey Dik
Andrey Dik

Conteúdo:

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


1. Introdução

As baleias-jubarte, esses majestosos gigantes do mar, são verdadeiros mestres dos oceanos. Quando as baleias-jubarte entram na dança da caça, o tempo parece parar, e cada movimento é cheio de graça e precisão. Mestres da "rede de bolhas", criam uma cortina aquática de bolhas para limitar e reunir suas presas no centro do círculo. Este método único de alimentação destaca sua inteligência e pensamento estratégico no processo de caça.

A sincronização de suas ações com outras baleias, mesmo desconhecidas, demonstra um profundo entendimento e união, mostrando uma capacidade para trabalho em equipe e coordenação, independentemente das circunstâncias.

Sua capacidade de consumir até 1,4 toneladas métricas de alimento por dia ressalta seu papel no ecossistema marinho como um dos mais poderosos "consumidores" do oceano. Seu ritmo de vida, alternando entre períodos de caça abundante e tempos de descanso e jejum, nos fala sobre a grandeza e imprevisibilidade do oceano, onde reinam soberanas. O período de hibernação, quando as baleias-jubarte quase não se alimentam, testemunha sua incrível capacidade de sobrevivência. Elas dependem das reservas de gordura acumuladas durante as capturas abundantes para sobreviver aos tempos de escassez de alimentos. Isso nos lembra como a natureza ensina os animais a serem econômicos e sábios ao utilizar recursos.

As baleias-jubarte são crônicas vivas de sobrevivência e adaptabilidade, símbolos de sabedoria, personificações da força e beleza do oceano, uma fonte inesgotável de inspiração para nós.

O Algoritmo de Otimização de Baleias (WOA) é um algoritmo de otimização meta-heurística proposto por Mirjalili e Lewis em 2016. Eles se inspiraram no comportamento das baleias durante a caça.

As baleias utilizam várias estratégias de caça, incluindo a "rede de bolhas" e a "penetração em espiral". Na "rede de bolhas", as baleias cercam suas presas, criando uma "rede" de bolhas para confundir e assustar as presas. Na "penetração em espiral", as baleias emergem das profundezas do oceano em um movimento espiral para capturar as presas.

Essas estratégias de caça foram abstratamente modeladas no algoritmo WOA. No algoritmo WOA, as "baleias" representam soluções para um problema de otimização, e a "caça" representa o processo de busca pela solução ótima.


2. Descrição do algoritmo

O algoritmo WOA começa com a inicialização da população de baleias em posições aleatórias. Em seguida, é escolhido um líder, em particular, a baleia com o melhor valor de função objetivo (na prática, a melhor solução global). As posições das outras baleias são atualizadas levando em consideração a posição do líder. Isso ocorre em dois modos: no modo de reconhecimento e no modo de uso prático. No modo de reconhecimento, as baleias atualizam suas posições usando uma busca aleatória nas proximidades da melhor solução global atual. No modo de uso prático, as baleias atualizam suas posições, aproximando-se de sua melhor solução atual.

O algoritmo WOA foi aplicado com sucesso para resolver muitas tarefas de otimização e mostrou bons resultados. No entanto, como qualquer algoritmo de otimização, possui suas vantagens e desvantagens. Por exemplo, ele pode ser propenso a cair em ótimos locais e ter uma velocidade de convergência relativamente lenta.

Aqui estão alguns fatos interessantes sobre as baleias-jubarte que podem estar ligados aos princípios do algoritmo WOA:

  • Colaboração e Coordenação. As baleias-jubarte frequentemente caçam em grupos, cooperando entre si para o sucesso comum. Isso lembra os princípios do algoritmo WOA, onde agentes individuais (como baleias) trabalham juntos, trocando informações e coordenando suas ações para alcançar a solução ótima.
  • Estratégias Inteligentes. As baleias-jubarte usam várias estratégias inteligentes de caça, como a criação de "rede de bolhas" e a coordenação de ações em grupo. O algoritmo WOA também é baseado em estratégias inteligentes de otimização, como a busca de soluções ótimas e a adaptação a condições mutáveis.
  • Adaptabilidade e Eficiência. As baleias-jubarte demonstram adaptabilidade e eficiência no processo de caça, mudando seus métodos conforme a situação. O algoritmo WOA também procura se adaptar e ser eficiente, aplicando diversas táticas de otimização e modificando seu comportamento para alcançar os melhores resultados.

Assim, o algoritmo WOA se inspira nas estratégias e comportamentos únicos das baleias-jubarte durante a caça, o que o ajuda a resolver problemas de otimização de forma eficaz e inteligente em várias áreas.

O algoritmo de otimização WOA modificado (WOAm) inclui várias etapas principais:

1. Movimento em relação à solução global:
    - No estágio inicial do algoritmo, cada indivíduo "baleia" (solução) se move em direção à solução global ótima. Isso ajuda a explorar o espaço de soluções e encontrar a direção geral para o ótimo.

2. Melhoria de sua posição:
    - Cada indivíduo (baleia) tenta melhorar sua posição atual, aproximando-se da melhor solução. Os indivíduos podem alterar seus parâmetros ou estratégias para alcançar um desempenho melhor.

3. Movimento em espiral:
    - Esta etapa representa um mecanismo importante do algoritmo WOA. Os indivíduos podem se mover em espiral ao redor da melhor solução, o que os ajuda a explorar mais eficientemente o espaço de busca e se aproximar da solução ótima.

4. Migração:
    - Esta etapa envolve a mudança aleatória das posições dos indivíduos para garantir diversidade e prevenir a estagnação em ótimos locais. A migração ajuda o algoritmo a evitar a convergência prematura para uma solução inadequada.

Essas etapas, em conjunto, garantem uma busca eficaz pela solução ótima no espaço do problema de otimização. Adicionei a quarta etapa para melhorar a resistência do algoritmo à estagnação. A modelagem da migração das baleias em busca de novas fontes de alimento quando as fontes anteriores estão esgotadas é essencial para adicionar flexibilidade ao algoritmo e permitir uma exploração mais eficiente do espaço de soluções. Dessa forma, refletem-se as estratégias de sobrevivência e adaptação na natureza.

probab

Figura 1. Área de valores do coeficiente "A" na fórmula A = 2.0 * aKo * r - aKo dependendo da época atual.

Pseudocódigo para o Algoritmo de Otimização de Busca de Baleias (WOAm):

1. Inicializar a população com posições aleatórias.
2. Calcular a adaptação.
3. Calcular o coeficiente aKo: aKo = 2.0 - epochNow * (2.0 / epochs).
4. Gerar um número aleatório "r" de uma distribuição uniforme no intervalo de -1 a 1.
5. Calcular as variáveis "A" e "C":
   - A = 2.0 * aKo * r - aKo (Figura 1)
   - C = 2.0 * r
6. Definir os valores para "spiralCoeff", número aleatório "l" de uma distribuição uniforme e probabilidade aleatória "p".
7. Se "p" for menor que "refProb", então:
   - Se o valor absoluto de "A" for maior que 1.0: X = Xbest - A * |Xbest - Xprev|
   - Caso contrário, escolher um índice aleatório "leaderInd" de 0 a "popSize" e: X = Xlead - A * |Xlead - Xprev|
8. Caso contrário, se a probabilidade aleatória for menor que "spiralProb", então: X = Xprev + | Xprev - X| * exp (b * l) * cos (2 * M_PI * l)
9. No caso contrário: X = PowerDistribution (cB [c], rangeMin [c], rangeMin [c], 30)
10. Calcular a adaptação.
11. Atualizar a solução global.
12. Repetir o passo 3 até que o critério de parada seja atendido.


WOA

Figura 2. A caça "rede de bolhas" das baleias que inspirou a criação do algoritmo de otimização WOA.

Vamos passar para a escrita do código do algoritmo WOAm.

Para descrever cada baleia, definiremos a estrutura "S_WOA_Agent". Vamos analisar o que está acontecendo aqui:

1. A estrutura contém os seguintes campos:
    - cPrev[] - array para armazenar as coordenadas anteriores do agente.
    - fPrev - variável para armazenar a avaliação (fitness) anterior do agente.

2. Init - método da estrutura "S_WOA_Agent" que inicializa os campos da estrutura. Ele recebe um argumento inteiro "coords", usado para redimensionar o array "cPrev" usando a função "ArrayResize".

3. fPrev = -DBL_MAX - define o valor inicial da variável "fPrev" como o menor valor possível de um número do tipo double.

Esse código representa a estrutura de dados básica para os agentes no algoritmo WOAm e inicializa seus campos ao criar um novo agente.

//——————————————————————————————————————————————————————————————————————————————
struct S_WOA_Agent
{
    double cPrev []; //previous coordinates
    double fPrev;    //previous fitness

    void Init (int coords)
    {
      ArrayResize (cPrev, coords);
      fPrev = -DBL_MAX;
    }
};
//——————————————————————————————————————————————————————————————————————————————

Definiremos a classe "C_AO_WOAm" do algoritmo WOAm, que herda da classe base de algoritmos populacionais "C_AO" e contém os seguintes campos e métodos:

1. Campos Públicos:

  • ao_name - nome do algoritmo de otimização.
  • ao_desc - descrição do algoritmo de otimização.
  • popSize - tamanho da população.
  • params - array de parâmetros do algoritmo.
  • refProb - probabilidade de refinamento.
  • spiralCoeff - coeficiente de espiral.
  • spiralProb - probabilidade de espiral.
  • agent - vetor de agentes.

2. Métodos:

  • C_AO_WOAm - construtor da classe, inicializando os campos da classe.
  • SetParams - método para definir os parâmetros do algoritmo.
  • Init - método para inicializar o algoritmo. Aceita os intervalos mínimo e máximo de busca, passo de busca e número de épocas.
  • Moving - método para mover os agentes.
  • Revision - método para revisão dos agentes.

3. Campos privados:

  • epochs - número de épocas.
  • epochNow - época atual.

//——————————————————————————————————————————————————————————————————————————————
class C_AO_WOAm : public C_AO
{
  public: //--------------------------------------------------------------------
  ~C_AO_WOAm () { }
  C_AO_WOAm ()
  {
    ao_name = "WOAm";
    ao_desc = "Whale Optimization Algorithm M";

    popSize = 100;   //population size


    ArrayResize (params, 4);

    params [0].name = "popSize";     params [0].val = popSize;
    params [1].name = "refProb";     params [1].val = refProb;
    params [2].name = "spiralCoeff"; params [2].val = spiralCoeff;
    params [3].name = "spiralProb";  params [3].val = spiralProb;
  }

  void SetParams ()
  {
    popSize     = (int)params [0].val;
    refProb     = params      [1].val;
    spiralCoeff = params      [2].val;
    spiralProb  = params      [3].val;
  }

  bool Init (const double &rangeMinP  [], //minimum search range
             const double &rangeMaxP  [], //maximum search range
             const double &rangeStepP [], //step search
             const int     epochsP = 0);  //number of epochs

  void Moving   ();
  void Revision ();

  //----------------------------------------------------------------------------
  double refProb;     //refinement probability
  double spiralCoeff; //spiral coefficient
  double spiralProb;  //spiral probability


  S_WOA_Agent agent []; //vector

  private: //-------------------------------------------------------------------
  int  epochs;
  int  epochNow;
};
//——————————————————————————————————————————————————————————————————————————————

O método "Init" da classe "C_AO_WOAm" é usado para inicializar as variáveis da classe com base nos parâmetros fornecidos. Este método realiza a inicialização padrão usando o método "StandardInit", que aceita os intervalos mínimo e máximo de busca, assim como o passo de busca.

Se a inicialização padrão for bem-sucedida, o método continua a inicialização das variáveis "epochs" e "epochNow". O valor de "epochs" é definido como o parâmetro fornecido "epochsP", e "epochNow" é inicializado com o valor 0.

Em seguida, o método altera o tamanho do array "agent" para o tamanho "popSize". Para cada elemento em "agent", o método "Init" é chamado com o parâmetro "coords".

O método retorna "true" se a inicialização for bem-sucedida e "false" caso contrário.

Este método realiza a configuração inicial do algoritmo de otimização WOAm com os parâmetros fornecidos e o prepara para executar a otimização pelo número de épocas definido.

//——————————————————————————————————————————————————————————————————————————————
bool C_AO_WOAm::Init (const double &rangeMinP  [], //minimum search range
                     const double &rangeMaxP  [], //maximum search range
                     const double &rangeStepP [], //step search
                     const int     epochsP = 0)   //number of epochs
{
  if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;

  //----------------------------------------------------------------------------
  epochs   = epochsP;
  epochNow = 0;

  ArrayResize (agent, popSize);
  for (int i = 0; i < popSize; i++) agent [i].Init (coords);

  return true;
}
//——————————————————————————————————————————————————————————————————————————————

O método "Moving" da classe "C_AO_WOAm" é usado para mover os agentes durante o processo de otimização. O método realiza as seguintes ações:

"epochNow++;" - aumenta o valor da época atual.

"if (!revision)" - verifica a condição se "revision" é igual a "false".

Se "revision" for igual a "false":

  • A inicialização das coordenadas dos agentes "a[i].c[c]" é realizada usando valores aleatórios nos intervalos definidos.
  • O flag "revision" é definido como "true".
  • O método termina.

Se "revision" não for igual a "false":

  • Para cada agente, novos cálculos de coordenadas são realizados usando fórmulas específicas e probabilidades.
  • Diversos cálculos matemáticos, números aleatórios e probabilidades são usados para determinar as novas coordenadas dos agentes.
  • Novas coordenadas "x" são calculadas de acordo com as condições e probabilidades.
  • Novas coordenadas "a[i].c[c]" são definidas usando o método "SeInDiSp" para corrigir os valores de acordo com os intervalos de busca e passos.

Este método é responsável por atualizar as coordenadas dos agentes no algoritmo de otimização WOAm de acordo com a época atual, valores aleatórios e probabilidades. Vamos destacar em cores as seções correspondentes do código, descrevendo diferentes modelos de comportamento das baleias:

Melhoria da solução global: A cada nova época, as baleias investigam mais cuidadosamente as proximidades da solução global encontrada de acordo com a lei linear e o coeficiente "A" calculado, buscando se aproximar do ótimo global.

Exploração das proximidades do "líder" da população: Considerando o coeficiente "A", as baleias exploram as proximidades do "líder" da população, que é selecionado aleatoriamente pela lei de distribuição uniforme. Assim, continua a exploração de todas as áreas onde as baleias estão na população.

Movimento espiral e rede de bolhas: As baleias se movem em espiral, considerando sua melhor posição individual e a posição atual, o que garante a coleta de peixes em uma nuvem densa e a concentração de alimento em um único lugar.

Migração de baleias: A migração de baleias é imitada por um movimento brusco na direção oposta à melhor solução global de acordo com uma lei de potência. Este processo determina uma alta probabilidade de estar nas proximidades da solução global e uma baixa, mas não nula, probabilidade de estar muito distante dela.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_WOAm::Moving ()
{
  epochNow++;

  //----------------------------------------------------------------------------
  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;
  }

  for (int i = 0; i < popSize; i++)
  {
    for (int c = 0; c < coords; c++)
    {
      double aKo = 2.0 - epochNow * (2.0 / epochs);
      double r = u.RNDfromCI (-1, 1);
      double A = 2.0 * aKo * r - aKo;
      double C = 2.0 * r;
      double b = spiralCoeff;
      double l = u.RNDfromCI (-1, 1);
      double p = u.RNDprobab ();
      double x;

      if (p < refProb)
      {
        if (MathAbs (A) > 1.0)
        {
          x = cB [c] - A * MathAbs (cB [c] - agent [i].cPrev [c]);                                                      //Xbest - A * |Xbest - X|
        }
        else
        {
          int leaderInd = u.RNDminusOne (popSize);
          x = agent [leaderInd].cPrev [c] - A * MathAbs (agent [leaderInd].cPrev [c] - agent [i].cPrev [c]);            //Xlid - A * |Xlid - X|;
        }
      }
      else
      {
        if (u.RNDprobab () < spiralProb)
        {
          x = agent [i].cPrev [c] + MathAbs (agent [i].cPrev [c] - a [i].c [c]) * MathExp (b * l) * cos (2 * M_PI * l); //XbestPrev + |XbestPrev - X| * MathExp (b * l) * cos (2 * M_PI * l)
        }
        else
        {
          x = u.PowerDistribution (cB [c], rangeMin [c], rangeMin [c], 30);
        }
      }

      a [i].c [c] = u.SeInDiSp (x, rangeMin [c], rangeMax [c], rangeStep [c]);
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

O método "Revision" da classe "C_AO_WOAm" é usado para atualizar a melhor solução global e as melhores posições das próprias baleias. O método realiza as seguintes ações:

1. Atualização da melhor solução global. No laço "for", o método percorre todos os indivíduos. Se o valor da função de adaptabilidade do indivíduo atual exceder o valor atual da melhor função de adaptabilidade, o melhor valor é atualizado e o array de coordenadas do indivíduo atual é copiado para o array de coordenadas da melhor solução.

2. Atualização dos valores anteriores da função de adaptabilidade e coordenadas dos agentes. No laço "for", o método percorre todos os indivíduos. Se o valor da função de adaptabilidade do indivíduo atual exceder o valor anterior da função de adaptabilidade desse agente, o valor anterior da função de adaptabilidade é atualizado e o array de coordenadas do indivíduo atual é copiado para o array de coordenadas anteriores desse agente.

Este método "Revision" é responsável por atualizar os melhores agentes com base nos valores de suas funções, bem como atualizar os valores anteriores das funções e coordenadas dos agentes dentro do algoritmo de otimização WOAm.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_WOAm::Revision ()
{
  int ind = -1;

  for (int i = 0; i < popSize; i++)
  {
    if (a [i].f > fB) ind = i;
  }

  if (ind != -1)
  {
    fB = a [ind].f;
    ArrayCopy (cB, a [ind].c, 0, 0, WHOLE_ARRAY);
  }

  for (int i = 0; i < popSize; i++)
  {
    if (a [i].f > agent [i].fPrev)
    {
      agent [i].fPrev = a [i].f;
      ArrayCopy (agent [i].cPrev, a [i].c, 0, 0, WHOLE_ARRAY);
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————


3. Resultados dos testes

A versão básica do algoritmo proposta pelos autores, infelizmente, deixa a desejar, mostrando resultados relativamente fracos, como pode ser visto abaixo.

WOA|Whale Optimization Algorithm|100.0|0.1|0.5|0.8|
=============================
5 Hilly's; Func runs: 10000; result: 0.45323929163422483
25 Hilly's; Func runs: 10000; result: 0.3158990997230676
500 Hilly's; Func runs: 10000; result: 0.25544320870775555
=============================
5 Forest's; Func runs: 10000; result: 0.43485195446891795
25 Forest's; Func runs: 10000; result: 0.2454326019188397
500 Forest's; Func runs: 10000; result: 0.1557433572339264
=============================
5 Megacity's; Func runs: 10000; result: 0.3400000000000001
25 Megacity's; Func runs: 10000; result: 0.18800000000000003
500 Megacity's; Func runs: 10000; result: 0.10146153846153938
=============================
All score: 2.49007 (27.67%)

No entanto, graças a esforços e abordagens criativas, houve avanços significativos, como a migração e distribuição de potência. Além disso, em vez de usar a posição atual das baleias como ponto de partida para calcular a próxima posição, agora são usadas as melhores posições anteriores das baleias. Essas alterações modificaram o algoritmo, dando-lhe uma nova qualidade e melhorando significativamente os resultados da versão anterior. Assim, o algoritmo se tornou mais eficiente e capaz de alcançar sucessos mais significativos na resolução das tarefas propostas.

Esta é uma impressão dos resultados da versão modificada do WOAm, onde há uma melhoria nos resultados de mais de 22% (onde 0% é o pior resultado possível e 100% é o melhor resultado teórico alcançável).

WOAm|Whale Optimization Algorithm|100.0|0.1|0.5|0.8|
=============================
5 Hilly's; Func runs: 10000; result: 0.8452089588169466
25 Hilly's; Func runs: 10000; result: 0.562977678943021
500 Hilly's; Func runs: 10000; result: 0.262626056156147
=============================
5 Forest's; Func runs: 10000; result: 0.9310009723200832
25 Forest's; Func runs: 10000; result: 0.5227806126625986
500 Forest's; Func runs: 10000; result: 0.1636489301696601
=============================
5 Megacity's; Func runs: 10000; result: 0.6630769230769229
25 Megacity's; Func runs: 10000; result: 0.41138461538461535
500 Megacity's; Func runs: 10000; result: 0.11356923076923182
=============================
All score: 4.47627 (49.74%)

Ao examinar a versão modificada, é possível notar uma dispersão significativa dos resultados na função Hilly e uma pequena dispersão na função Megacity discreta. É interessante notar que, geralmente, para a maioria dos algoritmos, a função Megacity é mais complexa e apresenta maior dispersão nos resultados. Portanto, é surpreendente que o WOAm mostre resultados muito estáveis e bons nessa função.

O algoritmo explora com sucesso áreas locais da superfície em várias regiões do espaço de busca, destacando direções promissoras. Isso é fácil por dividir o comportamento geral da população em etapas de comportamento individual, voltadas para melhorar a posição de cada baleia individualmente.

Essa abordagem permite que o algoritmo explore eficientemente o espaço de busca da solução ótima, focando na melhoria das posições de agentes individuais no grupo. Isso contribui para uma investigação mais precisa e profunda de áreas potencialmente promissoras, o que, por sua vez, melhora o desempenho geral do algoritmo.

A versão básica não é apresentada nesta visualização. Além disso, é apresentada a visualização do algoritmo na função de teste Ackley, que não participa do cálculo da tabela de classificação.

Hilly

  WOAm na função de teste Hilly.

Forest

  WOAm na função de teste Forest.

Megacity

  WOAm na função de teste Megacity.

Ackley

  WOAm na função de teste Ackley.

O algoritmo WOAm modificado ficou em décimo lugar na parte superior da tabela, demonstrando resultados bons e estáveis. 

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 BGA binary genetic algorithm 0,99992 0,99484 0,50483 2,49959 1,00000 0,99975 0,32054 2,32029 0,90667 0,96400 0,23035 2,10102 6,921 76,90
2 (P+O)ES (P+O) evolution strategies 0,99934 0,91895 0,56297 2,48127 1,00000 0,93522 0,39179 2,32701 0,83167 0,64433 0,21155 1,68755 6,496 72,18
3 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
4 ESG evolution of social groups 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
5 SIA simulated isotropic annealing 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
6 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
7 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
8 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
9 (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
10 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
11 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
12 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
13 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
14 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
15 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
16 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
17 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
18 NMm Nelder-Mead method M 0,73807 0,50598 0,31342 1,55747 0,63674 0,28302 0,08221 1,00197 0,44667 0,18667 0,04028 0,67362 3,233 35,92
19 FAm firefly algorithm M 0,58634 0,47228 0,32276 1,38138 0,68467 0,37439 0,10908 1,16814 0,28667 0,16467 0,04722 0,49855 3,048 33,87
20 GSA gravitational search algorithm 0,64757 0,49197 0,30062 1,44016 0,53962 0,36353 0,09945 1,00260 0,32667 0,12200 0,01917 0,46783 2,911 32,34
21 BFO bacterial foraging optimization 0,61171 0,43270 0,31318 1,35759 0,54410 0,21511 0,05676 0,81597 0,42167 0,13800 0,03195 0,59162 2,765 30,72
22 ABC artificial bee colony 0,63377 0,42402 0,30892 1,36671 0,55103 0,21874 0,05623 0,82600 0,34000 0,14200 0,03102 0,51302 2,706 30,06
23 BA bat algorithm 0,59761 0,45911 0,35242 1,40915 0,40321 0,19313 0,07175 0,66810 0,21000 0,10100 0,03517 0,34617 2,423 26,93
24 SA simulated annealing 0,55787 0,42177 0,31549 1,29513 0,34998 0,15259 0,05023 0,55280 0,31167 0,10033 0,02883 0,44083 2,289 25,43
25 IWDm intelligent water drops M 0,54501 0,37897 0,30124 1,22522 0,46104 0,14704 0,04369 0,65177 0,25833 0,09700 0,02308 0,37842 2,255 25,06
26 PSO particle swarm optimisation 0,59726 0,36923 0,29928 1,26577 0,37237 0,16324 0,07010 0,60572 0,25667 0,08000 0,02157 0,35823 2,230 24,77
27 MA monkey algorithm 0,59107 0,42681 0,31816 1,33604 0,31138 0,14069 0,06612 0,51819 0,22833 0,08567 0,02790 0,34190 2,196 24,40
28 SFL shuffled frog-leaping 0,53925 0,35816 0,29809 1,19551 0,37141 0,11427 0,04051 0,52618 0,27167 0,08667 0,02402 0,38235 2,104 23,38
29 FSS fish school search 0,55669 0,39992 0,31172 1,26833 0,31009 0,11889 0,04569 0,47467 0,21167 0,07633 0,02488 0,31288 2,056 22,84
30 RND random 0,52033 0,36068 0,30133 1,18234 0,31335 0,11787 0,04354 0,47476 0,25333 0,07933 0,02382 0,35648 2,014 22,37
31 GWO grey wolf optimizer 0,59169 0,36561 0,29595 1,25326 0,24499 0,09047 0,03612 0,37158 0,27667 0,08567 0,02170 0,38403 2,009 22,32
32 CSS charged system search 0,44252 0,35454 0,35201 1,14907 0,24140 0,11345 0,06814 0,42299 0,18333 0,06300 0,02322 0,26955 1,842 20,46
33 EM electroMagnetism-like algorithm 0,46250 0,34594 0,32285 1,13129 0,21245 0,09783 0,10057 0,41085 0,15667 0,06033 0,02712 0,24412 1,786 19,85


Considerações finais

No geral, estou satisfeito com as melhorias neste algoritmo, descritas neste artigo. No entanto, existem estudos mais aprofundados sobre a modificação desta versão que devem ser considerados por aqueles que estão interessados nesse tema e desejam realizar experimentos adicionais. A imersão nesses métodos pode abrir novos horizontes e inspirar a criação de soluções ainda mais eficazes na área deste algoritmo.

Aqui estão algumas estratégias que podem ajudar a melhorar o algoritmo de otimização de busca de baleias (WOA) e reduzir a probabilidade de ficar preso em extremos locais:

1. Diversificação da população. A diversidade na população pode ajudar a evitar ficar preso em ótimos locais. Considere métodos para manter a diversidade na população, como mecanismos de mutação, cruzamento ou exploração das vizinhanças das soluções.

2. Estratégia de elite. Essa estratégia envolve manter algumas das melhores soluções diferentes (elite) de geração para geração, evitando a redução da diversidade na população.

3. Mecanismo multi-estratégico. Essa abordagem envolve o uso simultâneo de várias estratégias de busca, o que pode auxiliar o algoritmo a explorar melhor o espaço de soluções e evitar armadilhas locais.

4. Hibridização com outros algoritmos. A hibridização do WOA com outros algoritmos de otimização também pode melhorar seu desempenho. Por exemplo, pode-se usar a evolução diferencial ou o enxame de partículas para melhorar a fase de exploração do algoritmo.

tab

Figura 3. Gradiente de cores dos algoritmos para os respectivos testes. Resultados iguais ou superiores a 0.99 são destacados em branco.

Chama a atenção a cor da célula do valor na função suave Hilly com 1000 variáveis, indicando que o resultado é o pior entre todos os algoritmos apresentados na tabela. Além disso, é significativamente pior. Vale destacar o alto desempenho na função Forest com 5 variáveis, e de modo geral, bons resultados nas funções Forest e Megacity.

chart

Figura 4. Histograma dos resultados dos testes dos algoritmos (na escala de 0 a 100, quanto maior, melhor,

onde 100 é o resultado teórico máximo possível, o script para cálculo da tabela de classificação está no arquivo).


Prós e contras do algoritmo de otimização de baleias (WOAm):

Prós:

  1. Arquitetura e implementação simples.
  2. Resultados estáveis e bons na função acentuada Forest e na função discreta Megacity.
  3. Pouco exigente em termos de recursos computacionais.

Contras:

  1. Convergência baixa (não há resultados próximos a 100%).
  2. Baixa escalabilidade em funções suaves, como Hilly (problemas com tarefas de alta dimensionalidade).

Um arquivo com as versões atualizadas dos códigos dos algoritmos está anexado ao artigo. 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 as capacidades de busca. As conclusões e julgamentos apresentados nos artigos são baseados nos resultados dos experimentos realizados.

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

Arquivos anexados |
WOAm.zip (24.34 KB)
Caminhe em novos trilhos: Personalize indicadores no MQL5 Caminhe em novos trilhos: Personalize indicadores no MQL5
Vou agora listar todas as possibilidades novas e recursos do novo terminal e linguagem. Elas são várias, e algumas novidades valem a discussão em um artigo separado. Além disso, não há códigos aqui escritos com programação orientada ao objeto, é um tópico muito importante para ser simplesmente mencionado em um contexto como vantagens adicionais para os desenvolvedores. Neste artigo vamos considerar os indicadores, sua estrutura, desenho, tipos e seus detalhes de programação em comparação com o MQL4. Espero que este artigo seja útil tanto para desenvolvedores iniciantes quanto para experientes, talvez alguns deles encontrem algo novo.
Redes neurais de maneira fácil (Parte 80): modelo generativo adversarial do transformador de grafos (GTGAN) Redes neurais de maneira fácil (Parte 80): modelo generativo adversarial do transformador de grafos (GTGAN)
Neste artigo, apresento o algoritmo GTGAN, que foi introduzido em janeiro de 2024 para resolver tarefas complexas de criação de layout arquitetônico com restrições de grafos.
Está chegando o novo MetaTrader 5 e MQL5 Está chegando o novo MetaTrader 5 e MQL5
Esta é apenas uma breve resenha do MetaTrader 5. Eu não posso descrever todos os novos recursos do sistema por um período tão curto de tempo - os testes começaram em 09.09.2009. Esta é uma data simbólica, e tenho certeza que será um número de sorte. Alguns dias passaram-se desde que eu obtive a versão beta do terminal MetaTrader 5 e MQL5. Eu ainda não consegui testar todos os seus recursos, mas já estou impressionado.
Algoritmos de otimização de população: Resistência a ficar preso em extremos locais (Parte II) Algoritmos de otimização de população: Resistência a ficar preso em extremos locais (Parte II)
Continuamos nosso experimento que visa examinar o comportamento dos algoritmos de otimização de população no contexto de sua capacidade de escapar eficientemente de mínimos locais quando a diversidade da população é baixa e alcançar máximos globais. Os resultados da pesquisa são fornecidos.