English Русский 中文 Deutsch 日本語 Português
preview
Algoritmos de optimización de la población: Búsqueda armónica (HS)

Algoritmos de optimización de la población: Búsqueda armónica (HS)

MetaTrader 5Ejemplos | 12 junio 2023, 10:24
534 0
Andrey Dik
Andrey Dik

Contenido:

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


1. Introducción

Una composición musical consta de varios componentes: ritmo, melodía y armonía, y mientras que el ritmo y la melodía son como el todo de una pieza musical, la armonía es lo que la embellece. Una pieza musical o una canción sin armonía es como una imagen sin pintar en un libro infantil: está dibujada, pero no hay color, ni brillo, ni expresividad. La armonía adecuada es un deleite para el oído y ennoblece el sonido, permitiéndonos disfrutar al máximo de las maravillosas melodías del piano, la guitarra o cualquier otro instrumento musical. Una melodía se puede cantar, una armonía solo se puede tocar. La armonía musical es el conjunto de acordes sin los cuales ninguna canción o pieza musical estaría completa ni sonaría plena.

La armonía aparece exactamente en el momento en que combinamos dos sonidos, uno tras otro, o en un sonido simultáneo. Un sinónimo más escueto sería "combinación". Combinamos un sonido con otro y tenemos una combinación que, a su manera, intenta construir una jerarquía. En los institutos de música, escuelas superiores y conservatorios existe una disciplina especial, la armonía, donde los alumnos estudian todos los acordes que existen en teoría musical, aprenden a aplicarlos en la práctica e incluso a resolver problemas de armonía.

En la improvisación musical, un cierto número de músicos intentan ajustar el tono de sus instrumentos para lograr una armonía agradable (el mejor estado). En la naturaleza, la armonía se define por la relación particular entre varias ondas sonoras con frecuencias diferentes. La calidad de la armonía improvisada viene determinada por la percepción y apreciación estéticas. Para mejorar la apreciación estética y encontrar la mejor armonía, los músicos practican continuamente. Existen semejanzas entre los procesos de improvisación y optimización de los músicos.

El método Harmony Search (HS) es un algoritmo de optimización metaheurístico evolutivo que se ha usado para resolver numerosos problemas complejos durante la última década. El algoritmo de búsqueda armónica (Harmony Search algorithm, HS) fue propuesto por primera vez en 2001 por Z. W. Geem. El método de HS se inspira en los principios fundamentales de la improvisación de los músicos y la búsqueda de la armonía musical. El método HS asigna la armonía perfecta de los sonidos a un extremo global en problemas de optimización multidimensional. Análogamente, el proceso de improvisación de los músicos se compara con un procedimiento para encontrar dicho extremo.

En la improvisación, cada músico toca un sonido en un compás de una pieza musical (dentro de las posibilidades de su instrumento musical), de forma que los sonidos de todos los músicos de la orquesta en ese compás formen un único vector armónico. Las combinaciones de sonidos que componen las "buenas" armonías se almacenan en la memoria de cada músico y pueden ser usadas por ellos para formar armonías aún mejores en los siguientes compases de la pieza.

Normalmente, al improvisar, un músico cumple uno de los tres requisitos siguientes: forma un sonido completamente aleatorio a partir de la gama de sonidos de que dispone; reproduce algún sonido de su memoria armónica; toca un vector armónico relacionado a partir de la misma memoria. Las principales características del algoritmo de HS son que puede utilizarse para resolver problemas de optimización tanto continuos como discretos.

Los rasgos distintivos de la HS son la sencillez del algoritmo y la eficacia de la búsqueda. Por ello, el algoritmo cuenta con una atención considerable por parte de los investigadores y se está desarrollando rápidamente tanto en el plano teórico como en el práctico. La HS es una técnica metaheurística que proporciona una gran estabilidad entre las fases de exploración y explotación del proceso de búsqueda. La HS se inspira en las expresiones creativas del hombre, el método de búsqueda de la solución perfecta a este problema resulta similar al usado por un músico que trata de encontrar una armonía agradable al oído. El método utilizado para obtener un valor de aptitud es similar al usado para obtener una referencia utilizando el tono de cada instrumento musical.


2. Descripción del algoritmo

El funcionamiento de la lógica de HS es similar al de un músico al crear una armonía perfecta. El músico trata de cambiar los distintos tonos hasta encontrar la armonía ideal. Entonces la colección de armonías encontradas se almacena en la memoria. Durante la optimización, las armonías sufren diversos cambios: si los resultados de los cambios son favorables, la memoria se actualizará añadiendo la armonía a la memoria y eliminando la armonía indeseable.... Bueno, ya me siento un poco confuso con los términos de los autores del algoritmo, ¿qué es entonces la armonía? ¿Y qué son los tonos? Vamos a intentar entender el algoritmo aplicando nuestros propios términos.

¿Qué es una pieza musical? Obviamente, no soy músico (una pena), sino programador, pero para nosotros y para escribir el algoritmo, el concepto de "nota" será suficiente. Una pieza musical consta de notas (acordes). La figura 1 muestra esquemáticamente el "mecanismo" de construcción de una pieza musical: la selección de notas de la figura 1 se corresponde con una única pieza musical, que de tener deseo y oído musical (se puede carecer de él) o educación musical (se puede carecer de ella), resulta fácilmente definible. Quien quiera adivinar, puede dejar un comentario en el artículo.

El proceso de optimización del algoritmo de HS consiste en desplazar las barras verdes con las notas a través de la barra azul que representa la propia pieza. El rango de la barra verde es una octava, que consta de notas individuales. La pieza musical (la barra azul) se corresponde con una de las soluciones de optimización. Las notas de la barra verde son los parámetros correspondientes optimizados de la tarea. La memoria del músico almacena varias variaciones de una pieza (varias variaciones de barras azules), y esta será la población en el algoritmo.



HSachord

Figura 1. Selección de notas en una pieza musical (búsqueda de armonía). La barra azul es la pieza musical. Las barras verdes son un conjunto de notas.

El ejemplo de la figura 1 se corresponde con la solución de un problema discreto en el que los pasos en el parámetro son 8 y se presenta para facilitar la comprensión del funcionamiento del algoritmo. No obstante, en una tarea arbitraria, el paso de los parámetros a optimizar puede ser cualquiera y habrá notas intermedias: los semitonos. Los parámetros correctos para resolver el problema se corresponden con las notas correctas de la pieza.

Así, el proceso de creación de una pieza musical comenzará con un conjunto aleatorio de sonidos de instrumentos musicales que se encuentran dentro de la gama de frecuencias reproducibles del instrumento. Es necesario crear varias variantes de una pieza para poder combinar secciones individuales de las notas variantes. Luego tenemos el proceso de cambio de las notas en estas variaciones. Se puede realizar de tres formas posibles:

1. Podemos cambiar al azar una de las notas de una pieza que esté en el rango del instrumento musical.
2. Podemos tomar una nota con su correspondiente ordinal de otras versiones de la pieza.
3. Tras tomar una nota de otra versión de la pieza, podemos cambiarla ligeramente, ya sea a una tonalidad más aguda o más grave.

Tras obtener de esta forma un nuevo conjunto de variantes de una pieza musical, evaluaremos cada una de las variantes en cuanto a su armonía sonora y luego guardaremos las variantes en su posición original en la memoria, siempre que la nueva variante resulte mejor que su versión anterior. Una característica única del algoritmo es que no tenemos necesidad de ordenar la población, en nuestro caso, un conjunto de obras: cada nueva mejor opción sustituirá a la antigua peor en el mismo lugar. El proceso recuerda un poco al funcionamiento de los algoritmos genéticos que imitan la evolución, en la que sobreviven los individuos más adaptados. Además, también podemos observar similitudes con la combinación de los genes en el cromosoma.

Basándonos en lo anteriormente dicho, podemos compilar de forma preliminar el pseudocódigo del algoritmo de HS:

1. Generamos aleatoriamente las armonías.
2. Medimos la calidad de las armonías (calculamos la función de aptitud).
3. Con una probabilidad Eh, utilizamos la selección de acordes de una armonía elegida al azar.
  3.1 Cambiamos el acorde con una probabilidad Ep utilizando la fórmula si el acorde se selecciona de alguna armonía.
    3.1.1 Dejamos sin cambios el acorde seleccionado.
  3.2 Nuevo acorde según la fórmula.
4. Medimos la calidad de las armonías (calculamos la función de aptitud).
5. Repetimos desde el paso 3 hasta que se cumpla el criterio de parada.

Así pues, vamos a describir ahora los parámetros de entrada del algoritmo, que son pocos y bastante intuitivos.

input int    Population_P = 50;    //Population size
input double Eh_P         = 0.9;   //random selection frequency
input double Ep_P         = 0.1;   //frequency of step-by-step adjustment
input double Range_P      = 0.2;   //range

  • Population_P - número de variaciones de una pieza en la memoria de un músico o, lo que es lo mismo, el tamaño de la población;
  • Eh_P - frecuencia con la que se selecciona de la memoria una variación de una pieza; influye en la frecuencia con la que nos remitiremos a otras variaciones para tomar prestada una nota. Un valor más alto implica mayores propiedades combinatorias del algoritmo;
  • Ep_P - frecuencia con la que la nota necesita ser cambiada ligeramente, más alta o más baja en afinación, si la nota ha sido seleccionada de otra variación de la pieza;
  • Range_P - rango de cambio de la nota en la versión editada de la pieza, si no se ha tomado de otra versión. Por ejemplo, 0,2 significaría el 20% del rango de las notas de un instrumento musical.

El algoritmo de HS trabaja con armonías (composiciones musicales) que pueden describirse usando la estructura S_Harmony. Una armonía se compone de notas (acordes), y supone un array que representa los parámetros optimizables c []. Los mejores acordes de la pieza se almacenan en el array cB []. Es en este array donde entrará la composición acertada y precisamente con estas composiciones (armonías) realizaremos permutaciones combinatorias, tomando notas prestadas de ellas. La calidad de la armonía se almacena en la variable h, mientras que la mejor armonía se guarda en la variable hB.

//——————————————————————————————————————————————————————————————————————————————
struct S_Harmony //musical composition
{
  double c  []; //chords
  double cB []; //best chords
  double h;     //harmony quality
  double hB;    //best harmony quality
};
//——————————————————————————————————————————————————————————————————————————————

En la clase C_AO_HS se usa un array de estructuras de armonía. Las declaraciones en la clase de métodos y miembros son compactas, ya que el algoritmo es inusualmente conciso y no requiere de grandes recursos computacionales: aquí no veremos la clasificación utilizada en muchos otros algoritmos de optimización. Necesitaremos arrays para establecer el máximo, el mínimo y el paso de los parámetros a optimizar (ejerciendo el papel de rango y paso del acorde), así como variables constantes para transmitirles los parámetros externos del algoritmo; en general, podemos detenernos aquí. Vamos a describir ahora los métodos en los que se encapsula la lógica central de HS.

//——————————————————————————————————————————————————————————————————————————————
class C_AO_HS
{
  //----------------------------------------------------------------------------
  public: S_Harmony h      []; //harmonies matrix
  public: double rangeMax  []; //maximum search range
  public: double rangeMin  []; //manimum search range
  public: double rangeStep []; //step search
  public: double cB        []; //best chords
  public: double hB;           //best harmony quality

  public: void Init (const int    chordsNumberP,      //chords number
                     const int    harmoniesNumberP,   //harmonies number
                     const double EhP,                //random selection frequency
                     const double EpP,                //frequency of step-by-step adjustment
                     const double rangeP,             //range
                     const int    maxIterationsP);    //max Iterations

  public: void Moving   (int iter);
  public: void Revision ();

  //----------------------------------------------------------------------------
  private: int    chordsNumber;      //chords number
  private: int    harmoniesNumber;   //harmonies number
  private: double Eh;                //random selection frequency
  private: double Ep;                //frequency of step-by-step adjustment
  private: double range;             //range
  private: int    maxIterations;
  private: double frequency [];      //frequency range
  private: bool   revision;

  private: double SeInDiSp  (double In, double InMin, double InMax, double Step);
  private: double RNDfromCI (double min, double max);
  private: double Scale     (double In, double InMIN, double InMAX, double OutMIN, double OutMAX,  bool revers);
};
//——————————————————————————————————————————————————————————————————————————————

El método abierto Init () se usa para inicializar el algoritmo. Aquí estableceremos el tamaño de los arrays. El índice de calidad de la mejor armonía hallada se inicializará con el mínimo número double posible: actuaremos de la misma forma con las variables correspondientes del array de la estructura de armonía.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_HS::Init (const int    chordsNumberP,      //chords number
                    const int    harmoniesNumberP,   //harmonies number
                    const double EhP,                //random selection frequency
                    const double EpP,                //frequency of step-by-step adjustment
                    const double rangeP,             //range
                    const int    maxIterationsP)     //max Iterations
{
  MathSrand ((int)GetMicrosecondCount ()); // reset of the generator
  hB       = -DBL_MAX;
  revision = false;

  chordsNumber    = chordsNumberP;
  harmoniesNumber = harmoniesNumberP;
  Eh              = EhP;
  Ep              = EpP;
  range           = rangeP;
  maxIterations   = maxIterationsP;

  ArrayResize (rangeMax,  chordsNumber);
  ArrayResize (rangeMin,  chordsNumber);
  ArrayResize (rangeStep, chordsNumber);
  ArrayResize (frequency, chordsNumber);

  ArrayResize (h, harmoniesNumberP);

  for (int i = 0; i < harmoniesNumberP; i++)
  {
    ArrayResize (h [i].c,  chordsNumber);
    ArrayResize (h [i].cB, chordsNumber);
    h [i].h  = -DBL_MAX;
    h [i].hB = -DBL_MAX;
  }

  ArrayResize (cB, chordsNumber);
}
//——————————————————————————————————————————————————————————————————————————————

El primer método obligatorio en cada iteración será el método abierto Moving (), que contiene el parámetro de entrada iter: la iteración actual. En la primera iteración, cuando la bandera «revision» es igual a false, las armonías deberán inicializarse con valores aleatorios en el rango de los instrumentos musicales, lo cual equivale a que un músico elija acordes al azar. Para reducir las operaciones repetitivas, guardaremos la gama de frecuencias sonoras de los acordes correspondientes (parámetros optimizables) en el array de frecuency [].

//----------------------------------------------------------------------------
if (!revision)
{
  hB = -DBL_MAX;

  for (int har = 0; har < harmoniesNumber; har++)
  {
    for (int c = 0; c < chordsNumber; c++)
    {
      h [har].c [c] = RNDfromCI (rangeMin [c], rangeMax [c]);
      h [har].c [c] = SeInDiSp  (h [har].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
      h [har].h     = -DBL_MAX;
      h [har].hB    = -DBL_MAX;

      frequency [c] = rangeMax [c] - rangeMin [c];
    }
  }

  revision = true;
}

En la segunda iteración y en las siguientes, se improvisará, es decir, se cambiarán sucesivamente los acordes y sus combinaciones. Hay varias armonías en la memoria que cambiaremos y combinaremos. Para cada nueva armonía, recorreremos los acordes secuencialmente. Para cada acorde existe una probabilidad de ser elegido aleatoriamente de la memoria de armonías, es decir, la armonía se seleccionará al azar (la probabilidad para todas las armonías es igual). Si el acorde se toma de la memoria armónica, la probabilidad de que cambie también se comprobará con la fórmula:

h [har].c [c] = h [har].c [c] + r * B * frequency [c];

donde:

r - número aleatorio comprendido entre -1 y 1
frecuency - gama de frecuencias del instrumento
B - coeficiente calculado según la fórmula:

B = ((maxIterations - iter) / (double)maxIterations) * (maxB - minB) + minB;

donde:

maxIterations - número máximo de iteraciones
iter - iteración actual
maxB - límite máximo del coeficiente
minB - límite mínimo del coeficiente

La figura 2 muestra la dependencia del coeficiente B respecto a los ajustes del algoritmo y de la iteración actual.

FSb

Figura 2. Dependencia del coeficiente B respecto a los ajustes maxB, minB y la iteración actual del algoritmo.

A partir de la fórmula para calcular el coeficiente B, podemos ver que con cada iteración el coeficiente B disminuye. De este modo, se mejoran los extremos encontrados al final de la optimización.
Si no se ha seleccionado un acorde de la memoria de armonía, se cambiará el que ya tengamos. La diferencia en el cambio de acorde, comparado con el cambio anterior, será el rango fijo de valores de onda sonora.


Una vez completado el proceso de cambio del acorde, comprobaremos el acorde resultante para ver si se encuentra fuera del rango de valores admisibles del instrumento musical.

//----------------------------------------------------------------------------
else
{
  double r         = 0.0;
  int    harAdress = 0;
  double minB      = 0.0;
  double maxB      = 0.3;
  double B = ((maxIterations - iter) / (double)maxIterations) * (maxB - minB) + minB;

  for (int har = 0; har < harmoniesNumber; har++)
  {
    for (int c = 0; c < chordsNumber; c++)
    {
      r = RNDfromCI (0.0, 1.0);

      if (r <= Eh)
      {
        r = RNDfromCI (0.0, harmoniesNumber - 1);
        harAdress = (int)MathRound (r);
        if (harAdress < 0) harAdress = 0;
        if (harAdress > harmoniesNumber - 1) harAdress = harmoniesNumber - 1;

        h [har].c [c] = h [harAdress].cB [c];

        r = RNDfromCI (0.0, 1.0);

        if (r < Ep)
        {
          r = RNDfromCI (-1.0, 1.0);
          h [har].c [c] = h [har].c [c] + r * B * frequency [c];
        }
      }
      else
      {
        r = RNDfromCI (-1.0, 1.0);
        h [har].c [c] = h [har].cB [c] + r * range * frequency [c];
      }

      h [har].c [c] = SeInDiSp (h [har].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
    }
  }
}

El segundo método público llamado en cada iteración después de que la función de aptitud haya sido calculada, es Revision (). Su objetivo es actualizar la solución global hallada. Si la armonía es mejor que su mejor versión h > hB, actualizaremos la mejor versión de esa armonía.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_HS::Revision ()
{
  for (int har = 0; har < harmoniesNumber; har++)
  {
    if (h [har].h > hB)
    {
      hB = h [har].h;
      ArrayCopy (cB, h [har].c, 0, 0, WHOLE_ARRAY);
    }
    if (h [har].h > h [har].hB)
    {
      h [har].hB = h [har].h;
      ArrayCopy (h [har].cB, h [har].c, 0, 0, WHOLE_ARRAY);
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

Un examen detallado del código nos revela que no hay ideas fundamentalmente nuevas en el algoritmo de búsqueda armónica. El algoritmo de búsqueda armónica supone un préstamo de ideas previamente utilizadas de algoritmos evolutivos, incluyendo la recombinación global uniforme, la mutación uniforme, la mutación gaussiana y la sustitución del peor individuo en cada generación. Algunas fuentes señalan la necesidad de sustituir la nueva armonía por la peor de la memoria, mientras que en nuestro algoritmo la armonía solo puede sustituir a su mejor solución: esto supone una diferencia entre este algoritmo de HS y la versión clásica, porque mi investigación indica que esta es la implementación del algoritmo que resultará más productiva.

La contribución del algoritmo de búsqueda armónica se concentra en dos áreas: la combinación de las ideas mencionadas, presente en este algoritmo, es algo nuevo; y la motivación musical detrás del algoritmo de búsqueda armónica también es nueva. Solo muy pocas publicaciones sobre la búsqueda armónica hablan de los motivos musicales o las extensiones del algoritmo de búsqueda armónica. La mayoría de las publicaciones se centran en la hibridación del algoritmo de búsqueda armónica con otros algoritmos evolutivos, la configuración de los parámetros de búsqueda armónica o la aplicación del algoritmo de búsqueda armónica a problemas específicos. Si pudiéramos aplicar más extensiones condicionadas por la música al algoritmo de HS, esto nos ayudaría a distinguirlo como un algoritmo evolutivo independiente. Esta investigación requeriría el estudio de la teoría musical, el análisis del proceso de composición y arreglo musical, el estudio de las teorías educativas de la música y la ingeniosa aplicación de dichas teorías al algoritmo para encontrar la armonía.


3. Resultados de las pruebas

Impresión del funcionamiento de HS en el banco de pruebas:

2023.02.08 17:30:05.710    Test_AO_HS (EURUSD,M1)    C_AO_HS:50;0.9;0.1;0.2
2023.02.08 17:30:05.711    Test_AO_HS (EURUSD,M1)    =============================
2023.02.08 17:30:07.919    Test_AO_HS (EURUSD,M1)    5 Rastrigin's; Func runs 10000 result: 80.62868417575105
2023.02.08 17:30:07.919    Test_AO_HS (EURUSD,M1)    Score: 0.99903
2023.02.08 17:30:11.563    Test_AO_HS (EURUSD,M1)    25 Rastrigin's; Func runs 10000 result: 75.85009280972398
2023.02.08 17:30:11.563    Test_AO_HS (EURUSD,M1)    Score: 0.93983
2023.02.08 17:30:45.823    Test_AO_HS (EURUSD,M1)    500 Rastrigin's; Func runs 10000 result: 50.26867628386793
2023.02.08 17:30:45.823    Test_AO_HS (EURUSD,M1)    Score: 0.62286
2023.02.08 17:30:45.823    Test_AO_HS (EURUSD,M1)    =============================
2023.02.08 17:30:47.878    Test_AO_HS (EURUSD,M1)    5 Forest's; Func runs 10000 result: 1.7224980742302596
2023.02.08 17:30:47.878    Test_AO_HS (EURUSD,M1)    Score: 0.97433
2023.02.08 17:30:51.546    Test_AO_HS (EURUSD,M1)    25 Forest's; Func runs 10000 result: 1.0610723369605124
2023.02.08 17:30:51.546    Test_AO_HS (EURUSD,M1)    Score: 0.60020
2023.02.08 17:31:31.229    Test_AO_HS (EURUSD,M1)    500 Forest's; Func runs 10000 result: 0.13820341163584177
2023.02.08 17:31:31.229    Test_AO_HS (EURUSD,M1)    Score: 0.07817
2023.02.08 17:31:31.229    Test_AO_HS (EURUSD,M1)    =============================
2023.02.08 17:31:34.315    Test_AO_HS (EURUSD,M1)    5 Megacity's; Func runs 10000 result: 7.959999999999999
2023.02.08 17:31:34.315    Test_AO_HS (EURUSD,M1)    Score: 0.66333
2023.02.08 17:31:42.862    Test_AO_HS (EURUSD,M1)    25 Megacity's; Func runs 10000 result: 5.112
2023.02.08 17:31:42.862    Test_AO_HS (EURUSD,M1)    Score: 0.42600
2023.02.08 17:32:25.172    Test_AO_HS (EURUSD,M1)    500 Megacity's; Func runs 10000 result: 0.6492
2023.02.08 17:32:25.172    Test_AO_HS (EURUSD,M1)    Score: 0.05410

Observando la impresión de los resultados de la prueba, llaman la atención los altos valores de las funciones de la prueba, lo cual hace esperar que la puntuación global de la prueba sea sobresaliente. Un rasgo característico de HS en la visualización es que no se aprecian formaciones estructurales en forma de grupos de coordenadas, como ocurre en algunos de los algoritmos anteriores: existe un patrón visible en el movimiento de los agentes en el espacio de búsqueda, similar al comportamiento del algoritmo de optimización RND, aunque los gráficos de convergencia se comportan de forma muy segura, acercándose progresivamente a la solución del problema de optimización. El estancamiento en los extremos locales no es algo característico de este algoritmo.

rastrigin

  HS en la función de prueba Rastrigin.

forest

  HS en la función de prueba Forest.

megacity

  HS en la función de prueba Megacity.

Ha llegado el momento de desglosar los resultados de la tabla y responder a la pregunta principal del artículo. En artículos anteriores, expresamos ciertas dudas sobre si podríamos conseguir probar un algoritmo que batiera al líder de la tabla de clasificación en ese momento en una función discreta. El algoritmo, que visualmente parece un algoritmo aleatorio, ha logrado convertirse en el líder no solo en la función discreta (el mejor en tres pruebas), sino también en las demás funciones de prueba, llegando a ser el mejor en 6 pruebas de un total de 9.

AO

Description

Rastrigin

Rastrigin final

Forest

Forest final

Megacity (discrete)

Megacity final

Final result

10 params (5 F)

50 params (25 F)

1000 params (500 F)

10 params (5 F)

50 params (25 F)

1000 params (500 F)

10 params (5 F)

50 params (25 F)

1000 params (500 F)

HS

harmony search

1,00000

1,00000

0,57048

2,57048

1,00000

0,98931

0,57917

2,56848

1,00000

1,00000

1,00000

3,00000

100,00000

ACOm

ant colony optimization M

0,34724

0,18876

0,20182

0,73782

0,85966

1,00000

1,00000

2,85966

1,00000

0,88484

0,13497

2,01981

68,094

IWO

invasive weed optimization

0,96140

0,70405

0,35295

2,01840

0,68718

0,46349

0,41071

1,56138

0,75912

0,39732

0,80145

1,95789

67,087

COAm

cuckoo optimization algorithm M

0,92701

0,49111

0,30792

1,72604

0,55451

0,34034

0,21362

1,10847

0,67153

0,30326

0,41127

1,38606

50,422

FAm

firefly algorithm M

0,60020

0,35662

0,20290

1,15972

0,47632

0,42299

0,64360

1,54291

0,21167

0,25143

0,84884

1,31194

47,816

BA

bat algorithm

0,40658

0,66918

1,00000

2,07576

0,15275

0,17477

0,33595

0,66347

0,15329

0,06334

0,41821

0,63484

39,711

ABC

artificial bee colony

0,78424

0,34335

0,24656

1,37415

0,50591

0,21455

0,17249

0,89295

0,47444

0,23609

0,33526

1,04579

38,937

BFO

bacterial foraging optimization

0,67422

0,32496

0,13988

1,13906

0,35462

0,26623

0,26695

0,88780

0,42336

0,30519

0,45578

1,18433

37,651

GSA

gravitational search algorithm

0,70396

0,47456

0,00000

1,17852

0,26854

0,36416

0,42921

1,06191

0,51095

0,32436

0,00000

0,83531

35,937

FSS

fish school search

0,46965

0,26591

0,13383

0,86939

0,06711

0,05013

0,08423

0,20147

0,00000

0,00959

0,19942

0,20901

13,215

PSO

particle swarm optimisation

0,20515

0,08606

0,08448

0,37569

0,13192

0,10486

0,28099

0,51777

0,08028

0,21100

0,04711

0,33839

10,208

RND

random

0,16881

0,10226

0,09495

0,36602

0,07413

0,04810

0,06094

0,18317

0,00000

0,00000

0,11850

0,11850

5,469

GWO

grey wolf optimizer

0,00000

0,00000

0,02672

0,02672

0,00000

0,00000

0,00000

0,00000

0,18977

0,03645

0,06156

0,28778

1,000


Resumamos: En el histograma con los resultados de las pruebas, el algoritmo de HS ocupa la primera posición en el momento que escribo estas líneas, con una enorme ventaja sobre los otros algoritmos de optimización, lo cual indica la enorme potencia y las posibilidades del algoritmo, así como sus capacidades potenciales para optimizar soluciones de diversos problemas complejos.

Un factor que, en mi opinión, resulta vital a la hora de demostrar resultados impresionantes en varios tipos de funciones de prueba, incluidas las muy complejas, es la herencia de algunos métodos (técnicas) presentes en otros algoritmos de optimización: La HS no dispone de clasificación de un conjunto de soluciones, cada solución actualiza solo su solución local: esto es característico del algoritmo de optimización de búsqueda de cuco, donde un nuevo camino de desarrollo de la rama de soluciones se produce solo si el huevo es mejor que el del nido. Además, los métodos utilizados en la HS se asemejan a los aplicados en los algoritmos genéticos, que implican la combinación de elementos de solución.

El potente algoritmo de optimización de HS, que tiene un rendimiento excepcionalmente alto, puede recomendarse con confianza para una amplia variedad de problemas complejos con muchas variables, tanto para funciones escalares suaves como para problemas combinatorios discretos complejos. El algoritmo de HS ya se ha aplicado con éxito en muchos ámbitos de la ingeniería (optimización de la topología estructural y la forma óptima de las piezas), la electrónica y la logística.

La sencilla implementación del algoritmo de HS deja margen para la investigación, permitiendo añadir y combinar diferentes estrategias de optimización, lo cual sugiere que las capacidades de este algoritmo están lejos de haberse alcanzado plenamente.

Histograma de los resultados de la prueba del algoritmo en la figura 3.

chart

Figura 3. Histograma con los resultados finales de los algoritmos de prueba.


Ventajas e inconvenientes del algoritmo de búsqueda armónica de HS:

Ventajas:
1. Fácil de aplicar.
2. Excelente convergencia en todo tipo de funciones, sin excepción.
3. Escalabilidad extraordinaria.
4. Muy rápido.
5. Número reducido de parámetros externos.

Desventajas:
No se han detectado.

Para cada artículo, adjuntamos un archivo que contiene las versiones actualizadas actuales de los códigos del algoritmo para todos los artículos anteriores. El artículo representa la experiencia acumulada y la opinión personal del autor; las conclusiones y juicios se basan en los experimentos realizados.

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

Archivos adjuntos |
Aprendizaje automático y Data Science (Parte 11): Clasificador bayesiano ingenuo y teoría de la probabilidad en el trading Aprendizaje automático y Data Science (Parte 11): Clasificador bayesiano ingenuo y teoría de la probabilidad en el trading
Comerciar con probabilidades es como caminar por la cuerda floja: requiere precisión, equilibrio y una clara comprensión del riesgo. En el mundo del trading, la probabilidad lo es todo: es lo que determina el resultado, el éxito o el fracaso, los beneficios o las pérdidas. Usando el poder de la probabilidad, los tráders pueden tomar decisiones mejor informadas, gestionar el riesgo con mayor eficacia y alcanzar sus objetivos financieros. Tanto si es usted un inversor experimentado como un tráder principiante, comprender las probabilidades puede ser la clave para liberar su potencial comercial. En este artículo, analizaremos el fascinante mundo del trading probabilístico y le mostraremos cómo llevar su modo de comerciar al siguiente nivel.
Redes neuronales de propagación inversa del error en matrices MQL5 Redes neuronales de propagación inversa del error en matrices MQL5
El artículo describe la teoría y la práctica de la aplicación del algoritmo de propagación inversa del error en MQL5 con la ayuda de matrices. Asimismo, incluye clases y ejemplos preparados del script, el indicador y el asesor.
Teoría de categorías en MQL5 (Parte 3) Teoría de categorías en MQL5 (Parte 3)
La teoría de categorías es una rama diversa y en expansión de las matemáticas, relativamente inexplorada aún en la comunidad MQL5. Esta serie de artículos tiene como objetivo destacar algunos de sus conceptos para crear una biblioteca abierta y seguir utilizando esta maravillosa sección para crear estrategias comerciales.
Desarrollo de un sistema de repetición — Simulación de mercado (Parte 02): Primeros experimentos (II) Desarrollo de un sistema de repetición — Simulación de mercado (Parte 02): Primeros experimentos (II)
Intentemos esta vez un enfoque diferente para lograr el objetivo de 1 minuto. Sin embargo, esta tarea no es tan sencilla como muchos piensan.