English
preview
Популяционные алгоритмы оптимизации: Алгоритмы искусственной микро-иммунной системы (Micro Artificial immune system, Micro-AIS)

Популяционные алгоритмы оптимизации: Алгоритмы искусственной микро-иммунной системы (Micro Artificial immune system, Micro-AIS)

MetaTrader 5Примеры | 16 января 2024, 11:12
657 47
Andrey Dik
Andrey Dik

Содержание:

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


1. Введение

Иммунная система - это удивительный механизм, который играет важную роль в защите нашего организма от внешних угроз. Как невидимый щит, она борется с бактериями, вирусами и грибками, сохраняя наш организм в здоровом состоянии. Но что если мы могли бы использовать этот мощный механизм для решения сложных задач оптимизации и обучения? Именно такой подход используется в методе оптимизации с использованием искусственной иммунной системы (Artificial Immune System, AIS).

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

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

В 1990-х годах был предложен метод оптимизации, известный как Artificial Immune System (AIS). Ранние исследования этого метода начались еще в середине 1980-х годов, когда Фармер, Паккард и Перельсон (Farmer, Packard, Perelson) (1986) и Берсини и Варела (Bersini, Varela) (1990) в своих работах по иммунным сетям внесли значительный вклад в разработку и применение AIS.

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

Micro-AIS (Micro-Immune Algorithm) - это модификация алгоритма иммунной системы (AIS), которая была разработана для решения задач оптимизации. Она отличается от обычного AIS тем, что использует более простую модель иммунной системы и более простые операции обработки иммунной информации.

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

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

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

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


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

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


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

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

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

Псевдокод Micro-AIS:

  1. Создать популяцию клонов антител и распределить их случайным образом по пространству поиска. Антитела и их клоны представляют собой потенциальные решения задачи оптимизации. Клоны создаются путем случайной генерации генотипа, который определяет значения параметров задачи оптимизации.
  2. Определяем приспособленность, которое является мерой качества решения. Значение приспособленности может быть вычислено путем оценки целевой функции для каждого антитела.
  3. Для каждого антитела создать клоны в количестве, соответствующему правилу убывающей прогрессии, первое по приспособленности антитело создаёт больше клонов чем второе, второе больше, чем третье и т.д. Таким образом количество клонов соответствует не степени приспособленности, а жёстко заданному правилу прогрессии. Более приспособленные антитела создают больше клонов, чем менее приспособленные всегда в одинаковом соотношении.
  4. Применить мутацию к генам клонов. Для каждого клона происходит мутация генотипа, которая позволяет создавать новые решения и исследовать пространство параметров задачи оптимизации.
  5. Определяем приспособленность клонов.
  6. После мутации и вычисления приспособленности, популяция клонов добавляется в родительскую популяцию антител.
  7. Отсортировать популяцию (антитела+клоны) в порядке убывания приспособленности, чтобы в последствии выбрать лучшие решения для создания новой популяции клонов в следующей итерации, тем самым реализуется конкуренция потомков-клонов с родительскими антителами.
  8. Повторять с п.2 до выполнения критерия останова. Критерий останова может быть определен заранее, например, достижение определенного значения приспособленности или достижение максимального числа итераций.

Мутация генов в клонах представляет собой генерацию случайных чисел с равномерным распределением по формуле:

X' = X + dist * rnd * k * mutation

где:

  • X' - новое значение гена (координаты) клона
  • X - значение гена родителя-антитела
  • dist - приращение к родительскому гену
  • rnd - случайное число с равномерным распределением в диапазоне [-1.0;1.0]
  • k - равномерно убывающий коэффициент, зависящий от текущей эпохи
  • mutation - коэффициент мутации, по сути - масштабный коэффициент приращения (внешний параметр)

Коэффициент "k" рассчитаем по следующей формуле:

k = (epochs - epochsCNT) / epochs

где:

  • epochs - предельное значение эпох
  • epochsCNT - счетчик эпох (итераций)

Размер приращения "dist" - расстояние от максимального значения оптимизируемого параметра до "X" в случае если "rnd" больше 0 и от "X" до минимального значения оптимизируемого параметра если иначе.

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

Напишем структуру, которая будет выступать в качестве антитела, S_Agent. Структура содержит только два поля:

  • c: массив координат агента
  • f: показатель приспособленности

Метод "Init" инициализирует поля структуры, изменяет размер массива "c" а полю "f" присваивается начальное значение "-DBL_MAX".

//——————————————————————————————————————————————————————————————————————————————
struct S_Agent
{
  void Init (int coords)
  {
    ArrayResize (c, coords);
    f = -DBL_MAX;
  }

  double c []; //coordinates
  double f;    //fitness
};
//——————————————————————————————————————————————————————————————————————————————

Объявим класс алгоритма микро-иммунной системы C_AO_Micro_AIS, в котором определены различные поля и методы.

Поля класса:

  • cB: массив лучших координат.
  • fB: показатель пригодности для лучших координат.
  • a: массив агентов типа "S_Agent".
  • rangeMax: массив максимальных значений диапазона поиска.
  • rangeMin: массив минимальных значений диапазона поиска.
  • rangeStep: массив шагов поиска.

Переменные "coords", "popSize", "minClonesNumber", "cloneStep", "mutation", "epochs" принимают внешние параметры алгоритма.

Методы класса:

  • Init: инициализирует поля класса с заданными значениями.
  • Moving: выполняет перемещение агентов.
  • Revision: выполняет ревизию.

Также в классе определены приватные методы "SeInDiSp", "RNDfromCI", "Sorting" для нормализации, генерации случайных чисел и сортировки соответственно.

//——————————————————————————————————————————————————————————————————————————————
class C_AO_Micro_AIS
{
  //----------------------------------------------------------------------------
  public: double  cB [];  //best coordinates
  public: double  fB;     //FF of the best coordinates
  public: S_Agent a  [];  //agent

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

  public: void Init (const int    coordsP,          //coordinates number
                     const int    popSizeP,         //population size
                     const int    minClonesNumberP, //minimum number of clones
                     const int    cloneStepP,       //clone step
                     const double mutationP,        //mutation
                     const int    epochP);          //total epochs

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

  //----------------------------------------------------------------------------
  private: int    coords;          //coordinates number
  private: int    popSize;         //population size
  private: int    minClonesNumber; //minimum number of clones
  private: int    cloneStep;       //clone step
  private: double mutation;        //mutation
  private: int    epochs;          //total epochs
  private: int    epochsCNT;       //epoch counter
  private: int    parentsNumb;     //number of parents
  private: bool   revision;

  private: S_Agent parents [];  //parents
  private: int     ind     [];
  private: double  val     [];
  private: S_Agent pTemp   [];

  private: int     cCnt    [];  //clone counters for each antibody

  private: double SeInDiSp           (double In, double InMin, double InMax, double Step);
  private: double RNDfromCI          (double min, double max);
  private: void   Sorting            (S_Agent &p [], int size);
};
//——————————————————————————————————————————————————————————————————————————————

Для инициализации объекта класса реализуем метод "Init" для инициализации полей класса с заданными значениями.

В начале метода происходит инициализация генератора случайных чисел с помощью функции "MathSrand" и сброс его состояния с помощью функции "GetMicrosecondCount".

Затем переменным "fB" и "revision" присваиваются значения "-DBL_MAX" и "false" соответственно, а так же инициализируем приватные поля входными параметрами метода.

Далее происходит вычисление значений массива "cCnt", используемого для хранения количества клонов для каждого антитела с помощью цикла, используя формулу прогрессии, где первый член прогрессии равен "a1", разность прогрессии равна "d", и сумма всех членов прогрессии равна "Sn". Значения прогрессии сохраняются в массиве "cCnt".

Затем метод определяет значение переменной "parentsNumb" как размер массива "cCnt".

Далее происходит изменение размеров массивов: "ind", "val", "pTemp", "a", "parents", "rangeMax", "rangeMin", "rangeStep" и "cB". Размеры массивов устанавливаются в соответствии со значениями "popSize" и "parentsNumb".

Далее в цикле инициализируются элементы массива "a" с помощью метода "Init" класса "S_Agent", а элементы массива "parents" инициализируются также с помощью метода "Init".

В конце метода происходит изменение размеров массивов "rangeMax", "rangeMin", "rangeStep" и "cB" в соответствии со значением "coords".

Таким образом, метод "Init" выполняет инициализацию полей класса "C_AO_Micro_AIS" и вычисление значений прогрессии для массива "cCnt".

//——————————————————————————————————————————————————————————————————————————————
void C_AO_Micro_AIS::Init (const int    coordsP,          //coordinates number
                           const int    popSizeP,         //population size
                           const int    minClonesNumberP, //minimum number of clones
                           const int    cloneStepP,       //clone step
                           const double mutationP,        //mutation
                           const int    epochP)           //total epochs
{
  MathSrand ((int)GetMicrosecondCount ()); // reset of the generator
  fB       = -DBL_MAX;
  revision = false;

  coords          = coordsP;
  popSize         = popSizeP;
  minClonesNumber = minClonesNumberP;
  cloneStep       = cloneStepP;
  mutation        = mutationP;
  epochs          = epochP;
  epochsCNT       = 1;

  //----------------------------------------------------------------------------
  int Sn = popSize;         //сумма
  int a1 = minClonesNumber; //первый член прогрессии
  int d  = cloneStep;       //разность прогрессии

  int an   = 0;             //n-й член прогрессии,
  int Ssum = 0;

  ArrayResize (cCnt, 1);

  for (int n = 1;; n++)
  {
    an = a1 + (n - 1) * d;
    Ssum = n * (a1 + an) / 2;

    if (Ssum == Sn)
    {
      ArrayResize (cCnt, n);
      cCnt [n - 1] = an;
      break;
    }
    else
    {
      if (Ssum < Sn)
      {
        ArrayResize (cCnt, n);
        cCnt [n - 1] = an;
      }
      else
      {
        if (n == 1)
        {
          ArrayResize (cCnt, n);
          cCnt [n - 1] = Sn;
          break;
        }
        else
        {
          n--;
          an = a1 + (n - 1) * d;
          int diff = Sn - ((n) * (a1 + an) / 2);

          int index = ArraySize (cCnt) - 1;

          while (true)
          {
            if (index < 0) index = ArraySize (cCnt) - 1;

            cCnt [index]++;

            index--;
            diff--;

            if (diff <= 0) break;
          }

          break;
        }
      }
    }
  }
  
  
  parentsNumb   = ArraySize (cCnt);
  ArrayReverse (cCnt, 0, WHOLE_ARRAY);

  ArrayResize (ind,   popSize + parentsNumb);
  ArrayResize (val,   popSize + parentsNumb);
  ArrayResize (pTemp, popSize + parentsNumb);
  ArrayResize (a,     popSize);
  for (int i = 0; i < popSize; i++) a [i].Init (coords);

  ArrayResize (parents, popSize + parentsNumb);
  for (int i = 0; i < popSize + parentsNumb; i++) parents [i].Init (coords);

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

С помощью метода "Moving" класса реализуем передвижение антител по пространству поиска.

В начале метода проверяется значение переменной "revision". Если оно равно "false", то выполняется размещение клонов антител в пространстве поиска с помощью генерации координат с равномерным распределением.

После генерации клонов антител в популяции, переменной "revision" присваивается значение "true", и метод завершается.

Если значение переменной "revision" не является "false", выполняется следующий блок кода.

Затем следует вложенный цикл "for", который итерируется по количеству родительских агентов "parentsNumb". Внутри этого цикла происходит следующее:

  • вложенный цикл "for" итерируется по количеству клонов для данного родительского антитела "cCnt[i]".
  • внутри этого цикла вложенный цикл "for" итерируется по всем координатам "c" агента.
  • значение координаты "a[indx].c[c]" устанавливается равным значению координаты "parents[i].c[c]".

Затем выполняется следующий блок кода:

  • вычисляется значение переменной "k" как разность между "epochs" и "epochsCNT", деленная на "epochs".
  • генерируется случайное число "rnd" в диапазоне от [-1.0;1.0].
  • "rnd" больше 0.0, то вычисляется значение переменной "dist" как разность между "rangeMax[c]" и "a[indx].c[c]". В противном случае, "dist" равно разности между "a[indx].c[c]" и "rangeMin[c]".
  • значение "a[indx].c[c]" пересчитывается с использованием формулы "a[indx].c[c] + dist * rnd * k * mutation". Здесь "mutation" - это коэффициент мутации.
  • значение "a[indx].c[c]" проходит через функцию "SeInDiSp", которая нормализует его в диапазоне от "rangeMin[c]" до "rangeMax[c]" с шагом "rangeStep[c]".
//——————————————————————————————————————————————————————————————————————————————
void C_AO_Micro_AIS::Moving ()
{
  //----------------------------------------------------------------------------
  if (!revision)
  {
    for (int i = 0; i < popSize; i++)
    {
      for (int c = 0; c < coords; c++)
      {
        a [i].c [c] = RNDfromCI (rangeMin [c], rangeMax [c]);
        a [i].c [c] = SeInDiSp (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
      }
    }

    revision = true;
    return;
  }

  //----------------------------------------------------------------------------
  int    indx = 0;
  double min  =  DBL_MAX;
  double max  = -DBL_MAX;
  double dist = 0.0;
  int    cnt  = 0;
  double rnd  = 0.0;
  
  for (int i = 0; i < parentsNumb; i++)
  {
    for (int cl = 0; cl < cCnt [i]; cl++)
    {
      for (int c = 0; c < coords; c++)
      {
        a [indx].c [c] = parents [i].c [c];
        
        //----------------------------------------------------------------------
        double k = ((double)epochs - (double)epochsCNT) / (double)epochs;
        rnd = RNDfromCI (-1.0, 1.0);

        if (rnd > 0.0) dist = (rangeMax [c] - a [indx].c [c]);
        else           dist = (a [indx].c [c] - rangeMin [c]);

        a [indx].c [c] = a [indx].c [c] + dist * rnd * k * mutation;
        a [indx].c [c] = SeInDiSp  (a [indx].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
      }

      indx++;
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

И в завершение, реализуем метод "Revision". Этот метод выполняет ревизию текущего состояния популяции агентов в алгоритме Micro-AIS.

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

Затем в цикле копируем клоны в популяцию родительских антигенов в конец массива.

После этого вызывается функция "Sorting" с аргументами "parents" и "parentsNumb + popSize". Данная функция выполняет сортировку массива "parents" по значению показателя пригодности в порядке убывания.

В конце метода инкрементируется переменная "epochsCNT", которая отвечает за подсчет количества эпох в алгоритме.

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

//——————————————————————————————————————————————————————————————————————————————
void C_AO_Micro_AIS::Revision ()
{
  //----------------------------------------------------------------------------
  int indx = -1;

  for (int i = 0; i < popSize; i++)
  {
    if (a [i].f > fB) indx = i;
  }

  if (indx != -1)
  {
    fB = a [indx].f;
    ArrayCopy (cB, a [indx].c, 0, 0, WHOLE_ARRAY);
  }

  //----------------------------------------------------------------------------
  for (int i = parentsNumb; i < parentsNumb + popSize; i++)
  {
    parents [i] = a [i - parentsNumb];
  }

  Sorting (parents, parentsNumb + popSize);
  
  epochsCNT++;
}
//——————————————————————————————————————————————————————————————————————————————


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

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

C_AO_Micro_AIS:50:1:2:0.3
=============================
5 Hilly's; Func runs: 10000; result: 0.7954680903046107
25 Hilly's; Func runs: 10000; result: 0.5192246492565626
500 Hilly's; Func runs: 10000; result: 0.30860655744850657
=============================
5 Forest's; Func runs: 10000; result: 0.7295587642801589
25 Forest's; Func runs: 10000; result: 0.36878621216829993
500 Forest's; Func runs: 10000; result: 0.09398090798741626
=============================
5 Megacity's; Func runs: 10000; result: 0.37666666666666665
25 Megacity's; Func runs: 10000; result: 0.15866666666666668
500 Megacity's; Func runs: 10000; result: 0.028016666666666672
=============================
All score: 3.37898 (37.54%)

Начиная с предыдущей статьи мы перешли к абсолютным значениям результатов тестирования, и теперь очень просто ориентироваться и сопоставлять результаты разных алгоритмов в таблице. Результат "37.54%" - это не выдающийся результат, но всё же это положение в верхней половине таблицы.

Визуализация процесса оптимизации показала, что алгоритм проявляет настойчивость в исследовании значимых локальных экстремумов для достижения более лучшего решения. Это приводит к концентрации агентов в разных областях пространства. График сходимости показал необычное поведение. Обычно в рассматриваемых алгоритмах наблюдается резкий рост сходимости в первой половине итераций, а затем темп сходимости плавно снижается. Однако, в данном алгоритме график сходимости имеет S-образную форму. Резкий рост сходимости наблюдается только на первых 10-20% итераций, затем скорость сходимости снижается, но ближе к окончанию оптимизации снова наблюдается значительное ускорение сходимости.

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

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

Hilly

  Micro-AIS на тестовой функции Hilly.

Forest

  Micro-AIS на тестовой функции Forest.

Megacity

  Micro-AIS на тестовой функции Megacity.

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

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

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

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

(P+O)ES

(P+O) evolution strategies

0,99934

0,91895

0,56297

2,48127

1,00000

0,93522

0,39179

2,32701

0,83167

0,64433

0,21155

1,68755

6,496

72,18

2

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

3

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

4

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

5

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

6

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

7

(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

8

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

9

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

10

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

11

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

12

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

13

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

14

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

15

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

16

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

17

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

18

BFO

bacterial foraging optimization

0,54626

0,43533

0,31907

1,30066

0,41626

0,23156

0,06266

0,71048

0,35500

0,15233

0,03627

0,54360

2,555

28,39

19

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

20

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

21

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

22

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

23

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

24

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

25

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

26

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

27

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

28

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

29

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


Выводы

Метод оптимизации с использованием искусственной микро-иммунной системы (Micro-AIS) представляет собой интересный и перспективный подход к решению задач оптимизации, основанный на принципах функционирования иммунной системы. Он позволяет использовать мощный механизм иммунной системы для решения сложных задач оптимизации и обучения.

Среди преимуществ Micro-AIS можно отметить малое количество внешних параметров и простую реализацию алгоритма. Это делает его достаточно привлекательным для использования в практических задачах.

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

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

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

rating table

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

chart

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

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


Плюсы и минусы алгоритма искусственной микро-иммунной системы (Micro-AIS):

Плюсы:
  1. Малое количество внешних параметров.
  2. Простая реализация алгоритма.
Минусы:
  1. Склонность к застреванию.
  2. Невысокая сходимость.

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

Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (47)
Stanislav Korotky
Stanislav Korotky | 22 янв. 2024 в 15:40
fxsaber #:

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

Ну, это было б слишком нереальное упрощение. Там ограничение по количеству прогонов, насколько я понял, а не по количеству параметров.

Я взял параметры из настроек тестовых фитнес-функций, чтобы более менее реальные размеры оптимизационного пространства иметь при сравнении алгоритмов. ;-).

fxsaber
fxsaber | 22 янв. 2024 в 15:43
Stanislav Korotky #:

Ну, это было б слишком нереальное упрощение. Там ограничение по количеству прогонов, насколько я понял, а не по количеству параметров.

Я взял параметры из настроек тестовых фитнес-функций, чтобы более менее реальные размеры оптимизационного пространства иметь при сравнении алгоритмов. ;-).

Честно говоря, не понимаю, зачем MQ воспринимает буквально этот Step. Это же уровень минимальной дискретности. И к алгоритму оптимизации имеет почти нулевое отношение.

Andrey Dik
Andrey Dik | 22 янв. 2024 в 18:28
fxsaber #:

Честно говоря, не понимаю, зачем MQ воспринимает буквально этот Step. Это же уровень минимальной дискретности. И к алгоритму оптимизации имеет почти нулевое отношение.

В вещественном представлении признаков - да, и не почти, а нулевое отношение.

Для бинарного ГА в этом плане дела обстоят несколько сложнее, есть нюансы.

Я говорил ранее, что в лоб нельзя сравнивать алго из статей со штатным ГА, это некорректно. Штатный ГА это комплекс, в котором учтено множество нюансов, что бы обеспечить работу на большинстве пользовательских ПК: скорость работы, уникальность новых решений, экономия памяти.

fxsaber
fxsaber | 26 мар. 2024 в 21:46
Stanislav Korotky #:

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

Поделитесь ссылкой. Это?

Stanislav Korotky
Stanislav Korotky | 27 мар. 2024 в 13:53
fxsaber #:

Поделитесь ссылкой. Это?

Да.

Теория категорий в MQL5 (Часть 19): Индукция квадрата естественности Теория категорий в MQL5 (Часть 19): Индукция квадрата естественности
Мы продолжаем рассмотрение естественных преобразований, рассматривая квадратичную индукцию естественности. Небольшие ограничения на реализацию мультивалютности для экспертов, собранных с помощью мастера MQL5, означают, что мы демонстрируем свои возможности по классификации данных с помощью скрипта. В качестве основных областей применения рассматриваются классификация изменений цен и, соответственно, их прогнозирование.
Выставление ордеров в MQL5 Выставление ордеров в MQL5
При создании любой торговой системы есть задача, которую необходимо эффективно решить. Эта задача заключается в выставлении ордеров либо в их автоматической обработке торговой системой. В статье рассмотрено создание торговой системы с точки зрения эффективного выставления ордеров.
Разметка данных в анализе временных рядов (Часть 2):Создаем наборы данных с маркерами тренда с помощью Python Разметка данных в анализе временных рядов (Часть 2):Создаем наборы данных с маркерами тренда с помощью Python
В этой серии статей представлены несколько методов разметки временных рядов, которые могут создавать данные, соответствующие большинству моделей искусственного интеллекта (ИИ). Целевая разметка данных может сделать обученную модель ИИ более соответствующей пользовательским целям и задачам, повысить точность модели и даже помочь модели совершить качественный скачок!
Нейросети — это просто (Часть 72): Прогнозирование траекторий в условиях наличия шума Нейросети — это просто (Часть 72): Прогнозирование траекторий в условиях наличия шума
Качество прогнозирование будущих состояний играет важную роль в метода Goal-Conditioned Predictive Coding, с которым мы познакомились в предыдущей статье. В данной статье я хочу познакомить Вас с алгоритмом, способным значительно повысить качество прогнозирования в стохастических средах, к которым можно отнести и финансовые рынки.