preview
Алгоритм эволюционного путешествия во времени — Time Evolution Travel Algorithm (TETA)

Алгоритм эволюционного путешествия во времени — Time Evolution Travel Algorithm (TETA)

MetaTrader 5Примеры | 29 января 2025, 08:40
329 0
Andrey Dik
Andrey Dik

Содержание

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


Введение

Мы рассмотрели много алгоритмов основанных на физических законах, таких как CSS, EM, GSA, AEFA, AOSm, однако, вселенная нас постоянно радует новыми явлениями и наполняет разными гипотезами и идеями. Один из основополагающих компонентов вселенной, такой как время, натолкнул меня на идею создания нового алгоритма оптимизации. Время не только вдохновляет на новые открытия, но и остаётся таинственной сущностью, которую трудно постигнуть. Оно течёт, словно река, унося с собой моменты нашей жизни и оставляя лишь воспоминания. Путешествия во времени всегда были предметом человеческого восхищения и фантазий. Чтобы лучше понять идею алгоритма, представим себе историю одного ученого.

Жил-был ученый-физик, одержимый идеей перемещения в светлое будущее, подальше от совершённых ошибок. Погрузившись в изучение потоков времени, он столкнулся с горьким открытием — путешествие в будущее невозможно. Не отчаявшись, он переключился на исследование перемещений в прошлое, надеясь исправить свои ошибки, но и здесь его ждало разочарование.

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

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

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

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


Реализация алгоритма

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

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

TETA

Рисунок 1. Параллельные вселенные со своими уникальными якорями (признаками)

В основе алгоритма TETA лежит концепция множественных параллельных вселенных, каждая из которых представляет собой потенциальное решение оптимизационной задачи. В техническом воплощении каждая такая вселенная описывается вектором координат (a[i].c), где каждая координата является якорем — ключевой переменной, определяющей конфигурацию данной реальности. Эти якоря можно представить как важнейшие параметры, настройка которых влияет на общее качество решения.

Для оценки качества каждой вселенной используется фитнес-функция (a[i].f), которая определяет "комфортность существования" в данной реальности. Чем выше значение этой функции, тем более благоприятной считается вселенная. Каждая вселенная хранит информацию не только о своем текущем состоянии, но и о лучшей известной конфигурации (a[i].cB), что можно сравнить с "памятью" о наиболее успешном варианте развития событий. Кроме того, алгоритм поддерживает глобальное лучшее состояние (cB), представляющее самую благоприятную конфигурацию среди всех обнаруженных вариантов.

Популяция из N особей формирует множество параллельных вселенных, каждая из которых описывается своим набором значений якорей. Эти вселенные постоянно ранжируются по значению фитнес-функции, что создает своеобразную иерархию от наименее до наиболее благоприятных состояний. Каждый якорь реальности является оптимизируемой переменной, и любое изменение этих переменных порождает новую конфигурацию вселенной. Полный набор якорей образует вектор переменных x = (x₁, x₂, ..., xₙ), полностью описывающий конкретную реальность. При этом, для каждой переменной определены границы допустимых значений, что можно интерпретировать, как физические законы, ограничивающие возможные изменения в каждой вселенной.

