English Русский Deutsch 日本語 Português
preview
Algoritmos de optimización de la población: Algoritmo de optimización de ballenas (Whale Optimization Algorithm, WOA)

Algoritmos de optimización de la población: Algoritmo de optimización de ballenas (Whale Optimization Algorithm, WOA)

MetaTrader 5Ejemplos | 16 septiembre 2024, 12:57
31 0
Andrey Dik
Andrey Dik

Contenido:

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


1. Introducción

Las ballenas jorobadas, esos majestuosos gigantes marinos, son las auténticas señoras del océano. Cuando las ballenas jorobadas ejecutan la danza de la caza, el tiempo parece detenerse y cada movimiento está lleno de gracia y precisión. Los maestros de la "red de burbujas" crean una cortina de burbujas para confinar y reunir a sus presas en el centro del anillo. Este singular método de alimentación pone de relieve su inteligencia y su pensamiento estratégico a la hora de cazar.

La sincronización de sus acciones con otros individuos, incluso extraños, revela su profunda comprensión mutua y unidad, mostrando su capacidad de trabajo en equipo y una coordinación independientemente de las circunstancias.

Su capacidad para absorber hasta 1,4 toneladas métricas de alimento al día pone de relieve su papel en el ecosistema marino como uno de los "consumidores" más significativos del océano. Semejante ritmo de vida, que alterna periodos de caza abundante con otros de descanso y ayuno, nos habla de la majestuosidad e imprevisibilidad del océano en el que reinan. Las épocas de hibernación, cuando las ballenas jorobadas tienen poca o ninguna comida, dan testimonio de su asombrosa capacidad de supervivencia. Para sobrevivir en épocas en las que escasea el alimento, las ballenas depende de las reservas de grasa acumuladas durante las ricas capturas. Esto nos recuerda cómo la naturaleza enseña a los animales a ser frugales y sabios a la hora de gastar sus recursos.

Las ballenas jorobadas son crónicas vivientes de supervivencia y adaptabilidad, símbolos de sabiduría, la encarnación viviente del poder y la belleza del océano, una fuente inagotable de inspiración para nosotros.

El WOA es un algoritmo de optimización metaheurístico propuesto por Mirjalili y Lewis en 2016. Se inspiraron en el comportamiento de las ballenas durante la caza.

Las ballenas usan diversas estrategias de caza, como la "red de burbujas" y la "penetración en espiral". En la "red de burbujas", las ballenas rodean a sus presas creando una "red" de burbujas para asustarlas y confundirlas. En la "penetración en espiral", las ballenas se elevan desde las profundidades del océano con un movimiento en espiral para capturar a sus presas.

Estas estrategias de caza se han modelado de forma abstracta en el algoritmo WOA. En el algoritmo WOA, las "ballenas" representan las soluciones al problema de optimización, mientras que la "caza" representa el proceso de búsqueda de la solución óptima.


2. Descripción del algoritmo

El algoritmo WOA comienza inicializando una población de ballenas con posiciones aleatorias. Luego se selecciona el líder, la ballena con el mejor valor de la función objetivo (en la práctica, la mejor solución global). Las posiciones de las demás ballenas se actualizan para reflejar la posición del líder. Esto sucede en dos modos: el modo de exploración y el modo operativo. En el modo de exploración, las ballenas actualizan sus posiciones usando una búsqueda aleatoria en la vecindad de la mejor solución global actual. En el modo de operativo, las ballenas actualizan sus posiciones, acercándose a su mejor solución actual.

El algoritmo WOA se ha aplicado con éxito a muchos problemas de optimización y ha ofrecido buenos resultados. No obstante, como cualquier algoritmo de optimización, tiene sus ventajas e inconvenientes. Por ejemplo, puede resultar propenso a alcanzar óptimos locales y tener una tasa de convergencia relativamente lenta.

Así podemos relacionar los hechos interesantes sobre las ballenas jorobadas con los principios del algoritmo WOA:

  • Cooperación y coordinación. Las ballenas jorobadas suelen cazar en grupo, cooperando entre sí para lograr el éxito común. Esto recuerda a los principios del algoritmo WOA, en el que los agentes individuales (como las ballenas) trabajan en equipo, compartiendo información y coordinando sus acciones para alcanzar una solución óptima.
  • Estrategias inteligentes. Las ballenas jorobadas usan diversas estrategias inteligentes de caza, como la red de burbujas y la coordinación en grupo. El algoritmo WOA también se basa en estrategias de optimización inteligentes, que incluyen la búsqueda de soluciones óptimas y la adaptación a condiciones cambiantes del entorno.
  • Adaptabilidad y eficacia. Las ballenas jorobadas demuestran adaptabilidad y eficacia en el proceso de caza, cambiando sus métodos según la situación. El algoritmo WOA también busca la adaptabilidad y la eficacia aplicando distintas estrategias de optimización y cambiando su comportamiento para lograr mejores resultados.

Así, el algoritmo WOA se inspira en las estrategias únicas y el comportamiento de caza de las ballenas jorobadas, lo cual le ayuda a resolver problemas de optimización en diversos dominios de forma eficaz e inteligente.

El algoritmo modificado de optimización de ballenas (WOAm) incluye varios pasos principales:

1. Movimiento respecto a la solución global:
    - En la fase inicial del algoritmo, cada individuo "ballena" (solución) se mueve hacia la solución óptima global. Esto ayuda a explorar el espacio de soluciones y a encontrar una dirección general hacia el óptimo.

2. Mejora de la propia posición:
    - Cada individuo (ballena) intenta mejorar su situación actual aproximándose a una solución mejor. Los individuos pueden cambiar sus parámetros o estrategias para lograr un rendimiento mejor.

3. Movimiento en espiral:
    - Este paso supone un mecanismo importante del algoritmo WOA. Los individuos pueden moverse en espiral alrededor de la mejor solución, lo cual les ayuda a explorar el espacio de búsqueda con mayor eficacia y acercarse a la solución óptima.

4. Migración:
    - Este paso consiste en variar aleatoriamente las posiciones de los individuos para garantizar la diversidad y evitar que estos se queden atascados en óptimos localizados. La migración ayuda al algoritmo a evitar una convergencia prematura hacia una solución insuficientemente buena.

El conjunto de estos pasos posibilita una búsqueda eficaz de la solución óptima en el espacio del problema de optimización. Hemos hecho cambios añadiendo un cuarto paso para mejorar la robustez del algoritmo frente a las interferencias. Modelizar la migración de las ballenas en libertad a nuevas zonas en busca de alimento resulta necesario cuando se agotan las fuentes anteriores. Esta adición ofrece al algoritmo una flexibilidad adicional y ayuda a explorar el espacio de soluciones de forma más eficiente, reflejando las estrategias de supervivencia y adaptación en la naturaleza.

probab

Figura 1. El área de valores del coeficiente "A" en la fórmula A = 2.0 * aKo * r - aKo según la época actual.

Pseudocódigo del algoritmo de optimización de búsqueda de ballenas (WOAm):

1. Inicializamos la población con una posición aleatoria.
2. Calculamos la adaptabilidad.
3. Calculamos el coeficiente aKo: aKo = 2,0 - epochNow * (2,0 / epochs).
4. Generamos un número aleatorio "r" a partir de una distribución uniforme entre -1 y 1.
5. Calculamos las variables "A" y "C":
   - A = 2.0 * aKo * r - aKo (figura 1)
   - C = 2,0 * r
6. Establecemos valores para "spiralCoeff", el número aleatorio "l" de una distribución uniforme y la probabilidad aleatoria "p".
7. Si "p" es menor que "refProb", entonces:
   - Si el valor absoluto de "A" es mayor que 1,0, entonces: X = Xbest - A * |Xbest - Xprev|
   - De lo contrario, elegiremos un índice aleatorio "leaderInd" de 0 a "popSize" y: X = Xlead - A * |Xlead - Xprev|
8. De lo contrario, si la probabilidad aleatoria es menor que spiralProb, entonces: X = Xprev + | Xprev - X| * exp (b * l) * cos (2 * M_PI * l)
9. De lo contrario: X = PowerDistribution (cB [c], rangeMin [c], rangeMin [c], 30)
10. Calculamos la adaptabilidad.
11. Actualizamos la solución global.
12. Repetimos desde el paso 3 hasta que se cumpla el criterio de parada.


WOA

Figura 2. Caza de "red de burbujas" de las ballenas que inspiró la redacción del algoritmo de optimización WOA.

Vamos a escribir el código del algoritmo WOAm.

Para describir cada ballena, definiremos la estructura "S_WOA_Agent". Vamos a desglosar lo que ocurre aquí:

1. La estructura contiene los siguientes campos:
    - cPrev[] - array para almacenar las coordenadas anteriores del agente.
    - fPrev - variable para almacenar la puntuación anterior del agente (aptitud).

2. Init - método de la estructura "S_WOA_Agent" que inicializa los campos de la estructura. Toma un argumento entero "coords" que se utilizará para redimensionar el array "cPrev" usando la función "ArrayResize".

3. fPrev = -DBL_MAX - establece el valor inicial de la variable "fPrev" igual al valor mínimo posible de un número de tipo double.

Este código representa la estructura básica de datos para los agentes en el algoritmo de optimización WOAm e inicializa sus campos cuando se crea un nuevo agente.

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

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

Vamos a definir la clase "C_AO_WOAm" del algoritmo WOAm, que es la sucesora de la clase base de algoritmos poblacionales "C_AO" y contiene los siguientes campos y métodos:

1. Campos públicos:

  • ao_name - nombre del algoritmo de optimización.
  • ao_desc - descripción del algoritmo de optimización.
  • popSize - tamaño de la población.
  • params - array de parámetros del algoritmo.
  • refProb - probabilidad de refinamiento.
  • spiralCoeff - coeficiente de espiral.
  • spiralProb - probabilidad de espiral.
  • agent - vector de agentes.

2. Métodos:

  • C_AO_WOAm - constructor de clase que inicializa los campos de la clase.
  • SetParams - método para establecer los parámetros del algoritmo.
  • Init - método para inicializar el algoritmo. Admite rangos de búsqueda mínimo y máximo, paso de búsqueda y número de épocas.
  • Moving - método para desplazar a los agentes.
  • Revision - método para revisar a los agentes.

3. Campos privados:

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

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

    popSize = 100;   //population size


    ArrayResize (params, 4);

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

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

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

  void Moving   ();
  void Revision ();

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


  S_WOA_Agent agent []; //vector

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

El método "Init" de la clase "C_AO_WOAm" se usa para inicializar las variables de la clase basándose en los parámetros transmitidos. Este método realiza una inicialización estándar usando el método "StandardInit", que admite los rangos de búsqueda mínimo y máximo, así como el paso de búsqueda.

Si la inicialización estándar tiene éxito, el método continuará inicializando las variables "epochs" y "epochNow". El valor de "epochs" se establece igual al parámetro transmitido "epochsP" y "epochNow" se inicializa a 0.

A continuación, el método redimensiona el array "agent" a "popSize". Para cada elemento del "agente", se llama al método "Init" con el parámetro "coords".

El método retornará "true" si la inicialización se ha realizado correctamente y "false" en caso contrario.

Este método ejecuta una configuración inicial del algoritmo de optimización WOAm con los parámetros dados y lo prepara para realizar la optimización para un número determinado de épocas.

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

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

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

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

El método "Moving" de la clase "C_AO_WOAm" se usa para mover los agentes durante el proceso de optimización. El método efectúa las siguientes acciones:

"epochNow++;" - se incrementa el valor de la época actual.

"if (!revision)" - comprueba la condición si "revision" es "false".

Si "revision" es "false", entonces:

  • Las coordenadas de los agentes "a[i].c[c]" se inicializan usando valores aleatorios en los rangos dados.
  • El indicador "revision" se establece en "true".
  • El método finaliza el funcionamiento.

Si "revision" no es igual a "false", entonces:

  • Para cada agente, las nuevas coordenadas se calculan usando determinadas fórmulas y probabilidades.
  • Para determinar las nuevas coordenadas de los agentes se usan diversos cálculos matemáticos, números aleatorios y probabilidades.
  • Las nuevas coordenadas x se calculan según las condiciones y probabilidades.
  • Las nuevas coordenadas "a[i].c[c]" se fijan usando el método "SeInDiSp" para corregir los valores según los rangos y pasos de búsqueda.

Este método se encarga de actualizar las coordenadas de los agentes en el algoritmo de optimización WOAm según la época actual, los valores aleatorios y las probabilidades. Vamos a codificar por colores las secciones de código relevantes que describen los distintos comportamientos de las ballenas:

Mejora de la solución global: Con cada nueva época, las ballenas exploran más a fondo la vecindad de la solución global encontrada por la ley lineal y el coeficiente "A" calculado, con el objetivo de aproximarse al óptimo global.

Exploración de los alrededores del barrio del "líder" de la población: Dado el factor "A", las ballenas exploran las proximidades del "líder" de la población, seleccionado aleatoriamente según una ley de distribución uniforme. Así pues, se seguirá explorando en todas las zonas donde se encuentran ballenas de la población.

Movimiento en espiral y red de "burbujas": Las ballenas se mueven en espiral, considerando su mejor posición individual y su ubicación actual, lo cual garantiza que los peces se reúnan en una densa nube y concentren su alimento en un solo lugar.

Migración de las ballenas: La migración de las ballenas se simula alejándose bruscamente de la mejor solución global según una ley escalonada. Este proceso determina una alta probabilidad de estar cerca de la solución global y una probabilidad pequeña pero no nula de encontrarse muy lejos de ella.

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

  //----------------------------------------------------------------------------
  if (!revision)
  {
    for (int i = 0; i < popSize; i++)
    {
      for (int c = 0; c < coords; c++)
      {
        a [i].c [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]);
        a [i].c [c] = u.SeInDiSp  (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
      }
    }

    revision = true;
    return;
  }

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

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

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

El método "Revision" de la clase "C_AO_WOAm" se usa para actualizar la mejor solución global y actualizar las mejores posiciones de las propias ballenas. El método efectúa las siguientes acciones:

1. Actualización de la mejor solución global. En el ciclo for, el método itera todos los individuos. Si el valor de la función de aptitud del individuo actual supera el valor de la mejor función de aptitud actual, se actualizará el mejor valor y el array de coordenadas del individuo actual se copiará en el array de coordenadas de la mejor solución.

2. Actualización de los valores anteriores de la función de aptitud y de las coordenadas del agente. En el ciclo for, el método itera todos los individuos. Si el valor de la función de aptitud del individuo actual supera el valor de la función de aptitud anterior de este agente, el valor de la función de aptitud anterior se actualizará y el array de coordenadas del individuo actual se copiará en el array de coordenadas anterior de este agente.

Este método "Revision" se encarga de actualizar los mejores agentes según el valor de sus características, y también de actualizar los valores de las características anteriores y las coordenadas de los agentes como parte del algoritmo de optimización WOAm.

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

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

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

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


3. Resultados de las pruebas

Lamentablemente, la versión básica del algoritmo propuesta por los autores deja mucho que desear, dado que muestra unos resultados relativamente pobres, que podemos ver a continuación.

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

Sin embargo, gracias a nuestro esfuerzo y creatividad, hemos conseguido mejoras significativas, incluidos elementos como la migración y la distribución escalonada. Además, en lugar de usar la posición actual de la ballena como punto de partida para calcular la siguiente posición, ahora se utilizan las mejores posiciones anteriores de la ballena. Estas modificaciones han transformado el algoritmo, dotándolo de una nueva calidad y mejorando notablemente los resultados de la versión modificada. Así, el algoritmo es ahora más eficaz y capaz de lograr un mayor éxito en la resolución de los problemas.

Aquí tenemos una impresión de los resultados de la versión modificada del WOAm, en la que hay una mejora en los resultados de más del 22% (donde 0% es el peor resultado posible y 100% es el mejor resultado teórico alcanzable).

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

En la visualización del rendimiento de la versión modificada, podemos observar una dispersión significativa de los resultados en la función Hilly y una pequeña dispersión en la función discreta Megacity. Resulta interesante observar que, normalmente (para la mayoría de los algoritmos), la función Megacity es la más compleja y muestra una gran dispersión de resultados, así que resulta aún más sorprendente que WOAm ofrezca resultados muy estables y buenos en esta función.

El algoritmo explora con éxito superficies localizadas en diferentes regiones del espacio de búsqueda, destacando las zonas prometedoras. Esto se facilita dividiendo el comportamiento general de manada de la población en etapas de comportamiento individual dirigidas a mejorar la situación de cada ballena de forma individual.

Este enfoque permite al algoritmo explorar eficazmente el espacio de búsqueda de soluciones óptimas, acentuando la mejora de las posiciones individuales de los agentes en la manada, lo cual facilita una exploración más precisa y profunda de las áreas potencialmente prometedoras, cosa que a su vez mejora el rendimiento general del algoritmo.

La versión básica no se muestra en esta visualización. Además, le ofrecemos una visualización del funcionamiento del algoritmo según la prueba de Ackley; esta función no interviene en el cálculo de la tabla de clasificación.

Hilly

  WOAm en la función de prueba Hilly.

Forest

  WOAm en la función de prueba Forest.

Megacity

  WOAm en la función de prueba de Megacity.

Ackley

  WOAm en la función de prueba de Ackley.

El algoritmo WOAm modificado se ha situado en el honorable décimo puesto de la tabla, mostrando unos resultados finales buenos y estables. 

AO Description Hilly Hilly final Forest Forest final Megacity (discrete) Megacity final Final result % 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 BGA binary genetic algorithm 0,99992 0,99484 0,50483 2,49959 1,00000 0,99975 0,32054 2,32029 0,90667 0,96400 0,23035 2,10102 6,921 76,90
2 (P+O)ES (P+O) evolution strategies 0,99934 0,91895 0,56297 2,48127 1,00000 0,93522 0,39179 2,32701 0,83167 0,64433 0,21155 1,68755 6,496 72,18
3 SDSm stochastic diffusion search M 0,93066 0,85445 0,39476 2,17988 0,99983 0,89244 0,19619 2,08846 0,72333 0,61100 0,10670 1,44103 5,709 63,44
4 ESG evolution of social groups 0,99906 0,79654 0,35056 2,14616 1,00000 0,82863 0,13102 1,95965 0,82333 0,55300 0,04725 1,42358 5,529 61,44
5 SIA simulated isotropic annealing 0,95784 0,84264 0,41465 2,21513 0,98239 0,79586 0,20507 1,98332 0,68667 0,49300 0,09053 1,27020 5,469 60,76
6 DE differential evolution 0,95044 0,61674 0,30308 1,87026 0,95317 0,78896 0,16652 1,90865 0,78667 0,36033 0,02953 1,17653 4,955 55,06
7 HS harmony search 0,86509 0,68782 0,32527 1,87818 0,99999 0,68002 0,09590 1,77592 0,62000 0,42267 0,05458 1,09725 4,751 52,79
8 SSG saplings sowing and growing 0,77839 0,64925 0,39543 1,82308 0,85973 0,62467 0,17429 1,65869 0,64667 0,44133 0,10598 1,19398 4,676 51,95
9 (PO)ES (PO) evolution strategies 0,79025 0,62647 0,42935 1,84606 0,87616 0,60943 0,19591 1,68151 0,59000 0,37933 0,11322 1,08255 4,610 51,22
10 WOAm wale optimization algorithm M 0,84521 0,56298 0,26263 1,67081 0,93100 0,52278 0,16365 1,61743 0,66308 0,41138 0,11357 1,18803 4,476 49,74
11 ACOm ant colony optimization M 0,88190 0,66127 0,30377 1,84693 0,85873 0,58680 0,15051 1,59604 0,59667 0,37333 0,02472 0,99472 4,438 49,31
12 BFO-GA bacterial foraging optimization - ga 0,89150 0,55111 0,31529 1,75790 0,96982 0,39612 0,06305 1,42899 0,72667 0,27500 0,03525 1,03692 4,224 46,93
13 MEC mind evolutionary computation 0,69533 0,53376 0,32661 1,55569 0,72464 0,33036 0,07198 1,12698 0,52500 0,22000 0,04198 0,78698 3,470 38,55
14 IWO invasive weed optimization 0,72679 0,52256 0,33123 1,58058 0,70756 0,33955 0,07484 1,12196 0,42333 0,23067 0,04617 0,70017 3,403 37,81
15 Micro-AIS micro artificial immune system 0,79547 0,51922 0,30861 1,62330 0,72956 0,36879 0,09398 1,19233 0,37667 0,15867 0,02802 0,56335 3,379 37,54
16 COAm cuckoo optimization algorithm M 0,75820 0,48652 0,31369 1,55841 0,74054 0,28051 0,05599 1,07704 0,50500 0,17467 0,03380 0,71347 3,349 37,21
17 SDOm spiral dynamics optimization M 0,74601 0,44623 0,29687 1,48912 0,70204 0,34678 0,10944 1,15826 0,42833 0,16767 0,03663 0,63263 3,280 36,44
18 NMm Nelder-Mead method M 0,73807 0,50598 0,31342 1,55747 0,63674 0,28302 0,08221 1,00197 0,44667 0,18667 0,04028 0,67362 3,233 35,92
19 FAm firefly algorithm M 0,58634 0,47228 0,32276 1,38138 0,68467 0,37439 0,10908 1,16814 0,28667 0,16467 0,04722 0,49855 3,048 33,87
20 GSA gravitational search algorithm 0,64757 0,49197 0,30062 1,44016 0,53962 0,36353 0,09945 1,00260 0,32667 0,12200 0,01917 0,46783 2,911 32,34
21 BFO bacterial foraging optimization 0,61171 0,43270 0,31318 1,35759 0,54410 0,21511 0,05676 0,81597 0,42167 0,13800 0,03195 0,59162 2,765 30,72
22 ABC artificial bee colony 0,63377 0,42402 0,30892 1,36671 0,55103 0,21874 0,05623 0,82600 0,34000 0,14200 0,03102 0,51302 2,706 30,06
23 BA bat algorithm 0,59761 0,45911 0,35242 1,40915 0,40321 0,19313 0,07175 0,66810 0,21000 0,10100 0,03517 0,34617 2,423 26,93
24 SA simulated annealing 0,55787 0,42177 0,31549 1,29513 0,34998 0,15259 0,05023 0,55280 0,31167 0,10033 0,02883 0,44083 2,289 25,43
25 IWDm intelligent water drops M 0,54501 0,37897 0,30124 1,22522 0,46104 0,14704 0,04369 0,65177 0,25833 0,09700 0,02308 0,37842 2,255 25,06
26 PSO particle swarm optimisation 0,59726 0,36923 0,29928 1,26577 0,37237 0,16324 0,07010 0,60572 0,25667 0,08000 0,02157 0,35823 2,230 24,77
27 MA monkey algorithm 0,59107 0,42681 0,31816 1,33604 0,31138 0,14069 0,06612 0,51819 0,22833 0,08567 0,02790 0,34190 2,196 24,40
28 SFL shuffled frog-leaping 0,53925 0,35816 0,29809 1,19551 0,37141 0,11427 0,04051 0,52618 0,27167 0,08667 0,02402 0,38235 2,104 23,38
29 FSS fish school search 0,55669 0,39992 0,31172 1,26833 0,31009 0,11889 0,04569 0,47467 0,21167 0,07633 0,02488 0,31288 2,056 22,84
30 RND random 0,52033 0,36068 0,30133 1,18234 0,31335 0,11787 0,04354 0,47476 0,25333 0,07933 0,02382 0,35648 2,014 22,37
31 GWO grey wolf optimizer 0,59169 0,36561 0,29595 1,25326 0,24499 0,09047 0,03612 0,37158 0,27667 0,08567 0,02170 0,38403 2,009 22,32
32 CSS charged system search 0,44252 0,35454 0,35201 1,14907 0,24140 0,11345 0,06814 0,42299 0,18333 0,06300 0,02322 0,26955 1,842 20,46
33 EM electroMagnetism-like algorithm 0,46250 0,34594 0,32285 1,13129 0,21245 0,09783 0,10057 0,41085 0,15667 0,06033 0,02712 0,24412 1,786 19,85


Conclusiones

En general, las mejoras introducidas en este algoritmo, que describimos en el presente artículo, resultan satisfactorias. Sin embargo, existen estudios más profundos sobre la modificación de esta versión que los apasionados del tema deben considerar, si tienen ganas de seguir experimentando. La inmersión en estos métodos puede abrirle nuevos horizontes e inspirar la creación de soluciones aún mejores en el campo de este algoritmo.

He aquí algunas estrategias que podrían ayudarle a mejorar el algoritmo de optimización de la búsqueda de ballenas (WOA) y reducir la probabilidad de quedarse atascado en extremos locales:

1. Diversificación de la población. La diversidad en una población puede ayudar a evitar el estancamiento en los óptimos localizados. Tenga en cuenta los métodos para mantener la diversidad en una población, como los mecanismos de mutación, los cruces o los estudios de vecindad de decisión.

2. La estrategia de la élite. Esta estrategia consiste en mantener cierto número de mejores soluciones ligeramente distintas (élites) de una generación a la siguiente, evitando así una disminución de la diversidad en la población.

3. Marco multiestratégico. Este enfoque implica el uso simultáneo de múltiples estrategias de búsqueda, lo cual puede ayudar al algoritmo a explorar mejor el espacio de soluciones y evitar las trampas locales.

4. Hibridación con otros algoritmos. La hibridación de WOA con otros algoritmos de optimización también podría mejorar su rendimiento. Por ejemplo, la evolución diferencial o el enjambre de partículas pueden usarse para mejorar la fase de exploración del algoritmo.

tab

Figura 3. Gradación por colores de los algoritmos según sus respectivas pruebas. Los resultados superiores o iguales a 0,99 aparecen resaltados en blanco.

Llama la atención el color de la celda de valor en la función Hilly suave con 1 000 variables, lo cual indica que el resultado es el peor entre todos los algoritmos presentados en la tabla. Además, mucho peor. También me gustaría destacar la alta puntuación de la función Forest con 5 variables, y el buen rendimiento general de las funciones Forest y Megacity.

chart

Figura 4. Histograma con los resultados de las pruebas de los algoritmos (en una escala de 0 a 100, cuanto mayor, mejor),

donde 100 es el máximo resultado teórico posible; hay un script para calcular la tabla de puntuación en el archivo).


Ventajas y desventajas del algoritmo WOAm:

Ventajas:

  1. Arquitectura y aplicación sencillas.
  2. Resultados estables y positivos en la función Forest aguda y la función Megacity discreta.
  3. No resulta exigente desde el punto de vista computacional.

Desventajas:

  1. Baja convergencia (no tenemos resultados cercanos al 100%).
  2. Baja escalabilidad en funciones suaves como Hilly (problemas con tareas 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.

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

Archivos adjuntos |
WOAm.zip (24.34 KB)
Utilizando redes neuronales en MetaTrader Utilizando redes neuronales en MetaTrader
En el artículo se muestra la aplicación de las redes neuronales en los programas de MQL, usando la biblioteca de libre difusión FANN. Usando como ejemplo una estrategia que utiliza el indicador MACD se ha construido un experto que usa el filtrado con red neuronal de las operaciones. Dicho filtrado ha mejorado las características del sistema comercial.
Aprendizaje automático y Data Science (Parte 22): Aprovechar las redes neuronales de autocodificadores para realizar operaciones más inteligentes pasando del ruido a la señal Aprendizaje automático y Data Science (Parte 22): Aprovechar las redes neuronales de autocodificadores para realizar operaciones más inteligentes pasando del ruido a la señal
En el vertiginoso mundo de los mercados financieros, separar las señales significativas del ruido es crucial para operar con éxito. Al emplear sofisticadas arquitecturas de redes neuronales, los autocodificadores destacan a la hora de descubrir patrones ocultos en los datos de mercado, transformando datos ruidosos en información práctica. En este artículo, exploramos cómo los autocodificadores están revolucionando las prácticas de negociación, ofreciendo a los operadores una poderosa herramienta para mejorar la toma de decisiones y obtener una ventaja competitiva en los dinámicos mercados actuales.
Particularidades del trabajo con números del tipo double en MQL4 Particularidades del trabajo con números del tipo double en MQL4
En estos apuntes hemos reunido consejos para resolver los errores más frecuentes al trabajar con números del tipo double en los programas en MQL4.
Creamos un asesor multidivisa sencillo utilizando MQL5 (Parte 7): Señales de los indicadores ZigZag y Awesome Oscillator Creamos un asesor multidivisa sencillo utilizando MQL5 (Parte 7): Señales de los indicadores ZigZag y Awesome Oscillator
En este artículo, entenderemos por EA multidivisa un EA o robot comercial que utiliza indicadores ZigZag y Awesome Oscillator que filtran mutuamente sus señales.