![Algoritmos de optimización de la población: Búsqueda armónica (HS)](https://c.mql5.com/2/51/Harmony_Search_600x314.jpg)
Algoritmos de optimización de la población: Búsqueda armónica (HS)
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.
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.
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.
HS en la función de prueba Rastrigin.
HS en la función de prueba Forest.
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.
Figura 3. Histograma con los resultados finales de los algoritmos de prueba.
Ventajas e inconvenientes del algoritmo de búsqueda armónica de HS:
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
![Aprendizaje automático y Data Science (Parte 11): Clasificador bayesiano ingenuo y teoría de la probabilidad en el trading](https://c.mql5.com/2/52/naive_bayes_avatar.png)
![Redes neuronales de propagación inversa del error en matrices MQL5](https://c.mql5.com/2/51/Avatar_lggz1x9t4-860i-3kodu0uiq-f2ofqhb1q5z5e1m-rrhtix-35-bsg11hrh.png)
![Teoría de categorías en MQL5 (Parte 3)](https://c.mql5.com/2/52/Category-Theory-part3-avatar.png)
![Desarrollo de un sistema de repetición — Simulación de mercado (Parte 02): Primeros experimentos (II)](https://c.mql5.com/2/52/replay-p2-avatar.png)
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso