Обсуждение статьи "Популяционные алгоритмы оптимизации: Эволюция социальных групп (Evolution of Social Groups, ESG)" - страница 2

 
Andrey Dik #:
Сомневаюсь, что значение GetMicrosecondCount может повторить значения при повторных запусках, даже если сильно постараться. При условии, что отдельные тесты проходят дольше микросекунды, конечно.
2024.02.03 16:11:25.824 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:25.873 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:25.873 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:25.873 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:36.957 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:37.007 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:37.007 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:37.007 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:47.218 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:47.267 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:47.267 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:47.267 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:12:49.104 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:12:49.152 AmountCycles = 5000, Repeats = 1
2024.02.03 16:12:49.152 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:12:49.152 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999

Слева столбец времени запуска скрипта.

 
fxsaber #:

Слева столбец времени запуска скрипта.


99.99% это максимум, которого можно достичь с выбранным шагом, а насколько я понимаю, выбрана точность два знака после запятой в настройках BGA.
Так что, это не следствие одинаковой инициализации гсч, а результат полной теоретически возможной сходимости в рамках поставленной задачи.
Можно в этом убедится, если распечатать самую первую созданную хромосому в каждом отдельном тесте, это будут разные хромосомы. В этом и есть удивительное свойство алгоритма оптимизации - находить одно и то же решение при разных (рандомных) начальных состояниях.
 
Пришёл в голову тест на устойчивость алго к застреванию в локалах.
Нужно разместить всех агентов на первой итерации не случайно по всему полю, а в глобальном минимуме. Задача - найти глобальный максимум. Уверен, что многие алго так и останутся в яме.
Это очень искусственный случай, но имеющий интересные выводы.
 
Andrey Dik #:
Пришёл в голову тест на устойчивость алго к застреванию в локалах.
Нужно разместить всех агентов на первой итерации не случайно по всему полю, а в глобальном минимуме. Задача - найти глобальный максимум. Уверен, что многие алго так и останутся в яме.
Это очень искусственный случай, но имеющий интересные выводы.

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

Ну это так, просто размышления вслух.

 
Andrey Dik #:
Нужно разместить всех агентов на первой итерации не случайно по всему полю, а в глобальном минимуме. Задача - найти глобальный максимум.

  1. Обычный запуск с поиском глобального максимума.
  2. Далее запускаемся из найденной точки (MaxTmp) для поиска глобального минимума.
  3. Далее запускаемся из найденной точки (MinTmp) для поиска глобального максимума.
  4. Переход на п.2.

В п.2-3 замеряем, как далеко находимся от глобальных минимумов/максимумов (MaxGlobal - MaxTmp + MinTmp - MinGlobal). Средний показатель - рейтинг1 алгоритма оптимизации.

Берем среднее значение от суммы (MaxTmp[i] - MinTmp[i]) - рейтинг2 алгоритма оптимизации.


Сейчас нет функции, позволяющей запускать алгоритм из точки.

 
fxsaber #:

  1. Обычный запуск с поиском глобального максимума.
  2. Далее запускаемся из найденной точки (MaxTmp) для поиска глобального минимума.
  3. Далее запускаемся из найденной точки (MinTmp) для поиска глобального максимума.
  4. Переход на п.2.

В п.2-3 замеряем, как далеко находимся от глобальных минимумов/максимумов (MaxGlobal - MaxTmp + MinTmp - MinGlobal). Средний показатель - рейтинг1 алгоритма оптимизации.

Берем среднее значение от суммы (MaxTmp[i] - MinTmp[i]) - рейтинг2 алгоритма оптимизации.


Можно и так))

Сейчас нет функции, позволяющей запускать алгоритм из точки.

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

И, вопрос с инициализацией ГСЧ урегулирован?

 
Andrey Dik #:

99.99% это максимум, которого можно достичь с выбранным шагом, а насколько я понимаю, выбрана точность два знака после запятой в настройках BGA.
Так что, это не следствие одинаковой инициализации гсч, а результат полной теоретически возможной сходимости в рамках поставленной задачи.
Можно в этом убедится, если распечатать самую первую созданную хромосому в каждом отдельном тесте, это будут разные хромосомы. В этом и есть удивительное свойство алгоритма оптимизации - находить одно и то же решение при разных (рандомных) начальных состояниях.

Вы правы, спасибо!

void OnStart()
{
  Print(GetMicrosecondCount());
}
2024.02.04 15:31:28.422 2142
2024.02.04 15:31:40.553 2367
2024.02.04 15:31:42.385 2326
 
Andrey Dik #:

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

Просьба показать на примерах двух своих алгоритмов.

 
fxsaber #:

Просьба показать на примерах двух своих алгоритмов.

в главном цикле эпох вставить код, который перезапишет координаты агентов на координаты глобального минимума функции:

for (int epochCNT = 1; epochCNT <= epochCount && !IsStopped (); epochCNT++)
    {
      AO.Moving ();
      
      //---the inserted code---the inserted code---the inserted code---the inser
      if (epochCNT == 1)
      {
        for (int set = 0; set < ArraySize (AO.a); set++)
        {
          for (int i = 0; i < funcCount; i++)
          {
            AO.a [set].c [i * 2]     = f.GetMinFuncX ();
            AO.a [set].c [i * 2 + 1] = f.GetMinFuncY ();
          }
        }
      }
      //---the inserted code---the inserted code---the inserted code---the inser

      for (int set = 0; set < ArraySize (AO.a); set++)
      {
        AO.a [set].f = f.CalcFunc (AO.a [set].c, funcCount);
      }

      AO.Revision  ();

      if (Video_P)
      {
        //drawing a population--------------------------------------------------
        SendGraphToCanvas  (1, 1);

        for (int i = 0; i < ArraySize (AO.a); i++)
        {
          PointDr (AO.a [i].c, f, 1, 1, funcCount, false);
        }
        PointDr (AO.cB, f, 1, 1, funcCount, true);

        MaxMinDr (f);

        //drawing a convergence graph---------------------------------------------
        xConv = (int)Scale (epochCNT, 1,              epochCount,     H + 2, W - 3, false);
        yConv = (int)Scale (AO.fB,   f.GetMinFun (), f.GetMaxFun (), 2,     H - 2, true);
        Canvas.FillCircle (xConv, yConv, 1, COLOR2RGB (clrConv));

        Canvas.Update ();
      }
    }

С алгоритмом BGA такой трюк не пройдёт, потому что таким образом мы перепишем только фенотип, а бинарный генотип останется при этом неизменным. Для него придётся залезть внутрь алгоритма и когда популяция в зачаточном состоянии - сделать такую хирургическую операцию.

Вот что получится, если инициализировать таким способом ESG:

expansion

Вот, снял видео с ESG, видно, как он вылазит из одной точки и распространяется вокруг в поисках глобального максимума. Так будут вести себя далеко не все алгоритмы, я писал об этом в статьях, некоторые алгоритмы вообще лишены механизмов "вылезать из ловушки".

 
Привет, я только начинаю узнавать об альтернативах встроенному быстрому генетическому алгоритму. Мне интересно, не могли бы вы помочь мне заставить вашу оптимизацию BGA работать. Я просматривал некоторые ваши статьи на эту тему. Однако у меня такое ощущение, что я начинаю поздно, где-то упустил какую-то информацию и не знаю, как на самом деле оптимизировать советник с другим алгоритмом. Я скачал и скомпилировал test_ao_bga.mq5. При загрузке терминала пишет: «Неверный тип программы, загрузка Test_AO_BGA.ex5 не удалась». Если я попытаюсь запустить его, терминал сообщит: «Test_AO_BGA.ex5 не найден». Не могли бы вы помочь мне заставить его работать? И как мне настроить свой собственный советник для использования оптимизации BGA? Спасибо.
Причина обращения: