Русский
preview
Algoritmo de ecolocalização de golfinhos — Dolphin Echolocation Algorithm (DEA)

Algoritmo de ecolocalização de golfinhos — Dolphin Echolocation Algorithm (DEA)

MetaTrader 5Negociação |
11 0
Andrey Dik
Andrey Dik

Conteúdo

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


Introdução

A cada novo artigo, nos aproximamos cada vez mais do nosso objetivo, a busca por um algoritmo digno para resolver tarefas de otimização com nossos robôs de negociação. Vamos estudar mais um novo algoritmo inspirado na natureza, cuja base é a capacidade de ecolocalização presente em alguns animais marinhos.

Imagine um golfinho caçando nas profundezas escuras do oceano. A visibilidade é praticamente nula, mas isso não o impede de encontrar presas com sucesso. O segredo está em uma capacidade surpreendente, o golfinho emite uma série de cliques e, pelo eco refletido, constrói um quadro preciso do espaço ao redor. Um fato interessante é que a frequência desses cliques varia: cliques raros durante a busca geral e cliques frequentes quando o alvo está próximo. Essa estratégia incomum foi justamente a base para a criação do algoritmo de otimização DEA (Dolphin Echolocation Algorithm).

No mundo da otimização, frequentemente nos deparamos com uma tarefa semelhante, é preciso encontrar a melhor solução em um enorme espaço de possibilidades, sem ter uma visão completa do cenário. Como o golfinho no oceano, começamos com uma busca ampla e gradualmente nos concentramos nas áreas mais promissoras.


Implementação do algoritmo

Para compreender melhor o princípio de funcionamento do algoritmo, imaginemos a seguinte situação. Você e seus amigos estão procurando ouro em uma grande praia, munidos de detectores de metal. No início da busca, é lógico se espalhar por toda a área, assim aumentam as chances de encontrar algo interessante. Mas assim que um de vocês ouve um sinal forte, ele informa os demais, e gradualmente toda a equipe começa a se concentrar nos locais promissores. Ao final da busca, todos estão cavando perto do sinal mais forte. Essa é a essência do algoritmo de ecolocalização de golfinhos.

No algoritmo, o papel dos golfinhos é desempenhado por agentes de busca, pontos no espaço de soluções. Cada "golfinho" representa uma solução potencial para o problema. Por exemplo, se estivermos procurando o mínimo da função simples y = x², então um golfinho pode estar no ponto x = -3, onde y = 9, outro no ponto x = 1, onde y = 1, e um terceiro pode estar por acaso no ponto x = 0, onde y = 0, este será o nosso campeão.

Mas como os golfinhos trocam informações? Aqui entra em cena o conceito de raio efetivo, que denotamos como "Re". Pense em até onde a luz de uma lanterna se espalha. Com Re = 1, temos um feixe estreito que ilumina apenas a área mais próxima. Com Re = 3, a luz se espalha mais amplamente, cobrindo mais espaço. E com Re = 5 ou mais, temos praticamente um refletor. No contexto do algoritmo, isso significa que a informação sobre uma boa solução se propaga para áreas vizinhas, e a intensidade dessa influência diminui com a distância.

Toda essa informação é acumulada na forma de um "mapa de promissividade", que o algoritmo chama de adaptabilidade acumulada "AF". Imagine um mapa de calor de uma cidade, onde as zonas "quentes" indicam locais com alta atividade. No nosso caso, as zonas "quentes" são as áreas onde os golfinhos encontraram boas soluções, isto é, presas. Quanto mais descobertas bem-sucedidas em uma determinada área, mais "quente" ela se torna, atraindo outros golfinhos.

No entanto, o algoritmo é mais inteligente do que uma simples concentração em um único ponto. Ele utiliza um parâmetro chamado probabilidade predeterminada "PP", que controla o equilíbrio entre diversificação de novos territórios e intensificação ou foco dos locais já identificados como bons. No início, quando "PP" é baixo, cerca de 0.1, o algoritmo experimenta mais; depois, quando "PP" está em torno de 0.5, passa a confiar mais em abordagens já testadas; e, quando "PP" se aproxima de 1, utiliza apenas os métodos mais eficientes.

Consideremos um exemplo concreto do funcionamento do algoritmo. Suponha que estamos procurando o ponto mais alto em um terreno montanhoso. No início da busca, nossos golfinhos estão distribuídos aleatoriamente por toda a área, alguns no vale, outros nas encostas, e alguns têm a sorte de estar no topo de uma colina. Após avaliar a altura de cada posição, o algoritmo determina que o golfinho no topo encontrou o melhor local. Agora ocorre algo interessante: a área ao redor desse golfinho bem-sucedido torna-se mais atraente para os demais, porém, e este é o ponto-chave, o próprio ponto onde o líder se encontra é temporariamente "zerado". Isso força os outros golfinhos a explorar áreas vizinhas, em vez de se acumularem em um único ponto. Essa abordagem ajuda a evitar a convergência prematura e a encontrar outras soluções potencialmente boas.

À medida que o algoritmo opera, o cenário muda. Na 50ª iteração, observamos que os golfinhos começam a se agrupar em áreas montanhosas, mas ainda mantêm certa diversidade. Na 100ª iteração, a maioria já está concentrada nos pontos mais altos do terreno e, ao final, todos os golfinhos se reúnem no máximo global. A eficiência do algoritmo depende do ajuste correto dos parâmetros.

A escolha do raio efetivo "Re" é importante para equilibrar a busca local e global. Com Re = 1, obtemos uma busca muito precisa, porém altamente direcionada, como se estivéssemos procurando uma agulha em um palheiro com uma lupa. Aumentar "Re" para 3-4 fornece uma abordagem equilibrada, semelhante à busca com uma lanterna. Já com "Re" maior que 5, o algoritmo atua como um refletor, cobrindo grandes áreas, mas perdendo em precisão.

O parâmetro "Power" determina quão abruptamente o algoritmo passa da diversificação para a intensificação ou foco . Com Power = 1, essa transição é suave e gradual. O valor Power = 2, recomendado, proporciona uma transição mais pronunciada, enquanto Power = 3 ou superior torna a mudança brusca, o que pode ser útil para determinados tipos de problemas.

A probabilidade inicial "PP1" define o equilíbrio inicial entre diversificação e intensificação ou foco . Um valor baixo, 0.05, significa uma exploração agressiva do espaço; o valor padrão 0.1 oferece um bom equilíbrio; e um valor alto, 0.5, leva a uma rápida concentração nas soluções encontradas.

A principal vantagem do DEA está em sua adaptabilidade, o algoritmo ajusta automaticamente o equilíbrio entre a diversificação de novas áreas e o aprofundamento em zonas promissoras. Ao mesmo tempo, ele permanece relativamente simples, exigindo a configuração de apenas quatro parâmetros. O mecanismo de propagação de informações por meio da adaptabilidade acumulada permite utilizar de forma eficiente o conhecimento sobre o espaço de busca, e a redefinição do AF para as melhores posições ajuda a evitar o aprisionamento em ótimos locais.

Naturalmente, o algoritmo também possui algumas limitações. Ele requer memória adicional para armazenar a adaptabilidade acumulada de todas as alternativas, o que pode ser um problema em espaços de busca muito grandes. E, talvez, mais um ponto, a eficiência do algoritmo depende da escolha correta do raio efetivo "Re". Abaixo é apresentada uma ilustração esquemática do funcionamento do algoritmo.

dea_algorithm

Figura 1. Ilustração do funcionamento do algoritmo DEA.

 Principais etapas do funcionamento do algoritmo DEA, mostradas na figura:

  1. Exploração inicial, os golfinhos, agentes de busca, em posições aleatórias com raio de ecolocalização "Re".
  2. Distribuição da adaptabilidade acumulada (AF), como o "AF" se acumula ao redor das posições dos golfinhos.
  3. Processo de convergência, três subetapas que mostram a transição da diversificação para a intensificação ou foco .

A ilustração ajuda a compreender como os golfinhos utilizam a ecolocalização para encontrar o ótimo, de que maneira a informação se propaga por meio da adaptabilidade acumulada, como o parâmetro "Re" influencia a largura da busca, e como "PP" controla o equilíbrio entre diversificação e intensificação ou foco . Conceitos-chave, fórmulas para PP, probabilidade predeterminada, e AF. Fluxograma do algoritmo, principais etapas com ciclo. Influência do parâmetro "Re", visualização de raio de influência estreito, médio e amplo.

Esquema de cores na figura: azul - golfinhos comuns; vermelho - melhor solução; gradientes de azul - níveis de adaptabilidade acumulada; cinza - espaço de busca. 

Agora, tendo uma certa compreensão do algoritmo, podemos passar à escrita do pseudocódigo detalhado. 

Parâmetros de entrada:

  • Número de golfinhos, agentes de busca
  • Raio efetivo de ecolocalização
  • Grau da curva de convergência
  • Probabilidade predeterminada inicial
  • Limites do espaço de busca e passo de discretização para cada dimensão

Inicialização:

Criação do espaço de alternativas:

  1. Para cada dimensão do espaço de busca, criar um conjunto de alternativas possíveis
  2. Se um passo de discretização for definido, criar alternativas com esse passo do mínimo ao máximo
  3. Se o passo não for definido, criar 500 alternativas distribuídas uniformemente
  4. Verificar o raio efetivo, ele não deve exceder um quarto do número de alternativas

Posicionamento inicial dos golfinhos:

  1. Distribuir aleatoriamente todos os golfinhos no espaço de busca
  2. Para cada golfinho, calcular a qualidade de sua posição, fitness
  3. Inicializar a adaptabilidade acumulada com zeros para todas as alternativas

Ciclo principal de otimização:

Repetir o número especificado de iterações:

Etapa 1. Cálculo da probabilidade predeterminada

Calcular a probabilidade de manter a melhor posição na iteração atual. No início do processo, essa probabilidade é igual ao valor inicial, depois cresce gradualmente segundo uma função de potência até atingir um no final da otimização.

Etapa 2. Cálculo do coeficiente dinâmico de adaptação

Calcular o coeficiente que determina o equilíbrio entre a busca local e a busca global. O coeficiente é igual à razão entre a diferença do melhor e do pior resultado e a soma dos desvios de todos os resultados em relação ao melhor. Quando a população é diversa, o coeficiente é alto; quando converge, é baixo.

Etapa 3. Acumulação de informações sobre adaptabilidade

Para cada golfinho:

  • Normalizar seu fitness em relação ao intervalo atual da população
  • Para cada coordenada, encontrar a alternativa mais próxima da posição do golfinho
  • Propagar a informação sobre a qualidade dentro do raio de ecolocalização ao redor dessa alternativa
  • A força de influência diminui linearmente com a distância ao centro
  • Nas fronteiras do espaço, aplicar reflexão para preservar a informação
  • Adicionar um pequeno valor a todas as adaptabilidades acumuladas para evitar probabilidades nulas

Etapa 4. Redefinição da informação para a melhor posição

Encontrar o golfinho com a melhor solução e redefinir a adaptabilidade acumulada para as alternativas correspondentes às suas coordenadas. Isso evita uma concentração excessiva da busca em um único ponto.

Etapa 5. Seleção de novas posições

Para cada golfinho e para cada uma de suas coordenadas:

  • Se for o melhor golfinho e ocorrer a probabilidade de manter a posição, deixar a coordenada inalterada
  • Caso contrário, se houver informação acumulada de adaptabilidade, selecionar uma nova alternativa proporcionalmente a essa informação pelo método da roleta
  • Se a informação acumulada estiver ausente ou for insuficiente:
    • com probabilidade igual ao coeficiente dinâmico, executar busca local dentro do raio de ecolocalização
    • caso contrário, executar busca global escolhendo uma alternativa aleatória
  • Aplicar as restrições do espaço de busca e a discretização

Etapa 6. Avaliação das novas posições

Calcular a qualidade da solução para cada golfinho em sua nova posição.

Etapa 7. Atualização da informação global

Atualizar os registros das melhores e piores soluções na população. Se for encontrada uma solução melhor que o ótimo global atual, armazená-la.

Conclusão:

Após a execução de todas as iterações, retornar a melhor solução encontrada e sua qualidade.

Passamos diretamente à construção do código do algoritmo DEA.

Vamos escrever a estrutura "S_Alternative". Ela será destinada a armazenar informações sobre uma alternativa no processo de tomada de decisão para otimização e contém "value", o valor que caracteriza essa alternativa, a avaliação de desempenho, e "AF", adaptabilidade acumulada (Accumulated Fitness) para essa alternativa, o que é necessário para avaliar a "qualidade" da alternativa quando é preciso aplicar um processo iterativo.

//————————————————————————————————————————————————————————————————————
struct S_Alternative
{
    double value;     // значение альтернативы
    double AF;        // накопленная пригодность для этой альтернативы
};
//————————————————————————————————————————————————————————————————————

A estrutura "S_Coordinate" é destinada a representar um conjunto de alternativas associadas a uma determinada coordenada, "alt", um array de alternativas, cada uma correspondendo à coordenada, e "count", variável que indica a quantidade atual de alternativas efetivamente armazenadas no array "alt".

//————————————————————————————————————————————————————————————————————
struct S_Coordinate
{
    S_Alternative alt [];  // массив альтернатив для данной координаты
    int           count;   // количество альтернатив
};
//————————————————————————————————————————————————————————————————————

Em seguida, passamos à descrição da classe que implementa diretamente o algoritmo de otimização DEA. A classe "C_AO_DEA" é herdeira da classe base "C_AO". Ao criar um objeto da classe, ocorre a inicialização dos principais parâmetros do algoritmo:

  • popSize, é inicializado o tamanho da população, número de "golfinhos" ou localizações.
  • Re, é definido o valor inicial do raio efetivo de busca.
  • Power, é definido o grau da curva de convergência.
  • PP1, é inicializado o fator de convergência para a primeira iteração.
Em seguida, é inicializado o array "params", utilizado para armazenar os parâmetros definidos pelo usuário do algoritmo. Nele são copiados os valores iniciais de "popSize", "Re", "Power", "PP1" com seus respectivos nomes.

O método "SetParams" é destinado a atualizar os parâmetros internos do algoritmo com base nos valores registrados no array "params". Após extrair os valores de "popSize", "Re", "Power", "PP1", é realizada a verificação de consistência.

Métodos:

  • Init, destinado à inicialização do algoritmo, recebendo os valores mínimos, máximos e os passos para cada parâmetro, bem como o número total de épocas, iterações.
  • Moving, responsável pelo deslocamento dos "golfinhos" no espaço de busca, sendo parte do ciclo principal de otimização.
  • Revision, executa o ajuste das posições e dos parâmetros da população após o deslocamento.

Os campos a seguir são utilizados internamente para o funcionamento do algoritmo e não estão disponíveis externamente à classe.

  • PP, número de ponto flutuante que representa a probabilidade predeterminada para a iteração atual, utilizada em decisões estocásticas; currentEpoch, valor que acompanha a época, iteração, atual do algoritmo.
  • totalEpochs, valor que armazena o número total planejado de épocas.
  • coeffA, coeficiente dinâmico utilizado na seleção de posições.
  • coordData, array de estruturas, onde cada "S_Coordinate" contém um array de alternativas e sua quantidade para uma determinada coordenada. 
Métodos:
  • CalculatePP, destinado ao cálculo do valor de "PP", probabilidade predeterminada, na iteração atual.
  • CalculateAccumulativeFitness, calcula a adaptabilidade acumulada para cada alternativa.
  • ResetAFforBestLocation, redefine os valores de adaptabilidade acumulada para as melhores localizações.
  • SelectNextLocations, seleciona as próximas posições dos "golfinhos" com base no estado atual.
  • FindNearestAlternative, busca a alternativa mais próxima com base nas coordenadas e no valor especificado.
  • CalculateCoefficientA, calcula o coeficiente dinâmico "coeffA".

De modo geral, a classe "C_AO_DEA" está pronta para ser utilizada na busca de soluções em um espaço multidimensional. Ela possui métodos públicos para inicialização e execução das principais etapas da otimização, além de métodos e dados privados que implementam a lógica interna do algoritmo.

//————————————————————————————————————————————————————————————————————
class C_AO_DEA : public C_AO
{
  public: //----------------------------------------------------------
  ~C_AO_DEA () { }
  C_AO_DEA ()
  {
    ao_name = "DEA";
    ao_desc = "Dolphin Echolocation Algorithm";
    ao_link = "https://www.mql5.com/ru/articles/18495";

    popSize = 100;    // NL - количество локаций (дельфинов)
    Re      = 2;      // эффективный радиус поиска
    Power   = 2.0;    // степень кривой сходимости
    PP1     = 1.0;    // фактор сходимости первой итерации

    ArrayResize (params, 4);

    params [0].name = "popSize"; params [0].val = popSize;
    params [1].name = "Re";      params [1].val = Re;
    params [2].name = "Power";   params [2].val = Power;
    params [3].name = "PP1";     params [3].val = PP1;
  }

  void SetParams ()
  {
    popSize = (int)params [0].val;
    Re      = (int)params [1].val;
    Power   = params      [2].val;
    PP1     = params      [3].val;

    // Проверка корректности параметров
    if (Re < 0) Re = 0;
    if (PP1 < 0.0) PP1 = 0.0;
    if (PP1 > 1.0) PP1 = 1.0;
    if (Power < 0.1) Power = 0.1;
  }

  bool Init (const double &rangeMinP  [],  // минимальные значения
             const double &rangeMaxP  [],  // максимальные значения
             const double &rangeStepP [],  // шаг изменения
             const int     epochsP = 0);   // количество эпох

  void Moving   ();
  void Revision ();

  //------------------------------------------------------------------
  int    Re;           // эффективный радиус поиска
  double Power;        // степень кривой сходимости
  double PP1;          // фактор сходимости первой итерации

  private: //---------------------------------------------------------
  double PP;           // предопределенная вероятность для текущей итерации
  int    currentEpoch; // текущая эпоха
  int    totalEpochs;  // общее количество эпох
  double coeffA;       // динамический коэффициент для выбора позиций

  S_Coordinate coordData []; // данные по координатам (альтернативы и AF)

  void CalculatePP ();
  void CalculateAccumulativeFitness ();
  void ResetAFforBestLocation ();
  void SelectNextLocations    ();
  int  FindNearestAlternative (int coord, double value);
  void CalculateCoefficientA  ();
};
//————————————————————————————————————————————————————————————————————

O método "Init" da classe "C_AO_DEA" executa a inicialização do algoritmo DEA. Ele recebe como parâmetros de entrada os valores mínimos e máximos de cada variável, os passos de variação de cada variável e o número total de épocas para a otimização. Inicialmente, o método chama o método base "StandardInit" para realizar a inicialização padrão dos parâmetros gerais do algoritmo e, caso essa inicialização não seja bem-sucedida, retorna "false". Em seguida, são inicializadas as variáveis que acompanham a época atual e o total de épocas de execução do algoritmo.

Após isso, é criada a estrutura de dados "coordData" para armazenar informações sobre cada coordenada, variável, do espaço de busca. Para cada coordenada, é determinado o número de valores alternativos possíveis. Se para a coordenada for definido um passo de variação, o número de alternativas é calculado com base nos limites e no passo. Se o passo não for definido, igual a zero, considera-se que a coordenada é contínua e, para ela, é estabelecido um número fixo de alternativas.

Em seguida, é realizada a verificação e, se necessário, o ajuste do parâmetro "Re", raio de busca, para que não exceda um quarto do número de alternativas para cada coordenada. Depois disso, é alocada memória para armazenar os valores alternativos de cada coordenada.

Ao final, um laço preenche o array de valores alternativos para cada coordenada, distribuindo-os uniformemente entre os valores mínimo e máximo. Se o passo estiver definido, os valores alternativos são calculados utilizando esse passo. Se o passo não estiver definido, utiliza-se a discretização do espaço entre os limites especificados. Além disso, para cada alternativa, o valor associado "AF", "Accumulative Fitness", adaptabilidade acumulada, é inicializado com zero. Se todas as etapas de inicialização forem concluídas com sucesso, o método retorna "true".

