English Español Deutsch 日本語 Português
preview
Популяционные алгоритмы оптимизации: Стохастический диффузионный поиск (Stochastic Diffusion Search, SDS)

Популяционные алгоритмы оптимизации: Стохастический диффузионный поиск (Stochastic Diffusion Search, SDS)

MetaTrader 5Примеры | 17 октября 2023, 08:57
1 088 6
Andrey Dik
Andrey Dik

Содержание:

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


1. Введение

Алгоритм стохастического диффузионного поиска (Stochastic Diffusion Search, SDS) был предложен в 1989 году Бишопом (J. Bishop) и с тех пор активно развивается его автором и Насуто (S. Nasuto). Отличительной особенностью данного алгоритма является его глубокое математическое обоснование по сравнению с другими популяционными алгоритмами. Исходно SDS был разработан для дискретной оптимизации, но только в 2011 году была предложена его модификация для глобальной непрерывной оптимизации.

Интересные факты:

1. Стохастический диффузионный поиск (SDS) был первой метаэвристикой Swarm Intelligence, которая относится к семейству роевых интеллектов и естественных алгоритмов поиска и оптимизации. Другими примерами таких алгоритмов являются оптимизация колоний муравьев, оптимизация роя частиц и генетические алгоритмы.

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

Алгоритм SDS основан на дешевой частичной оценке гипотезы (кандидатного решения проблемы поиска) агентами. Затем агенты обмениваются информацией о гипотезах через прямое личное общение. Посредством механизма диффузии высококачественные решения могут быть идентифицированы из кластеров агентов с одинаковой гипотезой.

Для лучшего понимания работы алгоритма SDS можно использовать простую аналогию – "Ресторанную игру".

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

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

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

В целом, SDS является интересным и эффективным алгоритмом для решения задач оптимизации. Он сочетает в себе преимущества популяционных алгоритмов и математическое обоснование, делая его привлекательным для исследования и применения в различных областях.


2. Описание алгоритма

Перейдем к более подробному рассмотрению алгоритма SDS.

Стохастический диффузионный поиск (SDS) — это популяционный алгоритм, основанный на двух идеях стратегии поиска:

1. Частичная оценка решений.
2. Распространение перспективных решений по всей популяции.


Есть две канонические игры, которые простым языком описывают принцип работы SDS.
1. Ресторанная игра
2. Золотодобывающая игра.



Игра "Ресторан"

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

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

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

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

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

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


"Золотодобывающая" игра

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

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

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

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

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

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

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

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


Для формализации алгоритма будем использовать понятие "кандидат", который эквивалентен делегату в игре "Ресторан" и шахтеру в золотодобывающей игре. Кандидат представляет собой поискового агента. Для более простого понимания сущности ресторан или холм можно представить себе пространство с двумя координатами, хотя в реальности для решения многомерных задач можно применять неограниченное количество координат. На рисунке 1 обозначениями С1, С2, С3 показаны кандидаты, которые хранят в себе номера ресторанов (соответствующие пространства на поле поиска). В процессе диффузионного обмена информацией о ресторанах кандидаты заимствуют номера ресторанов у случайным образом выбранных участников конференции в случае если значение фитнес функции у собеседника выше. Диапазон каждого параметра оптимизации (координаты пространства поиска) разбивается на количество ресторанов, указанного во внешних параметрах алгоритма, к примеру, если в параметрах алгоритма указано число 100 ресторанов, то это означает диапазон каждой координаты будет разбит на 100 частей.

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

Cheme1

Рисунок 1. Визуальное представление принципа диффузионного обмена информацией о ресторанах.

Рассмотрим шаги алгоритма SDS в виде псевдокода.

1. Инициализация кандидатов (назначение случайных ресторанов и блюд).

2.0. Тестирование гипотезы и диффузионный обмен между кандидатами.

2.1. Сравнение текущего опыта кандидата с его предыдущим.

2.1.1. Если опыт лучше, назначаем адреса ресторанов как гипотезу для следующей итерации.

2.1.2. Если опыт хуже, тогда спрашиваем мнение случайно выбранного кандидата.

2.1.2.1. Если опыт собеседника - кандидата лучше, тогда берем адреса перспективных (для текущего кандидата) ресторанов.

2.1.2.2. Если опыт собеседника - кандидата хуже, тогда с долей вероятности либо выбираем адрес случайно выбранного ресторана, либо оставляем текущий.

3.0. Выбираем блюда, в сформированном списке ресторанов, как гипотезу для следующей итерации.

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

Cheme2

Рисунок 2. Логическая схема проверки гипотез.


Настало время рассмотреть код SDS (Stochastic Diffusion Search) и начать с сердца и души алгоритма - агента, он же кандидат, которого можно описать структурой S_Candidate. Она содержит следующие поля:

1. raddr: массив, содержащий адреса ресторанов. Каждый элемент массива представляет адрес одного ресторана.
2. raddrPrev: массив, содержащий предыдущие адреса ресторанов. Каждый элемент массива представляет предыдущий адрес одного ресторана.
3. c: массив, содержащий координаты (блюда). Каждый элемент массива представляет координату одного блюда.
4. cPrev: массив, содержащий предыдущие координаты (блюда). Каждый элемент массива представляет предыдущую координату одного блюда.
5. f: значение функции приспособленности (fitness) для текущего состояния агента.
6. fPrev: значение функции приспособленности (fitness) для предыдущего состояния агента.

Структура S_Candidate имеет метод Init, который инициализирует все массивы размерностью coords (количество координат - оптимизируемых параметров) и устанавливает начальные значения f и fPrev в -DBL_MAX, поскольку сравнивать опыт кандидата на первой итерации не с чем и не с кем.

//——————————————————————————————————————————————————————————————————————————————
struct S_Candidate
{
  void Init (int coords)
  {
    ArrayResize (c,         coords);
    ArrayResize (cPrev,     coords);
    ArrayResize (raddr,     coords);
    ArrayResize (raddrPrev, coords);
    f        = -DBL_MAX;
    fPrev    = -DBL_MAX;
  }
  int    raddr     []; //restaurant address
  int    raddrPrev []; //previous restaurant address
  double c         []; //coordinates (dishes)
  double cPrev     []; //previous coordinates (dishes)
  double f;            //fitness
  double fPrev;        //previous fitness
};
//——————————————————————————————————————————————————————————————————————————————

Объявим класс алгоритма SDS, содержащий следующее:

Поля класса:
- cB: массив, содержащий лучшие координаты
- fB: значение функции приспособленности для лучших координат
- cands: массив кандидатов для поиска оптимальных координат
- rangeMax: массив, содержащий максимальные значения для каждой координаты
- rangeMin: массив, содержащий минимальные значения для каждой координаты
- rangeStep: массив, содержащий шаги поиска для каждой координаты

Методы класса:
- Init: инициализация параметров алгоритма, таких как количество координат, размер популяции, количество ресторанов и вероятность выбора ресторана
- Moving: выполнение шага алгоритма, перемещение кандидатов в новые координаты
- Revision: выполнение шага ревизии, обновление лучших координат и функции приспособленности
- SeInDiSp: метод для вычисления новой координаты в заданном диапазоне с заданным шагом
- RNDfromCI: метод для генерации случайного числа в заданном интервале

Другие поля класса:
- coords: количество координат
- populationSize: размер популяции
- restNumb: количество ресторанов
- probabRest: вероятность выбора ресторана
- restSpace: пространство ресторанов
- revision: флаг, указывающий на необходимость выполнения ревизии

//——————————————————————————————————————————————————————————————————————————————
class C_AO_SDS
{
  //----------------------------------------------------------------------------
  public: double cB   [];       //best coordinates
  public: double fB;            //FF of the best coordinates
  public: S_Candidate cands []; //candidates

  public: double rangeMax  []; //maximum search range
  public: double rangeMin  []; //manimum search range
  public: double rangeStep []; //step search



  public: void Init (const int    coordinatesNumberP,   //coordinates number
                     const int    populationSizeP,      //population size
                     const int    restaurantsNumberP,   //restaurants number
                     const double probabRestP);         //probability restaurant choosing

  public: void Moving   ();
  public: void Revision ();

  //----------------------------------------------------------------------------
  private: int    coords;            //coordinates number
  private: int    populationSize;    //population size

  private: int    restNumb;          //restaurants number
  private: double probabRest;        //probability restaurant choosing
  private: double restSpace [];      //restaurants space

  private: bool   revision;

  private: double SeInDiSp  (double In, double InMin, double InMax, double Step);
  private: double RNDfromCI (double min, double max);
};
//——————————————————————————————————————————————————————————————————————————————

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

Входными параметрами метода являются:
- coordinatesNumberP: количество координат (размерность пространства поиска)
- populationSizeP: размер популяции (количество кандидатов)
- restaurantsNumberP: количество ресторанов
- probabRestP: вероятность выбора ресторана

Сначала происходит сброс генератора случайных чисел с помощью функции MathSrand и передачи ей текущего значения микросекунд. Затем переменные fB и revision инициализируются начальными значениями -DBL_MAX и false соответственно.
Далее присваиваются значения входным параметрам coordinatesNumberP и populationSizeP переменным coords и populationSize.
Переменные restNumb и probabRest инициализируются значениями restaurantsNumberP и probabRestP.
Создается массив restSpace размером coords с помощью функции ArrayResize.
Затем создается массив cands размером populationSize с помощью функции ArrayResize. В цикле происходит инициализация каждого элемента массива cands вызовом метода Init с параметром coords.
Также создаются массивы rangeMax, rangeMin, rangeStep и cB размером coords с помощью функции ArrayResize.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_SDS::Init (const int    coordinatesNumberP,   //coordinates number
                     const int    populationSizeP,      //population size
                     const int    restaurantsNumberP,   //restaurants number
                     const double probabRestP)          //probability restaurant choosing
{
  MathSrand ((int)GetMicrosecondCount ()); // reset of the generator
  fB       = -DBL_MAX;
  revision = false;

  coords         = coordinatesNumberP;
  populationSize = populationSizeP;

  restNumb   = restaurantsNumberP;
  probabRest = probabRestP;
  ArrayResize (restSpace, coords);

  ArrayResize (cands, populationSize);
  for (int i = 0; i < populationSize; i++) cands [i].Init (coords);

  ArrayResize (rangeMax,       coords);
  ArrayResize (rangeMin,       coords);
  ArrayResize (rangeStep,      coords);
  ArrayResize (cB,             coords);
}
//——————————————————————————————————————————————————————————————————————————————

Метод  Moving() хотя и будет вызываться на каждой итерации, но основная логика метода выполняется только один раз, контролируемая флагом revision.

В начале функции проверяется переменная revision, если она равна false, то выполняется инициализация переменных и массивов.
Затем происходит цикл по координатам точек пространства.

Внутри этого цикла вычисляется значение restSpace[i], которое представляет собой длину интервала для каждой координаты, определенную как разность между максимальным и минимальным значениями диапазона, деленная на restNumb.

Далее объявляются переменные min и max, которые будут использоваться для определения диапазона значений для пространства конкретного ресторана.

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

Затем выполняется цикл по популяции размером populationSize, внутри которого выполняется цикл по координатам точек пространства. Внутри этого цикла генерируется случайное число n с помощью функции RNDfromCI(), которое используется для определения индекса в массиве restSpace. Если полученное значение n больше или равно restNumb, то оно присваивается restNumb - 1, для обеспечения равномерного распределения случайной величины. Затем вычисляются значения min и max, используя rangeMin, restSpace и n.

Генерируем случайное число dish (блюдо) с помощью функции RNDfromCI(), которое находится в диапазоне от min до max (пространство ресторана).

Затем значение dish используется для вычисления значения c[i] с помощью функции SeInDiSp(), использующей rangeMin, rangeMax, rangeStep для обеспечения корректного шага оптимизируемых параметров.

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

Переменная revision устанавливается в true, чтобы при следующем вызове функции Moving() не выполнялась инициализация переменных и массивов.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_SDS::Moving ()
{
  if (!revision)
  {
    for (int i = 0; i < coords; i++)
    {
      restSpace [i] = (rangeMax [i] - rangeMin [i]) / restNumb;
    }

    double min = 0.0;
    double max = 0.0;

    int    n   = 0;
    double dish = 0.0;

    for (int i = 0; i < populationSize; i++)
    {
      for (int c = 0; c < coords; c++)
      {
        n = (int)(RNDfromCI (0, restNumb));
        if (n >= restNumb) n = restNumb - 1;

        cands [i].raddr     [c] = n;
        cands [i].raddrPrev [c] = n;
        min = rangeMin [c] + restSpace [c] * n;
        max = min + restSpace [c];

        dish = RNDfromCI (min, max);

        cands [i].c [c] =  SeInDiSp (dish, rangeMin [c], rangeMax [c], rangeStep [c]);
      }
    }

    revision = true;
  }
}
//——————————————————————————————————————————————————————————————————————————————

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

1. Обновление лучшего найденного значения фитнес функции fB и соответствующего ему набора координат cB. Для каждого кандидата i в популяции, делается сравнение, если значение f (оценка функции) больше текущего глобального значения fB, то fB обновляется и в лучший глобальный набор координат cB копируется из кандидата i.

2. Обновление предыдущих значений оценок и наборов ресторанов для каждого кандидата. Для каждого кандидата i в популяции, если значение f больше предыдущего значения fPrev, то fPrev обновляется, а также копируются наборы ресторанов c и raddr из кандидата i в соответствующие предыдущие значения cPrev и raddrPrev.

3. Выбор нового набора ресторанов для каждого кандидата. Для каждого кандидата i в популяции и каждой координаты c, выбирается случайное число n в диапазоне от 0 до populationSize. Если значение fPrev для кандидата n больше значения fPrev для кандидата i, то набор ресторанов raddr для кандидата i обновляется значением raddrPrev для кандидата n. В противном случае, генерируется случайное число rnd в диапазоне от 0.0 до 1.0. Если rnd меньше вероятности probabRest, то выбирается случайное число n в диапазоне от 0 до restNumb и набор ресторанов raddr для кандидата i обновляется значением n. В противном случае, набор ресторанов raddr для кандидата i остается неизменным.

4. Генерация нового набора координат для каждого кандидата. Для каждого кандидата i в популяции и каждой координаты c, определяются минимальное и максимальное значения min и max на основе диапазона rangeMin и restSpace для соответствующей координаты. Затем генерируется случайное число в диапазоне от min до max с использованием функции SeInDiSp, и полученное значение присваивается соответствующей координате c в наборе c для кандидата i.

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

//——————————————————————————————————————————————————————————————————————————————
void C_AO_SDS::Revision ()
{
  //----------------------------------------------------------------------------
  for (int i = 0; i < populationSize; i++)
  {
    if (cands [i].f > fB)
    {
      fB = cands [i].f;
      ArrayCopy (cB, cands [i].c, 0, 0, WHOLE_ARRAY);
    }
  }

  //----------------------------------------------------------------------------
  double min = 0.0;
  double max = 0.0;
  double rnd = 0.0;
  int    n   = 0;

  for (int i = 0; i < populationSize; i++)
  {
    if (cands [i].f > cands [i].fPrev)
    {
      cands [i].fPrev = cands [i].f;
      ArrayCopy (cands [i].cPrev, cands [i].c, 0, 0, WHOLE_ARRAY);
      ArrayCopy (cands [i].raddrPrev, cands [i].raddr, 0, 0, WHOLE_ARRAY);
    }
  }

  for (int i = 0; i < populationSize; i++)
  {
    for (int c = 0; c < coords; c++)
    {
      n = (int)(RNDfromCI (0, populationSize));
      if (n >= populationSize) n = populationSize - 1;

      if (cands [n].fPrev > cands [i].fPrev)
      {
        cands [i].raddr [c] = cands [n].raddrPrev [c];
      }
      else
      {
        rnd = RNDfromCI (0.0, 1.0);

        if (rnd < probabRest)
        {
          n = (int)(RNDfromCI (0, restNumb));
          if (n >= restNumb) n = restNumb - 1;
          cands [i].raddr [c] = n;
        }
        else
        {
          cands [i].raddr [c] = cands [i].raddrPrev [c];
        }
      }

      min = rangeMin [c] + restSpace [c] * cands [i].raddr [c];
      max = min + restSpace [c];

      cands [i].c [c] = SeInDiSp (RNDfromCI (min, max), rangeMin [c], rangeMax [c], rangeStep [c]);
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————


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

Распечатка работы алгоритма стохастического диффузионного поиска на тестовом стенде:

C_AO_SDS:100;1000;0.1
=============================
5 Rastrigin's; Func runs 10000 result: 80.64253803557851
Score: 0.99921
25 Rastrigin's; Func runs 10000 result: 79.00996143538204
Score: 0.97898
500 Rastrigin's; Func runs 10000 result: 54.31544686388126
Score: 0.67300
=============================
5 Forest's; Func runs 10000 result: 1.677891584229713
Score: 0.94910
25 Forest's; Func runs 10000 result: 1.4089003503272384
Score: 0.79694
500 Forest's; Func runs 10000 result: 0.2437939668372883
Score: 0.13790
=============================
5 Megacity's; Func runs 10000 result: 8.6
Score: 0.71667
25 Megacity's; Func runs 10000 result: 6.448
Score: 0.53733
500 Megacity's; Func runs 10000 result: 0.9551999999999999
Score: 0.07960
=============================
All score: 5.86873

Сразу при взгляде на принт результатов работы алгоритма можем обратить внимание на невероятно высокие результаты по сравнению с другими алгоритмами. Подробное сравнение представлено ниже в таблице.

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

rastrigin

  SDS на тестовой функции Rastrigin.

forest

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

megacity

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

Хотелось бы отметить, что я никак не ожидал потрясающих результатов у такого очень простого, основанного на чистом случайном блуждании, алгоритма. Алгоритм SDS с большим превосходством, почти 13%, опередил все ранее рассмотренные алгоритмы, демонстрируя самые лучшие результаты во многих тестах (4 первых места из 9 возможных). Единственная дисциплина - многопеременная функция Растригина, лидер в которой далеко всех оставил позади, это алгоритм электромагнитного поиска (EM).

Даже на чрезвычайно сложной дискретной функции Megacity, алгоритм SDS показывает превосходные результаты, демонстрируя при этом практически полное отсутствие застревания, единственный, кто опередил SDS в тестах с 1000 переменных на Forest и Megacity - алгоритм растущих деревьев (SSG). 

AO

Description

Rastrigin

Rastrigin final

Forest

Forest final

Megacity (discrete)

Megacity final

Final result

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

SDS

stochastic diffusion search

0,99737

1,00000

0,63507

2,63244

0,96893

1,00000

0,95092

2,91985

1,00000

1,00000

0,72149

2,72149

100,000

2

SSG

saplings sowing and growing

1,00000

0,95313

0,55665

2,50978

0,72740

0,69680

1,00000

2,42421

0,69612

0,65726

1,00000

2,35338

87,489

3

HS

harmony search

0,99676

0,90817

0,48178

2,38670

1,00000

0,72930

0,44806

2,17736

0,91159

0,76446

0,41537

2,09142

79,474

4

ACOm

ant colony optimization M

0,34611

0,17142

0,17044

0,68797

0,86888

0,73719

0,77362

2,37968

0,91159

0,67983

0,05606

1,64749

54,863

5

IWO

invasive weed optimization

0,95828

0,63939

0,29807

1,89575

0,70773

0,34168

0,31773

1,36714

0,72927

0,32158

0,33289

1,38375

53,994

6

MEC

mind evolutionary computation

0,99270

0,48648

0,22800

1,70718

0,60762

0,29973

0,25459

1,16194

0,85083

0,31594

0,26170

1,42847

49,567

7

COAm

cuckoo optimization algorithm M

0,92400

0,44601

0,26004

1,63006

0,58378

0,25090

0,16526

0,99994

0,66298

0,25246

0,17083

1,08627

42,193

8

FAm

firefly algorithm M

0,59825

0,32387

0,17135

1,09348

0,51073

0,31182

0,49790

1,32045

0,31491

0,21438

0,35258

0,88188

36,860

9

ABC

artificial bee colony

0,78170

0,31182

0,20822

1,30174

0,53837

0,15816

0,13344

0,82998

0,51381

0,20311

0,13926

0,85617

32,954

10

BA

bat algorithm

0,40526

0,60773

0,84451

1,85750

0,20841

0,12884

0,25989

0,59714

0,27073

0,07616

0,17371

0,52060

32,794

11

GSA

gravitational search algorithm

0,70167

0,43098

0,00000

1,13265

0,31660

0,26845

0,33204

0,91710

0,54144

0,26797

0,00000

0,80941

31,322

12

BFO

bacterial foraging optimization

0,67203

0,29511

0,11813

1,08528

0,39702

0,19626

0,20652

0,79980

0,47514

0,25388

0,18932

0,91834

30,615

13

EM

electroMagnetism-like algorithm

0,12235

0,44109

1,00000

1,56344

0,00000

0,02578

0,34880

0,37458

0,00000

0,00000

0,10924

0,10924

21,024

14

SFL

shuffled frog-leaping

0,40072

0,22627

0,26548

0,89247

0,20153

0,03057

0,02652

0,25862

0,24862

0,04231

0,06639

0,35732

14,189

15

MA

monkey algorithm

0,33192

0,31883

0,14644

0,79719

0,10012

0,05817

0,08932

0,24762

0,19889

0,03243

0,10720

0,33853

12,603

16

FSS

fish school search

0,46812

0,24149

0,11302

0,82264

0,12840

0,03696

0,06516

0,23052

0,15471

0,03666

0,08283

0,27420

11,893

17

PSO

particle swarm optimisation

0,20449

0,07816

0,07160

0,35425

0,18895

0,07730

0,21738

0,48363

0,21547

0,04513

0,01957

0,28016

9,238

18

RND

random

0,16826

0,09287

0,08019

0,34132

0,13496

0,03546

0,04715

0,21757

0,15471

0,02962

0,04922

0,23354

5,108

19

GWO

grey wolf optimizer

0,00000

0,00000

0,02256

0,02256

0,06570

0,00000

0,00000

0,06570

0,29834

0,05640

0,02557

0,38031

1,000


Выводы

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

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

rating table

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


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

chart

Рисунок 4. Гистограмма итоговых результатов тестирования алгоритмов.

Плюсы и минусы алгоритма стохастического диффузионного поиска (SDS):

Плюсы:
1. Минимальное количество внешних параметров.
2. Высокая эффективность при решении разнообразных задач.
3. Низкая нагрузка на вычислительные ресурсы.
4. Легкость в реализации алгоритма.
5. Устойчивость к застреванию.
6. Высокие результаты как на гладких, так и на сложных дискретных функциях.
7. Высокая сходимость.

Минусы:
1. Не замечены.

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

Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (6)
Andrey Dik
Andrey Dik | 18 окт. 2023 в 21:37
fxsaber #:

Пока слабо разбирался в реализации. Поэтому вопрос.


Если у ФФ надо оптимизировать только половину входных параметров, можно ли попросить оптимизировать все равно якобы все параметры, но только у "ненужной" половины задать неизменяемый диапазон?

Да, конечно, установить диапазон соответствующих параметров MIN=MAX (шаг не будет играть роли, можно установить любой), если я правильно понял вопрос. В этом случае эти параметры буду выдаваться с одним и тем же значением.

Вообще, алгоритм не вызывает расчёт ФФ, поэтому он может оптить только нужные пользователю параметры.

Aleksandr Slavskii
Aleksandr Slavskii | 20 окт. 2023 в 17:36
fxsaber #:

Если у ФФ ...

ФФ ???    

Что такое ФФ ??? 

Andrey Dik
Andrey Dik | 20 окт. 2023 в 17:51
Aleksandr Slavskii #:

ФФ ???    

Что такое ФФ ??? 

фитнес функция, это то, что нужно оптимизировать (ФФ или FF)
Aleksandr Slavskii
Aleksandr Slavskii | 20 окт. 2023 в 18:38
Andrey Dik #:
фитнес функция, это то, что нужно оптимизировать (ФФ или FF)

Спасибо тебе, добрый человек.

nevar
nevar | 11 дек. 2023 в 22:19

1- Is it possible to scale or normalize (Zscore-MinMax-Logistic-LogNormal) the input and output?

2 -Instead of indicator parameter optimization ,is it possible to predict the optimal buy sell signals x bars ahead? 

How good is this algorithm finding the local and global maxima-minima?

Thanks.

Запускаем MetaTrader VPS впервые — пошаговая инструкция Запускаем MetaTrader VPS впервые — пошаговая инструкция
Всем, кто использует торговые советники или подписки на сигналы, рано или поздно понадобится надежный круглосуточный хостинг для торговой платформы. Мы рекомендуем использовать MetaTrader VPS по целому ряду причин. Платить и управлять сервисом можно через аккаунт MQL5.community. Если у вас еще нет аккаунта на MQL5.com — зарегистрируйтесь и укажите его в настройках платформы.
Нейросети — это просто (Часть 59): Дихотомия контроля (Dichotomy of Control — DoC) Нейросети — это просто (Часть 59): Дихотомия контроля (Dichotomy of Control — DoC)
В предыдущей статье мы познакомились с Трансформером решений. Но сложная стохастическая среда валютного рынка не позволила в полной мере раскрыть потенциал представленного метода. Сегодня я хочу представить Вам алгоритм, который направлен на повышение производительности алгоритмов в стохастических средах.
Сезонность на рынке форекс и возможности ее использования Сезонность на рынке форекс и возможности ее использования
Каждый современный человек знаком с понятием сезонности, например, все мы привыкли к росту цен свежих овощей в зимний период или подорожанию топлива в сильные морозы, но мало кто знает, что подобные закономерности существуют и на рынке форекс.
Классификационные модели библиотеки Scikit-learn и их экспорт в ONNX Классификационные модели библиотеки Scikit-learn и их экспорт в ONNX
В данной статье мы рассмотрим применение всех классификационных моделей пакета Scikit-learn для решения задачи классификации ирисов Фишера, попробуем их сконвертировать в ONNX-формат и использовать полученные модели в программах на MQL5. Также мы сравним точность работы оригинальных моделей и их ONNX-версий на полном наборе Iris dataset.