preview
Алгоритм адаптивного социального поведения — Adaptive Social Behavior Optimization (ASBO): Двухфазная эволюция

Алгоритм адаптивного социального поведения — Adaptive Social Behavior Optimization (ASBO): Двухфазная эволюция

MetaTrader 5Примеры | 24 июля 2024, 13:17
37 0
Andrey Dik
Andrey Dik

Содержание
  1. Введение
  2. Реализация алгоритма
  3. Результаты тестов


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 &center []);
      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 раскрывает ряд интересных особенностей, которые заслуживают внимания. С самого начала работы алгоритма можно заметить, как он успешно выделяет значимые области решения, что свидетельствует о его способности эффективно исследовать пространство параметров.

      График сходимости демонстрирует характерные разрывы в линии, которые обусловлены последовательной работой нескольких популяций на первой фазе. Эти разрывы говорят о том, что каждая популяция вносит свой вклад в процесс оптимизации, исследуя различные участки пространства. Однако на второй фазе график принимает сплошную форму, что означает объединение лучших решений из всех популяций, собранных вместе после первой фазы. Это объединение позволяет алгоритму сосредоточиться на уточнение перспективных областей.

      Таким образом, визуализация не только иллюстрирует динамику работы алгоритма, но и подчеркивает его адаптивные и кооперативные механизмы.

      Hilly

        ASBO на тестовой функции Hilly.

      Forest

      ASBO на тестовой функции Forest.

      Megacity

      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


      Выводы

      Алгоритм выделяется своей оригинальностью и нестандартным поведением, что делает его визуализацию уникальной и не похожей на ранее известные нам методы. Это привлекает внимание и вызывает интерес к его внутренним механизмам.

      Хотелось бы отметить, что, несмотря на средние общие результаты и сходимость при решении задач малой размерности, алгоритм демонстрирует свой истинный потенциал при работе с более сложными задачами и в условиях обширного пространства поиска. Он использует несколько популяций, которые работают последовательно на первой фазе, что поднимает вопрос о целесообразности разделения ограниченного количества эпох на предварительные расчеты независимых популяций. Эксперименты, проведенные с использованием лишь одной популяции на первой фазе, показывают заметно худшие результаты, что подтверждает полезность предварительного сбора информации об окружающем пространстве поиска. Это позволяет алгоритму более эффективно использовать лидирующие особи — наиболее удачные решения во второй фазе поиска.

      Кроме того, алгоритм обладает огромным потенциалом для дальнейших исследований. Я убежден, что его возможности еще не раскрыты полностью, и требуется больше экспериментов и анализа, чтобы понять, как максимально эффективно использовать его алгоритмические преимущества.

      Tab

      Рисунок 2. Цветовая градация алгоритмов по соответствующим тестам. Белым цветом подсвечены результаты больше или равные 0.99. Подсвеченные зелёным названия - мои авторские алгоритмы

      chart

      Рисунок 3. Гистограмма результатов тестирования алгоритмов (по шкале от 0 до 100, чем больше, тем лучше,

      где 100 - максимально возможный теоретический результат, в архиве скрипт для расчета рейтинговой таблицы)


      Плюсы и минусы алгоритма адаптивного социального поведения (ASBO):

      Плюсы:

      1. Небольшое количество внешних параметров.
      2. Хорошие результаты на сложных задачах высокой размерности.

      Минусы:

      1. Невысокая сходимость на задачах малой размерности.

      К статье прикреплён архив с актуальными версиями кодов алгоритмов. Автор статьи не несёт ответственности за абсолютную точность в описании канонических алгоритмов, во многие из них были внесены изменения для улучшения поисковых возможностей. Выводы и суждения, представленные в статьях, основываются на результатах проведённых экспериментов.


      Подведение промежуточных итогов проделанной работы

      В ходе наших исследований мы рассмотрели более сорока алгоритмов оптимизации, каждый из которых представляет собой уникальный подход к решению сложных задач. Этот процесс был не только увлекательным, но и чрезвычайно познавательным, раскрывая богатство и разнообразие методов в области оптимизации.

      Воссоздание и модификация алгоритмов. Для подавляющего большинства рассмотренных алгоритмов отсутствовали исходные коды в широком доступе. Это побудило меня к творческому подходу: воссоздание кода производилось исключительно на основе текстовых описаний авторов, взятых из различных публикаций. Такой подход не только позволил глубже понять принципы работы каждого алгоритма, но и дал возможность адаптировать их под наши конкретные нужды.
      Те немногие алгоритмы, которые имели открытый исходный код, не были применимы для решения задач оптимизации в общем виде. Это потребовало значительной модификации, чтобы сделать их универсальными и легко применимыми к широкому спектру задач.

      Инновации и улучшения. Некоторые алгоритмы, такие как ACO (муравьиные колонии, для решения задач на графах), изначально не предназначались авторами для работы с задачами в непрерывном пространстве и требовали модификации для расширения области их применения. В другие алгоритмы были внесены улучшения в поисковую стратегию, повышая их эффективность. Эти модифицированные версии получили в названии постфикс "m", отражая их эволюцию. Кроме того, мы детально рассмотрели множество различных приёмов обработки популяций, генерации новых решений и методов отбора.

      В качестве демонстрации новых идей и подходов к оптимизации были разработаны более пяти моих новых авторских алгоритмов и эксклюзивно представлены в статьях.

      Применение и дальнейшее изучение. Важно отметить, что любой из представленных алгоритмов может быть применен для решения задач оптимизации без необходимости дополнительной переделки или доработки. Это делает их доступными и удобными для широкого круга исследователей и практиков.

      Для тех, кто стремится достичь наилучших результатов в отдельных конкретных задачах, предоставлены сравнительные таблицы и гистограммы, позволяющие изучить индивидуальные свойства каждого алгоритма. Это открывает возможности для более тонкой настройки и оптимизации под конкретные требования.

      И в заключение: оба подхода – как использование готовых алгоритмов, так и их глубокое изучение и адаптация – имеют право на существование. Понимание тонкостей и приёмов в стратегиях поиска различных алгоритмов открывает исследователям новые горизонты для достижения выдающихся результатов.

      Я искренне желаю всем читателям успехов в поиске наилучших решений и достижении поставленных целей. Пусть ваш путь в мире оптимизации и алготрейдинге будет увлекательным и плодотворным!


      Прикрепленные файлы |
      ASBO.ZIP (26.84 KB)
      Особенности написания Пользовательских Индикаторов Особенности написания Пользовательских Индикаторов
      Написание пользовательских индикаторов в торговой системе MetaTrader 4
      Разработка системы репликации (Часть 42): Проект Chart Trade (I) Разработка системы репликации (Часть 42): Проект Chart Trade (I)
      Давайте создадим что-нибудь поинтереснее. Не хочу портить сюрприз, поэтому следите за статьей, чтобы лучше понять. С самого начала этой серии о разработке системы репликации/моделирования, я говорил, что идея состоит в том, чтобы использовать платформу MetaTrader 5 одинаково как в разрабатываемой нами системе, так и на реальном рынке. Важно, чтобы это было сделано должным образом. Никто не хочет тренироваться и учиться сражаться, используя одни инструменты, в то время как во время боя ему придется пользоваться другими.
      Особенности написания экспертов Особенности написания экспертов
      Написание и тестирование экспертов в торговой системе MetaTrader 4.
      Теория хаоса в трейдинге (Часть 1): Введение, применение на финансовых рынках и индикатор Ляпунова Теория хаоса в трейдинге (Часть 1): Введение, применение на финансовых рынках и индикатор Ляпунова
      Можно ли применять теорию хаоса на финансовых рынках? Чем классическая теория Хаоса и хаотические системы отличаются от концепции, предложенной Биллом Вильямсом, рассмотрим в этой статье.