Русский Português
preview
Algoritmo de ecolocalización de delfines — Dolphin Echolocation Algorithm (DEA)

Algoritmo de ecolocalización de delfines — Dolphin Echolocation Algorithm (DEA)

MetaTrader 5Trading |
98 0
Andrey Dik
Andrey Dik

Contenido

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


Introducción

Con cada nuevo artículo, nos acercamos más a nuestro objetivo: encontrar un algoritmo adecuado para resolver problemas de optimización con nuestros robots de trading. Hoy exploraremos un nuevo algoritmo inspirado en la naturaleza, basado en las capacidades de ecolocalización de algunos animales marinos.

Imagine un delfín cazando en las oscuras profundidades del océano. La visibilidad es prácticamente nula, pero esto no le impide encontrar presas con éxito. El secreto reside en una habilidad asombrosa: el delfín emite una serie de clics y, usando el eco reflejado, crea una imagen precisa del espacio circundante. Un dato interesante es que la frecuencia de estos clics varía: durante la búsqueda general se producen clics poco frecuentes, aumentando cuando el objetivo está cerca. Precisamente esta estrategia inusual constituye la base del algoritmo de optimización DEA (Dolphin Echolocation Algorithm).

En el mundo de la optimización, con frecuencia nos enfrentamos a un desafío similar: encontrar la mejor solución en un vasto espacio de posibilidades sin tener una visión completa del panorama. Igual que los delfines en el océano, comenzamos con una búsqueda amplia y poco a poco nos centramos en las zonas más prometedoras.


Implementación del algoritmo

Para comprender mejor cómo funciona el algoritmo, imaginemos la siguiente situación. Usted y sus amigos están buscando oro en una gran playa, equipados con detectores de metales. Al inicio de la búsqueda, conviene explorar toda la zona; de esta forma, tendrá más posibilidades de encontrar algo interesante. Pero en cuanto uno de ustedes oye una señal fuerte, informa a los demás, y poco a poco todo el equipo empieza a concentrarse en los lugares más prometedores. Al final de la búsqueda, todos están cavando cerca de la señal más fuerte. Esta es la esencia del algoritmo de ecolocalización de los delfines.

En el algoritmo, el papel de los delfines lo desempeñan los agentes de búsqueda, es decir, los puntos en el espacio de soluciones. Cada uno de estos "delfines" representa una posible solución al problema. Por ejemplo, si buscamos el mínimo de una función simple y = x², entonces un delfín puede estar en el punto x = -3 (donde y = 9), otro en el punto x = 1 (donde y = 1), mientras que el tercero terminará aleatoriamente en el punto x = 0 (donde y = 0); este será nuestro campeón.

Pero, ¿cómo intercambian información los delfines? Aquí es donde entra en juego el concepto de radio efectivo, indicado como "Re". Piense en lo lejos que se extiende la luz de una linterna. Con Re = 1 tenemos un haz estrecho que ilumina solo el área inmediata. Con Re = 3, la luz se dispersa más, cubriendo una mayor superficie. Y con Re = 5 y superiores, prácticamente obtenemos un foco de luz. En el contexto del algoritmo, esto significa que la información sobre una buena solución se difunde a las áreas vecinas, y, además, la fuerza de esta influencia disminuye con la distancia.

Toda esta información se acumula como un "mapa de zonas prometedoras", que el algoritmo denomina aptitud acumulada "AF". Imagine un mapa de calor de una ciudad, donde las zonas "calientes" indican áreas de alta actividad. En nuestro caso, las zonas "calientes" son las áreas donde los delfines han encontrado buenas soluciones (presas). Cuantos más hallazgos exitosos haya en un área determinada, más "caliente" se volverá, atrayendo a otros delfines.

Sin embargo, el algoritmo es más inteligente que una simple acumulación en un solo lugar. Este usa un parámetro llamado probabilidad predeterminada "PP" que controla el equilibrio entre la exploración de nuevas áreas y la explotación de los buenos lugares ya encontrados. Al principio, cuando "PP" es baja, alrededor de 0,1, el algoritmo experimenta, y luego, cuando "PP" está alrededor de 0,5, se basa más en enfoques probados, y ya antes de que "PP" se acerque a 1, utiliza solo los métodos más efectivos.

Veamos un ejemplo concreto de cómo funciona el algoritmo. Digamos que estamos buscando el punto más alto en una zona montañosa. Al comienzo de la búsqueda, nuestros delfines se encuentran dispersos al azar por toda la zona: algunos en el valle, otros en las laderas y algunos tienen la suerte de encontrarse en la cima de una colina. Tras evaluar la altura de cada posición, el algoritmo determina que el delfín que está en la parte superior ha encontrado el mejor lugar. Ahora sucede algo interesante: el área alrededor de este delfín afortunado se vuelve más atractiva para los demás, pero (y este es el punto clave) el punto exacto donde se encuentra el líder se anula temporalmente, lo que obliga a otros delfines a explorar zonas cercanas en lugar de congregarse en un solo lugar. Este enfoque ayuda a evitar la convergencia prematura y a encontrar otras soluciones potencialmente buenas.

A medida que el algoritmo opera, la imagen cambia. En la iteración 50, observamos que los delfines comienzan a agruparse en zonas montañosas, pero aún conservan cierta diversidad. En la iteración número 100, la mayoría de ellos se concentran en los puntos más altos del terreno, y en la fase final, todos los delfines se centran en el máximo global. La eficiencia del algoritmo depende de la correcta configuración de los parámetros.

La elección del radio efectivo "Re" es vital para lograr un equilibrio entre la búsqueda local y la global. Con Re = 1 obtenemos una búsqueda muy precisa pero muy específica, como si estuviéramos buscando una aguja en un pajar con la ayuda de una lupa. Aumentar el valor de "Re" a 3-4 ofrece un enfoque equilibrado, similar a la búsqueda con una linterna. Y cuando "Re" es mayor que 5, el algoritmo funciona como un foco, abarcando áreas más grandes, pero perdiendo precisión.

El parámetro "Power" determina la brusquedad con la que el algoritmo pasa de la exploración a la explotación. Con un valor Power igual a 1, la transición es suave y gradual. Un valor Power igual a 2 (recomendado) posibilita una transición más pronunciada, mientras que los valores Power de 3 o superiores producen una transición más brusca, lo que puede ser útil para ciertos tipos de tareas.

La probabilidad inicial "PP1" establece el equilibrio inicial entre exploración y explotación. Un valor bajo (0,05) implica una exploración agresiva del espacio, el valor estándar de 0,1 ofrece un buen equilibrio y un valor alto (0,5) conlleva una rápida concentración en las soluciones encontradas.

La principal ventaja del DEA es su adaptabilidad: el algoritmo ajusta automáticamente el equilibrio entre la exploración de nuevas áreas y la profundización en las zonas prometedoras. Sin embargo, sigue resultando relativamente sencillo, ya que solo requiere configurar cuatro ajustes. El mecanismo de propagación de la información a través de la aptitud acumulada permite el uso eficiente del conocimiento sobre el espacio de búsqueda, mientras que la puesta a cero de AF para las mejores posiciones ayuda a evitar el atasco en óptimos locales.

Obviamente, el algoritmo tiene algunas limitaciones. Se requiere memoria adicional para almacenar la aptitud acumulada de todas las alternativas, lo cual puede ser un problema para espacios de búsqueda muy grandes. Y quizás una cosa más: la eficiencia del algoritmo depende de la elección correcta del radio efectivo "Re". Ahora le mostraremos un esquema del funcionamiento del algoritmo:

dea_algorithm

Figura 1. Ilustración del algoritmo DEA en funcionamiento.

 Las etapas principales del algoritmo DEA se muestran en la figura:

  1. Exploración inicial — delfines (agentes de búsqueda) en posiciones aleatorias con radio de ecolocalización "Re".
  2. Distribución de la aptitud acumulada (AF) — cómo se acumula la "AF" alrededor de las posiciones de los delfines.
  3. El proceso de convergencia tiene tres subetapas que muestran la transición de la exploración a la explotación.

La ilustración nos ayuda a comprender cómo los delfines usan la ecolocalización para encontrar el punto óptimo, cómo se difunde la información a través de la aptitud acumulada, cómo el parámetro "Re" afecta la amplitud de la búsqueda y cómo "PP" controla el equilibrio entre exploración y explotación. Conceptos clave — fórmulas para PP (probabilidad predeterminada) y AF. Esquema del algoritmo — pasos principales con un ciclo. Influencia del parámetro "Re" — visualización del radio de influencia estrecho, medio y amplio.

La combinación de colores en la figura es la siguiente: azul - delfines normales, rojo - la mejor solución, degradados azules - niveles de aptitud acumulativos, y gris - espacio de búsqueda. 

Ahora que tenemos una idea general del algoritmo, podemos escribir un pseudocódigo detallado. 

Parámetros de entrada:

  • Número de delfines (agentes de búsqueda)
  • Radio de ecolocalización efectivo
  • Grado de la curva de convergencia
  • Probabilidad predeterminada inicial
  • Límites del espacio de búsqueda y paso de discretización para cada dimensión.

Inicialización:

Creación de un espacio de alternativas:

  1. Para cada dimensión del espacio de búsqueda, generamos un conjunto de posibles alternativas.
  2. Si especificamos un paso de discretización, se crearán alternativas con este paso desde el mínimo hasta el máximo.
  3. Si no especificamos el paso, se genererán 500 alternativas distribuidas uniformemente.
  4. Comprobamos el radio efectivo: no deberá exceder una cuarta parte del número de alternativas.

Ubicación inicial de los delfines:

  1. Colocamos aleatoriamente a todos los delfines en el espacio de búsqueda.
  2. Para cada delfín, calculamos la calidad de su posición (aptitud).
  3. Inicializamos la aptitud acumulada a cero para todas las alternativas.

Ciclo de optimización principal:

Repetimos el proceso un número determinado de veces:

Etapa 1. Calculamos la probabilidad predeterminada

Calculamos la probabilidad de mantener la mejor posición en la iteración actual. Al inicio del proceso, esta probabilidad es igual al valor inicial, luego aumenta gradualmente según una función potencial hasta alcanzar la unidad al final de la optimización.

Etapa 2. Cálculo del coeficiente de adaptación dinámica

Calculamos el coeficiente que determina el equilibrio entre la búsqueda local y la global. El coeficiente es igual a la razón entre la diferencia entre la mejor y la peor solución y la suma de las desviaciones de todas las soluciones con respecto a la mejor. Si la población es diversa, el coeficiente será alto; si converge, será bajo.

Etapa 3. Acumulación de información sobre aptitud

Para cada delfín:

  • Normalizamos su aptitud en relación con el rango actual en la población.
  • Para cada coordenada, encontramos la alternativa más cercana a la posición del delfín.
  • Difundimos información de aptitud dentro del radio de ecolocalización de esta alternativa.
  • La intensidad de la influencia disminuye linealmente con la distancia al centro.
  • Aplicamos la reflexión en los límites del espacio para preservar la información.
  • Sumamos un pequeño valor a todas las aptitudes acumuladas para evitar probabilidades cero.

Etapa 4. Restablecimiento de la información para una mejor posición.

Encontramos el delfín con la mejor solución y restablecemos la aptitud acumulada para las alternativas correspondientes a sus coordenadas. Esto evitará que la búsqueda se concentre demasiado en un solo punto.

Etapa 5. Selección de nuevas posiciones

Para cada delfín y cada una de sus coordenadas:

  • Si este es el mejor delfín y existe posibilidad de guardar la posición, dejaremos la coordenada sin cambios.
  • De lo contrario, si se acumula información sobre la aptitud, seleccionaremos una nueva alternativa en proporción a esta información utilizando el método de la ruleta.
  • Si la información recopilada es incompleta o insuficiente:
    • Con una probabilidad igual al coeficiente dinámico, realizaremos una búsqueda local dentro del radio de ecolocalización.
    • De lo contrario, realizaremos una búsqueda global seleccionando una alternativa aleatoria.
  • Aplicamos restricciones y discretización del espacio de búsqueda.

Etapa 6. Evaluación de nuevas posiciones

Calculamos la aptitud de la solución para cada delfín en su nueva posición.

Etapa 7. Actualización de la información global

Actualizamos los registros de las mejores y peores soluciones de la población. Si se encuentra una solución mejor que el óptimo global actual, la guardaremos.

Finalización:

Tras completar todas las iteraciones, se retornará la mejor solución encontrada y su aptitud.

Pasemos directamente a la implementación del código del algoritmo DEA.

Concretamente, escribiremos la estructura "S_Alternative". Estará destinada a almacenar información sobre la alternativa en el proceso de toma de decisiones para la optimización y contiene "value", el valor que caracteriza a dicha alternativa, la evaluación de la eficiencia y AF, la aptitud acumulada (Accumulated Fitness) para esta alternativa, lo cual es necesario para evaluar la "calidad" de la alternativa cuando se requiere aplicar un proceso iterativo.

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

La estructura "S_Coordinate" está diseñada para representar un conjunto de alternativas asociadas a una coordenada específica; "alt" es un array de alternativas, cada una de las cuales se corresponde con una coordenada, mientras que "count" es una variable que indica el número actual de alternativas almacenadas en el array "alt".

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

A continuación, describiremos la clase que implementa directamente el algoritmo de optimización (DEA). La clase "C_AO_DEA" hereda de la clase básica "C_AO". Al crear un objeto de clase, se inicializan los parámetros principales del algoritmo:

  • popSize — inicializa el tamaño de la población (número de "delfines" o ubicaciones).
  • Re — establece el valor inicial del radio de búsqueda efectivo.
  • Power — especifica el grado de convergencia de la curva.
  • PP1 — inicializa el factor de convergencia para la primera iteración.
A continuación, se inicializa el array "params", que se usa para almacenar los parámetros de usuario del algoritmo. En él se copian los valores iniciales "popSize", "Re", "Power", "PP1" con los nombres correspondientes.

El método "SetParams" está diseñado para actualizar los parámetros internos del algoritmo según los valores escritos en el array "params". Tras extraer los valores "popSize", "Re", "Power" y "PP1", se realiza una comprobación de validación.

Métodos:

  • Init — está diseñado para inicializar el algoritmo, admitiendo los valores mínimos, máximos y pasos para cada parámetro, así como el número total de épocas (iteraciones).
  • Moving — es responsable de desplazar los "delfines" en el espacio de búsqueda; esto forma parte del ciclo principal de optimización.
  • Revision — ajusta las posiciones y los parámetros de la población después del movimiento.

Los siguientes campos se usan internamente para ejecutar el algoritmo y no son accesibles desde fuera de la clase.

  • PP — número de punto flotante que representa una probabilidad predefinida para la iteración actual, utilizado para decisiones estocásticas, currentEpoch es un valor que registra la época (iteración) actual del algoritmo.
  • totalEpochs — valor que almacena el número total de épocas programadas.
  • coeffA — coeficiente dinámico que se utiliza para seleccionar posiciones.
  • coordData — array de estructuras donde cada "S_Coordinate" contiene un array de alternativas y su número para una coordenada en particular. 
Métodos:
  • CalculatePP — se utiliza para calcular el valor "PP" (probabilidad predeterminada) en la iteración actual.
  • CalculateAccumulativeFitness — calcula la aptitud acumulada para cada alternativa.
  • ResetAFforBestLocation — restablece los valores de aptitud acumulados para las mejores ubicaciones.
  • SelectNextLocations — selecciona las siguientes ubicaciones para los delfines en función de su estado actual.
  • FindNearestAlternative — encuentra la alternativa más cercana en función de las coordenadas y el valor proporcionados.
  • CalculateCoefficientA — calcula el coeficiente dinámico "coeffA".

En general, esta clase "C_AO_DEA" está lista para ser usada para encontrar soluciones en espacios multidimensionales. Dispone de métodos públicos para inicializar y realizar los pasos principales de optimización, así como de métodos y datos privados que implementan la lógica interna del 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  ();
};
//————————————————————————————————————————————————————————————————————

El método "Init" de la clase "C_AO_DEA" inicializa el algoritmo (DEA). Obtiene como parámetros de entrada los valores mínimo y máximo de cada variable, los pasos para modificar cada variable y el número total de épocas a optimizar. El método primero llama al método básico "StandardInit" para realizar la inicialización estándar de los parámetros comunes del algoritmo y, si esta inicialización falla, devuelve "false". A continuación, se inicializan las variables que registran las épocas actuales y totales de la ejecución del algoritmo.

Tras esto, se crea una estructura de datos "coordData" para almacenar información sobre cada coordenada (variable) del espacio de búsqueda. Para cada coordenada, se determina el número de posibles valores alternativos. Si se indica un cambio escalonado para una coordenada, el número de alternativas se calculará en función de los límites y del escalón. Si no se especifica el paso (es igual a cero), se supondrá que la coordenada es continua y se establecerá un número fijo de alternativas para ella.

A continuación, se comprueba el parámetro "Re" (radio de búsqueda) y, si es necesario, se ajustará para que no supere un cuarto del número de alternativas para cada coordenada. Después de esto, se asigna memoria para almacenar valores alternativos para cada coordenada.

Finalmente, el ciclo rellena un array de valores alternativos para cada coordenada, distribuyéndolos uniformemente entre los valores mínimo y máximo. Si se especifica un paso, se calcularán valores alternativos utilizando ese paso. Si no se especifica el paso, se utilizará la discretización del espacio entre los límites especificados. Además, para cada alternativa, el valor "AF" ("Accumulative Fitness") asociado se inicializa a cero. Si todos los pasos de inicialización se completan correctamente, el método devolverá "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;
}
//————————————————————————————————————————————————————————————————————

El método "Moving" implementa un paso principal del algoritmo (DEA), que se corresponde con una determinada iteración del proceso de optimización. Si se trata de la primera iteración, detectada mediante la bandera "revision", se producirá una asignación aleatoria inicial de coordenadas de población. Para cada sección (elemento de la población) y para cada variable en el rango, se asignan valores aleatorios. Dichos valores se ajustan considerando los límites y la magnitud del cambio para garantizar soluciones aceptables. Después de ello, se activa la bandera, se realiza la inicialización y el método sale de este ciclo.

Una vez finalizada la inicialización, el contador de épocas (iteraciones) actual se incrementa en uno. A continuación, se efectúan los pasos clave del algoritmo: se determinan las métricas de rendimiento para cada solución de la población actual, que indican qué tan bien se ajustan al problema. Luego se calcula el coeficiente "a". Según los indicadores de calidad, se determina una medida generalizada de la aptitud de cada solución y se restablece el índice "AF" para la misma, lo que permite centrar la búsqueda en el área de las mejores soluciones. En función de la información actual y los coeficientes calculados, se seleccionan las siguientes ubicaciones (posiciones) para presentar y mover soluciones en el espacio de búsqueda.

En general, el método "Moving" implementa un ciclo de iteración del algoritmo DEA, realizando secuencialmente pasos clave de actualización y mejora de soluciones en el proceso de búsqueda del óptimo.

//————————————————————————————————————————————————————————————————————
//--- Основной шаг алгоритма (согласно 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 ();
}
//————————————————————————————————————————————————————————————————————

El siguiente método, "CalculatePP", se ocupa de calcular la probabilidad predeterminada (PP) que se utiliza en el proceso de toma de decisiones dentro del algoritmo. Si el número total de épocas (iteraciones) es igual o menor que uno, entonces la probabilidad se establecerá igual a un valor inicial predeterminado (PP1). En este caso, no se requiere ningún cálculo adicional y el método finaliza.

Si el número de épocas es mayor que uno, el valor "PP" se calculará según una fórmula dada que tiene en cuenta la época actual e incluye la siguiente lógica: se calcula el grado, que es una función de la época actual elevada a la potencia (Power), y se le resta uno; de manera similar, se calcula la potencia para el número total de épocas.

El valor "PP" se actualiza usando una fórmula que se aproxima gradualmente a 1, teniendo en cuenta el progreso actual a lo largo de las distintas épocas. Específicamente, se agrega al valor inicial de "PP1" una parte proporcional al progreso ajustado por el grado y los parámetros "Power" y "totalEpochs" dados. Si el exponente total es distinto de cero, se realizará una división para obtener la probabilidad actual; de lo contrario, el valor permanecerá igual al "PP1" inicial.

En definitiva, el método modifica dinámicamente el valor de probabilidad durante la ejecución del algoritmo, garantizando un equilibrio entre el valor inicial y un valor más "progresivo" a medida que avanzan las épocas.

//————————————————————————————————————————————————————————————————————
//--- Вычисление предопределенной вероятности (согласно формуле 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;
  }
}
//————————————————————————————————————————————————————————————————————

A continuación le presentamos el siguiente método "CalculateCoefficientA" para calcular el coeficiente dinámico "a", que se utiliza en el algoritmo DEA para regular el proceso de búsqueda. El método itera toda la población actual de soluciones y, para cada solución, calcula la diferencia entre la aptitud máxima posible "fB" y la aptitud actual de una solución en particular (a[i].f). Dichas diferencias se acumulan hasta formar una suma.

Tras acumular la suma de los valores, el coeficiente "a" se obtiene como la razón entre la diferencia entre "fB" y la aptitud mínima "fW" y la suma resultante. Esto nos permite definir un coeficiente dinámico que se adapta según el estado actual de la población y ayuda a equilibrar la tasa de convergencia o exploración del espacio de búsqueda.

    Este método crea, por lo tanto, un parámetro de escala que tiene en cuenta la distribución de aptitud de las soluciones e influye en su estrategia de actualización y movimiento en las iteraciones posteriores del 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;
    }
    //————————————————————————————————————————————————————————————————————

    El método "FindNearestAlternative" está diseñado para encontrar la alternativa más cercana a un valor dado dentro de una coordenada específica y toma dos argumentos: el índice de la coordenada "coord" y el valor "value" para el cual se requiere encontrar la alternativa más cercana. Luego se inicializan y establecen los valores iniciales para "nearest" (el índice de la alternativa más cercana) y "minDist" (la distancia mínima).

    El ciclo recorre todas las alternativas asociadas con la coordenada dada "coord". Para cada alternativa, se calcula la distancia entre el valor "value" dado y el valor alternativo (coordData[coord].alt[i].value), y si la distancia calculada es menor que la distancia mínima actual (minDist), entonces "minDist" se actualizará con el nuevo valor de distancia menor, y "nearest" se actualizará con el índice de la alternativa actual.

    Una vez completado el ciclo, se devuelve el índice de la alternativa que estaba más cerca del valor dado "value" dentro de la coordenada dada. De este modo, el método determina cuál de las alternativas disponibles para la coordenada especificada está más cerca del valor real dado.

    //————————————————————————————————————————————————————————————————————
    //--- Поиск ближайшей альтернативы
    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;
    }
    //————————————————————————————————————————————————————————————————————

    El método "CalculateAccumulatetiveFitness" está diseñado para calcular la aptitud acumulada (AF) para las alternativas según "Algorithm 2". Antes de comenzar los cálculos, todos los valores de aptitud acumulada para cada alternativa en cada coordenada se borran y se establecen en cero. Después se encuentra el rango de aptitudes en la población actual de soluciones, calculado como la diferencia entre la aptitud máxima posible (fB) y la mínima (fW).

    Luego, para cada agente (delfín), su aptitud se normaliza en relación con el rango, y para cada coordenada de búsqueda, se determina la alternativa más cercana, y en el radio "Re" alrededor de esta alternativa, se actualiza la aptitud acumulada para la alternativa, teniendo en cuenta la naturaleza reflectante de los límites. Esto se logra mediante la suma ponderada de contribuciones, donde los pesos se forman según la distancia a la alternativa más cercana (teniendo en cuenta los límites reflectantes) e incluyen un coeficiente asociado con el paso actual en el radio "Re".

    Como resultado del funcionamiento del método, se forman valores de aptitud acumulada para cada alternativa en cada coordenada, teniendo en cuenta la contribución de las alternativas vecinas.

    //————————————————————————————————————————————————————————————————————
    //--- Вычисление накопленной пригодности (согласно 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;
        }
      }
    }
    //————————————————————————————————————————————————————————————————————
    

    El método "ResetAFforBestLocation" está diseñado para restablecer la aptitud acumulada (AF) para las alternativas que corresponden a la ubicación de la mejor solución (agente) en la población. En primer lugar, el método determina el índice de la mejor solución (agente) en la población actual. El proceso itera a través de todas las soluciones, encontrando la que tiene el valor de aptitud máximo. El índice de la solución con la mayor aptitud se almacena en la variable "bestIndex".

    Para cada coordenada "c" de la mejor solución, el método determina la alternativa más cercana al valor de la coordenada de la mejor solución en esa coordenada utilizando la función "FindNearestAlternative", y si existe la alternativa encontrada (el índice está dentro del rango aceptable), entonces el valor de aptitud acumulada "AF" para esa alternativa en particular se restablece a cero.

    De este modo, el método restablece "AF" únicamente para aquellas alternativas que se ajustan más a las coordenadas de la mejor solución. Esto se hace para reducir la influencia de estas alternativas en las etapas posteriores de la búsqueda, lo cual podría fomentar la exploración de otras áreas del espacio de búsqueda.

    Como resultado, la aptitud de aquellas coordenadas que mejor se corresponden con la mejor solución se "pone a cero/se restablece" para estimular la búsqueda de otras soluciones, posiblemente más óptimas.

    //————————————————————————————————————————————————————————————————————
    //--- Сброс 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;
        }
      }
    }
    //————————————————————————————————————————————————————————————————————

    El método "SelectNextLocations" está diseñado para seleccionar la siguiente posición para cada solución en la población (para cada delfín), basándose en consideraciones probabilísticas y considerando tanto la aptitud acumulada (AF) como la estrategia para mantener la mejor posición. El método primero determina la mejor solución en la población actual basándose en su valor de aptitud. El índice de la mejor solución se guarda para su uso posterior.

    Para cada solución y cada una de sus coordenadas, se realiza el siguiente conjunto de acciones: si la solución actual es la mejor y el número aleatorio es menor que la probabilidad "PP", la coordenada actual de esta solución se mantendrá sin cambios. Esto conserva la mejor solución anterior; sin embargo, si la solución actual no es la mejor y la probabilidad "PP" ha fallado, entonces se sumarán todos los valores "AF" de las alternativas en la coordenada actual y, si la suma total de "AF" es mayor que un número pequeño (epsilon), lo cual indica la presencia de valores de aptitud distintos de cero, se aplicará la selección por ruleta: se elegirá un número aleatorio proporcional a la suma de "AF" y la coordenada de la solución se seleccionará según la suma acumulada de "AF" de las alternativas, lo que permite que las soluciones se muevan hacia ubicaciones con mayor aptitud.

    Si la suma de "AF" es cercana a cero (todos los valores de "AF" son muy pequeños), se realizará una búsqueda local si el número aleatorio es menor que el coeficiente dinámico "coeffA". En este caso, se selecciona un desplazamiento aleatorio (-Re...+Re) con respecto al valor actual y la coordenada se actualiza con el valor más cercano, teniendo en cuenta los límites.

    Búsqueda global (selección aleatoria) si el número aleatorio es mayor que "coeffA". En este caso, se selecciona una alternativa completamente aleatoria para la coordenada. Al final del método, el valor de la coordenada obtenido se limita al rango permitido (rangeMin, rangeMax) y se discretiza con el paso dado "rangeStep" para garantizar que el valor se encuentre dentro del rango permitido y corresponda a los valores permitidos.

    Como resultado de este método, las coordenadas de cada solución se actualizan considerando los pesos de probabilidad basados en la aptitud acumulada, la estrategia "PP" (conservando la mejor), la búsqueda local y global dinámica, lo que permite al algoritmo explorar eficazmente el espacio de búsqueda y encontrar soluciones óptimas.

    //————————————————————————————————————————————————————————————————————
    //--- Выбор следующих позиций на основе вероятностей
    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]);
        }
      }
    }
    //————————————————————————————————————————————————————————————————————

    El método de "Revision" se utiliza para actualizar la información sobre las mejores y peores soluciones en la población actual. Después se especifica el índice de la mejor solución y a la variable que almacena la mejor aptitud se le asigna el valor de la peor de las soluciones actuales. Esto crea un estado inicial para la búsqueda de nuevos extremos. Luego se buscan todas las soluciones en la población actual: se determina la solución con el valor de aptitud máximo (la mejor solución). Su valor se guarda y el índice almacenado se actualiza. También se busca la solución con el valor de aptitud mínimo (la peor solución). Si se encuentra una solución verdaderamente óptima, sus coordenadas se copiarán en un array o variable especial diseñada para almacenar la mejor solución actual.

    Como resultado de la aplicación del método, se conocerán con exactitud las coordenadas de las mejores y peores soluciones de la población en el momento actual. Esto permite que el algoritmo realice un seguimiento de la dinámica de búsqueda y use estos datos en la toma de decisiones para mejorar el proceso de búsqueda de soluciones óptimas.

    //————————————————————————————————————————————————————————————————————
    //--- Обновление лучшего решения
    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 de las pruebas

    Ahora veamos los resultados. Podemos observar de inmediato que el algoritmo maneja bien y rápidamente diversos tipos de tareas.

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

    La visualización muestra una dispersión de resultados para funciones de baja dimensionalidad (verde) y buenos resultados para funciones de dimensionalidad media (azul).

    Hilly

    DEA en la función de prueba Hilly

    Forest

    DEA en la función de prueba Forest

    Megacity

    DEA en la función de prueba Megacity

    Según los resultados de su funcionamiento, el algoritmo DEA ocupa el puesto 25 en la tabla de clasificación.

    AO Description Hilly Hilly
    Final
    Forest Forest
    Final
    Megacity (discrete) Megacity
    Final
    Resultado Final % de
    MAX
    10 p (5 F) 50 p (25 F) 1000 p (500 F) 10 p (5 F) 50 p (25 F) 1000 p (500 F) 10 p (5 F) 50 p (25 F) 1000 p (500 F)
    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 optimization 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 búsqueda de orbitales atómicos 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


    Conclusiones

    Las principales ventajas del algoritmo son: el control de búsqueda adaptativo (una probabilidad predeterminada aumenta gradualmente, desplazando el equilibrio de la exploración a la explotación); la adaptación dinámica; la memoria colectiva (la aptitud acumulada almacena y difunde información sobre áreas prometedoras) y el mecanismo de diversidad (la eliminación de información para las mejores posiciones estimula la exploración de nuevas áreas).

    La fortaleza del algoritmo reside en su naturaleza adaptativa. El coeficiente dinámico lo hace "vivo": detecta el pulso de la población y se adapta al ritmo de la tarea. Cuando los delfines se encuentran dispersos por el océano de búsqueda, el algoritmo fomenta la exploración local. Cuando empiezan a converger en un objetivo, él los impulsa hacia nuevos horizontes, impidiendo que se estanquen en la ilusión del éxito local.

    La aptitud acumulada es la memoria colectiva del grupo, donde cada descubrimiento deja un eco en el espacio de soluciones. Pero a diferencia de la simple acumulación, el algoritmo puede olvidar; paradójicamente, restablecer las mejores posiciones provoca descubrimientos aún mejores.

    Esto no es solo una metáfora, es una filosofía de optimización, donde cada clic del ecolocalizador contiene información sobre el espacio de posibilidades.

    tab

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

    chart

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

    Ventajas y desventajas del algoritmo DEA:

    Ventajas:

    1. Buena convergencia en funciones de dimensionalidad media y alta.
    2. Número reducido de parámetros externos.

    Desventajas:

    1. Existe cierta tendencia a quedarse estancado en problemas de baja dimensionalidad.
    2. Gasto de recursos en funciones de alta dimensionalidad.

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


    Programas usados en el artículo

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

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

    Archivos adjuntos |
    DEA.ZIP (302.09 KB)
    Análisis de las brechas temporales de precios en MQL5 (Parte I): Creando un indicador básico Análisis de las brechas temporales de precios en MQL5 (Parte I): Creando un indicador básico
    El análisis de brechas temporales ayuda a los tráders a identificar posibles puntos de reversión del mercado. El artículo analiza qué es un desfase temporal, cómo interpretarlo y de qué manera se puede utilizar para detectar la inyección de un gran volumen en el mercado.
    Automatización de estrategias de trading en MQL5 (Parte 18): Estrategia de scalping «Trend Bounce» con envolventes: infraestructura básica y generación de señales (Parte I) Automatización de estrategias de trading en MQL5 (Parte 18): Estrategia de scalping «Trend Bounce» con envolventes: infraestructura básica y generación de señales (Parte I)
    En este artículo, desarrollamos la infraestructura básica del asesor experto «Envelopes Trend Bounce Scalping» en MQL5. Inicializamos las envolventes y otros indicadores para la generación de señales. Preparamos el entorno de backtesting para preparar la ejecución de operaciones en la siguiente parte.
    Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 26): Herramienta de patrones pin bar y envolventes con divergencia del RSI (patrones múltiples) Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 26): Herramienta de patrones pin bar y envolventes con divergencia del RSI (patrones múltiples)
    En línea con nuestro objetivo de desarrollar herramientas prácticas basadas en la acción del precio, este artículo analiza la creación de un Asesor Experto (EA) que detecta patrones de «pin bar» y «engulfing», utilizando la divergencia del RSI como señal de confirmación antes de generar cualquier señal de trading.
    Herramientas de trading de MQL5 (Parte 3): Creación de un panel de control con análisis de múltiples marcos temporales para el trading estratégico Herramientas de trading de MQL5 (Parte 3): Creación de un panel de control con análisis de múltiples marcos temporales para el trading estratégico
    En este artículo, creamos un panel de escáner multitemporal en MQL5 para mostrar señales de trading en tiempo real. Diseñamos una interfaz de cuadrícula interactiva, implementamos el cálculo de señales con múltiples indicadores y añadimos un botón de cierre. El artículo concluye con los beneficios del backtesting y el trading estratégico.