![Алгоритм адаптивного социального поведения — Adaptive Social Behavior Optimization (ASBO): Двухфазная эволюция](https://c.mql5.com/2/85/Adaptive_Social_Behavior_Optimization__Part_2_600x314.jpg)
Алгоритм адаптивного социального поведения — Adaptive Social Behavior Optimization (ASBO): Двухфазная эволюция
1. Введение
В предыдущей статье мы рассмотрели пример концепции Швефеля, включающего нормальное распределение, применение самоадаптивных коэффициентов мутации, а также функцию определения ближайших соседей по их приспособленности. Теперь наш путь ведет нас к новому этапу исследования, где мы погрузимся в двухфазный процесс, завершим формирование алгоритма как математической модели - ASBO (Adaptive Social Behavior Optimization). Мы предпримем комплексное тестирование этой интересной модели на уже нам знакомых тестовых функциях и сделаем выводы о ее эффективности. В этой статье мы раскроем новые грани применения социального поведения живых организмов в области оптимизации, а также представим уникальные результаты, которые помогут нам лучше понять и использовать принципы коллективного поведения для решения сложных задач.
2. Реализация алгоритма
Начнём с формирования псевдокода алгоритма ABSO (используемые уравнения представлены ниже):
Входные параметры: размер популяций PZ, количество популяций M, количество эпох P' на каждую популяцию. f (x) - целевая функция.
Инициализация:
1. Создать M популяций, каждая размером PZ
2. Для каждой популяции:
- Инициализировать решения xi случайным образом
- Вычислить значения целевой функции f (xi) для каждого решения
- Определить глобального лидера Gb как решение с максимальным f (xi)
- Для каждого решения xi определить группу ближайших соседей Nc
- Инициализировать личные лучшие решения Sb = xi
- Инициализировать адаптивные параметры Cg, Cs, Cn случайным образом в диапазоне [-1.0; 1.0]
Фаза 1: Независимая обработка популяций.
3. Для каждой из M популяций:
- Для каждого решения xi:
- Применить самоадаптивную мутацию для обновления коэффициентов Cg, Cs, Cn по уравнениям (3) и (4)
- Вычислить изменение положения ΔX (i + 1) по уравнению (1)
- Обновить положение xi по уравнению (2)
- Вычислить новое значение f (xi)
- Обновить личное лучшее решение Sb, если f (xi) > f (Sb)
- Обновить глобального лидера Gb, если f (xi) > f (Gb)
- Повторять до достижения P' эпох
4. Сохранить финальные популяции, значения f (xi) и параметры Cg, Cs, Cn
Фаза 2: Обработка объединенной популяции.
5. Из всех финальных популяций выбрать PZ лучших решений по f (xi)
6. Использовать сохраненные параметры Cg, Cs, Cn для этих PZ решений
7. Применить алгоритм ASBO к объединенной популяции размером PZ
8. Повторять шаги 6-7 до достижения критерия останова
Вывод: Глобальный оптимум Gb
Ключевые уравнения:
- ΔX (i + 1) = Cg * R1 * (Gb - xi) + Cs * R2 * (Sb - xi) + Cn * R3 * (Nc - xi) (1)
- x (i + 1) = xi + ΔX (i + 1) (2)
- p'i (j) = pi (j) + σi (j) * N (0, 1) (3)
- σ'i (j) = σi (j) * exp (τ' * N (0, 1) + τ * Nj (0, 1)) (4)
Где:
- Gb - глобальный лидер
- Sb - личное лучшее решение
- Nc - центр группы соседей по приспособленности
- R1, R2, R3 - случайные числа в диапазоне [0, 1]
- Cg, Cs, Cn - адаптивные параметры
- N (0, 1) - случайное число из нормального распределения
- Nj (0,1) - случайное число из нормального распределения для каждого измерения j
- τ, τ' - масштабирующие факторы для самоадаптивной мутации
Из представленного псевдокода, можно заметить, что в алгоритме осуществляется двухфазная эволюция развития модели общества. Тезисно в сжатом виде можно описать логику алгоритма по фазам:
1. Первая фаза:
- Изначально берется M популяций одинакового размера PZ.
- Для каждой из этих M популяций независимо применяется алгоритм ASBO в течение фиксированного числа итераций P'.
- По окончании этой фазы сохраняются значения фитнес-функций и параметров адаптивной мутации для каждого индивидуума из всех финальных популяций.
2. Вторая фаза:
- Из всех финальных популяций первой фазы отбираются PZ лучших индивидуумов по значению фитнес-функции.
- Для этих PZ лучших индивидуумов используются их сохраненные параметры адаптивной мутации.
- Над этой новой популяцией размера PZ применяется алгоритм ASBO для получения окончательного решения.
Смысл двухфазной эволюции:
1. Первая фаза обеспечивает разнообразие решений и лучшую локализацию области глобального оптимума за счет независимой эволюции нескольких популяций.
2. Вторая фаза использует лучшие решения популяций из первой фазы и их адаптивные параметры для ускоренной сходимости к глобальному оптимуму.
Таким образом, двухфазная эволюция, теоретически, позволяет сочетать глобальный поиск на первом этапе с более эффективной локальной оптимизацией на втором этапе, что в итоге, предположительно, повышает производительность алгоритма в целом.
Классический вариант многопопуляционного двухфазного алгоритма ASBO предполагает использование нескольких популяций параллельно и независимо на первой фазе. На второй фазе берутся лучшие решения из популяций и создается новая популяция. Однако, при использовании нашего единого шаблона для всех популяционных алгоритмов, возникает вопрос о том, как обрабатывать несколько популяций.
Первым решением может быть разделение обычной популяции, например, 50 особей, на несколько популяций, например, 5. В этом случае каждая из 5 популяций будет содержать по 10 особей. Мы можем использовать несколько популяций обычным образом, как одну целую популяцию. Однако на второй фазе возникает проблема: нам необходимо взять лучшие решения из этих 5 популяций и поместить их в новую популяцию. Но мы не сможем набрать необходимое количество, поскольку нам придется поместить их все полностью, что фактически означает создание копии исходной популяции.
Вторым решением этой задачи является создание 5 популяций с размером, равным размеру нашей популяции, то есть 50 особей. Для каждой из этих популяций выделено фиксированное количество эпох, например 20. В этом случае на первой фазе мы будем последовательно обрабатывать эти 5 популяций с фиксированным количеством эпох на каждую популяцию, т.е. будет затрачено 5 * 20 = 100 эпох. Оставшиеся 100 эпох (из общего числа 200 эпох) будет происходить вторая фаза. На этой второй фазе мы поместим эти 5 популяций в одну большую популяцию размером 250 особей, произведем сортировку и из них возьмём 50 лучших особей и создадим новую популяцию. Далее производим операции с этой новой популяцией обычным образом согласно формулам. По смыслу это полностью совпадает с оригинальным алгоритмом, при этом мы придерживаемся нашей концепции работы с популяционными алгоритмами. Нам приходилось и ранее применять инновационные подходы в других алгоритмах, таких как Нельдера-Мида, химический CRO, в эволюционных алгоритмах и других, чтобы обеспечить совместимость всех алгоритмов и их бесшовную взаимозаменяемость.
Как будто бы мы всё обговорили, все методы и логические действия в алгоритме, переходим непосредственно к написанию кода.
Напишем структуру "S_ASBO_Agent", которая в многопопуляционном двухфазном алгоритме ASBO опишет поискового агента. В структуре определены переменные и метод "Init", который инициализирует агента.
Переменные:
- c - массив координат
- cBest - массив лучших координат
- f - значение приспособленности (fitness)
- fBest - лучшее значение приспособленности
- Cg, Cs, Cn - адаптивные параметры
- u - объект класса "C_AO_Utilities"
Метод "Init" инициализирует агента:
- Принимает количество координат "coords" и массивы "rangeMin" и "rangeMax", представляющие минимальные и максимальные значения для каждой координаты.
- Выделяет память для массивов "c" и "cBest" с количеством координат "coords".
- Устанавливает начальное значение "fBest" как "-DBL_MAX".
- Генерирует случайные значения для адаптивных параметров "Cg", "Cs", "Cn".
- Заполняет массив "c" случайными значениями в диапазоне между "rangeMin" и "rangeMax".
- Присваивает значения из "c" массиву "cBest".
//—————————————————————————————————————————————————————————————————————————————— struct S_ASBO_Agent { double c []; //coordinates double cBest []; //best coordinates double f; //fitness double fBest; //best fitness double Cg, Cs, Cn; //adaptive parameters C_AO_Utilities u; void Init (int coords, double &rangeMin [], double &rangeMax []) { ArrayResize (c, coords); ArrayResize (cBest, coords); fBest = -DBL_MAX; Cg = u.RNDprobab (); Cs = u.RNDprobab (); Cn = u.RNDprobab (); for (int i = 0; i < coords; i++) { c [i] = u.RNDfromCI (rangeMin [i], rangeMax [i]); cBest [i] = c [i]; } } }; //——————————————————————————————————————————————————————————————————————————————
Для работы поочерёдно с нескольким популяциями будет удобно использовать массив популяций, для это напишем структуру "S_ASBO_Population", которая содержит только одно поле:
- agent - массив объектов типа "S_ASBO_Agent", представляющий агентов в популяции.
//—————————————————————————————————————————————————————————————————————————————— struct S_ASBO_Population { S_ASBO_Agent agent []; }; //——————————————————————————————————————————————————————————————————————————————
Объявим класс "C_AO_ASBO" - наследник класса "C_AO". Класс содержит ряд методов и переменных для работы с оптимизацией:
1. Конструктор и деструктор:
- Конструктор инициализирует параметры алгоритма, такие как размер популяции, количество популяций, количество эпох для каждой популяции и ссылки на описание алгоритма.
- Деструктор пустой.
2. Методы:
- SetParams - устанавливает параметры алгоритма из массива "params".
- Init - инициализирует алгоритм с заданными параметрами: диапазоном поиска, шагом поиска и количеством эпох.
- Moving - выполняет операции перемещения агентов в пространстве поиска.
- Revision - выполняет операции ревизии (пересмотра) агентов в пространстве поиска и обновления лучшего глобального решения.
3. Переменные:
- numPop, epochsForPop - количество популяций и количество эпох для каждой популяции.
- epochs, epochNow, currPop, isPhase2, popEpochs, tau, tau_prime - дополнительные переменные, используемые в алгоритме.
- allAgentsForSortPhase2, allAgentsTemp, agentsPhase2, agentsTemp - массивы агентов, используемые в алгоритме.
- pop - массив популяций.
4. Вспомогательные методы:
- AdaptiveMutation - выполняет адаптивную мутацию для агента.
- UpdatePosition - обновляет позицию агента.
- FindNeighborCenter - находит центр соседей для агента.
- Sorting - выполняет сортировку агентов.
Таким образом, класс "C_AO_ASBO" представляет собой реализацию алгоритма ASBO с использованием различных методов и операций для перемещения и ревизии агентов в пространстве поиска.
//—————————————————————————————————————————————————————————————————————————————— class C_AO_ASBO : public C_AO { public: //-------------------------------------------------------------------- ~C_AO_ASBO () { } C_AO_ASBO () { ao_name = "ASBO"; ao_desc = "Adaptive Social Behavior Optimization"; ao_link = "https://www.mql5.com/ru/articles/15283"; popSize = 50; //population size numPop = 5; //number of populations epochsForPop = 10; //number of epochs for each population ArrayResize (params, 3); params [0].name = "popSize"; params [0].val = popSize; params [1].name = "numPop"; params [1].val = numPop; params [2].name = "epochsForPop"; params [2].val = epochsForPop; } void SetParams () { popSize = (int)params [0].val; numPop = (int)params [1].val; epochsForPop = (int)params [2].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 (); //---------------------------------------------------------------------------- int numPop; //number of populations int epochsForPop; //number of epochs for each population private: //------------------------------------------------------------------- int epochs; int epochNow; int currPop; bool isPhase2; int popEpochs; double tau; double tau_prime; S_ASBO_Agent allAgentsForSortPhase2 []; S_ASBO_Agent allAgentsTemp []; S_ASBO_Agent agentsPhase2 []; S_ASBO_Agent agentsTemp []; S_ASBO_Population pop []; //M populations void AdaptiveMutation (S_ASBO_Agent &agent); void UpdatePosition (int ind, S_ASBO_Agent &ag []); void FindNeighborCenter (int ind, S_ASBO_Agent &ag [], double ¢er []); void Sorting (S_ASBO_Agent &p [], S_ASBO_Agent &pTemp [], int size); }; //——————————————————————————————————————————————————————————————————————————————
Метод "Init" выполняет важную функцию класса "C_AO_ASBO" инициализирует параметры и структуры данных для алгоритма, необходимых для работы алгоритма ASBO перед началом оптимизации. Основные шаги инициализации в методе "Init":
1. Проверка и инициализация базовых параметров:
- Метод вызывает "StandardInit" для инициализации базовых параметров, таких как минимальный и максимальный диапазоны поиска, и шаг поиска. Если инициализация не удалась, метод возвращает "false".
2. Инициализация дополнительных переменных:
- Устанавливаются значения переменных "epochs", "epochNow", "currPop", "isPhase2" и "popEpochs".
- Рассчитываются значения переменных "tau" и "tau_prime" на основе размерности пространства поиска "coords".
3. Создание и инициализация популяций и агентов:
- Создается массив "pop" для хранения популяций, и каждая популяция инициализируется. Для каждого агента в популяции вызывается метод "Init" для инициализации его координат в заданном диапазоне.
- Создается массив "agentsPhase2" для агентов фазы 2 и инициализируется аналогично популяциям.
- Создаются массивы "allAgentsForSortPhase2" и "allAgentsTemp" для временного хранения агентов в процессе сортировки, и каждый агент инициализируется.
4. Возврат результата:
- Метод возвращает "true", если инициализация прошла успешно.
//—————————————————————————————————————————————————————————————————————————————— bool C_AO_ASBO::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; currPop = 0; isPhase2 = false; popEpochs = 0; tau = 1.0 / MathSqrt (2.0 * coords); tau_prime = 1.0 / MathSqrt (2.0 * MathSqrt (coords)); ArrayResize (pop, numPop); for (int i = 0; i < numPop; i++) { ArrayResize (pop [i].agent, popSize); for (int j = 0; j < popSize; j++) pop [i].agent [j].Init (coords, rangeMin, rangeMax); } ArrayResize (agentsPhase2, popSize); ArrayResize (agentsTemp, popSize); for (int i = 0; i < popSize; i++) agentsPhase2 [i].Init (coords, rangeMin, rangeMax); ArrayResize (allAgentsForSortPhase2, popSize * numPop); ArrayResize (allAgentsTemp, popSize * numPop); for (int i = 0; i < popSize * numPop; i++) { allAgentsForSortPhase2 [i].Init (coords, rangeMin, rangeMax); allAgentsTemp [i].Init (coords, rangeMin, rangeMax); } return true; } //——————————————————————————————————————————————————————————————————————————————
Метод "Moving" класса "C_AO_ASBO" представляет основной процесс движения агентов в рамках алгоритма ASBO, включая переход между фазами и выполнение соответствующих операций для каждой фазы. Основные шаги в методе "Moving":
1. Увеличение значения "epochNow":
- Значение переменной "epochNow" увеличивается на 1, что отражает начало новой эпохи оптимизации.
2. Фаза 1:
- Если алгоритм не находится в фазе 2, то выполняется следующее:
- Если количество эпох для текущей популяции достигло предела "epochsForPop", то сбрасывается счетчик "popEpochs", увеличивается счетчик "currPop" и сбрасывается значение "fB".
- Если достигнуто максимальное количество популяций "numPop", то алгоритм переходит в фазу 2. В этом случае агенты всех популяций объединяются в единый массив, сортируются, и лучшие агенты копируются в массив "agentsPhase2".
- В противном случае для каждого агента в текущей популяции выполняются операции адаптивной мутации и обновления позиции, а также копирования координат.
3. Фаза 2:
- В фазе 2 для каждого агента в массиве "agentsPhase2" также выполняются операции адаптивной мутации и обновления позиции, а также копирования координат.
//—————————————————————————————————————————————————————————————————————————————— void C_AO_ASBO::Moving () { epochNow++; //Фаза 1---------------------------------------------------------------------- if (!isPhase2) { if (popEpochs >= epochsForPop) { popEpochs = 0; currPop++; fB = -DBL_MAX; } if (currPop >= numPop) { isPhase2 = true; int cnt = 0; for (int i = 0; i < numPop; i++) { for (int j = 0; j < popSize; j++) { allAgentsForSortPhase2 [cnt] = pop [i].agent [j]; cnt++; } } u.Sorting (allAgentsForSortPhase2, allAgentsTemp, popSize * numPop); for (int j = 0; j < popSize; j++) agentsPhase2 [j] = allAgentsForSortPhase2 [j]; } else { for (int i = 1; i < popSize; i++) { AdaptiveMutation (pop [currPop].agent [i]); UpdatePosition (i, pop [currPop].agent); ArrayCopy (a [i].c, pop [currPop].agent [i].c); } popEpochs++; return; } } //Фаза 2---------------------------------------------------------------------- for (int i = 1; i < popSize; i++) { AdaptiveMutation (agentsPhase2 [i]); UpdatePosition (i, agentsPhase2); ArrayCopy (a [i].c, agentsPhase2 [i].c); } } //——————————————————————————————————————————————————————————————————————————————
Метод "Revision" класса "C_AO_ASBO" представляет процесс ревизии результатов оптимизации, включая обновление значения "fB" и обновление результатов оптимизации для каждой фазы алгоритма ASBO. Основные компоненты кода:
1. Переменные и их инициализация:
- int ind = -1; — переменная для хранения индекса элемента с наилучшим значением функции "f".
- fB — переменная, представляющая наилучшее значение функции "f", найденное на текущем этапе.
2. Поиск наилучшего агента:
- В первом цикле "for" происходит перебор всех агентов (объектов, представляющих решения) в массиве "a" размером "popSize".
- Если значение функции "f" текущего агента больше, чем текущее наилучшее значение "fB", то обновляются "fB" и индекс "ind".
3. Копирование данных:
- Если был найден агент с лучшим значением функции "ind != -1", то массив "cB" (представляющий параметры лучшего решения) обновляется значениями из массива "a".
4. Фаза 1:
- Если текущая популяция "currPop" меньше общего числа популяций "numPop", происходит обновление значений функции "f" для агентов текущей популяции.
- Если значение "f" агента в массиве "a" больше его лучшего значения "fBest", то обновляется "fBest" и копируются соответствующие характеристики в "cBest".
- Затем происходит сортировка агентов текущей популяции с использованием метода "u.Sorting".
5. Фаза 2:
- Если текущая популяция равна или больше общего числа популяций, то аналогичные действия выполняются для массива "agentsPhase2".
- Обновляются значения функции "f", проверяются и обновляются лучшие значения "fBest", и происходит сортировка.
Общая логика работы:
- Метод "Revision" выполняет два основных этапа: поиск лучшего агента и обновление данных для агентов в зависимости от текущей фазы (фаза 1 или фаза 2).
- Основная цель — отслеживать и обновлять наилучшие найденные решения в процессе оптимизации, а также поддерживать сортировку агентов для последующего использования.
//—————————————————————————————————————————————————————————————————————————————— void C_AO_ASBO::Revision () { //---------------------------------------------------------------------------- int ind = -1; for (int i = 0; i < popSize; i++) { if (a [i].f > fB) { fB = a [i].f; ind = i; } } if (ind != -1) ArrayCopy (cB, a [ind].c, 0, 0, WHOLE_ARRAY); //---------------------------------------------------------------------------- //фаза 1 if (currPop < numPop) { for (int i = 0; i < popSize; i++) { pop [currPop].agent [i].f = a [i].f; if (a [i].f > pop [currPop].agent [i].fBest) { pop [currPop].agent [i].fBest = a [i].f; ArrayCopy (pop [currPop].agent [i].cBest, a [i].c, 0, 0, WHOLE_ARRAY); } } u.Sorting (pop [currPop].agent, agentsTemp, popSize); } //фаза 2 else { for (int i = 0; i < popSize; i++) { agentsPhase2 [i].f = a [i].f; if (a [i].f > agentsPhase2 [i].fBest) { agentsPhase2 [i].fBest = a [i].f; ArrayCopy (agentsPhase2 [i].cBest, a [i].c, 0, 0, WHOLE_ARRAY); } } u.Sorting (agentsPhase2, agentsTemp, popSize); } } //——————————————————————————————————————————————————————————————————————————————
Метод "AdaptiveMutation" класса "C_AO_ASBO" представляет процесс адаптивной мутации коэффициентов агента "ag" в рамках алгоритма ASBO, включая применение гауссовского распределения и вычисление новых значений коэффициентов на основе случайных величин. Основные шаги в методе "AdaptiveMutation":
1. Адаптивная мутация коэффициентов:
- Коэффициенты "Cg", "Cs" и "Cn" агента "ag" мутируются с помощью гауссовского распределения.
- Для каждого коэффициента вычисляется новое значение с помощью экспоненциальной функции от суммы двух гауссовских случайных величин, каждая из которых умножается на соответствующий коэффициент "tau_prime" и "tau".
//—————————————————————————————————————————————————————————————————————————————— void C_AO_ASBO::AdaptiveMutation (S_ASBO_Agent &ag) { ag.Cg *= MathExp (tau_prime * u.GaussDistribution (0, -1, 1, 1) + tau * u.GaussDistribution (0, -1, 1, 8)); ag.Cs *= MathExp (tau_prime * u.GaussDistribution (0, -1, 1, 1) + tau * u.GaussDistribution (0, -1, 1, 8)); ag.Cn *= MathExp (tau_prime * u.GaussDistribution (0, -1, 1, 1) + tau * u.GaussDistribution (0, -1, 1, 8)); } //——————————————————————————————————————————————————————————————————————————————
Метод "UpdatePosition" класса "C_AO_ASBO" представляет процесс обновления позиции агента в рамках алгоритма ASBO, включая вычисление изменения позиции на основе различных коэффициентов и обновление позиции в пределах заданных диапазонов. Основные шаги в методе "UpdatePosition":
1. Вычисление изменения позиции:
- Вычисляется изменение позиции агента "ag [ind]" в каждом измерении "j" с использованием различных коэффициентов и величин, таких как "cB", "cBest", "deltaX", "rangeMin", "rangeMax" и "rangeStep".
2. Обновление позиции агента:
- Для каждого измерения "j" вычисляется новое значение позиции агента "ag [ind].c [j]" путем добавления изменения "deltaX [j]" и последующей коррекции значения в пределах заданных диапазонов.
Закомментированная часть кода "1)" - оригинальный вариант авторов, "3)" - мой вариант без учета коэффициентов "Cg", "Cs", "Cn", вместо них использовано нормальное распределение. Вариант "2)" - мой вариант, показал самые лучшие результаты из этих трёх вариантов.
//—————————————————————————————————————————————————————————————————————————————— void C_AO_ASBO::UpdatePosition (int ind, S_ASBO_Agent &ag []) { double deltaX []; ArrayResize (deltaX, coords); FindNeighborCenter (ind, ag, deltaX); for (int j = 0; j < coords; j++) { /* //1) deltaX [j] = ag [ind].Cg * u.RNDfromCI (-1, 1) * (cB [j] - ag [ind].c [j]) + ag [ind].Cs * u.RNDfromCI (-1, 1) * (ag [ind].cBest [j] - ag [ind].c [j]) + ag [ind].Cn * u.RNDfromCI (-1, 1) * (deltaX [j] - ag [ind].c [j]); */ //2) deltaX [j] = ag [ind].Cg * (cB [j] - ag [ind].c [j]) + ag [ind].Cs * (ag [ind].cBest [j] - ag [ind].c [j]) + ag [ind].Cn * (deltaX [j] - ag [ind].c [j]); /* //3) deltaX [j] = u.GaussDistribution (0, -1, 1, 8) * (cB [j] - ag [ind].c [j]) + u.GaussDistribution (0, -1, 1, 8) * (ag [ind].cBest [j] - ag [ind].c [j]) + u.GaussDistribution (0, -1, 1, 8) * (deltaX [j] - ag [ind].c [j]); */ ag [ind].c [j] += deltaX [j]; ag [ind].c [j] = u.SeInDiSp (ag [ind].c [j], rangeMin [j], rangeMax [j], rangeStep [j]); } } //——————————————————————————————————————————————————————————————————————————————
3. Результаты тестов
Распечатка алгоритма ASBO выявляет ряд интересных особенностей, которые делают его действительно уникальным. Одной из ключевых характеристик является его выдающаяся способность к масштабированию. Это позволяет алгоритму эффективно справляться с задачами высокой размерности. Особенно примечательны результаты, полученные при тестировании функций Forest и Megacity с 1000 параметрами. В этих случаях ASBO демонстрирует впечатляющие показатели, сопоставимые с результатами ведущих алгоритмов в рейтинговой таблице. Такие достижения подчеркивают не только эффективность алгоритма, но и его потенциал для применения в разнообразных областях, требующих высококачественной оптимизации.
ASBO|Adaptive Social Behavior Optimization|50.0|5.0|10.0|
=============================
5 Hilly's; Func runs: 10000; result: 0.7633114189858913
25 Hilly's; Func runs: 10000; result: 0.4925279738997658
500 Hilly's; Func runs: 10000; result: 0.3261850685263711
=============================
5 Forest's; Func runs: 10000; result: 0.7954558091769679
25 Forest's; Func runs: 10000; result: 0.4003462752027551
500 Forest's; Func runs: 10000; result: 0.26096981234192485
=============================
5 Megacity's; Func runs: 10000; result: 0.2646153846153846
25 Megacity's; Func runs: 10000; result: 0.1716923076923077
500 Megacity's; Func runs: 10000; result: 0.18200000000000044
=============================
All score: 3.65710 (40.63%)
Визуализация результатов работы алгоритма ASBO раскрывает ряд интересных особенностей, которые заслуживают внимания. С самого начала работы алгоритма можно заметить, как он успешно выделяет значимые области решения, что свидетельствует о его способности эффективно исследовать пространство параметров.
График сходимости демонстрирует характерные разрывы в линии, которые обусловлены последовательной работой нескольких популяций на первой фазе. Эти разрывы говорят о том, что каждая популяция вносит свой вклад в процесс оптимизации, исследуя различные участки пространства. Однако на второй фазе график принимает сплошную форму, что означает объединение лучших решений из всех популяций, собранных вместе после первой фазы. Это объединение позволяет алгоритму сосредоточиться на уточнение перспективных областей.
Таким образом, визуализация не только иллюстрирует динамику работы алгоритма, но и подчеркивает его адаптивные и кооперативные механизмы.
ASBO на тестовой функции Hilly.
ASBO на тестовой функции Forest.
ASBO на тестовой функции Megacity.
Алгоритм по результатам проведенных исследований занимает уверенное место в середине рейтинговой таблицы.
№ | AO | Description | Hilly | Hilly final | Forest | Forest final | Megacity (discrete) | Megacity final | Final result | % of MAX | ||||||
10 p (5 F) | 50 p (25 F) | 1000 p (500 F) | 10 p (5 F) | 50 p (25 F) | 1000 p (500 F) | 10 p (5 F) | 50 p (25 F) | 1000 p (500 F) | ||||||||
1 | ANS | across neighbourhood search | 0,94948 | 0,84776 | 0,43857 | 2,23581 | 1,00000 | 0,92334 | 0,39988 | 2,32323 | 0,70923 | 0,63477 | 0,23091 | 1,57491 | 6,134 | 68,15 |
2 | CLA | code lock algorithm | 0,95345 | 0,87107 | 0,37590 | 2,20042 | 0,98942 | 0,91709 | 0,31642 | 2,22294 | 0,79692 | 0,69385 | 0,19303 | 1,68380 | 6,107 | 67,86 |
3 | (P+O)ES | (P+O) evolution strategies | 0,92256 | 0,88101 | 0,40021 | 2,20379 | 0,97750 | 0,87490 | 0,31945 | 2,17185 | 0,67385 | 0,62985 | 0,18634 | 1,49003 | 5,866 | 65,17 |
4 | CTA | comet tail algorithm | 0,95346 | 0,86319 | 0,27770 | 2,09435 | 0,99794 | 0,85740 | 0,33949 | 2,19484 | 0,88769 | 0,56431 | 0,10512 | 1,55712 | 5,846 | 64,96 |
5 | 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 |
6 | 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 |
7 | 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 |
8 | ACS | artificial cooperative search | 0,75547 | 0,74744 | 0,30407 | 1,80698 | 1,00000 | 0,88861 | 0,22413 | 2,11274 | 0,69077 | 0,48185 | 0,13322 | 1,30583 | 5,226 | 58,06 |
9 | TSEA | turtle shell evolution algorithm | 0,96798 | 0,64480 | 0,29672 | 1,90949 | 0,99449 | 0,61981 | 0,22708 | 1,84139 | 0,69077 | 0,42646 | 0,13598 | 1,25322 | 5,004 | 55,60 |
10 | 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 |
11 | CRO | chemical reaction optimisation | 0,94629 | 0,66112 | 0,29853 | 1,90593 | 0,87906 | 0,58422 | 0,21146 | 1,67473 | 0,75846 | 0,42646 | 0,12686 | 1,31178 | 4,892 | 54,36 |
12 | BSA | bird swarm algorithm | 0,89306 | 0,64900 | 0,26250 | 1,80455 | 0,92420 | 0,71121 | 0,24939 | 1,88479 | 0,69385 | 0,32615 | 0,10012 | 1,12012 | 4,809 | 53,44 |
13 | 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 |
14 | 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 |
15 | (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 |
16 | BSO | brain storm optimization | 0,93736 | 0,57616 | 0,29688 | 1,81041 | 0,93131 | 0,55866 | 0,23537 | 1,72534 | 0,55231 | 0,29077 | 0,11914 | 0,96222 | 4,498 | 49,98 |
17 | 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 |
18 | AEFA | artificial electric field algorithm | 0,87700 | 0,61753 | 0,25235 | 1,74688 | 0,92729 | 0,72698 | 0,18064 | 1,83490 | 0,66615 | 0,11631 | 0,09508 | 0,87754 | 4,459 | 49,55 |
19 | 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 |
20 | 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 |
21 | ASBO | adaptive social behavior optimization | 0,76331 | 0,49253 | 0,32619 | 1,58202 | 0,79546 | 0,40035 | 0,26097 | 1,45677 | 0,26462 | 0,17169 | 0,18200 | 0,61831 | 3,657 | 40,63 |
22 | 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 |
23 | 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 |
24 | 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 |
25 | 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 |
26 | 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 |
27 | 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 |
28 | 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 |
29 | 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 |
30 | 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 |
31 | 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 |
32 | 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 |
33 | 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 |
34 | 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 |
35 | 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 |
36 | Boids | boids algorithm | 0,43340 | 0,30581 | 0,25425 | 0,99346 | 0,35718 | 0,20160 | 0,15708 | 0,71586 | 0,27846 | 0,14277 | 0,09834 | 0,51957 | 2,229 | 24,77 |
37 | 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 |
38 | 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 |
39 | 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 |
40 | 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 |
41 | 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 |
42 | 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 |
43 | 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 |
Выводы
Алгоритм выделяется своей оригинальностью и нестандартным поведением, что делает его визуализацию уникальной и не похожей на ранее известные нам методы. Это привлекает внимание и вызывает интерес к его внутренним механизмам.
Хотелось бы отметить, что, несмотря на средние общие результаты и сходимость при решении задач малой размерности, алгоритм демонстрирует свой истинный потенциал при работе с более сложными задачами и в условиях обширного пространства поиска. Он использует несколько популяций, которые работают последовательно на первой фазе, что поднимает вопрос о целесообразности разделения ограниченного количества эпох на предварительные расчеты независимых популяций. Эксперименты, проведенные с использованием лишь одной популяции на первой фазе, показывают заметно худшие результаты, что подтверждает полезность предварительного сбора информации об окружающем пространстве поиска. Это позволяет алгоритму более эффективно использовать лидирующие особи — наиболее удачные решения во второй фазе поиска.
Кроме того, алгоритм обладает огромным потенциалом для дальнейших исследований. Я убежден, что его возможности еще не раскрыты полностью, и требуется больше экспериментов и анализа, чтобы понять, как максимально эффективно использовать его алгоритмические преимущества.
Рисунок 2. Цветовая градация алгоритмов по соответствующим тестам. Белым цветом подсвечены результаты больше или равные 0.99. Подсвеченные зелёным названия - мои авторские алгоритмы
Рисунок 3. Гистограмма результатов тестирования алгоритмов (по шкале от 0 до 100, чем больше, тем лучше,
где 100 - максимально возможный теоретический результат, в архиве скрипт для расчета рейтинговой таблицы)
Плюсы и минусы алгоритма адаптивного социального поведения (ASBO):
Плюсы:
- Небольшое количество внешних параметров.
- Хорошие результаты на сложных задачах высокой размерности.
Минусы:
- Невысокая сходимость на задачах малой размерности.
К статье прикреплён архив с актуальными версиями кодов алгоритмов. Автор статьи не несёт ответственности за абсолютную точность в описании канонических алгоритмов, во многие из них были внесены изменения для улучшения поисковых возможностей. Выводы и суждения, представленные в статьях, основываются на результатах проведённых экспериментов.
- github: https://github.com/JQSakaJoo/Population-optimization-algorithms-MQL5
- CodeBase: https://www.mql5.com/ru/code/49355
Подведение промежуточных итогов проделанной работы
В ходе наших исследований мы рассмотрели более сорока алгоритмов оптимизации, каждый из которых представляет собой уникальный подход к решению сложных задач. Этот процесс был не только увлекательным, но и чрезвычайно познавательным, раскрывая богатство и разнообразие методов в области оптимизации.
Воссоздание и модификация алгоритмов. Для подавляющего большинства рассмотренных алгоритмов отсутствовали исходные коды в широком доступе. Это побудило меня к творческому подходу: воссоздание кода производилось исключительно на основе текстовых описаний авторов, взятых из различных публикаций. Такой подход не только позволил глубже понять принципы работы каждого алгоритма, но и дал возможность адаптировать их под наши конкретные нужды.
Те немногие алгоритмы, которые имели открытый исходный код, не были применимы для решения задач оптимизации в общем виде. Это потребовало значительной модификации, чтобы сделать их универсальными и легко применимыми к широкому спектру задач.
Инновации и улучшения. Некоторые алгоритмы, такие как ACO (муравьиные колонии, для решения задач на графах), изначально не предназначались авторами для работы с задачами в непрерывном пространстве и требовали модификации для расширения области их применения. В другие алгоритмы были внесены улучшения в поисковую стратегию, повышая их эффективность. Эти модифицированные версии получили в названии постфикс "m", отражая их эволюцию. Кроме того, мы детально рассмотрели множество различных приёмов обработки популяций, генерации новых решений и методов отбора.
В качестве демонстрации новых идей и подходов к оптимизации были разработаны более пяти моих новых авторских алгоритмов и эксклюзивно представлены в статьях.
Применение и дальнейшее изучение. Важно отметить, что любой из представленных алгоритмов может быть применен для решения задач оптимизации без необходимости дополнительной переделки или доработки. Это делает их доступными и удобными для широкого круга исследователей и практиков.
Для тех, кто стремится достичь наилучших результатов в отдельных конкретных задачах, предоставлены сравнительные таблицы и гистограммы, позволяющие изучить индивидуальные свойства каждого алгоритма. Это открывает возможности для более тонкой настройки и оптимизации под конкретные требования.
И в заключение: оба подхода – как использование готовых алгоритмов, так и их глубокое изучение и адаптация – имеют право на существование. Понимание тонкостей и приёмов в стратегиях поиска различных алгоритмов открывает исследователям новые горизонты для достижения выдающихся результатов.
Я искренне желаю всем читателям успехов в поиске наилучших решений и достижении поставленных целей. Пусть ваш путь в мире оптимизации и алготрейдинге будет увлекательным и плодотворным!
![Особенности написания Пользовательских Индикаторов](https://c.mql5.com/2/16/77_1.gif)
![Разработка системы репликации (Часть 42): Проект Chart Trade (I)](https://c.mql5.com/2/69/Desenvolvendo_um_sistema_de_Replay_3Parte_42x_Projeto_do_Chart_Trade_tIw___LOGO_.png)
![Теория хаоса в трейдинге (Часть 1): Введение, применение на финансовых рынках и индикатор Ляпунова](https://c.mql5.com/2/85/Chaos_theory_in_trading_Part_1___LOGO.png)
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования