English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
Popülasyon optimizasyon algoritmaları: Ateş böceği algoritması (Firefly Algorithm, FA)

Popülasyon optimizasyon algoritmaları: Ateş böceği algoritması (Firefly Algorithm, FA)

MetaTrader 5Örnekler | 8 Ocak 2024, 13:34
167 0
Andrey Dik
Andrey Dik

İçindekiler

1. Giriş
2. Algoritma tanımı
3. Test sonuçları


1. Giriş

Doğa, birçok metasezgisel algoritma için her zaman bir ilham kaynağı olmuştur. Bireysel deneyimlere dayanarak, yönlendirilme olmadan sorunlara çözüm bulmayı başarmıştır. Doğal seçilim ve en uygun olanın hayatta kalması, ilk metasezgisel algoritmaların oluşturulmasında ana motivasyon olmuştur. Doğada hayvanlar birbirleriyle birçok şekilde iletişim kurarlar. Ateş böcekleri iletişim kurmak için parıldama yeteneklerini kullanırlar. Kendilerine özgü parıldama modelleri olan yaklaşık 2000 ateş böceği türü vardır. Genellikle belirli bir düzende kısa bir parıltı üretirler. Işık ve yoğunluğu, biyolüminesans adı verilen biyokimyasal süreçlerin bir sonucu olarak meydana gelir. Bu tür parıltıların ana işlevinin karşı cinsten bireyleri ve potansiyel kurbanları çekmek olduğuna inanılmaktadır. Bazı tropik ateş böcekleri parıltılarını senkronize edebilir, böylece biyolojik öz örgütlenmenin bir örneğini gösterirler. Işığın yoğunluğu, kaynağından uzaklığın bir fonksiyonu olarak, ters kare yasasına uyar, bu nedenle bir ateş böceğinden gelen titrek ışık, etrafındaki ateş böceklerinin parıltının görüş alanı içerisinde tepki vermesine neden olur.

Ateş böceklerinin davranışlarından esinlenen iki çeşit popülasyon optimizasyon algoritması vardır: ateş böceği algoritması ve kandil böceği sürü optimizasyon (Glowworm Swarm Optimization, GSO) algoritması. Ateş böcekleri ile kandil böceklerinin arasındaki temel fark, kandil böceklerinin kanatsız olmasıdır. Bu makalede, ilgili iki çeşit optimizasyon algoritmasından ilkini, ateş böceği algoritmasını ele alacağız.

2. Algoritma tanımı

Ateş böceği algoritması, 2007 yılında Cambridge Üniversitesinden (İngiltere) X-Sh. Yang tarafından önerilmiş ve hemen optimizasyon araştırmacılarının dikkatini çekmiştir. Ateş böceği algoritması, son zamanlarda optimizasyon problemlerini çözmede etkileyici sonuçlar gösteren sürü zekası algoritmaları ailesinin bir parçasıdır. Ateş böceği algoritması, özellikle, sürekli ve ayrık optimizasyon problemlerini çözmek için kullanılır.

Ateş böceği algoritması, gerçek ateş böceklerinin parıldama özelliklerine dayanan üç kurala sahiptir. Kurallar şu şekildedir:

  1. Tüm ateş böcekleri daha çekici ve parlak muadillerine doğru hareket edecektir.
  2. Bir ateş böceğinin çekim derecesi parlaklığı ile orantılıdır ve havanın ışığı emmesi nedeniyle başka bir ateş böceğine olan mesafe arttıkça azalır. Bu nedenle, parıldayan iki ateş böceği arasında, daha az parlak olan daha parlak olana doğru hareket edecektir. Eğer daha parlak ya da daha çekici bir muadili yoksa, ateş böceği rastgele hareket edecektir.
  3. Ateş böceğinin parlaklığı veya ışık yoğunluğu, problemin amaç fonksiyonunun değerine göre belirlenir.


Başlangıçta, algoritmanın başında, tüm ateş böcekleri arama uzayına rastgele dağıtılır. Algoritma daha sonra iki aşamaya dayalı olarak en uygun bölümleri belirler:

  1. Işık yoğunluğundaki değişim - ateş böceğinin mevcut konumundaki parlaklığı, çekici bir ateş böceğine doğru hareket ederek uygunluk değerine yansır.
  2. Ateş böceği, komşu ateş böceklerinin ışık yoğunluğunu gözlemleyerek konumunu değiştirir.


Şimdi ateş böceği optimizasyonunun inceliklerini daha ayrıntılı olarak keşfedebiliriz. Algoritmanın özü Şekil 1'de açıkça gösterilmektedir.

Fas

Şekil 1. Arama uzayında ateş böcekleri. Mesafe arttıkça görünürlük azalır

Arama prensibinin arkasındaki ana fikir, ateş böcekleri arasındaki mesafenin artmasıyla görünürlüğün doğrusal olmayan bir şekilde azalmasıdır. Bu doğrusal olmayan ilişki olmasaydı, her ateş böceği kararlı bir şekilde daha parlak bir ışık kaynağına doğru hareket ederdi. Bununla birlikte, Şekil 1'de gördüğümüz gibi, ateş böceği en parlak akrabasını seçmez, çünkü ışığı çevre tarafından emildiği için ışığı daha az fark edilir. Bunun yerine, daha az parlak bir muadilini seçer (ona göre en parlak olanı seçer). Bu özellik, algoritmanın daha küçük sürülere bölünme konusundaki iyi becerisini açıklamaktadır. Bu durum, ışığın mesafeye bağlı olarak soğurulmasının doğrusal olmayan fonksiyonu nedeniyle doğal bir şekilde meydana gelir. Aşağıdaki Şekil 2'de, algoritma parametrelerinden biri olan ortam soğurma katsayısı gamanın farklı değerleriyle ‘algoritmanın mesafeye karşı görünürlük fonksiyonunu’ görebiliriz.


visibility

Şekil 2. Gama saydamlık katsayısının sırasıyla 1.0, 0.2, 0.05, 0.01'e eşit olduğu, f(x) mesafesinden ortamın saydamlığının fonksiyonu

Gama sonsuza yöneldiğinde, ortam opaklaşır; gama sıfır olduğunda ise ortam tamamen şeffaf olur ve her ateş böceği diğerini arama uzayında herhangi bir mesafeden görebilir. Gama = 0.0 olursa ne olur? Tüm ateş böcekleri, en parlak akrabaya doğru uçarak optimum olmayan bir noktaya yakınsayacaktır. Dolayısıyla, algoritma yerel ekstremumlardan birinde takılı kalarak yakınsamayacaktır. Ortam tamamen opak olursa ne olur? Ateş böcekleri kendilerinden daha çekici birini görmeyecektir. Algoritmanın yazarı tarafından önerilen konsepte göre, kendinden daha iyi birini görmemek, bir ateş böceğinin rastgele hareket etmesine neden olur. Algoritma bir rastgele aramaya dönüşecektir. Algoritma sınıflandırması derecelendirme tablomuzda, rastgele arama algoritması son sırada yer almaktadır.  

Algoritmanın daha ileri analizine geçelim ve ateş böceklerinin hareketlerini tanımlayan denklemleri ele alalım. Mesafeye karşı görünürlük fonksiyonu, çekicilik endeksinin hesaplanmasının temelini oluşturmaktadır:

attractiveness = fireflies [k].f / (1.0 + gamma * distance * distance)

Tanımlamalar:
attractiveness - çekicilik
gamma - ortam opaklık katsayısı
distance - ateş böcekleri arasındaki Öklid mesafesi
fireflies [k].f - k’nıncı ateş böceğinin ışık yoğunluğu

Denklem, çekicilik fonksiyonunun doğrudan problemin boyutuna ve mesafe değerinin sınırlarına bağlı olduğunu açıkça ortaya koymaktadır, bu nedenle algoritmanın yazarı belirli bir optimizasyon problemi için şeffaflık katsayısının seçilmesini önermektedir. Algoritmanın nasıl davranacağını önceden bilmeden bunu yapmanın sakıncalı ve zaman alıcı olduğunu düşünüyorum, bu nedenle 0 ila 20 aralığındaki mesafe değerlerini normalleştirmek gerektiğini düşünüyorum. Bu amaçla, diğer algoritmalarda defalarca kullandığımız Scale () fonksiyonunu uygularız. Çekicilik hesaplamasından önceki mesafe dönüşümü şu şekildedir:

distance = Scale (distance, 0.0, maxDist, 0.0, 20.0, false)

Tanımlamalar:

maxDist - tüm ateş böcekleri içinde bir çift ateş böceği arasındaki maksimum Öklid mesafesi

Bu durumda, ateş böceklerinin çekiciliği problemin boyutuna bağlı olmayacaktır ve belirli bir optimizasyon problemi için gama katsayısını seçmeye gerek yoktur. Çekicilik fonksiyonu, her ateş böceğinin ne tür bir eş seçimi yapacağını belirler. Bu seçim katı bir şekilde belirlenmiştir. Ateş böceklerinin birbirlerine olan çekiciliğinin etkisi beta katsayısını (algoritmanın ikinci parametresi) belirler. Ateş böceklerinin seçimi ilgili her yinelemede önceden belirlenmişse, algoritmanın arama yetenekleri nasıl sağlanır? Bu amaçla, rastgele bir vektör bileşeni ve üçüncü algoritma parametresi (alfa) eklenmiştir. Ateş böceklerinin karmaşık davranışsal ilişkileri şöyle görünecektir:

fireflies [i].c [c] = Xj + beta * (Xi - Xj) + alpha * r * v [c]

Tanımlamalar:
fireflies [i].c [c] - i'ninci ateş böceğinin c'ninci koordinatı
beta - ateş böcekleri çekim etkisi katsayısı
alpha - ateş böceklerinin hareketindeki rastgele bileşeni etkileyen ve hareket hedefinden sapmalar veren katsayı
r - [-1.0; 1.0] aralığında rastgele sayı
v[c] - c’ninci koordinata göre arama aralığının uç noktaları arasındaki mesafeyi karakterize eden vektör bileşeni
Хj - hareketin olacağı çiftteki ateş böceğinin karşılık gelen koordinatı
Xi - hareketin hesaplandığı ateş böceğinin karşılık gelen koordinatı

Şimdi sıra algoritma kodunu tanımlamaya geldi. Nispeten basittir. Ayrıntılı olarak inceleyelim.

Bir ateş böceği, [] - koordinatlar, f - ateş böceğinin parlaklığı (uygunluk fonksiyonu) olmak üzere iki bileşen içeren basit bir yapı S_Firefly ile tanımlanacaktır. Her ateş böceği için ilgili yinelemede bir çift oluşturacak şekilde hareket edeceği yalnızca bir birey olduğundan, bir sonraki hareketi hesaplarken koordinatların üzerine yazma riskini almayız. Bu amaçla, aşağıda ele alınan özel bir yapıyı tanıtacağız.
//——————————————————————————————————————————————————————————————————————————————
struct S_Firefly
{
  double c  []; //coordinates
  double f;     //the value of the fitness function
};
//——————————————————————————————————————————————————————————————————————————————

S_Attractiveness yapısı, çekicilik değerini ve karşılık gelen ateş böceğinin numarasını bir çift olarak saklamak içindir. Her ateş böceği en çekici olanın koordinatlarına doğru değil, eşinin zaten hareket ettiği koordinatlara doğru hareket eder. Yazar tarafından açıklanan algoritma versiyonu ile bu konuda bazı tutarsızlıklar vardır, ancak bu şekilde daha iyi çalışmaktadır.

//——————————————————————————————————————————————————————————————————————————————
struct S_Attractiveness
{
  double a; //attractiveness
  int    i; //index of the most attractive firefly
};
//——————————————————————————————————————————————————————————————————————————————

Ateş böceği algoritması C_AO_FA sınıfı kullanılarak tanımlanır. Burada üç public metot (ilk başlatma için Init() ve her yinelemede çağrılması gereken diğerleri - Flight() ve Luminosity()), private yardımcı metotlar ve parametre sabitlerini saklamak için üyeler bulunmaktadır.

//——————————————————————————————————————————————————————————————————————————————
class C_AO_FA
{
  //----------------------------------------------------------------------------
  public: S_Firefly fireflies []; //fireflies
  public: double    rangeMax  []; //maximum search range
  public: double    rangeMin  []; //minimum 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,  //number of opt. parameters
                     const int    sizeP,    //swarm size
                     const double alphaP,   //alpha, randomness in motion
                     const double betaP,    //beta, effect of attractiveness
                     const double gammaP);  //gamma, transparency of the environment

  public: void Flight ();
  public: void Luminosity ();

  //----------------------------------------------------------------------------
  private: S_Attractiveness att [];
  private: int    swarmSize;
  private: int    params;
  private: double maxDist;
  private: double v [];

  private: double alpha;      //randomness in motion
  private: double beta;       //effect of attractiveness
  private: double gamma;      //transparency of the environment
  private: bool   luminosity;

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

Init() public metodu başlatma için kullanılır ve her optimizasyonun başlangıcından önce çağrılmalıdır. Parametreleri algoritma için üstyapı parametreleridir. Metot, diziler için bellek ayıracak ve global ve her bir ateş böceğinin parlaklık değerini sıfırlayacaktır.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_FA::Init (const int    paramsP, //number of opt. parameters
                    const int    sizeP,   //swarm size
                    const double alphaP,  //alpha, randomness in motion
                    const double betaP,   //beta, effect of attractiveness
                    const double gammaP)  //gamma, transparency of the environment
{
  fB = -DBL_MAX;

  params    = paramsP;
  swarmSize = sizeP;
  alpha     = alphaP;
  beta      = betaP;
  gamma     = gammaP;

  ArrayResize (rangeMax,  params);
  ArrayResize (rangeMin,  params);
  ArrayResize (rangeStep, params);
  ArrayResize (v,         params);
  ArrayResize (att,       swarmSize);

  luminosity = false;

  ArrayResize (fireflies, swarmSize);

  for (int i = 0; i < swarmSize; i++)
  {
    ArrayResize (fireflies [i].c,  params);
    fireflies [i].f = -DBL_MAX;
  }

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

Her yinelemede çağrılan ilk public metoda bakalım - Flight(). Algoritmanın ana mantığı bu metotta yoğunlaşmıştır, bu nedenle daha ayrıntılı olarak ele alınması gerekir. 'luminosity' değişkeni, algoritmanın ilk yinelemede mi yoksa sonraki yinelemelerde mi çalıştığını belirlememizi sağlayan bir bayrak görevi görür. Bayrak ayarlanmamışsa, ateş böceklerini koordinat uzayında tekdüze dağılıma uygun olarak rastgele dağıtmak gerekir. Bu eylemle birlikte, her koordinat için yer değiştirme vektörünü ayarlıyoruz ve hemen ateş böcekleri arasında olabilecek maksimum Öklid mesafesini hesaplıyoruz (daha önce de belirtildiği gibi, ortam şeffaflık katsayısının problemin boyutuna bağımlılığını önlemek amacıyla ateş böcekleri arasındaki mesafeleri normalleştirmek için bu gereklidir). Bu işlemlerden sonra 'luminosity' bayrağını etkinleştiririz.

if (!luminosity)
{
  fB = -DBL_MAX;

  //--------------------------------------------------------------------------
  double summCoordinates = 0.0;
  for (int c = 0; c < params; c++)
  {
    v [c] = rangeMax [c] - rangeMin [c];
    summCoordinates += pow (v [c], 2.0);
  }
  maxDist = pow (summCoordinates, 0.5);

  //--------------------------------------------------------------------------
  for (int s = 0; s < swarmSize; s++)
  {
    for (int k = 0; k < params; k++)
    {
      fireflies [s].c  [k] = RNDfromCI (rangeMin [k], rangeMax [k]);
      fireflies [s].c  [k] = SeInDiSp (fireflies [s].c [k], rangeMin [k], rangeMax [k], rangeStep [k]);
    }
  }

  luminosity = true;
}

İkinci ve daha sonraki yinelemelerden itibaren, ateş böcekleri ilk yinelemede rastgele dağıtıldıktan ve parlamaya başladıktan sonra (uygunluk fonksiyonu onlar için hesaplanmıştır), her bir ateş böceği için çekicilik derecesini hesaplamak mümkündür. Bunu yapmak için, tüm olası ateş böceği çiftleri arasındaki Öklid mesafesini hesaplamamız gerekir. Bu amaçla, koordinatlardaki farkların karelerini toplarız ve bu toplamın karekökünü alırız. Hesaplanan mesafe, çekicilik hesaplama denkleminde kullanılacaktır. Her ateş böceği için mümkün olan tek çifti bu şekilde elde ederiz. Devamında, tüm ateş böcekleri arasındaki maksimum parlaklığı belirleriz. Bu, bir çift bulmanın mümkün olmayacağı ve uzayda tek başına dolaşacak olan en parlak ateş böceğini belirlemek için gerekli olacaktır. Belki de bir sonraki yinelemede daha şanslı olacaktır.

//measure the distance between all------------------------------------------
for (int i = 0; i < swarmSize; i++)
{
  att [i].a = -DBL_MAX;

  for (int k = 0; k < swarmSize; k++)
  {
    if (i == k) continue;

    summCoordinates = 0.0;
    for (int c = 0; c < params; c++) summCoordinates += pow (fireflies [i].c [c] - fireflies [k].c [c], 2.0);

    distance = pow (summCoordinates, 0.5);
    distance = Scale (distance, 0.0, maxDist, 0.0, 20.0, false);
    attractiveness = fireflies [k].f / (1.0 + gamma * distance * distance);

    if (attractiveness > att [i].a)
    {
      att [i].a = attractiveness;
      att [i].i = k;
    }

    if (fireflies [i].f > maxF) maxF = fireflies [i].f;
  }
}

Flight() metot kodunun bu kısmı ateş böceklerinin uçuşundan sorumludur. Parlaklığı diğerlerinden daha fazla olan talihsiz ateş böceği için hesaplama biraz farklı yapılır. Hareket vektörünü, [-1.0; 1.0] arasındaki rastgele bir sayı ile çarpılan alfa katsayısı aracılığıyla mevcut konumuna ekleriz. Teorik olarak, algoritmada bu, daha da iyi olacağı beklentisiyle en iyi çözümün ek bir araştırması olarak işlev görür, ancak daha sonra göreceğimiz gibi, bu tekniğin işe yaramaz olduğu ortaya çıkacaktır. Bu aşamada, algoritmanın klasik versiyonunu ele alıyoruz.

Bir çiftin zaten bulunduğu diğer tüm ateş böcekleri için, hareketin hesaplanması, rastgele bir bileşenin eklenmesiyle (daha önce bahsetmiştik) uygun çifte doğru hareket etmekten oluşacaktır.

//flight--------------------------------------------------------------------
for (int i = 0; i < swarmSize; i++)
{
  if (fireflies [i].f >= maxF)
  {
    for (int c = 0; c < params; c++)
    {
      r  = RNDfromCI (-1.0, 1.0);
      fireflies [i].c [c] = fireflies [i].c [c] + alpha * r * v [c];
      fireflies [i].c [c] = SeInDiSp (fireflies [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]); 
    }
  }
  else
  {
    for (int c = 0; c < params; c++)
    {
      r  = RNDfromCI (-1.0, 1.0);
      Xi = fireflies [i].c [c];
      Xj = fireflies [att [i].i].c [c];
      fireflies [i].c [c] = Xj + beta * (Xi - Xj) + alpha * r * v [c];
      fireflies [i].c [c] = SeInDiSp (fireflies [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
    }
  }
}

Her yinelemede çağrılan basit bir public metot. Burada en iyi çözümü güncelleyeceğiz.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_FA::Luminosity ()
{
  for (int i = 0; i < swarmSize; i++)
  {
    if (fireflies [i].f > fB)
    {
      fB = fireflies [i].f;
      ArrayCopy (cB, fireflies [i].c, 0, 0, WHOLE_ARRAY);
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

Şimdi testlere geçelim. Algoritmanın test fonksiyonları üzerindeki sonuçlarına bakalım:

2022.12.16 13:39:00.102    Test_AO_FA (EURUSD,M1)    =============================
2022.12.16 13:39:05.930    Test_AO_FA (EURUSD,M1)    1 Skin's; Func runs 10000 result: 4.901742065217812
2022.12.16 13:39:05.930    Test_AO_FA (EURUSD,M1)    Score: 0.99603
2022.12.16 13:39:13.579    Test_AO_FA (EURUSD,M1)    20 Skin's; Func runs 10000 result: 3.2208359936020665
2022.12.16 13:39:13.579    Test_AO_FA (EURUSD,M1)    Score: 0.59468
2022.12.16 13:39:53.607    Test_AO_FA (EURUSD,M1)    500 Skin's; Func runs 10000 result: 0.98491319842575
2022.12.16 13:39:53.607    Test_AO_FA (EURUSD,M1)    Score: 0.06082
2022.12.16 13:39:53.607    Test_AO_FA (EURUSD,M1)    =============================
2022.12.16 13:39:59.313    Test_AO_FA (EURUSD,M1)    1 Forest's; Func runs 10000 result: 1.578196881663454
2022.12.16 13:39:59.313    Test_AO_FA (EURUSD,M1)    Score: 0.89271
2022.12.16 13:40:07.274    Test_AO_FA (EURUSD,M1)    20 Forest's; Func runs 10000 result: 0.3101994341994826
2022.12.16 13:40:07.274    Test_AO_FA (EURUSD,M1)    Score: 0.17546
2022.12.16 13:40:49.159    Test_AO_FA (EURUSD,M1)    500 Forest's; Func runs 10000 result: 0.06829102669136165
2022.12.16 13:40:49.159    Test_AO_FA (EURUSD,M1)    Score: 0.03863
2022.12.16 13:40:49.159    Test_AO_FA (EURUSD,M1)    =============================
2022.12.16 13:40:54.895    Test_AO_FA (EURUSD,M1)    1 Megacity's; Func runs 10000 result: 8.2
2022.12.16 13:40:54.895    Test_AO_FA (EURUSD,M1)    Score: 0.68333
2022.12.16 13:41:02.777    Test_AO_FA (EURUSD,M1)    20 Megacity's; Func runs 10000 result: 1.5900000000000003
2022.12.16 13:41:02.777    Test_AO_FA (EURUSD,M1)    Score: 0.13250
2022.12.16 13:41:43.901    Test_AO_FA (EURUSD,M1)    500 Megacity's; Func runs 10000 result: 0.2892
2022.12.16 13:41:43.901    Test_AO_FA (EURUSD,M1)    Score: 0.02410
2022.12.16 13:41:43.901    Test_AO_FA (EURUSD,M1)    =============================
2022.12.16 13:41:43.901    Test_AO_FA (EURUSD,M1)    All score for C_AO_FA: 0.39980648892951776

Sonuçlar en hafif tabirle etkileyici değildir. Algoritma, bireysel testlerde PSO, FSS ve GWO'dan sadece biraz daha iyidir. Ancak, toplam derecelendirme göstergesinde, sadece rastgele arama algoritmasını geride bırakarak sondan ikinci sırada yer almaktadır. Tüm bunlar göz önünde bulundurulduğunda, testlerdeki göstergelerin hesaplanmasını gözden geçirme fikri ortaya çıkmıştır. İlerleyen makalelerde daha uygun bir derecelendirme hesaplama şemasına geçeceğim, mevcut makalede ise nihai sonuçların histogramını ekleyeceğim. Ayrı ayrı algoritmalar arasındaki performans oranını net bir şekilde gösterecektir.

Klasik ateş böceği algoritmasının uygulanması kolaydır. Bununla birlikte, çalışmalar çok modlu problemler için yavaş yakınsadığını ve kolayca yerel ekstremum tuzağına düştüğünü göstermektedir. Buna ek olarak, mevcut yinelemeye parametrik olarak bağlı olan katsayılardan yoksundur. Dolayısıyla, çalışmanın amaçlarından biri, performansını artırmak için standart ateş böceği algoritmasını değiştirmekti.

Algoritma fikri oldukça orijinaldir ve her şeyi olduğu gibi bırakmak ve özelliklerini geliştirmeye çalışmamak yazık olur. Bu nedenle, rastgele bileşeni bir Levy uçuşu ile değiştirerek algoritmayı değiştirmeye çalıştım. Levy uçuşu her algoritma için arama yeteneğini geliştiremez. Guguk kuşu arama algoritmasını inceledikten sonra, bu yöntemi kullanarak diğer algoritmaları iyileştirmeye çalıştım, ancak bu beklenen sonuçları getirmedi. Görünüşe göre bu, onu tamamlayan algoritma içerisindeki dahili arama stratejisiyle bir şekilde tutarlı olmalıdır. Bu özel durumda, Levy uçuşunun uygulanması çarpıcı bir etki yarattı - algoritmanın yetenekleri önemli ölçüde arttı. Bu konu hakkında makalenin test sonuçlarıyla ilgili bölümünde konuşacağız.

İşte kodda değişikliğin yapıldığı kısım. İlk olarak, klasik versiyonda, en iyi parlaklığa sahip ateş böceği mevcut konumundan rastgele bir yöne doğru hareket eder. Daha sonra en iyi ateş böceğimiz en iyi global konumdan hareket ederek mevcut konumunu değil, bir bütün olarak çözümü iyileştirmeye çalışır. En iyi çözümün koordinatlarına, hareket vektörünü dikkate alarak aynı alfa katsayısına sahip Levy uçuş dağılımından (ağır kuyruklu dağılım) rastgele bir sayı ekleriz. Bu, komşu bölgeyi rafine ederek global çözümün koordinatlarını iyileştirmeyi gerçekten mümkün kıldı.

Gördüğünüz gibi, ateş böceklerinin geri kalanının davranışı artık Levy uçuşunun rastgele bileşenine göre ayarlanmış olsa da aynı klasik kurallara uymaktadır. Algoritmada yapılan tüm değişiklik budur.

//flight--------------------------------------------------------------------
for (int i = 0; i < swarmSize; i++)
{
  if (fireflies [i].f >= maxF)
  {
    for (int c = 0; c < params; c++)
    {
      r1 = RNDfromCI (0.0, 1.0);
      r1 = r1 > 0.5 ? 1.0 : -1.0;
      r2 = RNDfromCI (1.0, 20.0);

      fireflies [i].c [c] = cB [c] + alpha * r1 * pow (r2, -2.0) * v [c];
      fireflies [i].c [c] = SeInDiSp (fireflies [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
    }
  }
  else
  {
    for (int c = 0; c < params; c++)
    {
      r1 = RNDfromCI (0.0, 1.0);
      r1 = r1 > 0.5 ? 1.0 : -1.0;
      r2 = RNDfromCI (1.0, 20.0);

      Xi = fireflies [i].c [c];
      Xj = fireflies [att [i].i].c [c];

      fireflies [i].c [c] = Xj + beta * (Xi - Xj) + alpha * r1 * pow (r2, -2.0) * v [c];
      fireflies [i].c [c] = SeInDiSp (fireflies [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
    }
  }
}

Levy uçuş fonksiyonu grafiği Şekil 3'te verilmiştir. Fonksiyon denklemindeki üs, algoritmanın davranışını nasıl etkileyebilir? Araştırmalarıma göre, derece arttıkça, uzun (ağır kuyruklu) atlamaların sayısı kısa olanlara göre azalırken, algoritmanın en iyi çözümün çevresindeki koordinatları iyileştirme yeteneği artmaktadır. Bununla birlikte, uzun atlamaların az olması nedeniyle, yerel ekstremumlarda takılma olasılığı artmaktadır. Bu etki, ayrık fonksiyonlar üzerinde çalışırken daha belirgin olurken, düzgün fonksiyonlar üzerinde o kadar belirgin olmayacaktır. Aksine, üssün azalmasıyla uzun atlamaların sayısı artmakta, algoritmanın arama yetenekleri gelişmekte, ancak yakınsama doğruluğu kötüleşmektedir, bu nedenle doğruluk ve arama arasında orta bir zemine ihtiyacımız vardır. Ayrıca, optimizasyon problemine bağlı olarak farklı olabilir.


Levi

Şekil 3. Levy uçuş fonksiyonu, derece 0.5...3.0 


Şimdi, algoritmanın değiştirilmiş versiyonunun test ortamındaki sonuçlarına geçelim. Aşağıda değiştirilmiş versiyonun performansının klasik versiyona kıyasla ne kadar geliştiğini görebilirsiniz.

2022.12.16 13:07:15.925    Test_AO_FAm (EURUSD,M1)    =============================
2022.12.16 13:07:21.544    Test_AO_FAm (EURUSD,M1)    1 Skin's; Func runs 10000 result: 4.854437214435259
2022.12.16 13:07:21.544    Test_AO_FAm (EURUSD,M1)    Score: 0.98473
2022.12.16 13:07:29.518    Test_AO_FAm (EURUSD,M1)    20 Skin's; Func runs 10000 result: 4.588539001298423
2022.12.16 13:07:29.518    Test_AO_FAm (EURUSD,M1)    Score: 0.92124
2022.12.16 13:08:12.587    Test_AO_FAm (EURUSD,M1)    500 Skin's; Func runs 10000 result: 1.981278990090829
2022.12.16 13:08:12.587    Test_AO_FAm (EURUSD,M1)    Score: 0.29872
2022.12.16 13:08:12.587    Test_AO_FAm (EURUSD,M1)    =============================
2022.12.16 13:08:18.336    Test_AO_FAm (EURUSD,M1)    1 Forest's; Func runs 10000 result: 1.7665409595127233
2022.12.16 13:08:18.336    Test_AO_FAm (EURUSD,M1)    Score: 0.99924
2022.12.16 13:08:26.432    Test_AO_FAm (EURUSD,M1)    20 Forest's; Func runs 10000 result: 0.6261364994589462
2022.12.16 13:08:26.432    Test_AO_FAm (EURUSD,M1)    Score: 0.35417
2022.12.16 13:09:10.587    Test_AO_FAm (EURUSD,M1)    500 Forest's; Func runs 10000 result: 0.14269062630878
2022.12.16 13:09:10.587    Test_AO_FAm (EURUSD,M1)    Score: 0.08071
2022.12.16 13:09:10.587    Test_AO_FAm (EURUSD,M1)    =============================
2022.12.16 13:09:16.393    Test_AO_FAm (EURUSD,M1)    1 Megacity's; Func runs 10000 result: 10.0
2022.12.16 13:09:16.393    Test_AO_FAm (EURUSD,M1)    Score: 0.83333
2022.12.16 13:09:24.373    Test_AO_FAm (EURUSD,M1)    20 Megacity's; Func runs 10000 result: 1.7899999999999998
2022.12.16 13:09:24.373    Test_AO_FAm (EURUSD,M1)    Score: 0.14917
2022.12.16 13:10:09.298    Test_AO_FAm (EURUSD,M1)    500 Megacity's; Func runs 10000 result: 0.5076
2022.12.16 13:10:09.298    Test_AO_FAm (EURUSD,M1)    Score: 0.04230
2022.12.16 13:10:09.298    Test_AO_FAm (EURUSD,M1)    =============================
2022.12.16 13:10:09.298    Test_AO_FAm (EURUSD,M1)    All score for C_AO_FAm: 0.5181804234713119

Gördüğünüz gibi, değiştirilmiş algoritma sadece daha iyi sonuçlar göstermekle kalmıyor, aynı zamanda derecelendirme tablosunda lider konumda yer alıyor. Bir sonraki bölümde sonuçlara daha yakından bakacağız. Aşağıda, algoritmanın değiştirilmiş versiyonunun test ortamı üzerindeki animasyonu yer almaktadır.

Skin

  Skin test fonksiyonu üzerinde FAm

Forest

  Forest test fonksiyonu üzerinde FAm

Megacity

  Megacity test fonksiyonu üzerinde FAm


3. Test sonuçları

Değiştirilmiş ateş böceği algoritması (FAm) tüm testlerde mükemmel performans göstermiştir. Genel olarak, sonuçlar algoritmanın ayarlarına bağlıdır. Bazı ayarlarda, iki değişkenli her üç fonksiyonda da %100 yakınsama elde edilmiştir. Algoritmanın yüksek ölçeklenebilirliği, 40 ve 1000 parametreli testlerde liderlik sağlamaktadır. Beta ve gama parametrelerinin güçlü bir etkisi vardır, bu da hem yüksek yakınsama hem de yerel ekstremumlarda takılmaya karşı direnç elde etmeyi mümkün kılar. Sonuçlar, genel olarak algoritmanın dezavantajlarına atfedilebilecek şekilde büyük farklılıklar göstermektedir. Diğer her şey eşit olduğunda, bu algoritma daha önce ele alınanlar arasında en güçlü olanıdır. Makine öğrenimi ve yapay zeka görevleri de dahil olmak üzere, özellikle sinir ağlarını eğitirken çok geniş bir görev yelpazesinde kullanılması tavsiye edilebilir.

Aşağıda, değiştirilmiş ateş böceği algoritmasının lider olduğu nihai derecelendirme tablosu yer almaktadır. Ne yazık ki klasik algoritma, orijinalliğine rağmen iyi sonuçlar elde edememiştir. Parametreler üzerinde ayarlama yapılması da başarı getirmemiştir.

AO

Açıklama

Skin

Skin için nihai sonuç

Forest

Forest için nihai sonuç

Megacity (ayrık)

Megacity için nihai sonuç

Nihai sonuç

2 parametre (1 F)

40 parametre (20 F)

1000 parametre (500 F)

2 parametre (1 F)

40 parametre (20 F)

1000 parametre (500 F)

2 parametre (1 F)

40 parametre (20 F)

1000 parametre (500 F)

FAm

Ateş böceği algoritması (m)

0.98473

0.92124

0.29872

0.73490

0.99924

0.35417

0.08071

0.47804

0.83333

0.14917

0.04230

0.34160

0.51817889

COAm

Guguk kuşu optimizasyon algoritması (m)

1.00000

0.85911

0.14316

0.66742

0.99283

0.28787

0.04551

0.44207

1.00000

0.24917

0.03537

0.42818

0.51255778

ACOm

Karınca kolonisi optimizasyonu (m)

0.98229

0.79108

0.12602

0.63313

1.00000

0.62077

0.11521

0.57866

0.38333

0.44000

0.02377

0.28237

0.49805222

ABCm

Yapay arı kolonisi (m)

1.00000

0.63922

0.08076

0.57333

0.99908

0.20112

0.03785

0.41268

1.00000

0.16333

0.02823

0.39719

0.46106556

ABC

Yapay arı kolonisi

0.99339

0.73381

0.11118

0.61279

0.99934

0.21437

0.04215

0.41862

0.85000

0.16833

0.03130

0.34988

0.46043000

GWO

Gri kurt optimizasyonu

0.99900

0.48033

0.18924

0.55619

0.83844

0.08755

0.02555

0.31718

1.00000

0.10000

0.02187

0.37396

0.41577556

FSS

Balık sürüsü arama

0.99391

0.5692

0.11341

0.55884

0.85172

0.12143

0.03223

0.33513

0.91667

0.08583

0.02583

0.34278

0.41224778

PSO

Parçacık sürüsü optimizasyonu

0.99627

0.38080

0.05089

0.47599

0.93772

0.14540

0.04856

0.37723

1.00000

0.09333

0.02233

0.37189

0.40836667

FA

Ateş böceği algoritması

0.99603

0.59468

0.06082

0.55051

0.89271

0.17546

0.03863

0.36893

0.68333

0.13250

0.02410

0.27998

0.39980649

RND

Rastgele

0.99932

0.44276

0.06827

0.50345

0.83126

0.11524

0.03048

0.32566

0.83333

0.09000

0.02403

0.31579

0.38163222


Bu makaleden başlayarak, test sırasında en iyi algoritmanın 100 koşullu puana sahip olacağı, en kötüsünün ise 1 puana sahip olacağı bir histogram yayınlayacağım. Derecelendirme tablosu algoritmalarının nihai sonuçlarının ölçeğini net bir şekilde görebildiğimiz için görsel algı açısından en uygun görüntüleme yönteminin bu olduğunu düşünüyorum. Şimdi rastgele algoritmanın liderin ne kadar gerisinde kaldığını görebiliriz.

rating

Şekil 4. Algoritmaların nihai test sonuçlarının histogramı


Hatırlayacağınız üzere, metasezgisel algoritmalar, arama motorlarında makul bir varsayımla rastgelelik özelliğinden yararlanan ve çözüm uzayını inceleyerek ve kullanarak rastgele oluşturulmuş geçerli çözümler kümesinden yinelemeler yoluyla mevcut çözümlerin kalitesini artırmaya çalışan optimizasyon problemlerini çözmek için yaklaşık yöntemlerdir. Bu algoritmaların optimal olduğu garanti edilmese de, makul ve kabul edilebilir bir çözüm verdikleri test edilmiştir. Ayrıca, problemin davranışının onları büyük ölçüde etkilememesi gibi bir avantaja sahiptirler ve bu da onları birçok görevde yararlı kılan şeydir. Mevcut birçok algoritmanın varlığı, davranışına bağlı olarak bir problemi çözmek için uygun olanı seçmeyi mümkün kılar.

Evrimsel algoritmaların ortaya çıkışından bu yana, sezgisel algoritmalar üzerine çok sayıda araştırma yapılmıştır. Yeni algoritmaların uygulanması önde gelen araştırma alanlarından biri olmuştur. Şu anda 40'tan fazla metasezgisel algoritma bulunmaktadır. Bunların çoğu doğadaki senaryoların simüle edilmesiyle oluşturulmuştur.

Aşağıdaki yorumlar ateş böceği algoritmasının değiştirilmiş versiyonunu (FAm) ifade etmektedir.

Avantajları:
  • Basit uygulama. Değiştirilmesi kolay.
  • Yüksek ölçeklenebilirlik.
  • Yüksek yakınsama (algoritma ayarlarına bağlı olarak değişebilir).
  • Arama uzayı bölgesini yerel ekstremumlar etrafında ayrı gruplar halinde kümeleme yeteneği.

Dezavantajları:
  • Ayarların optimizasyon sonuçları üzerindeki güçlü etkisi.
  • Bazı ayarlarda, algoritma yerel ekstremumlarda takılıp kalmaya eğilimlidir.

Her makale, önceki tüm makalelerdeki algoritma kodlarının güncellenmiş sürümlerini içeren bir arşive sahiptir. Her yeni makale, yazarın birikmiş kişisel deneyimidir ve sonuçlar ve yargılar, bu amaç için geliştirilen özel bir test ortamında gerçekleştirilen deneylere dayanmaktadır.



MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/11873

Ekli dosyalar |
Popülasyon optimizasyon algoritmaları: Yarasa algoritması (Bat Algorithm, BA) Popülasyon optimizasyon algoritmaları: Yarasa algoritması (Bat Algorithm, BA)
Bu makalede, düzgün fonksiyonlar üzerinde iyi yakınsama gösteren yarasa algoritmasını inceleyeceğiz.
MetaTrader VPS'i ilk kez başlatma: Adım adım talimatlar MetaTrader VPS'i ilk kez başlatma: Adım adım talimatlar
Ticaret robotları veya sinyal abonelikleri kullanan herkes er ya da geç işlem platformları için güvenilir bir 7/24 sunucu kiralama ihtiyacı duyar. Çeşitli nedenlerden dolayı MetaTrader VPS kullanmanızı öneririz. MQL5.community hesabınız üzerinden hizmet için rahatça ödeme yapabilir ve aboneliği yönetebilirsiniz.
Accelerator Oscillator göstergesine dayalı bir ticaret sistemi nasıl geliştirilir? Accelerator Oscillator göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?
En popüler teknik göstergelere dayalı ticaret sistemleri geliştirdiğimiz serimizin yeni makalesindeyiz. Bu makalede, Accelerator Oscillator göstergesini inceleyeceğiz ve onu kullanarak bir ticaret sistemini nasıl tasarlayacağımızı öğreneceğiz.
MQL5'te ONNX modelleri nasıl kullanılır? MQL5'te ONNX modelleri nasıl kullanılır?
Açık sinir ağı santrali (Open Neural Network eXchange, ONNX), makine öğrenimi modellerini temsil etmek için oluşturulmuş açık bir formattır. Bu makalede, finansal zaman serilerini öngörmek için bir CNN-LSTM modelinin nasıl oluşturulacağını ele alacağız. Ayrıca oluşturulan ONNX modelinin bir MQL5 Uzman Danışmanında nasıl kullanılacağını da göstereceğiz.