Оценка благоприятности каждой вселенной производится через фитнес-функцию f(x), отображающую конфигурацию вселенной в действительное число. Чем выше это значение, тем более предпочтительной считается данная реальность. Таким образом создается математически строгий механизм оценки и сравнения различных вариантов развития событий во множестве параллельных вселенных.

      Ключевой особенностью алгоритма является единый вероятностный коэффициент (rnd *= rnd), который определяет как вероятность выбора вселенной для взаимодействия, так и силу изменения якорей. Это создает естественный механизм самобалансировки системы: лучшие вселенные имеют больший шанс быть выбранными, но их якоря изменяются слабее (пропорционально rnd), в то время как худшие вселенные, хотя и выбираются реже, подвергаются более сильным изменениям (пропорционально 1.0 - rnd).

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

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

      Рисунок 2. Красная линия — функция вероятности выбора вселенных в зависимости от их качества, зеленая линия — степень изменения якорей для соответствующих вселенных

      Псевдокод алгоритма:

      Инициализация:
      1. Создать популяцию из N параллельных вселенных
      2. Для каждой вселенной:
         - Случайно инициализировать значения якорей (координат) в допустимых пределах
         - Установить начальные лучшие значения равными текущим

      Основной цикл:
      1. Сортировка вселенных по качеству (фитнес-функции)
         - Лучшие вселенные получают меньшие индексы
         - Худшие вселенные получают большие индексы

      2. Для каждой вселенной i из N:
         Для каждого якоря (координаты):
         
         а) Выбор вселенной для взаимодействия:
            - Генерировать случайное число rnd от 0 до 1
            - Возвести rnd в квадрат для усиления приоритета лучших вселенных
            - Выбрать индекс pair пропорционально rnd
         
         б) Если текущая вселенная не совпадает с выбранной (i ≠ pair):
            
            Если текущая вселенная лучше выбранной (i < pair):
               - Слабое изменение якоря пропорционально rnd
               - Новое_значение = текущее + rnd * (значение_выбранной - текущее)
            
            Иначе (текущая вселенная хуже выбранной):
               Если (случайное_число > rnd):
                  - Сильное изменение якоря пропорционально (1 - rnd)
                  - Новое_значение = текущее + (1-rnd) * (значение_выбранной - текущее)
               Иначе:
                  - Полное копирование значения якоря из лучшей вселенной
                  - Новое_значение = значение_выбранной
         
         в) Иначе (взаимодействие с собой):
            - Локальный поиск через гауссово распределение
            - Новое_значение = GaussDistribution(текущее_лучшее)
         
         г) Коррекция нового значения якоря в допустимых пределах

      3. Обновление лучших значений:
         Для каждой вселенной:
         - Если текущее решение лучше личного лучшего, обновить личное лучшее
         - Если текущее решение лучше глобального лучшего, обновить глобальное лучшее

      4. Повторять основной цикл до выполнения критерия остановки

      Теперь у нас все готово для реализации машины перемещения по параллельным вселенным в коде. Напишем класс "C_AO_TETA", который будет являться производным от класса "C_AO". Вот его краткое описание:

      • Конструктор — инициализирует имя, описание и ссылку на алгоритм, а также устанавливает размер популяции.
      • Метод SetParams — устанавливает параметры, используя значения из массива "params".
      • Методы Init, Moving,Revision — объявлены, но будут реализованы в другом фрагменте кода.
      class C_AO_TETA : public C_AO
      {
        public: //--------------------------------------------------------------------
        ~C_AO_TETA () { }
        C_AO_TETA ()
        {
          ao_name = "TETA";
          ao_desc = "Time Evolution Travel Algorithm";
          ao_link = "https://www.mql5.com/ru/articles/16963";
      
          popSize = 50; // количество параллельных вселенных в популяции
      
          ArrayResize (params, 1);
          params [0].name = "popSize"; params [0].val = popSize;
        }
      
        void SetParams ()
        {
          popSize = (int)params [0].val;
        }
      
        bool Init (const double &rangeMinP  [],  // минимальные значения для якорей
                   const double &rangeMaxP  [],  // максимальные значения для якорей
                   const double &rangeStepP [],  // шаг изменения якорей
                   const int     epochsP = 0);   // количество эпох поиска
      
        void Moving ();
        void Revision ();
      
        private: //-------------------------------------------------------------------
      };
      //——————————————————————————————————————————————————————————————————————————————
      

      Инициализация метода "Init" класса "C_AO_TETA" выполняет начальную настройку алгоритма. 

      Параметры метода:
      • rangeMinP — массив минимальных значений для якорей.
      • rangeMaxP — массив максимальных значений для якорей.
      • rangeStepP — массив шагов изменения якорей.
      • epochsP — количество эпох поиска по умолчанию 0).
      Стандартная инициализация:
      • Метод вызывает "StandardInit", выполняет проверку и настройку диапазонов для якорей. Если эта инициализация не удалась (возвращает false).
      Возврат значения:
      • Если все проверки и настройки прошли успешно, метод возвращает "true", указывая на успешную инициализацию алгоритма.
      //——————————————————————————————————————————————————————————————————————————————
      // TETA - Time Evolution Travel Algorithm
      // Алгоритм оптимизации, основанный на концепции перемещения между параллельными вселенными
      // через изменение ключевых якорей (событий) жизни
      
      //——————————————————————————————————————————————————————————————————————————————
      bool C_AO_TETA::Init (const double &rangeMinP  [], // минимальные значения для якорей
                            const double &rangeMaxP  [], // максимальные значения для якорей
                            const double &rangeStepP [], // шаг изменения якорей
                            const int     epochsP = 0)   // количество эпох поиска
      {
        if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;
      
        //----------------------------------------------------------------------------
        return true;
      }
      //——————————————————————————————————————————————————————————————————————————————

      Метод "Moving" класса "C_AO_TETA" отвечает за изменение якорей в параллельных вселенных для создания новых в рамках алгоритма.

      Проверка состояния ревизии:
      • Если "revision" равен "false", метод инициализирует начальные значения якорей для всех параллельных вселенных, используя случайные значения из заданного диапазона и применяя функции для приведения к допустимым значениям (на основе шага).
      Обновление значений якорей:
      • Если ревизия уже была проведена, происходит итерация по всем параллельным вселенным. Для каждого якоря генерируется вероятность и вычисляется его новое значение:
        • Если текущая вселенная более благоприятна, то якорь немного изменяется в положительную сторону, чтобы найти лучший баланс.
        • Если текущая вселенная менее благоприятна, проверка вероятности может привести к значительному изменению якоря или полному принятию его из более успешной вселенной.
        • Если вселенные совпадают, происходит локальная настройка якоря с использованием гауссового распределения.
      • После вычисления нового значения, якорь приводится к допустимому диапазону.

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

        //——————————————————————————————————————————————————————————————————————————————
        void C_AO_TETA::Moving ()
        {
          //----------------------------------------------------------------------------
          if (!revision)
          {
            // Инициализация начальных значений якорей во всех параллельных вселенных
            for (int i = 0; i < popSize; i++)
            {
              for (int c = 0; c < coords; c++)
              {
                a [i].c [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]);
                a [i].c [c] = u.SeInDiSp  (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
              }
            }
        
            revision = true;
            return;
          }
        
          //----------------------------------------------------------------------------
          double rnd  = 0.0;
          double val  = 0.0;
          int    pair = 0.0;
        
          for (int i = 0; i < popSize; i++)
          {
            for (int c = 0; c < coords; c++)
            {
              // Генерация вероятности, которая определяет как шанс выбора вселенной,
              // так и силу изменения якорей
              rnd  = u.RNDprobab ();
              rnd *= rnd;
        
              // Выбор вселенной для обмена опытом
              pair = (int)u.Scale (rnd, 0.0, 1.0, 0, popSize - 1);
        
              if (i != pair)
              {
                if (i < pair)
                {
                  // Если текущая вселенная более благоприятна:
                  // Небольшое изменение якоря (пропорционально rnd) для поиска лучшего баланса
                  val = a [i].c [c] + (rnd)*(a [pair].cB [c] - a [i].cB [c]);
                }
                else
                {
                  if (u.RNDprobab () > rnd)
                  {
                    // Если текущая вселенная менее благоприятна:
                    // Значительное изменение якоря (пропорционально 1.0 - rnd)
                    val = a [i].cB [c] + (1.0 - rnd) * (a [pair].cB [c] - a [i].cB [c]);
                  }
                  else
                  {
                    // Полное принятие конфигурации якоря из более успешной вселенной
                    val = a [pair].cB [c];
                  }
                }
              }
              else
              {
                // Локальная настройка якоря через гауссово распределение
                val = u.GaussDistribution (cB [c], rangeMin [c], rangeMax [c], 1);
              }
        
              a [i].c [c] = u.SeInDiSp  (val, rangeMin [c], rangeMax [c], rangeStep [c]);
            }
          }
        }
        //——————————————————————————————————————————————————————————————————————————————
        

        Метод "Revision" класса "C_AO_TETA" отвечает за обновление конфигураций якорей в параллельных вселенных и сортировку этих вселенных по их качеству, подробнее:

          Обновление глобально лучшей конфигурации:
          • Метод проходит по всем параллельным вселенным (от 0 до popSize).
          • Если значение функции f текущей вселенной (a[i].f) больше глобального лучшего значения "fB", то:
            • Обновляется "fB" на значение (a[i].f).
            • Конфигурация якорей текущей вселенной копируется в глобальную конфигурацию "cB".
            Обновление лучшей известной конфигурации для каждой вселенной:
            • Если значение функции "f" текущей вселенной больше её лучшего известного значения (a[i].fB), то:
              • Обновляется (a[i].fB) на значение (a[i].f).
              • Конфигурация якорей текущей вселенной копируется в её лучшую известную конфигурацию (a[i].cB).
            Сортировка вселенных:
            • Объявляется статический массив "aT" для хранения агентов.
            • Размер массива изменяется на "popSize".
            • Вселенные сортируются по их лучшему из известных индивидуальных свойств с помощью функции "u.Sorting_fB".
              //——————————————————————————————————————————————————————————————————————————————
              void C_AO_TETA::Revision ()
              {
                for (int i = 0; i < popSize; i++)
                {
                  // Обновление глобально лучшей конфигурации якорей
                  if (a [i].f > fB)
                  {
                    fB = a [i].f;
                    ArrayCopy (cB, a [i].c);
                  }
              
                  // Обновление лучшей известной конфигурации якорей для каждой вселенной
                  if (a [i].f > a [i].fB)
                  {
                    a [i].fB = a [i].f;
                    ArrayCopy (a [i].cB, a [i].c);
                  }
                }
              
                // Сортировка вселенных по степени их благоприятности
                static S_AO_Agent aT []; ArrayResize (aT, popSize);
                u.Sorting_fB (a, aT, popSize);
              }
              //——————————————————————————————————————————————————————————————————————————————


              Результаты тестов

              Результаты работы алгоритма TETA:

              TETA|Time Evolution Travel Algorithm|50.0|
              =============================
              5 Hilly's; Func runs: 10000; result: 0.9136198796338938
              25 Hilly's; Func runs: 10000; result: 0.8234856192574587
              500 Hilly's; Func runs: 10000; result: 0.3199003852163246
              =============================
              5 Forest's; Func runs: 10000; result: 0.970957820488216
              25 Forest's; Func runs: 10000; result: 0.8953189778250419
              500 Forest's; Func runs: 10000; result: 0.29324457646900925
              =============================
              5 Megacity's; Func runs: 10000; result: 0.7346153846153844
              25 Megacity's; Func runs: 10000; result: 0.6856923076923078
              500 Megacity's; Func runs: 10000; result: 0.16020769230769372
              =============================
              All score: 5.79704 (64.41%)

              Итоговый результат: 5.79704 (64.41%). Учитывая сложность тестовых функций, это отличный показатель. Алгоритм очень быстро обнаруживает важные участки поверхности с перспективными оптимумами и тут же приступает к их уточнению, что можно проследить на каждой визуализации работы алгоритма.

              Hilly

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

              Forest

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

              Megacity

              TETA на тестовой функции Megacity

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

              GoldsteinPrice

              TETA на тестовой функции GoldsteinPrice (доступна для выбора из списка тестовых функций)

              Результаты на GoldsteinPrice:

              5 GoldsteinPrice's; Func runs: 10000; result: 0.9999786723616957
              25 GoldsteinPrice's; Func runs: 10000; result: 0.9999750431600845
              500 GoldsteinPrice's; Func runs: 10000; result: 0.9992343490683104

              Алгоритм TETA при завершении тестирования входит в первую десятку лучших алгоритмов оптимизации и занимает почетное 6 место.

              AO Description HillyHilly final ForestForest 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)
              1ANSacross neighbourhood search0,949480,847760,438572,235811,000000,923340,399882,323230,709230,634770,230911,574916,13468,15
              2CLAcode lock algorithm (joo)0,953450,871070,375902,200420,989420,917090,316422,222940,796920,693850,193031,683806,10767,86
              3AMOmanimal migration ptimization M0,903580,843170,462842,209590,990010,924360,465982,380340,567690,591320,237731,396755,98766,52
              4(P+O)ES(P+O) evolution strategies0,922560,881010,400212,203790,977500,874900,319452,171850,673850,629850,186341,490035,86665,17
              5CTAcomet tail algorithm (joo)0,953460,863190,277702,094350,997940,857400,339492,194840,887690,564310,105121,557125,84664,96
              6TETAtime evolution travel algorithm (joo)0,913620,823490,319902,057010,970960,895320,293242,159520,734620,685690,160211,580525,79764,41
              7SDSmstochastic diffusion search M0,930660,854450,394762,179880,999830,892440,196192,088460,723330,611000,106701,441035,70963,44
              8AAmarchery algorithm M0,917440,708760,421602,047800,925270,758020,353282,036570,673850,552000,237381,463235,54861,64
              9ESGevolution of social groups (joo)0,999060,796540,350562,146161,000000,828630,131021,959650,823330,553000,047251,423585,52961,44
              10SIAsimulated isotropic annealing (joo)0,957840,842640,414652,215130,982390,795860,205071,983320,686670,493000,090531,270205,46960,76
              11ACSartificial cooperative search0,755470,747440,304071,806981,000000,888610,224132,112740,690770,481850,133221,305835,22658,06
              12BHAmblack hole algorithm M0,752360,766750,345831,864930,935930,801520,271772,009230,650770,516460,154721,321955,19657,73
              13ASOanarchy society optimization0,848720,746460,314651,909830,961480,791500,238031,991010,570770,540620,166141,277525,17857,54
              14AOSmatomic orbital search M0,802320,704490,310211,817020,856600,694510,219961,771070,746150,528620,143581,418355,00655,63
              15TSEAturtle shell evolution algorithm (joo)0,967980,644800,296721,909490,994490,619810,227081,841390,690770,426460,135981,253225,00455,60
              16DEdifferential evolution0,950440,616740,303081,870260,953170,788960,166521,908650,786670,360330,029531,176534,95555,06
              17CROchemical reaction optimisation0,946290,661120,298531,905930,879060,584220,211461,674730,758460,426460,126861,311784,89254,36
              18BSAbird swarm algorithm0,893060,649000,262501,804550,924200,711210,249391,884790,693850,326150,100121,120124,80953,44
              19HSharmony search0,865090,687820,325271,878180,999990,680020,095901,775920,620000,422670,054581,097254,75152,79
              20SSGsaplings sowing and growing0,778390,649250,395431,823080,859730,624670,174291,658690,646670,441330,105981,193984,67651,95
              21BCOmbacterial chemotaxis optimization M0,759530,622680,314831,697040,893780,613390,225421,732590,653850,420920,144351,219124,64951,65
              22ABOafrican buffalo optimization0,833370,622470,299641,755480,921700,586180,197231,705110,610000,431540,132251,173784,63451,49
              23(PO)ES(PO) evolution strategies0,790250,626470,429351,846060,876160,609430,195911,681510,590000,379330,113221,082554,61051,22
              24TSmtabu search M0,877950,614310,291041,783300,928850,518440,190541,637830,610770,382150,121571,114494,53650,40
              25BSObrain storm optimization0,937360,576160,296881,810410,931310,558660,235371,725340,552310,290770,119140,962224,49849,98
              26WOAmwale optimization algorithm M0,845210,562980,262631,670810,931000,522780,163651,617430,663080,411380,113571,188034,47649,74
              27AEFAartificial electric field algorithm0,877000,617530,252351,746880,927290,726980,180641,834900,666150,116310,095080,877544,45949,55
              28AEOartificial ecosystem-based optimization algorithm0,913800,467130,264701,645630,902230,437050,214001,553270,661540,308000,285631,255174,45449,49
              29ACOmant colony optimization M0,881900,661270,303771,846930,858730,586800,150511,596040,596670,373330,024720,994724,43849,31
              30BFO-GAbacterial foraging optimization - ga0,891500,551110,315291,757900,969820,396120,063051,428990,726670,275000,035251,036924,22446,93
              31SOAsimple optimization algorithm0,915200,469760,270891,655850,896750,374010,169841,440600,695380,280310,108521,084224,18146,45
              32ABHAartificial bee hive algorithm0,841310,542270,263041,646630,878580,477790,171811,528180,509230,338770,103970,951974,12745,85
              33ACMOatmospheric cloud model optimization0,903210,485460,304031,692700,802680,378570,191781,373030,623080,244000,107950,975034,04144,90
              34ADAMmadaptive moment estimation M0,886350,447660,266131,600140,844970,384930,168891,398800,661540,270460,105941,037944,03744,85
              35ATAmartificial tribe algorithm M0,717710,553040,252351,523100,824910,559040,204731,588670,440000,186150,094110,720263,83242,58
              36ASHAartificial showering algorithm0,896860,404330,256171,557370,803600,355260,191601,350460,476920,181230,097740,755893,66440,71
              37ASBOadaptive social behavior optimization0,763310,492530,326191,582020,795460,400350,260971,456770,264620,171690,182000,618313,65740,63
              38MECmind evolutionary computation0,695330,533760,326611,555690,724640,330360,071981,126980,525000,220000,041980,786983,47038,55
              39IWOinvasive weed optimization0,726790,522560,331231,580580,707560,339550,074841,121960,423330,230670,046170,700173,40337,81
              40Micro-AISmicro artificial immune system0,795470,519220,308611,623300,729560,368790,093981,192330,376670,158670,028020,563353,37937,54
              41COAmcuckoo optimization algorithm M0,758200,486520,313691,558410,740540,280510,055991,077040,505000,174670,033800,713473,34937,21
              42SDOmspiral dynamics optimization M0,746010,446230,296871,489120,702040,346780,109441,158260,428330,167670,036630,632633,28036,44
              43NMmNelder-Mead method M0,738070,505980,313421,557470,636740,283020,082211,001970,446670,186670,040280,673623,23335,92
              44BBBCbig bang-big crunch algorithm0,605310,452500,312551,370360,523230,354260,204171,081660,397690,194310,112860,704863,15735,08
              45CPAcyclic parthenogenesis algorithm0,716640,400140,255021,371800,621780,336510,192641,150930,343080,167690,094550,605323,12834,76
              RWrandom walk0,487540,321590,257811,066940,375540,219440,158770,753750,279690,149170,098470,527342,34826,09


              Выводы

              Работая над алгоритмом TETA, я постоянно стремился создать что-то простое и эффективное. Метафора параллельных вселенных и путешествий во времени изначально казалась просто красивой идеей, но в процессе разработки она органично воплотилась в эффективный механизм оптимизации.

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

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

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

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

              Tab

              Рисунок 3. Цветовая градация алгоритмов по соответствующим тестам

              Chart

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

              Плюсы и минусы алгоритма TETA:

              Плюсы:

              1. Из внешних параметров только размер популяции.
              2. Простая реализация.
              3. Очень быстрый.
              4. Сбалансированные показатели на задачах как малых, так и больших размерностей.

              Минусы:

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

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

              Программы, используемые в статье

              #ИмяТипОписание
              1#C_AO.mqh
              Включаемый файл
              Родительский класс популяционных алгоритмов оптимизации
              2#C_AO_enum.mqh
              Включаемый файл
              Перечисление популяционных алгоритмов оптимизации
              3TestFunctions.mqh
              Включаемый файл
              Библиотека тестовых функций
              4
              TestStandFunctions.mqh
              Включаемый файл
              Библиотека функций тестового стенда
              5
              Utilities.mqh
              Включаемый файл
              Библиотека вспомогательных функций
              6
              CalculationTestResults.mqh
              Включаемый файл
              Скрипт для расчета результатов в сравнительную таблицу
              7
              Testing AOs.mq5
              СкриптЕдиный испытательный стенд для всех популяционных алгоритмов оптимизации
              8
              Simple use of population optimization algorithms.mq5
              Скрипт
              Простой пример использования популяционных алгоритмов оптимизации без визуализации
              9
              Test_AO_TETA.mq5
              СкриптИспытательный стенд для TETA
              Прикрепленные файлы |
              TETA.ZIP (154.13 KB)
              Собственные векторы и собственные значения: Разведочный анализ данных в MetaTrader 5 Собственные векторы и собственные значения: Разведочный анализ данных в MetaTrader 5
              В статье мы рассмотрим различные способы применения собственных векторов и собственных значений в разведочном анализе данных для выявления в них уникальных взаимосвязей.
              Создаем динамическую мультисимвольную мультипериодную панель индекса относительной силы (RSI) в MQL5 Создаем динамическую мультисимвольную мультипериодную панель индекса относительной силы (RSI) в MQL5
              В статье рассмотрена разработка динамической мультисимвольной мультипериодной панели индикатора RSI в MQL5. Панель призвана предоставлять трейдерам значения RSI в реальном времени по различным символам и таймфреймам. Панель будет оснащена интерактивными кнопками, обновлениями в реальном времени и цветовыми индикаторами, помогающими трейдерам принимать обоснованные решения.
              Разработка системы репликации (Часть 61): Нажатие кнопки воспроизведения в сервисе (II) Разработка системы репликации (Часть 61): Нажатие кнопки воспроизведения в сервисе (II)
              В данной статье мы рассмотрим изменения, которые позволят системе репликации/моделирования работать более эффективно и безопасно. Также я не оставлю без внимания тех, кто хочет извлечь максимум пользы из использования классов. Кроме того, рассмотрим специфическую проблему в MQL5, которая снижает производительность кода при работе с классами, и объясним, как ее решить.
              Методы дискретизации ценовых движений на Python Методы дискретизации ценовых движений на Python
              Мы рассмотрим методы дискретизации цен на Python + MQL5. В этой статье я поделюсь практическим опытом разработки библиотеки на Python, которая реализует целый спектр подходов к формированию баров — от классических Volume и Range bars до более экзотических методов вроде Renko и Kagi.ары, свечи трехлинейного прорыва, рэйндж бары — какова их статистика, как еще можно представить цены дискретно?