English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
모집단 최적화 알고리즘: 박쥐 알고리즘(BA)

모집단 최적화 알고리즘: 박쥐 알고리즘(BA)

MetaTrader 5 | 22 11월 2023, 11:13
343 0
Andrey Dik
Andrey Dik

콘텐츠

1. 소개
2. 알고리즘에 대한 설명
3. 테스트 결과


1. 소개

박쥐는 놀라운 동물입니다. 과학자들은 최초의 박쥐가 6500만~1억 년 전에 공룡과 같이 살면서 나타났다고 믿습니다. 박쥐는 날개를 가진 유일한 포유류입니다. 박쥐는 1300종이 넘는 종을 자랑합니다. 극지방을 제외한 거의 모든 곳에서 볼 수 있습니다. 낮에는 대피소에 숨어 지냅니다. 박쥐는 어두운 동굴을 탐색하고 어두운 밤에 사냥을 하기 위해 음파를 사용하여 물체를 감지하는 시스템인 반향 위치 탐지 기능을 사용합니다. 박쥐는 물체에 부딪혀 반사될 때까지 전진하는 고주파 사운드를 방출하여 반향 위치를 찾습니다. 반향 위치 탐지는 일종의 음파 탐지기입니다: 박쥐는 크고 짧은 펄스 소리를 냅니다. 소리가 물체에 도달하게 되면 짧은 시간 후에 박쥐의 귀에 울림이 되돌아오는데 박쥐는 이를 통해 공간에서 방향을 찾고 먹잇감의 위치를 파악하게 됩니다. 

박쥐 알고리즘(BA)은 Yang이 2010년에 도입한 휴리스틱 알고리즘으로 박쥐의 반향 위치 행동을 모방하여 글로벌 최적화를 수행합니다. 일반적으로 자연과 물리적 프로세스에서 영감을 받은 메타휴리스틱은 이제 다양한 복잡한 최적화 문제를 해결하는 가장 강력한 기법 중 하나로 사용되고 있습니다. 최적화는 여러 가지 효율적인 옵션 중에서 특정 기준 세트에 가장 적합한 요소를 선택하는 것으로 계산의 효율성과 글로벌 최적화 가능성의 측면에서 다양한 장단점을 보여줍니다.

기능 최적화는 매개변수를 입력으로 받는 '타겟' 함수를 제공하여 여러 가지 특정 문제를 모델링하고 해결하기 위한 공식적인 프레임워크를 제공합니다. 목표는 최적의 값을 반환하도록 결합된 매개변수의 값을 찾는 것입니다. 이 프레임워크는 충분히 추상적이어서 다양한 문제들이 '기능 최적화' 문제로 해석될 수 있습니다.


그러나 기존의 기능 최적화는 일부 작은 문제를 해결하는 데만 사용되며 실제로는 적용되지 않는 경우가 많습니다. 따라서 과학자들은 이러한 문제를 해결할 수 있는 풍부한 모델을 제공하는 자연에 주목하고 있습니다. 색다른 방법으로 응용 문제를 해결하기 위한 많은 지능형 군집 최적화 알고리즘이 자연 생물학적 시스템을 모델링하여 제안되고 있습니다. 이들 알고리즘들은 뛰어난 성능을 발휘하며 다양한 최적화 문제에 널리 사용됩니다. BA는 실제 박쥐의 자연스러운 소리 펄스 볼륨과 방출 주파수를 모방한 인공 박쥐를 검색 에이전트로 사용하여 검색 프로세스를 수행하는 새롭고 현대적인 군집형 알고리즘입니다.


2. 알고리즘에 대한 설명

기본적으로 박쥐 알고리즘에서 각 박쥐는 솔루션 공간에서 유효한 솔루션을 나타내는 "질량과 크기가 없는" 입자로 취급됩니다. 서로 다른 체력 함수에 대해 각 박쥐는 해당 특징 값을 가지며 특징 값을 비교하여 현재 최적의 개체를 결정합니다. 그런 다음 음파의 주파수, 속도, 임펄스 방출 속도 및 집단 내 각 박쥐의 부피가 업데이트되고 반복 진화가 계속되고 현재 최적 솔루션이 근사화되고 생성되고 마침내 전역 최적의 솔루션이 발견됩니다. 알고리즘은 각 박쥐의 빈도, 속도, 위치를 업데이트 합니다.

표준 알고리즘에는 다섯 가지의 기본 매개 변수가 필요합니다: 주파수, 음량, 리플, 음량 및 리플 비율 빈도는 과거의 최고 포지션이 현재의 포지션에 미치는 영향이 균형을 맞추도록 하는 데에 사용됩니다. 개별 박쥐는 검색 빈도의 범위가 크면 그룹의 과거 위치에서 멀리 떨어진 곳을 검색하고 그 반대의 경우도 마찬가지입니다.

알고리즘에는 앞서 고려한 것과 비교해 보면 상당히 많은 매개 변수가 있습니다:

input double MIN_FREQ_P          = 0.0;
input double MAX_FREQ_P         = 1.0;
input double MIN_LOUDNESS_P  = 0.0;
input double MAX_LOUDNESS_P = 1.5;
input double MIN_PULSE_P        = 0.0;
input double MAX_PULSE_P        = 1.0;
input double ALPHA_P               = 0.3;
input double GAMMA_P              = 0.3;

BA 알고리즘을 구현할 때 저는 많은 곳에서 기사 작성자가 알고리즘을 완전히 다른 방식으로 설명한다는 사실을 발견했습니다. 차이는 핵심 사항을 설명할 때나 기본적인 알고리즘 기능에 대해 설명할 때 사용하는 용어에 있었습니다. 여기서는 제가 이러한 것들을 어떻게 이해했는지를 설명하겠습니다. 반향 위치 측정의 기본이 되는 물리적 원리는 알고리즘에 상당한 의구심과 규칙을 적용하여 적용할 수 있습니다. 우리는 박쥐가 MinFreq에서 MaxFreq 범위의 사운드 펄스를 사용한다고 가정합니다. 주파수는 박쥐의 속도에 영향을 줍니다. 조건부 음량 개념도 사용되며 이는 박쥐의 현재 위치에서 로컬 검색 상태에서 최적의 솔루션 근처에서 글로벌 검색 상태로 전환하는 데 영향을 미칩니다. 최적화하는 동안 진동 주파수는 증가하는 반면 소리의 볼륨은 감소합니다.

BA 알고리즘 의사 코드(그림 1):

1. 박쥐 개체군 초기화.
2. 주파수, 속도 및 새로운 솔루션의 생성.
3. 로컬 솔루션 검색.
4. 글로벌 솔루션 업데이트.
5. 볼륨을 낮추고 진동 주파수를 높임.
6. 정지 기준이 충족될 때까지 2단계를 반복.

계획

그림 1. BA 알고리즘 블록 다이어그램

코드 설명을 시작하겠습니다. "박쥐" 검색 에이전트를 설명하려면 각 반복 시점에서 모든 상태의 특성을 완벽히 설명하는 데 필요한 구조가 필요합니다. position [] 배열은 공간에서 최적의 위치 좌표를 저장하는 데 사용되며, auxPosition [] 배열은 현재의 "작동" 좌표를 위한 것입니다. speed [] 배열은 좌표로 속도 벡터를 계산할 때 필요합니다. frequency - 사운드 진동의 주파수, initPulseRate - 초기 진동수(최적화 시작부터 각 배트마다 개별), pulseRate - 현재 반복 시 진동수, loudness - 사운드 진동의 음량, fitness - 마지막 움직임 이후의 피트니스 함수 값, fitnessBest - 모든 반복에서 에이전트의 피트니스 함수 최고 값. 

//——————————————————————————————————————————————————————————————————————————————
struct S_Bat
{
  double position    [];
  double auxPosition [];
  double speed       [];
  double frequency;
  double initPulseRate;
  double pulseRate;
  double loudness;
  double fitness;
  double fitnessBest;
};
//——————————————————————————————————————————————————————————————————————————————

박쥐 알고리즘 클래스에는 탐색 에이전트의 구조, 탐색 공간의 경계와 단계, 알고리즘이 찾은 최적 좌표, 적합도 함수의 최적값, 알고리즘 매개변수를 저장하기 위한 상수, 공용 초기화 메서드, 알고리즘 작동에 필요한 두 가지 공용 메서드, 알고리즘 전용 비공개 메서드가 포함되어 있습니다.

//——————————————————————————————————————————————————————————————————————————————
class C_AO_BA
{
  //============================================================================
  public: S_Bat  bats      []; //bats
  public: double rangeMax  []; //maximum search range
  public: double rangeMin  []; //manimum search range
  public: double rangeStep []; //step search
  public: double cB        []; //best coordinates
  public: double fB;           //FF of the best coordinates

  public: void Init (const int    paramsP,
                     const int    batsNumberP,
                     const double min_FREQ_P,
                     const double max_FREQ_P,
                     const double min_LOUDNESS_P,
                     const double max_LOUDNESS_P,
                     const double min_PULSE_P,
                     const double max_PULSE_P,
                     const double alpha_P,
                     const double gamma_P,
                     const int    maxIterP);

  public: void Flight (int epoch);
  public: void Preparation ();

  //============================================================================
  private: void Walk               (S_Bat &bat);
  private: void AproxBest          (S_Bat &bat, double averageLoudness);
  private: void AcceptNewSolutions (S_Bat &bat);
  private: int  currentIteration;
  private: int  maxIter;

  private: double MIN_FREQ;
  private: double MAX_FREQ;

  private: double MIN_LOUDNESS;
  private: double MAX_LOUDNESS;

  private: double MIN_PULSE;
  private: double MAX_PULSE;

  private: double ALPHA;
  private: double GAMMA;

  private: int    params;
  private: int    batsNumber;

  private: bool   firstFlight;

  private: double SeInDiSp  (double In, double inMin, double inMax, double step);
  private: double RNDfromCI (double min, double max);
  private: double Scale     (double In, double InMIN, double InMAX, double OutMIN, double OutMAX,  bool revers);
};
//——————————————————————————————————————————————————————————————————————————————

알고리즘 설정 파라미터의 Init () 공용 메서드에서 배열에 메모리를 할당하고 변수를 최소값으로 재설정하여 가장 적합한 값을 저장하고 초기 반복의 플래그를 재설정합니다. 일반적으로 이 방법은 복잡하지 않고 특별한 것이 아닙니다.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_BA::Init (const int    paramsP,
                    const int    batsNumberP,
                    const double min_FREQ_P,
                    const double max_FREQ_P,
                    const double min_LOUDNESS_P,
                    const double max_LOUDNESS_P,
                    const double min_PULSE_P,
                    const double max_PULSE_P,
                    const double alpha_P,
                    const double gamma_P,
                    const int    maxIterP)
{
  MathSrand (GetTickCount ());

  fB = -DBL_MAX;

  params       = paramsP;
  batsNumber   = batsNumberP;
  MIN_FREQ     = min_FREQ_P;
  MAX_FREQ     = max_FREQ_P;
  MIN_LOUDNESS = min_LOUDNESS_P;
  MAX_LOUDNESS = max_LOUDNESS_P;
  MIN_PULSE    = min_PULSE_P;
  MAX_PULSE    = max_PULSE_P;
  ALPHA        = alpha_P;
  GAMMA        = gamma_P;
  maxIter      = maxIterP;

  ArrayResize (rangeMax,  params);
  ArrayResize (rangeMin,  params);
  ArrayResize (rangeStep, params);

  firstFlight = false;

  ArrayResize (bats, batsNumber);

  for (int i = 0; i < batsNumber; i++)
  {
    ArrayResize (bats [i].position,    params);
    ArrayResize (bats [i].auxPosition, params);
    ArrayResize (bats [i].speed,       params);

    bats [i].fitness  = -DBL_MAX;
  }

  ArrayResize (cB, params);
}
//——————————————————————————————————————————————————————————————————————————————

각 반복에서 호출되는 첫 번째 메서드는 Flight()입니다. 이 메서드는 검색 로직의 주요 프레임에 집중하고 나머지 세부 사항은 이 최적화 알고리즘과 관련된 보조 비공개 메서드에 배치합니다. 첫 번째 반복에서 첫 번째 비행 플래그가 재설정됩니다(재설정은 Init () 메서드에서 초기화 중에 발생합니다). 즉, 검색 공간에서 임의의 위치에 있는 각각의 박쥐에 초기 상태를 할당해야 합니다:

  • 제로 속도,
  • 매개 변수에 지정된 범위의 난수로 할당된 사운드 진동의 개별 주파수입니다,
  • 초기 개별 진동 주파수는 매개변수 범위의 난수로도 정의됩니다.
  • 매개변수 범위에서 사운드 진동의 음량을 조절할 수 있습니다.

보시다시피 각각의 인공 박쥐는 개별적인 소리 신호의 특성을 가지고 있어 실제 박쥐와 비슷합니다. 수십만 마리의 개체들로 구성된 전체 개체군에서 어미는 새끼가 내는 고유한 소리 신호로 한 마리의 새끼를 찾을 수 있습니다.

첫 비행 플래그가 활성화된 경우 박쥐를 이동하기 위한 기본 작업을 수행해야 합니다. 알고리즘의 흥미로운 특징 중 하나는 전체 개체의 평균 소리 크기라는 개념에 있습니다. 일반적으로 모든 반복에 걸쳐 '알파' 계수를 통해 사운드 음량이 감소합니다. 여기에는 두 가지 유형의 박쥐의 움직임이 있습니다: Walk () - 각 좌표 구성 요소에 대한 속도 벡터를 계산하고 최적의 솔루션 근처에서 국부적으로 이동하는 개별 이동.

다음 반복할 때마다 진동의 강도가 감소하여 주변 탐색의 강도에 영향을 줍니다. 따라서 탐색과 착취는 최적화 과정에서 동적으로 변화합니다. 다음으로 현재 반복이 박쥐의 행동에 어떤 영향을 미치는지 살펴보겠습니다.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_BA::Flight (int epoch)
{
  currentIteration = epoch;

  //============================================================================
  if (!firstFlight)
  {
    fB = -DBL_MAX;

    //--------------------------------------------------------------------------
    for (int b = 0; b < batsNumber; b++)
    {
      for (int p = 0; p < params; p++)
      {
        bats [b].position    [p] = RNDfromCI (rangeMin [p], rangeMax [p]);
        bats [b].position    [p] = SeInDiSp (bats [b].position [p], rangeMin [p], rangeMax [p], rangeStep [p]);
        bats [b].auxPosition [p] = bats [b].position    [p];
        bats [b].speed       [p] = 0.0;
        bats [b].frequency       = RNDfromCI (MIN_FREQ, MAX_FREQ);
        bats [b].initPulseRate   = RNDfromCI (MIN_PULSE, MAX_PULSE / 2);
        bats [b].pulseRate       = bats [b].initPulseRate;
        bats [b].loudness        = RNDfromCI (MAX_LOUDNESS / 2, MAX_LOUDNESS);
        bats [b].fitness         = -DBL_MAX;
        bats [b].fitnessBest     = -DBL_MAX;
      }
    }

    firstFlight = true;
  }
  //============================================================================
  else
  {
    double avgLoudness = 0;

    for (int b = 0; b < batsNumber; b++)
    {
      avgLoudness += bats [b].loudness;
    }

    avgLoudness /= batsNumber;

    for (int b = 0; b < batsNumber; b++)
    {
      Walk (bats [b]);

      if (RNDfromCI (MIN_PULSE, MAX_PULSE) > bats [b].pulseRate)
      {
        AproxBest (bats [b], avgLoudness);
      }
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

두 번째 필수 공용 메서드인 Preparation()은 각 반복마다 호출되며 글로벌 최적 솔루션을 업데이트하는 데 필요합니다. 여기에서 우리는 '음량'이라는 개념이 어떻게 사용되는지 확인할 수 있습니다. 반복할 때마다 각 마우스의 볼륨이 계수('알파' 알고리즘 튜닝 매개변수)를 통해 감소하므로 로컬 학습 확률은 글로벌 솔루션 학습의 강도와 함께 감소합니다. 다시 말해 각 박쥐의 최적 위치를 업데이트할 확률은 반복할 때마다 감소합니다. 이것은 적어도 저에게는 알고리즘에서 가장 이해도가 낮은 부분 중 하나입니다. 그러나 알고리즘 작성자가 이를 구현했기 때문에 반드시 필요한 것입니다.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_BA::Preparation ()
{
  //----------------------------------------------------------------------------
  for (int b = 0; b < batsNumber; b++)
  {
    if (bats [b].fitness > fB)
    {
      fB = bats [b].fitness;
      ArrayCopy (cB, bats [b].auxPosition, 0, 0, WHOLE_ARRAY);
    }
  }

  //----------------------------------------------------------------------------
  for (int b = 0; b < batsNumber; b++)
  {
    if (RNDfromCI (MIN_LOUDNESS, MAX_LOUDNESS) < bats [b].loudness && bats [b].fitness >= bats [b].fitnessBest)
    {
      AcceptNewSolutions (bats [b]);
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

비공개 Walk() 메서드는 글로벌 최적 솔루션이 주어졌을 때 각 박쥐가 지금까지의 현재 최적 위치를 기준으로 개별적으로 움직이도록 합니다. 이 메서드는 [MIN_FREQ;MAX_FREQ] 범위 내에서 무작위로 변하는 사운드 진동의 주파수를 사용합니다. 주파수는 검색 에이전트의 이동 속도를 계산하는 데 필요하며 이는 최적의 마우스 위치와 최적의 글로벌 솔루션 간의 차이에 주파수를 곱한 값입니다. 그런 다음 속도 값이 박쥐 벡터의 현재 최적 솔루션에 벡터별로 추가됩니다. 따라서 우리는 불균형한 물리적 양으로 운영하지만 무엇을 할 수 있을까요? 이는 실제 물리적 객체에 대한 근사치일 뿐입니다. 이 경우 개연성은 무시되어야 합니다. 새로운 위치를 계산한 후에는 SeInDiSp() 메서드를 사용하여 좌표가 범위를 벗어나는지 확인해야 합니다.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_BA::Walk (S_Bat &bat)
{
  for (int j = 0; j < params; ++j)
  {
    bat.frequency       = MIN_FREQ + (MAX_FREQ - MIN_FREQ) * RNDfromCI (0.0, 1.0);
    bat.speed       [j] = bat.speed [j] + (bat.position [j] - cB [j]) * bat.frequency;
    bat.auxPosition [j] = bat.position [j] + bat.speed [j];

    bat.auxPosition [j] = SeInDiSp (bat.auxPosition [j], rangeMin [j], rangeMax [j], rangeStep [j]);
  }
}
//——————————————————————————————————————————————————————————————————————————————

두 번째 비공개 메서드인 AproxBest()는 글로벌 최적 솔루션을 기준으로 박쥐를 이동하여 추가적으로 좌표의 세분화를 제공하는 역할을 담당합니다. 저는 전체 박쥐 개체군의 평균 음량에 [-1.0; 1.0] 범위의 난수를 곱한 값의 형태로 증분 좌표에 벡터 단위로 더하는 이 동작의 물리적 의미를 이해할 수 없습니다. 저는 정의 도메인의 유효한 값 벡터를 통해 최적화 되는 함수의 차원으로 값을 줄이려고 했지만 테스트 결과가 저자 버전의 알고리즘보다 좋지 않았습니다. 그래서 모든 것을 그대로 두었습니다. 저는 BA 알고리즘의 효율성을 향상시킬 수 있다고 확신하였지만 이 경우 추가 연구가 필요할 것입니다. 좌표를 계산한 후 SeInDiSp() 메서드를 사용하여 값이 범위를 벗어났는지 확인합니다.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_BA::AproxBest (S_Bat &bat, double averageLoudness)
{
  for (int j = 0; j < params; ++j)
  {
    bat.auxPosition [j] = cB [j] + averageLoudness * RNDfromCI (-1.0, 1.0);
    bat.auxPosition [j] = SeInDiSp (bat.auxPosition [j], rangeMin [j], rangeMax [j], rangeStep [j]);
  }
}
//——————————————————————————————————————————————————————————————————————————————

또 다른 특정 비공개 메서드는 각 박쥐의 사운드 진동 주파수에 대한 테스트 조건이 충족될 때 호출되는 AcceptNewSolutions()입니다. 여기에서 개별 음량과 개별 진동 주파수가 다시 계산될 뿐만 아니라 새로운 최상의 개별 솔루션이 허용됩니다. 여기서 우리는 반복의 서수가 진동 주파수 계산에 어떻게 관여하는지 확인할 수 있습니다.

알고리즘 논리와 관련하여 이 시점에서 저는 로직을 변경하여 결과가 총 반복 횟수의 차원과 무관하도록 만들어 궁극적으로 알고리즘의 효율성을 약간 증가시켰습니다. 원래 버전에서는 반복 횟수가 진동 주파수를 계산하는 비선형 공식에 직접적으로 관여했습니다. BA에는 이미 많은 관습이 있습니다. 저는 이 경우에는 더 이상 눈을 감을 수 없었습니다.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_BA::AcceptNewSolutions (S_Bat &bat)
{
  ArrayCopy(bat.position, bat.auxPosition, 0, 0, WHOLE_ARRAY);
  bat.fitnessBest = bat.fitness;
  bat.loudness    = ALPHA * bat.loudness;
  double iter     = Scale (currentIteration, 1, maxIter, 0.0, 10.0, false);
  bat.pulseRate   = bat.initPulseRate *(1.0 - exp(-GAMMA * iter));
}
//——————————————————————————————————————————————————————————————————————————————

현재 반복 횟수(그래프의 x)와 감마 설정 파라미터에 대한 진동 주파수의 의존성은 그림 2에 나와 있습니다.

감마

그림 2. 현재 반복 횟수 및 0.9, 0.7, 0.5, 0.3, 0.2 값으로 한 감마 설정 파라미터에 대한 진동 주파수의 의존성.

3. 테스트 결과

지난 글에서 저는 테스트된 알고리즘의 등급을 계산하는 방법론을 수정할 계획에 대해 언급했습니다. 첫째, 대부분의 알고리즘이 두 변수의 테스트 함수에 쉽게 대처할 수 있고 결과의 차이가 거의 구별되지 않기 때문에 저는 모든 테스트 함수에서 처음 두 테스트의 변수 수를 늘리기로 결정했습니다. 이제 변수의 수는 10, 50, 1000이 됩니다.

둘째, 피부 테스트 함수가 널리 사용되는 라스트리진 함수로 대체되었습니다(그림 3). 이 기능은 피부처럼 부드럽습니다. 이 표면은 좌표축의 중심에 4개의 지점에 전역 최대값과 1개의 전역 최소값이 있는 복잡한 표면으로 많은 국부 극한값이 있습니다.

셋째, 테스트 결과를 표의 모든 알고리즘 중 가장 좋은 결과가 1.0, 가장 나쁜 결과가 0.0인 범위의 값으로 정규화 하기로 결정했습니다. 이를 통해 우리는 테스트 결과를 균등하게 평가할 수 있으며 테스트 시 각 최적화 알고리즘의 결과에 따라 함수의 복잡성을 고려할 수 있습니다.

그 후 알고리즘 테스트 결과가 요약됩니다. 최대 결과에는 100(참조 최대 결과)의 값이 할당되고 최소값은 1입니다. 이를 통해 테스트 함수의 복잡성을 고려하여 알고리즘을 서로 균등하게 직접 비교할 수 있습니다. 이제 Print ()에서 프린트된 결과는 각 알고리즘에 대한 테스트 스크립트의 소스 파일에 각각 저장됩니다. 점수를 계산하는 스크립트는 아래에 첨부되어 있습니다. 스크립트는 고려 중인 새로운 알고리즘의 결과를 추가하여 후속 기사에서 업데이트 될 예정입니다.



라스트진

그림 3. 라스트리진 테스트 함수

테스트 스탠드 결과는 다음과 같습니다:

2022.12.28 17:13:46.384    Test_AO_BA (EURUSD,M1)    C_AO_BA:50;0.0;1.0;0.0;1.5;0.0;1.0;0.3;0.3
2022.12.28 17:13:46.384    Test_AO_BA (EURUSD,M1)    =============================
2022.12.28 17:13:48.451    Test_AO_BA (EURUSD,M1)    5 Rastrigin's; Func runs 10000 result: 66.63334336098077
2022.12.28 17:13:48.451    Test_AO_BA (EURUSD,M1)    Score: 0.82562
2022.12.28 17:13:52.630    Test_AO_BA (EURUSD,M1)    25 Rastrigin's; Func runs 10000 result: 65.51391114042588
2022.12.28 17:13:52.630    Test_AO_BA (EURUSD,M1)    Score: 0.81175
2022.12.28 17:14:27.234    Test_AO_BA (EURUSD,M1)    500 Rastrigin's; Func runs 10000 result: 59.84512760590815
2022.12.28 17:14:27.234    Test_AO_BA (EURUSD,M1)    Score: 0.74151
2022.12.28 17:14:27.234    Test_AO_BA (EURUSD,M1)    =============================
2022.12.28 17:14:32.280    Test_AO_BA (EURUSD,M1)    5 Forest's; Func runs 10000 result: 0.5861602092218606
2022.12.28 17:14:32.280    Test_AO_BA (EURUSD,M1)    Score: 0.33156
2022.12.28 17:14:39.204    Test_AO_BA (EURUSD,M1)    25 Forest's; Func runs 10000 result: 0.2895682720055589
2022.12.28 17:14:39.204    Test_AO_BA (EURUSD,M1)    Score: 0.16379
2022.12.28 17:15:14.716    Test_AO_BA (EURUSD,M1)    500 Forest's; Func runs 10000 result: 0.09867854051596259
2022.12.28 17:15:14.716    Test_AO_BA (EURUSD,M1)    Score: 0.05582
2022.12.28 17:15:14.716    Test_AO_BA (EURUSD,M1)    =============================
2022.12.28 17:15:20.843    Test_AO_BA (EURUSD,M1)    5 Megacity's; Func runs 10000 result: 3.3199999999999994
2022.12.28 17:15:20.843    Test_AO_BA (EURUSD,M1)    Score: 0.27667
2022.12.28 17:15:26.624    Test_AO_BA (EURUSD,M1)    25 Megacity's; Func runs 10000 result: 1.2079999999999997
2022.12.28 17:15:26.624    Test_AO_BA (EURUSD,M1)    Score: 0.10067
2022.12.28 17:16:05.013    Test_AO_BA (EURUSD,M1)    500 Megacity's; Func runs 10000 result: 0.40759999999999996
2022.12.28 17:16:05.013    Test_AO_BA (EURUSD,M1)    Score: 0.03397

박쥐 알고리즘은 부드러운 라스트리진 함수에서 인상적인 결과를 보여주었습니다. 흥미롭게도 함수의 변수 수가 증가함에 따라 결과의 안정성(반복성)이 증가하여 부드러운 함수에서 BA의 확장성이 우수하다는 것이 나타납니다. 특히 BA는 모든 테스트 참가자 중 50개 및 1000개의 변수가 있는 Rastrigin 함수에서 가장 우수한 것으로 나타났습니다. 이는 우리가 복잡한 평활 함수 및 신경망 작업에 박쥐 알고리즘을 사용하기에 적합하다는 것을 말해 줍니다. 숲 및 메가시티 함수에서 박쥐 알고리즘은 평균적인 결과를 보였으며 국부적인 극단에 갇히는 경향을 보였습니다. 좌표는 그룹으로 국지화 되어 있으며 글로벌 최적점을 향한 변화와 이동의 역학 관계를 보여주지 않습니다. 제 생각으로는 연구 중인 함수의 표면에 기울기가 있는지 여부에 대해 알고리즘이 민감하기 때문에 이런 일이 발생하는 것 같습니다. 기울기가 없는 경우 알고리즘은 피트니스 함수 값이 크게 증가하지 않는 로컬 영역 근처에서 빠르게 멈춥니다. 게다가 BA 알고리즘에는 COA(레비 항공편)에서 구현된 메커니즘과 유사하게 새로운 미지의 영역으로 '점프'할 수 있는 메커니즘이 없습니다.

저는 BA에 대한 많은 설정 사항도 언급해야 합니다. 매개변수(자유도)가 많을 뿐만 아니라 각 매개변수는 검색 속성의 특성과 전체 수렴률 모두에 큰 영향을 미칩니다. 일부 매개변수는 부드러운 함수에서 일부는 이산 및 균열 함수에서 우수한 결과를 제공할 수 있습니다. 다양한 유형의 테스트 함수들에 동일하게 대응할 수 있는 몇 가지 보편적인 매개 변수를 찾는 것은 어려운 작업입니다. 이 기사에는 가장 최적의 매개변수가 포함된 박쥐 알고리즘의 소스 코드가 포함되어 있습니다. 저는 일반적으로 최적화 알고리즘을 사용한 경험이 거의 없는 사용자들은 BA를 사용하지 않는 것이 좋다고 말씀드리고 싶습니다. 왜냐하면 최적화 결과가 크게 달라질 수 있기 때문입니다.  

라스트진

  라스트리진 테스트 함수에서 BA

숲

Forest 테스트 함수에서 BA

메가시티

메가시티 테스트 함수에서 BA

테스트 함수의 시각화에 집중하면서 우리는 박쥐 알고리즘의 특징에 대한 아이디어를 얻을 수 있습니다. 특히 모든 테스트 함수에서 작업할 때 이 알고리즘은 매우 작은 로컬 영역에서 좌표를 그룹화하는 것이 특징입니다. 부드러운 함수의 경우 이 기능을 사용하면 피트니스 함수의 기울기가 약간 변하는 곳에서도 움직일 수 있지만 이산 함수에서는 알고리즘이 평평한 고원에 갇히기 때문에 이 기능이 단점이 될 수 있습니다.

스크립트가 최적화 알고리즘의 점수를 계산하여 얻은 결과입니다:

2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    =======C_AO_RND=======
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.18210 | 0.15281 | 0.07011 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.08623 | 0.04810 | 0.06094 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.00000 | 0.00000 | 0.08904 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.6893397068905002
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    =======C_AO_PSO=======
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.22131 | 0.12861 | 0.05966 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.15345 | 0.10486 | 0.28099 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.08028 | 0.02385 | 0.00000 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    1.053004072893302
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    =======C_AO_ACOm=======
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.37458 | 0.28208 | 0.17991 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    1.00000 | 1.00000 | 1.00000 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    1.00000 | 1.00000 | 0.10959 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    5.946151922377553
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    =======C_AO_ABC=======
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.84599 | 0.51308 | 0.22588 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.58850 | 0.21455 | 0.17249 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.47444 | 0.26681 | 0.35941 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    3.661160435265267
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    =======C_AO_GWO=======
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.00000 | 0.00000 | 0.00000 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.00000 | 0.00000 | 0.00000 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.18977 | 0.04119 | 0.01802 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.24898721240154956
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    =======C_AO_COAm=======
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    1.00000 | 0.73390 | 0.28892 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.64504 | 0.34034 | 0.21362 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.67153 | 0.34273 | 0.45422 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    4.690306586791184
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    =======C_AO_FSS=======
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.50663 | 0.39737 | 0.11006 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.07806 | 0.05013 | 0.08423 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.00000 | 0.01084 | 0.18998 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    1.4272897567648186
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    =======C_AO_FAm=======
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.64746 | 0.53292 | 0.18102 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.55408 | 0.42299 | 0.64360 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.21167 | 0.28416 | 1.00000 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    4.477897116029613
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    =======C_AO_BA=======
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.43859 | 1.00000 | 1.00000 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.17768 | 0.17477 | 0.33595 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.15329 | 0.07158 | 0.46287 |
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    3.8147314003892507
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    ================
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    ================
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    ================
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    0.24898721240154956 | 5.946151922377553
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    C_AO_RND: 8.652
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    C_AO_PSO: 14.971
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    C_AO_ACOm: 100.000
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    C_AO_ABC: 60.294
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    C_AO_GWO: 1.000
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    C_AO_COAm: 78.177
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    C_AO_FSS: 21.475
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    C_AO_FAm: 74.486
2023.01.03 17:55:57.386    CalculationTestResults (EURUSD,M1)    C_AO_BA: 62.962

최종 평점 표를 살펴보겠습니다. 위에서 언급했듯이 알고리즘의 예상 특성을 계산하는 방법론이 변경되었고 알고리즘은 새로운 자리를 차지하게 되었습니다. 일부 기존 고전적인 알고리즘이 표에서 제거되고 테스트에서 더 높은 성능을 보여주는 수정된 버전만 남았습니다. 이제 테스트 결과는 이전처럼 절대적인 결과(테스트 함수 값의 절대 정규화 결과)가 아니라 알고리즘 간 비교 결과를 기반으로 한 상대적인 결과입니다.

표에 따르면 현재 ACOm(개미 군집 최적화)이 선두를 차지하고 있습니다. 이 알고리즘은 9번의 테스트 중 5번의 테스트에서 가장 좋은 결과를 보여 주었으므로 최종 결과는 100점입니다. 뻐꾸기 최적화 알고리즘의 수정 버전인 COAm이 2위를 차지했습니다. 이 알고리즘은 부드러운 라스트리진 함수에서 가장 우수한 것으로 나타났으며 다른 테스트 대상들에 비해 다른 테스트에서도 좋은 결과를 보여주었습니다. 수정된 반딧불이 알고리즘 FAm이 3위를 차지했습니다. 수정된 반딧불이는 메가시티 이산 함수에서 최고의 결과를 보여주었습니다. 이 테스트에서는 FSS만 동일한 결과를 보였습니다.

AO

설명

라스트리진

라스트리진 최종

숲 최종

메가시티(개별)

메가시티 최종

최종 결과

10 params (5 F)

50 params (25 F)

1000 params(500 F)

10 params (5 F)

50 params (25 F)

1000 params(500 F)

10 params (5 F)

50 params (25 F)

1000 params(500 F)

ACOm

개미 식민지 최적화 M

0.37458

0.28208

0.17991

0.83657

1.00000

1.00000

1.00000

3.00000

1.00000

1.00000

0.10959

2.10959

100.000

COAm

뻐꾸기 최적화 알고리즘 M

1.00000

0.73390

0.28892

2.02282

0.64504

0.34034

0.21362

1.19900

0.67153

0.34273

0.45422

1.46848

78.177

FAm

반딧불이 알고리즘 M

0.64746

0.53292

0.18102

1.36140

0.55408

0.42299

0.64360

1.62067

0.21167

0.28416

1.00000

1.49583

74.486

BA

박쥐 알고리즘

0.43859

1.00000

1.00000

2.43859

0.17768

0.17477

0.33595

0.68840

0.15329

0.07158

0.46287

0.68774

62.962

ABC

인공 꿀벌 군집

0.84599

0.51308

0.22588

1.58495

0.58850

0.21455

0.17249

0.97554

0.47444

0.26681

0.35941

1.10066

60.294

FSS

물고기 떼 검색

0.64746

0.53292

0.18102

1.36140

0.55408

0.42299

0.64360

1.62067

0.21167

0.28416

1.00000

1.49583

21.475

PSO

파티클 스웜 최적화

0.22131

0.12861

0.05966

0.40958

0.15345

0.10486

0.28099

0.53930

0.08028

0.02385

0.00000

0.10413

14.971

RND

랜덤

0.18210

0.15281

0.07011

0.40502

0.08623

0.04810

0.06094

0.19527

0.00000

0.00000

0.08904

0.08904

8.652

GWO

회색 늑대 최적화

0.00000

0.00000

0.00000

0.00000

0.00000

0.00000

0.00000

0.00000

0.18977

0.04119

0.01802

0.24898

1.000


그림 4의 알고리즘 테스트 결과 히스토그램

등급

그림 4. 테스트 알고리즘의 최종 결과 히스토그램

박쥐 알고리즘(BA)의 속성에 대한 결론:

장점:
1. 빠른 속도.
2. 알고리즘은 부드러운 함수와 잘 작동합니다.
3. 확장성.

단점:
1. 설정이 너무 많습니다.
2. 불연속 함수에 대한 평범한 결과.


MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/11915

엑셀러레이터 오실레이터를 사용하여 거래 시스템을 설계하는 방법을 알아보세요 엑셀러레이터 오실레이터를 사용하여 거래 시스템을 설계하는 방법을 알아보세요
이 기사는 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법과 관련한 시리즈의 새로운 글입니다. 우리는 엑셀러레이터 오실레이터 지표라는 새로운 지표에 대해 알아보고 이를 활용하여 거래 시스템을 설계하는 방법을 알아볼 것입니다.
모집단 최적화 알고리즘: 반딧불이 알고리즘(FA) 모집단 최적화 알고리즘: 반딧불이 알고리즘(FA)
이 글에서는 반딧불이 알고리즘(FA) 최적화 방법에 대해 살펴보겠습니다. 수정을 통해 알고리즘은 주변부의 존재에서평점 테이블의 실제 리더가 되었습니다.
앨리게이터로 트레이딩 시스템 설계 방법 알아보기 앨리게이터로 트레이딩 시스템 설계 방법 알아보기
이번 글이 가장 인기 있는 보조지표를 기반으로 트레이딩 시스템을 설계하는 방법에 대한 시리즈의 마지막 기사입니다. 우리는 앨리게이터 지표를 기반으로 트레이딩 시스템을 만드는 방법을 배워볼 것입니다.
MQL5에서 ONNX 모델을 사용하는 방법 MQL5에서 ONNX 모델을 사용하는 방법
ONNX(Open Neural Network Exchange)는 머신 러닝 모델을 나타내기 위해 구축된 개방형 형식입니다. 이 기사에서는 금융 시계열을 예측하기 위해 CNN-LSTM 모델을 만드는 방법에 대해 살펴보겠습니다. 또한 MQL5 Expert Advisor에서 생성된 ONNX 모델을 사용하는 방법도 보여드리겠습니다.