//————————————————————————————————————————————————————————————————————
//--- Инициализация
bool C_AO_DEA::Init (const double &rangeMinP  [],
                     const double &rangeMaxP  [],
                     const double &rangeStepP [],
                     const int epochsP = 0)
{
  if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;

  //------------------------------------------------------------------
  currentEpoch = 0;
  totalEpochs  = epochsP;

  // Инициализация структуры данных для координат
  ArrayResize (coordData, coords);

  // Создаем альтернативы для каждой координаты
  for (int c = 0; c < coords; c++)
  {
    if (rangeStep [c] != 0)
    {
      coordData [c].count = (int)((rangeMax [c] - rangeMin [c]) / rangeStep [c]) + 1;
    }
    else
    {
      coordData [c].count = 500;
    }

    // Проверяем, что Re не слишком большой для количества альтернатив
    if (Re > coordData [c].count / 4) Re = coordData [c].count / 4;

    ArrayResize (coordData [c].alt, coordData [c].count);

    // Заполняем альтернативы
    for (int i = 0; i < coordData [c].count; i++)
    {
      if (rangeStep [c] != 0)
      {
        coordData [c].alt [i].value = rangeMin [c] + i * rangeStep [c];
      }
      else
      {
        coordData [c].alt [i].value = rangeMin [c] + (rangeMax [c] - rangeMin [c]) * i / (coordData [c].count - 1);
      }
      coordData [c].alt [i].AF = 0.0;
    }
  }

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

O método "Moving" implementa uma etapa principal do algoritmo DEA, correspondente a uma iteração específica do processo de otimização. Se for a primeira iteração, identificado pelo sinalizador "revision", ocorre a atribuição aleatória inicial das coordenadas da população. Para cada indivíduo, elemento da população, e para cada variável dentro do intervalo, são definidos valores aleatórios. Esses valores passam por correção considerando os limites e o passo de variação, garantindo soluções válidas. Em seguida, o sinalizador é ajustado indicando que a inicialização foi concluída, e o método encerra sua execução nesse ciclo.

Quando a inicialização já foi realizada, o contador da época, iteração, atual é incrementado em uma unidade. Em seguida, são executadas as etapas-chave do algoritmo: são determinados os indicadores de desempenho para cada solução da população atual, mostrando o quão bem elas atendem ao problema. É calculado o coeficiente "a". Com base nos indicadores de qualidade, é determinada a medida geral de adaptabilidade de cada solução e, para ela, o índice "AF" é redefinido, permitindo concentrar a busca na região das melhores soluções. Com base nas informações atuais e nos coeficientes calculados, são selecionadas as próximas localizações, posições, para representar e deslocar as soluções no espaço de busca.

De modo geral, o método "Moving" implementa um ciclo de iteração do algoritmo DEA, executando sequencialmente as etapas principais de atualização e melhoria das soluções no processo de busca pelo ótimo.

//————————————————————————————————————————————————————————————————————
//--- Основной шаг алгоритма (согласно Algorithm 1)
void C_AO_DEA::Moving ()
{
  // Начальная инициализация
  if (!revision)
  {
    for (int p = 0; p < popSize; p++)
    {
      for (int c = 0; c < coords; c++)
      {
        a [p].c  [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]);
        a [p].c  [c] = u.SeInDiSp (a [p].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
        a [p].cB [c] = a [p].c [c];
      }
    }

    revision = true;
    return;
  }

  // Увеличиваем счетчик эпох
  currentEpoch++;

  // Шаги алгоритма DEA согласно Algorithm 1:

  // 1. Вычисляем PP для текущей итерации
  CalculatePP ();

  // 2. Рассчитываем динамический коэффициент a
  CalculateCoefficientA ();

  // 3. Вычисляем накопленную пригодность
  CalculateAccumulativeFitness ();

  // 4. Находим лучшую локацию и сбрасываем для нее AF
  ResetAFforBestLocation ();

  // 5. Выбираем следующие позиции
  SelectNextLocations ();
}
//————————————————————————————————————————————————————————————————————

O próximo método, "CalculatePP", é responsável pelo cálculo da probabilidade predeterminada, PP, utilizada no processo de tomada de decisões dentro do algoritmo. Se o número total de épocas, iterações, for igual ou inferior a um, a probabilidade é definida como o valor inicial previamente especificado, PP1. Nesse caso, nenhum cálculo adicional é necessário, e o método é finalizado.

Se o número de épocas for maior que um, o valor de "PP" é calculado com base na fórmula especificada, que leva em consideração a época atual e inclui a seguinte lógica: calcula-se uma potência que é função da época atual elevada a (Power), e desse valor subtrai-se um; de forma análoga, calcula-se a potência para o número total de épocas.

O valor de "PP" é atualizado por uma fórmula que tende gradualmente a 1, levando em conta o progresso atual ao longo das épocas. Especificamente, adiciona-se ao valor inicial "PP1" uma parte proporcional ao progresso, ajustada por meio da potência e dos parâmetros definidos "Power" e "totalEpochs". Se o indicador total da potência for diferente de zero, realiza-se a divisão para obter a probabilidade atual; caso contrário, o valor permanece igual ao inicial "PP1".

Como resultado, o método altera dinamicamente o valor da probabilidade ao longo da execução do algoritmo, garantindo o equilíbrio entre o valor inicial e um valor mais "progressivo" à medida que as épocas avançam.

//————————————————————————————————————————————————————————————————————
//--- Вычисление предопределенной вероятности (согласно формуле 5)
void C_AO_DEA::CalculatePP ()
{
  if (totalEpochs <= 1)
  {
    PP = PP1;
    return;
  }

  // PP = PP1 + (1 - PP1) * ((Loop^Power - 1) / (LoopsNumber^Power - 1))
  double iterPower  = MathPow ((double)currentEpoch, Power) - 1.0;
  double totalPower = MathPow ((double)totalEpochs,  Power) - 1.0;

  if (totalPower != 0)
  {
    PP = PP1 + (1.0 - PP1) * iterPower / totalPower;
  }
  else
  {
    PP = PP1;
  }
}
//————————————————————————————————————————————————————————————————————

Em seguida, o método apresentado "CalculateCoefficientA" é destinado ao cálculo do coeficiente dinâmico "a", utilizado no algoritmo DEA para regular o processo de busca. O método percorre toda a população atual de soluções e, para cada solução, calcula a diferença entre a adaptabilidade máxima possível "fB" e a adaptabilidade atual da solução específica (a[i].f). Essas diferenças são acumuladas em uma soma.

Após a acumulação da soma dos valores, o coeficiente "a" é obtido como a razão entre a diferença de "fB" e a adaptabilidade mínima "fW" e a soma calculada. Isso permite determinar um coeficiente dinâmico que se adapta ao estado atual da população e ajuda a equilibrar a velocidade de convergência ou a diversificação do espaço de busca.

    Dessa forma, o método cria um parâmetro de escala que leva em consideração a distribuição das adaptabilidades das soluções e influencia a estratégia de atualização e deslocamento nas iterações subsequentes do algoritmo.

    //————————————————————————————————————————————————————————————————————
    //--- Расчет динамического коэффициента a
    void C_AO_DEA::CalculateCoefficientA ()
    {
      double sumFitness = 0.0;
    
      for (int i = 0; i < popSize; i++)
      {
        sumFitness += fB - a [i].f;
      }
    
      coeffA = (fB - fW) / sumFitness;
    }
    //————————————————————————————————————————————————————————————————————

    O método "FindNearestAlternative" é destinado a encontrar a alternativa mais próxima de um valor especificado dentro de uma determinada coordenada e recebe dois argumentos: o índice da coordenada "coord" e o valor "value", para o qual se deseja encontrar a alternativa mais próxima. São inicializados e definidos os valores iniciais de "nearest", índice da alternativa mais próxima, e "minDist", distância mínima.

    Um laço percorre todas as alternativas associadas à coordenada especificada "coord". Para cada alternativa, calcula-se a distância entre o valor fornecido "value" e o valor da alternativa, coordData[coord].alt[i].value, e, se a distância calculada for menor que a distância mínima atual, "minDist", então "minDist" é atualizado com o novo valor menor e "nearest" é atualizado com o índice da alternativa atual.

    Após a conclusão do laço, é retornado o índice da alternativa que se mostrou mais próxima do valor especificado "value" dentro da coordenada indicada. Assim, o método determina qual das alternativas disponíveis para a coordenada especificada está mais próxima do valor real informado.

    //————————————————————————————————————————————————————————————————————
    //--- Поиск ближайшей альтернативы
    int C_AO_DEA::FindNearestAlternative (int coord, double value)
    {
      int nearest = 0;
      double minDist = DBL_MAX;
    
      for (int i = 0; i < coordData [coord].count; i++)
      {
        double dist = MathAbs (value - coordData [coord].alt [i].value);
        if (dist < minDist)
        {
          minDist = dist;
          nearest = i;
        }
      }
    
      return nearest;
    }
    //————————————————————————————————————————————————————————————————————

    O método "CalculateAccumulatetiveFitness" é destinado ao cálculo da adaptabilidade acumulada, AF, das alternativas, de acordo com o "Algorithm 2". Antes do início dos cálculos, todos os valores de adaptabilidade acumulada para cada alternativa em cada coordenada são limpos e definidos como zero. É determinado o intervalo de adaptabilidades na população atual de soluções, calculado como a diferença entre a adaptabilidade máxima possível, fB, e a mínima, fW.

    Em seguida, para cada agente, golfinho, sua adaptabilidade é normalizada em relação ao intervalo, e, para cada coordenada de busca, é identificada a alternativa mais próxima, e dentro do raio "Re" ao redor dessa alternativa, ocorre a atualização da adaptabilidade acumulada das alternativas, levando em conta o caráter reflexivo das fronteiras. Isso é realizado por meio da adição ponderada de contribuições, onde os pesos são formados com base na distância até a alternativa mais próxima, considerando os limites com reflexão, e incluem um coeficiente relacionado ao passo atual dentro do raio "Re".

    Como resultado do método, para cada alternativa em cada coordenada, são formados valores acumulados de adaptabilidade que consideram a contribuição das alternativas vizinhas.

    //————————————————————————————————————————————————————————————————————
    //--- Вычисление накопленной пригодности (согласно Algorithm 2)
    void C_AO_DEA::CalculateAccumulativeFitness ()
    {
      // Очищаем накопленную пригодность для всех альтернатив
      for (int c = 0; c < coords; c++)
      {
        for (int i = 0; i < coordData [c].count; i++)
        {
          coordData [c].alt [i].AF = 0.0;
        }
      }
    
      double rangeFF = fB - fW;
      if (rangeFF == 0.0) rangeFF = DBL_EPSILON;
    
      // Для каждого агента (дельфина)
      for (int i = 0; i < popSize; i++)
      {
        // Нормализуем fitness для данного агента
        double normalizedFitness = (a [i].f - fW) / rangeFF;
    
        for (int c = 0; c < coords; c++)
        {
          // Находим ближайшую альтернативу для текущей координаты
          int nearestAlt = FindNearestAlternative (c, a [i].c [c]);
    
          // Обновляем накопленную пригодность в радиусе Re
          // Согласно Algorithm 2: AF(A+k)j = (1/Re) * (Re - |k|) * fitness(i) + AF(A+k)j
          for (int k = -Re; k <= Re; k++)
          {
            int altIndex = nearestAlt + k;
    
            // Проверка границ с учетом отражения (reflective characteristic)
            if (altIndex < 0)
            {
              altIndex = -altIndex; // отражение от нижней границы
            }
            else if (altIndex >= coordData [c].count)
            {
              altIndex = 2 * (coordData [c].count - 1) - altIndex; // отражение от верхней границы
            }
    
            if (altIndex >= 0 && altIndex < coordData [c].count)
            {
              double weight = (1.0 / (double)(Re + 1)) * (Re - MathAbs (k) + 1);
              coordData [c].alt [altIndex].AF += weight * normalizedFitness;
            }
          }
        }
      }
    
      // Добавляем малое значение epsilon ко всем AF для избежания нулевых вероятностей
      double epsilon = 0.0001;
      for (int c = 0; c < coords; c++)
      {
        for (int i = 0; i < coordData [c].count; i++)
        {
          coordData [c].alt [i].AF += epsilon;
        }
      }
    }
    //————————————————————————————————————————————————————————————————————
    

    O método "ResetAFforBestLocation" é destinado a redefinir a adaptabilidade acumulada, AF, das alternativas correspondentes à localização da melhor solução, agente, na população. Inicialmente, o método determina o índice da melhor solução, agente, na população atual. Ele percorre todas as soluções, identificando aquela com o valor máximo de adaptabilidade, fitness. O índice da solução com adaptabilidade máxima é armazenado na variável "bestIndex".

    Para cada coordenada "c" da melhor solução, o método determina a alternativa mais próxima do valor da coordenada da melhor solução nessa coordenada, utilizando a função "FindNearestAlternative", e, se a alternativa encontrada existir, isto é, se o índice estiver dentro dos limites válidos, o valor da adaptabilidade acumulada "AF" dessa alternativa específica é redefinido para zero.

    Assim, o método redefine o "AF" apenas para as alternativas que correspondem mais precisamente às coordenadas da melhor solução. Isso é feito para reduzir a influência dessas alternativas nas etapas subsequentes da busca, potencialmente estimulando a diversificação de outras regiões do espaço de busca.

    Como resultado, as adaptabilidades das coordenadas que mais correspondem à melhor solução são "zeradas", redefinidas, a fim de estimular a busca por outras soluções possivelmente mais ótimas.

    //————————————————————————————————————————————————————————————————————
    //--- Сброс AF для лучшей локации (согласно Algorithm 3)
    void C_AO_DEA::ResetAFforBestLocation ()
    {
      // Находим индекс лучшего решения
      int bestIndex = 0;
      double bestFitness = a [0].f;
    
      // Ищем решение с максимальным fitness (т.к. мы всегда максимизируем нормализованный fitness)
      for (int i = 1; i < popSize; i++)
      {
        if (a [i].f > bestFitness)
        {
          bestFitness = a [i].f;
          bestIndex = i;
        }
      }
    
      // Обнуляем AF для ВСЕХ альтернатив, соответствующих координатам лучшего решения
      for (int c = 0; c < coords; c++)
      {
        // Находим ближайшую альтернативу к координате лучшего решения
        int nearestAlt = FindNearestAlternative (c, a [bestIndex].c [c]);
    
        // Обнуляем AF только для этой альтернативы
        if (nearestAlt >= 0 && nearestAlt < coordData [c].count)
        {
          coordData [c].alt [nearestAlt].AF = 0.0;
        }
      }
    }
    //————————————————————————————————————————————————————————————————————

    O método "SelectNextLocations" é destinado à seleção da próxima posição para cada solução da população, para cada golfinho, com base em considerações probabilísticas e levando em conta tanto a adaptabilidade acumulada, AF, quanto a estratégia de preservação da melhor posição. O método inicialmente determina a melhor solução na população atual com base no valor de sua adaptabilidade. O índice da melhor solução é armazenado para uso posterior.

    Para cada solução e para cada uma de suas coordenadas, é executado o seguinte conjunto de ações: se a solução atual for a melhor e um número aleatório for menor que a probabilidade "PP", a coordenada atual dessa solução é mantida sem alterações. Isso preserva a melhor solução anterior; entretanto, se a solução atual não for a melhor e a probabilidade "PP" não for ativada, então todos os valores "AF" das alternativas na coordenada atual são somados e, se a soma total de "AF" for maior que um pequeno valor, epsilon, o que indica a presença de valores de adaptabilidade não nulos, executa-se a roleta: um número aleatório é selecionado proporcionalmente à soma de "AF", e a coordenada da solução é escolhida com base na soma cumulativa dos "AF" das alternativas, permitindo que as soluções se desloquem para regiões com maior adaptabilidade.

    Se a soma de "AF" for próxima de zero, isto é, todos os valores de "AF" forem muito pequenos, realiza-se busca local caso um número aleatório seja menor que o coeficiente dinâmico "coeffA". Nesse caso, é escolhido um deslocamento aleatório dentro do intervalo (-Re...+Re) em relação ao valor atual, e a coordenada é atualizada para o valor alternativo mais próximo, considerando os limites.

    A busca global, escolha aleatória, ocorre se o número aleatório for maior que "coeffA". Nesse caso, é selecionada uma alternativa completamente aleatória para a coordenada. Ao final da execução do método, o valor obtido para a coordenada é limitado ao intervalo permitido, rangeMin, rangeMax, e discretizado com o passo definido "rangeStep", garantindo que o valor esteja dentro dos limites válidos e corresponda a valores permitidos.

    Como resultado desse método, as coordenadas de cada solução são atualizadas levando em conta os pesos probabilísticos baseados na adaptabilidade acumulada, a estratégia "PP", preservação das melhores, e a busca dinâmica local e global, o que permite ao algoritmo explorar de forma eficiente o espaço de busca e procurar soluções ótimas.

    //————————————————————————————————————————————————————————————————————
    //--- Выбор следующих позиций на основе вероятностей
    void C_AO_DEA::SelectNextLocations ()
    {
      // Сначала находим индекс лучшего решения
      int bestIndex = 0;
      double bestFitness = a [0].f;
    
      for (int i = 1; i < popSize; i++)
      {
        if (a [i].f > bestFitness)
        {
          bestFitness = a [i].f;
          bestIndex = i;
        }
      }
    
      for (int i = 0; i < popSize; i++)
      {
        for (int c = 0; c < coords; c++)
        {
          // Для лучшей позиции применяем PP
          if (i == bestIndex && u.RNDprobab () < PP)
          {
            // Сохраняем текущее значение координаты лучшего решения с вероятностью PP
            continue;
          }
    
          // Выбираем на основе накопленной пригодности
          double totalAF = 0.0;
          for (int alt = 0; alt < coordData [c].count; alt++)
          {
            totalAF += coordData [c].alt [alt].AF;
          }
    
          if (totalAF > DBL_EPSILON) // Проверяем, что есть ненулевые AF
          {
            // Выбор альтернативы на основе рулетки
            double rnd = u.RNDprobab () * totalAF;
            double cumSum = 0.0;
    
            for (int alt = 0; alt < coordData [c].count; alt++)
            {
              cumSum += coordData [c].alt [alt].AF;
              if (cumSum >= rnd)
              {
                a [i].c [c] = coordData [c].alt [alt].value;
                break;
              }
            }
          }
          else
          {
            // Если все AF практически нулевые, используем случайный выбор
            // с динамическим коэффициентом coeffA для вероятности локального поиска
            if (u.RNDprobab () < coeffA) // Используем динамический коэффициент
            {
              // Локальный поиск - остаемся рядом с текущей позицией
              int currentAlt = FindNearestAlternative (c, a [i].c [c]);
              int shift = u.RNDminusOne (2 * Re + 1) - Re; // случайное смещение в пределах Re
              int newAlt = currentAlt + shift;
    
              // Проверка границ
              if (newAlt < 0) newAlt = 0;
              if (newAlt >= coordData [c].count) newAlt = coordData [c].count - 1;
    
              a [i].c [c] = coordData [c].alt [newAlt].value;
            }
            else
            {
              // Глобальный поиск - полностью случайный выбор
              int randAlt = u.RNDminusOne (coordData [c].count);
              a [i].c [c] = coordData [c].alt [randAlt].value;
            }
          }
    
          // Проверка границ и дискретизация
          a [i].c [c] = u.SeInDiSp (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
        }
      }
    }
    //————————————————————————————————————————————————————————————————————

    O método "Revision" serve para atualizar as informações sobre as melhores e piores soluções na população atual. Define-se o índice da melhor solução e à variável que armazena o melhor fitness é atribuído inicialmente o valor do pior da população atual. Isso cria um estado inicial para a busca de novos extremos. Todas as soluções da população atual são então percorridas: é identificada a solução com o valor máximo de fitness, a melhor solução. Seu valor é armazenado e o índice correspondente é atualizado. Também é identificada a solução com o valor mínimo de fitness, a pior solução. Se uma solução realmente melhor for encontrada, suas coordenadas são copiadas para um array ou variável especial destinada a armazenar a melhor solução atual.

    Como resultado da execução do método, em cada momento são conhecidas com precisão as coordenadas da melhor e da pior solução na população. Isso permite ao algoritmo acompanhar a dinâmica da busca e utilizar esses dados na tomada de decisões para aprimorar o processo de procura por soluções ótimas.

    //————————————————————————————————————————————————————————————————————
    //--- Обновление лучшего решения
    void C_AO_DEA::Revision ()
    {
      int bestIND = -1;
      fW = fB;
    
      // Находим лучшее и худшее решения в текущей популяции
      for (int i = 0; i < popSize; i++)
      {
        // Обновляем лучшее решение
        if (a [i].f > fB)
        {
          fB = a [i].f;
          bestIND = i;
        }
    
        // Обновляем худшее решение
        if (a [i].f < fW)
        {
          fW = a [i].f;
        }
      }
    
      // Копируем координаты лучшего решения
      if (bestIND != -1)
      {
        ArrayCopy (cB, a [bestIND].c, 0, 0, WHOLE_ARRAY);
      }
    }
    //————————————————————————————————————————————————————————————————————


    Resultados dos testes

    Agora vamos observar os resultados. É possível destacar imediatamente que o algoritmo lida de forma excelente e rápida com diferentes tipos de tarefas.

    DEA|Dolphin Echolocation Algorithm|100.0|2.0|2.0|1.0|

    =============================
    5 Hilly's; Func runs: 10000; result: 0.7599517883429889
    25 Hilly's; Func runs: 10000; result: 0.6757192867862007
    500 Hilly's; Func runs: 10000; result: 0.34170057553968197
    =============================
    5 Forest's; Func runs: 10000; result: 0.8958173952258406
    25 Forest's; Func runs: 10000; result: 0.6422393144820473
    500 Forest's; Func runs: 10000; result: 0.23940903266305935
    =============================
    5 Megacity's; Func runs: 10000; result: 0.6153846153846154
    25 Megacity's; Func runs: 10000; result: 0.4403076923076923
    500 Megacity's; Func runs: 10000; result: 0.15115384615384736
    =============================
    All score: 4.76168 (52.91%)

    Na visualização, nota-se dispersão de resultados nas funções de baixa dimensionalidade, verde, e bons resultados nas funções de dimensionalidade média, azul.

    Hilly

    DEA na função de teste Hilly

    Forest

    DEA na função de teste Forest

    Megacity

    DEA na função de teste Megacity

    De acordo com os resultados obtidos, o algoritmo DEA ocupa a 25ª posição na tabela classificatória.

    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 BOAm billiards optimization algorithm M 0,95757 0,82599 0,25235 2,03590 1,00000 0,90036 0,30502 2,20538 0,73538 0,52523 0,09563 1,35625 5,598 62,19
    9 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
    10 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
    11 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
    12 BBO biogeography based optimization 0,94912 0,69456 0,35031 1,99399 0,93820 0,67365 0,25682 1,86867 0,74615 0,48277 0,17369 1,40261 5,265 58,50
    13 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
    14 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
    15 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
    16 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
    17 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
    18 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
    19 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
    20 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
    21 SRA successful restaurateur algorithm (joo) 0,96883 0,63455 0,29217 1,89555 0,94637 0,55506 0,19124 1,69267 0,74923 0,44031 0,12526 1,31480 4,903 54,48
    22 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
    23 BIO blood inheritance optimization (joo) 0,81568 0,65336 0,30877 1,77781 0,89937 0,65319 0,21760 1,77016 0,67846 0,47631 0,13902 1,29378 4,842 53,80
    24 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
    25 DEA dolphin_echolocation_algorithm 0,75995 0,67572 0,34171 1,77738 0,89582 0,64223 0,23941 1,77746 0,61538 0,44031 0,15115 1,20684 4,762 52,91
    26 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
    27 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
    28 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
    29 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
    30 (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
    31 FBA fractal-based Algorithm 0,79000 0,65134 0,28965 1,73099 0,87158 0,56823 0,18877 1,62858 0,61077 0,46062 0,12398 1,19537 4,555 50,61
    32 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
    33 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
    34 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
    35 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
    36 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
    37 CAm camel algorithm M 0,78684 0,56042 0,35133 1,69859 0,82772 0,56041 0,24336 1,63149 0,64846 0,33092 0,13418 1,11356 4,444 49,37
    38 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
    39 CMAES covariance_matrix_adaptation_evolution_strategy 0,76258 0,72089 0,00000 1,48347 0,82056 0,79616 0,00000 1,61672 0,75846 0,49077 0,00000 1,24923 4,349 48,33
    40 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
    41 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
    42 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
    43 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
    44 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
    45 CGO chaos game optimization 0,57256 0,37158 0,32018 1,26432 0,61176 0,61931 0,62161 1,85267 0,37538 0,21923 0,19028 0,78490 3,902 43,35
    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

    As principais vantagens do algoritmo foram: controle adaptativo da busca, a probabilidade predeterminada aumenta gradualmente, deslocando o equilíbrio da diversificação para a intensificação ou foco; adaptação dinâmica, memória coletiva, a adaptabilidade acumulada preserva e propaga informações sobre áreas promissoras; mecanismo de diversidade, a redefinição das informações para as melhores posições estimula a exploração de novas regiões.

    A força do algoritmo reside em sua natureza adaptativa. O coeficiente dinâmico o torna "vivo", ele sente o pulso da população e se ajusta ao ritmo da tarefa. Quando os golfinhos estão dispersos pelo oceano da busca, o algoritmo incentiva a exploração local. Quando começam a convergir para o objetivo, ele os impulsiona para novos horizontes, impedindo que fiquem presos na ilusão de um sucesso local.

    A adaptabilidade acumulada é a memória coletiva do grupo, onde cada descoberta deixa um eco no espaço de soluções. Mas, diferentemente de um simples acúmulo, o algoritmo sabe esquecer, a redefinição das melhores posições leva, de forma paradoxal, a descobertas ainda melhores.

    Isso não é apenas uma metáfora, é uma filosofia de otimização, onde cada clique do ecolocalizador carrega informação sobre o espaço de possibilidades.

    tab

    Figura 2. Graduação de cores dos algoritmos nos testes correspondentes

    chart

    Figura 3. 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, no arquivo há o script para cálculo da tabela classificatória)

    Prós e contras do algoritmo DEA:

    Prós:

    1. Boa convergência em funções de média e alta dimensionalidade.
    2. Poucos parâmetros externos.

    Contras:

    1. Há certa tendência a ficar preso em tarefas de baixa dimensionalidade.
    2. Alto consumo de recursos em funções de grande dimensionalidade.

    Um arquivo compactado 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 baseiam-se nos resultados dos experimentos realizados.


    Programas utilizados no artigo

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

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

    Arquivos anexados |
    DEA.ZIP (302.09 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.
    Aplicação do modelo Grey na análise técnica de séries temporais financeiras Aplicação do modelo Grey na análise técnica de séries temporais financeiras
    Este artigo é dedicado ao estudo do modelo Grey, uma ferramenta promissora, capaz de ampliar as possibilidades do trader. Vamos considerar algumas formas de aplicar esse modelo na análise técnica e na construção de estratégias de negociação.
    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.
    Identificação e classificação de padrões fractais por meio de aprendizado de máquina Identificação e classificação de padrões fractais por meio de aprendizado de máquina
    Neste artigo abordaremos o tema intrigante da análise fractal e da previsão de mercados por meio de aprendizado de máquina. Estes são apenas os primeiros passos no caminho para o estudo das diversas estruturas fractais que se formam nos gráficos de cotações financeiras. Utilizaremos a correlação para a busca de padrões e o algoritmo CatBoost para a classificação desses padrões.