English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
Popülasyon optimizasyon algoritmaları: Yarasa algoritması (Bat Algorithm, BA)

Popülasyon optimizasyon algoritmaları: Yarasa algoritması (Bat Algorithm, BA)

MetaTrader 5Örnekler | 8 Ocak 2024, 13:49
200 0
Andrey Dik
Andrey Dik

İçindekiler

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


1. Giriş

Yarasalar inanılmaz hayvanlardır. Bilim insanları ilk yarasaların 65-100 milyon yıl önce ortaya çıktığını ve dinozorlarla yan yana yaşadığını düşünmektedir. Yarasalar kanatlı tek memelilerdir. 1300'den fazla türü bulunmaktadır. Kutup bölgeleri dışında neredeyse her yerde bulunabilirler. Gün boyunca sığınaklarda saklanırlar. Karanlık mağaralarda gezinmek ve hava karardıktan sonra avlanmak için yarasalar, ses dalgalarını kullanarak nesneleri tespit etmelerini sağlayan bir sistem olan ekolokasyona başvururlar. Bir nesneye çarpıp geri yansıyana kadar ilerleyen yüksek frekanslı bir ses yayarak ekolokasyon yaparlar. Ekolokasyon bir tür sonardır: yarasa yüksek ve kısa atımlı bir ses yayar. Ses bir nesneye ulaştığında, yankı kısa bir süre sonra yarasanın kulaklarına geri döner, bu da yarasaların kendilerini uzayda nasıl yönlendirdiklerini ve avlarının konumunu nasıl belirlediklerini gösterir. 

Yarasa algoritması (Bat Algorithm, BA), Yang tarafından 2010 yılında tanıtılan ve global optimizasyon gerçekleştirmek için yarasaların ekolokasyon davranışını taklit eden sezgisel bir algoritmadır. Genellikle doğadan ve fiziksel süreçlerden ilham alan metasezgisel yöntemler, günümüzde birçok karmaşık optimizasyon probleminin çözümünde en güçlü tekniklerden biri olarak kullanılmaktadır. Optimizasyon, hesaplama verimliliği ve global optimizasyon olasılığı açısından birçok farklı avantaj ve dezavantaj gösteren bir dizi verimli seçenek arasından belirli bir kriter kümesi için en iyi elemanların seçilmesidir.

Özellik optimizasyonu, bir parametreyi girdi olarak alan bir "amaç" fonksiyonu sağlayarak bir dizi özel problemin modellenmesi ve çözülmesi için resmi bir çerçeve sunar. Hedef, en iyi değeri geri döndürmek için birleştirilmiş parametrenin değerini bulmaktır. Bu çerçeve, çeşitli problemlerin "özellik optimizasyonu" problemleri olarak yorumlanabilmesi için yeterince soyuttur.


Bununla birlikte, geleneksel özellik optimizasyonu yalnızca genellikle pratikte uygulanamayan bazı küçük problemleri çözmek için kullanılır. Bu nedenle bilim insanları dikkatlerini, bu problemleri çözmek için zengin modeller sunan doğaya çevirmektedir. Doğal biyolojik sistemler modellenerek, uygulamalı problemlerin geleneksel olmayan yöntemlerle çözülmesi için birçok akıllı sürü optimizasyon algoritması önerilmiştir. Mükemmel performansları nedeniyle çeşitli optimizasyon problemlerinde yaygın olarak kullanılırlar. Yarasa algoritması, gerçek yarasaların doğal ses atım yüksekliğini ve emisyon frekansını simüle eden arama temsilcileri olarak yapay yarasaları kullanarak arama işlemi gerçekleştiren yeni ve modern bir sürü benzeri algoritmadır.


2. Algoritma tanımı

Temel yarasa algoritmasında her yarasa, çözüm uzayında geçerli bir çözümü temsil eden "kütlesi ve büyüklüğü olmayan" bir parçacık olarak ele alınır. Farklı uygunluk fonksiyonları için, her yarasa karşılık gelen bir özellik değerine sahiptir ve özellik değerlerini karşılaştırarak mevcut optimum bireyi belirler. Daha sonra popülasyondaki her bir yarasanın akustik dalga frekansı, hızı, atımların yayılma hızı ve ses yüksekliği güncellenir, yinelemeli evrim devam eder, mevcut optimal çözüme yaklaşılır ve oluşturulur ve son olarak global optimal çözüm bulunur. Algoritma her bir yarasanın frekansını, hızını ve konumunu günceller.

Standart algoritma beş temel parametre gerektirir: frekans, ses yüksekliği, dalgalanma ve ses yüksekliği ve dalgalanma oranları. Frekans, geçmişteki en iyi konumun mevcut konum üzerindeki etkisini dengelemek için kullanılır. Arama frekansı aralığı geniş olduğunda yarasa grubun geçmiş konumundan uzakta arama yapacaktır ve bunun tersi de geçerlidir.

Algoritmanın daha önce incelenenlere kıyasla oldukça fazla parametresi vardır:

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 algoritmasını uygularken, birçok kaynakta makalelerin yazarlarının algoritmayı tamamen farklı şekillerde tanımladıkları gerçeğiyle karşılaştım. Farklılıklar hem kilit noktaların tanımlanmasındaki terimlerin kullanımında hem de temel algoritmik özelliklerdeydi, bu yüzden kendim nasıl anladığımı size anlatacağım. Ekolokasyonun altında yatan temel fiziksel ilkeler, önemli sınırlamalar ve kurallar ile algoritmaya uygulanabilir. Yarasaların MinFreq ile MaxFreq arasında değişen frekansta ses atımları kullandığını varsayıyoruz. Frekans yarasa hızını etkiler. Yarasanın mevcut konumundaki yerel arama durumundan en iyi çözümün yakınındaki global arama durumuna geçişi etkileyen koşullu ses yüksekliği kavramı da kullanılmaktadır. Optimizasyon boyunca atım frekansı artarken, ses yüksekliği azalır.

BA algoritmasının yalancı kodu (Şekil 1):

1. Yarasa popülasyonunu başlat.
2. Frekans, hız ve yeni çözümleri oluştur.
3. Yerel bir çözüm ara.
4. Global çözümü güncelle.
5. Ses yüksekliğini azalt ve atım frekansını artır.
6. Durma kriteri karşılanana kadar 2. adımdan itibaren tekrarla.

scheme

Şekil 1. BA algoritmasının blok diyagramı

Kodu tanımlamaya başlayalım. "Yarasa" arama temsilcisini tanımlamak için, her yineleme sırasında durumun tam bir tanımını yapmak adına gerekli tüm özellikleri tanımladığımız bir yapıya ihtiyacımız vardır. position [] dizisi uzaydaki en iyi konum koordinatlarını saklamak için kullanılırken, auxPosition [] dizisi mevcut "operasyonel" koordinatlar içindir. speed [] dizisi, koordinatlara göre hız vektörünün hesaplanmasında gereklidir. frequency - ses atımlarının frekansı, initPulseRate - ilk atım oranı (optimizasyonun en başından itibaren her yarasa için ayrı), pulseRate - mevcut yinelemedeki atım oranı, loudness - ses atımlarının yüksekliği, fitness - son hareketten sonraki uygunluk fonksiyonu değeri, fitnessBest - tüm yinelemeler için temsilcinin uygunluk fonksiyonunun en iyi değeri. 

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

Yarasa algoritması sınıfı, arama temsilcileri, keşfedilen uzayın sınırları ve adımı, algoritma tarafından bulunan en iyi koordinatlar, uygunluk fonksiyonunun en iyi değeri ve algoritma parametrelerini saklamak için sabitlerin yanı sıra public başlatma metodu, algoritma ile çalışmak için gerekli iki public metot ve algoritmaya özgü private metotlardan oluşan bir yapı içerir.

//——————————————————————————————————————————————————————————————————————————————
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);
};
//——————————————————————————————————————————————————————————————————————————————

Algoritmanın Init () public metodunda parametreler ayarlanır, diziler için bellek ayrılır, en iyi uyumu saklamak için değişken minimum değere sıfırlanır ve ilk yineleme bayrağı sıfırlanır. Genel olarak, bu metot karmaşık ve özel bir şey değildir.

//——————————————————————————————————————————————————————————————————————————————
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);
}
//——————————————————————————————————————————————————————————————————————————————

Her yinelemede çağrılan ilk metot Flight()'tır. Arama mantığının ana çerçevesine odaklanır ve geri kalan ayrıntılar bu optimizasyon algoritmasına özgü yardımcı private metotlara yerleştirilir. İlk yinelemede firstFlight bayrağı sıfırlanır (sıfırlama Init () metodunda başlatma sırasında gerçekleşir). Bu, her yarasaya arama uzayında rastgele bir konum olan bir başlangıç durumu atamamız gerektiği anlamına gelir:

  • sıfır hız,
  • parametreler tarafından belirtilen aralıkta rastgele bir sayı ile atanan bireysel ses atım frekansı,
  • ilk bireysel atım frekansı da parametre aralığında rastgele bir sayı ile tanımlanır,
  • ve parametre aralığındaki ses atımlarının yüksekliği.

Gördüğünüz gibi, her yapay yarasanın ses sinyallerinin kendine özgü bir dizi özelliği vardır, bu da onları doğadaki gerçek yarasalara daha çok benzetmektedir. Birkaç yüz bin bireyden oluşabilen tüm popülasyonda bir anne, bebeğin yaydığı benzersiz ses imzasıyla tek bir yavruyu bulabilir.

firstFlight bayrağı etkinleştirilirse, yarasaları hareket ettirmek için temel işlemleri gerçekleştirmek gerekir. Algoritmanın ilginç özelliklerinden biri, tüm popülasyonun ortalama ses yüksekliği kavramında yatmaktadır. Genel olarak, ses yüksekliği tüm yinelemeler boyunca 'alfa' katsayısı aracılığıyla azalır. Burada iki tür yarasa hareketi vardır: Walk () - her koordinat bileşeni için hız vektörünün hesaplanması ile bireysel hareket ve en iyi çözümün yakınında yerel hareket.

Her bir sonraki yinelemede, atımların yoğunluğu azalır ve bu da komşuluk keşfinin yoğunluğunu etkiler. Böylece, keşif ve sömürü optimizasyon boyunca dinamik olarak değişir. Sırada, mevcut yinelemenin yarasaların davranışını nasıl etkilediğini göreceğiz.

//——————————————————————————————————————————————————————————————————————————————
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);
      }
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

Her yinelemede çağrılan ikinci gerekli public metot - Preparation(), global en iyi çözümü güncellemek için gereklidir. Burada "ses yüksekliği" kavramının nasıl kullanıldığını görebiliriz. Her yinelemede her yarasanın ses yüksekliği bir faktör ('alfa' algoritma ayar parametresi) ile azaldığından, yerel araştırmanın olasılığı global çözüm araştırmasının yoğunluğu ile birlikte azalır. Başka bir deyişle, her bir yarasanın en iyi konumunun güncellenme olasılığı her yinelemede azalır. Bu, algoritmada en az anlaşılan anlardan biridir (en azından benim için). Ancak, algoritmanın yazarı bunu uygulamıştır, bu da gerekli olduğu anlamına gelir.

//——————————————————————————————————————————————————————————————————————————————
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]);
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

Private Walk() metodu, global en iyi çözüm dikkate alınarak, her yarasanın o ana kadarki en iyi konumuna göre ayrı ayrı hareket etmesini sağlar. Bu metot, [MIN_FREQ;MAX_FREQ] aralığı içerisinde rastgele değişen ses atım frekansını kullanır. Frekans, en iyi yarasa konumu ile en iyi global çözüm arasındaki farkın frekansla çarpımı olan arama temsilcisinin hareket hızını hesaplamak için gereklidir. Bundan sonra, hız değeri yarasanın mevcut en iyi çözümüne vektörel olarak eklenir. Dolayısıyla, orantısız fiziksel büyüklüklerle çalışıyoruz, ama ne yapabiliriz? Bu sadece gerçek fiziksel nesnelere bir yaklaşımdır. Bu durumda akla yatkınlık göz ardı edilmelidir. Yeni konum hesaplandıktan sonra, SeInDiSp () metodu kullanılarak koordinatların aralık dışı olup olmadığı kontrol edilmelidir.

//——————————————————————————————————————————————————————————————————————————————
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]);
  }
}
//——————————————————————————————————————————————————————————————————————————————

İkinci private metot olan AproxBest(), yarasaların global en iyi çözüme göre hareket ettirilmesinden sorumludur ve koordinatlarda ek bir iyileştirme sağlar. ‘Tüm yarasa popülasyonu içerisindeki ortalama ses yüksekliğinin’ ‘[-1.0; 1.0] aralığındaki rastgele bir sayıyla’ çarpımı şeklindeki bir artışın koordinatlara vektörel olarak eklenmesinden oluşan bu eylemin fiziksel anlamını anlamak benim için mümkün değil. Değerleri, tanım kümesinin geçerli değerlerinin vektörü aracılığıyla optimize edilen fonksiyonun boyutuna indirmeye çalıştım, ancak test sonuçları yazarın algoritma versiyonundan daha kötü çıktı, bu yüzden her şeyi olduğu gibi bıraktım, ancak BA algoritmasının verimliliğinin artırılabileceğinden eminim, ancak bu ek araştırma gerektirecektir, ki bu durumda amaç bu değildi. Koordinatlar hesaplandıktan sonra, SeInDiSp () metodu kullanılarak değerlerin aralık dışı olup olmadığı kontrol edilir.

//——————————————————————————————————————————————————————————————————————————————
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]);
  }
}
//——————————————————————————————————————————————————————————————————————————————

Bir başka private metot da AcceptNewSolutions () olup, her yarasa için ses atımlarının frekansına ilişkin test koşulu karşılandığında çağrılır. Yeni en iyi bireysel çözüm kabul edilir, ayrıca bireysel ses yüksekliği ve bireysel atım frekansı burada yeniden hesaplanır. Burada, bir yinelemenin sıra numarasının atım frekansının hesaplanmasına nasıl dahil olduğunu görebiliriz.

Algoritma mantığının bu kısmında, kendime biraz özgürlük tanıdım ve mantığı değiştirdim, sonucu toplam yineleme sayısının boyutundan bağımsız hale getirdim, bu da sonuçta algoritmanın verimliliğini biraz artırdı. Orijinal versiyonda, yineleme sayısı doğrudan atım frekansının hesaplanmasına yönelik doğrusal olmayan formülde yer alıyordu. BA zaten çok sayıda kurala sahiptir. Bu durumda bir tanesine daha gözlerimi kapatamazdım.

//——————————————————————————————————————————————————————————————————————————————
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));
}
//——————————————————————————————————————————————————————————————————————————————

Atım frekansının mevcut yineleme sayısına (grafikte x) ve ‘gama’ ayar parametresine bağımlılığı Şekil 2'de gösterilmektedir.

gamma

Şekil 2. Atım frekansının mevcut yineleme sayısına ve 0.9, 0.7, 0.5, 0.3, 0.2 değerlerine sahip ‘gama’ ayar parametresine bağımlılığı

3. Test sonuçları

Son makalede, test edilen algoritmaların derecelendirmesini hesaplama metodolojisini revize etme planlarından bahsetmiştim. İlk olarak, çoğu algoritma iki değişkenli test fonksiyonlarıyla kolayca başa çıkabildiğinden ve sonuçlar arasındaki fark neredeyse ayırt edilemez olduğundan, tüm test fonksiyonlarında ilk iki test için değişken sayısını artırmaya karar verdim. Şimdi değişkenlerin sayısı 10, 50 ve 1000 olacaktır.

İkinci olarak, Skin test fonksiyonu yaygın olarak kullanılan Rastrigin fonksiyonu ile değiştirilmiştir (Şekil 3). Bu fonksiyon Skin gibi düzgün bir fonksiyondur. Birçok yerel ekstremum, dört noktada global maksimum ve koordinat eksenlerinin merkezinde bir global minimum ile karmaşık bir yüzeye sahiptir.

Üçüncü olarak, test sonuçlarını tablodaki tüm algoritmalar arasında en iyi sonucun 1.0 ve en kötü sonucun 0.0 olduğu bir değer aralığına normalleştirmeye karar verdim. Bu, test sonuçlarını eşit bir şekilde değerlendirmemizi sağlarken, fonksiyonların karmaşıklığı testteki optimizasyon algoritmalarının her birinin sonuçlarına göre dikkate alınır.

Sonrasında, algoritmaların test sonuçları toplanır. Maksimum sonuca 100 değeri atanır (referans maksimum sonuç), minimum değer ise 1'dir. Bu, test fonksiyonlarının karmaşıklığını göz önünde bulundurarak algoritmaları doğrudan birbirleriyle eşit bir şekilde karşılaştırmamıza olanak sağlar. Artık Print () ile yazdırılan sonuçlar sırasıyla her algoritma için test komut dosyalarının kaynak dosyalarına kaydedilecektir. Testlerdeki puanları hesaplayan komut dosyası aşağıda eklenmiştir. Yeni algoritmaların sonuçlarının eklenmesiyle sonraki makalelerde güncellenecektir.



rastrigin

Şekil 3. Rastrigin test fonksiyonu

Test ortamı sonuçları aşağıdaki gibidir:

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

Yarasa algoritması, düzgün Rastrigin fonksiyonu üzerinde etkileyici sonuçlar göstermiştir. İlginç bir şekilde, fonksiyondaki değişken sayısı arttıkça, sonuçların kararlılığı (tekrarlanabilirliği) artmaktadır, bu da BA'nın düzgün fonksiyonlar üzerinde mükemmel ölçeklenebilirliğini göstermektedir. Özellikle, BA'nın tüm test katılımcıları arasında 50 ve 1000 değişkenli Rastrigin fonksiyonunda en iyi olduğu ortaya çıktı ve bu da yarasa algoritmasını karmaşık düzgün fonksiyonlar ve sinir ağları ile çalışmak için önermemizi sağlıyor. Forest ve Megacity fonksiyonlarında yarasa algoritması, yerel ekstremumlarda takılma eğilimi gösteren ortalama sonuçlar gösterdi. Koordinatlar gruplar halinde lokalize oldu ve global optimuma doğru değişim ve hareket dinamiklerini göstermedi. Sanırım bunun nedeni, algoritmanın incelenen fonksiyonun yüzeyinde bir gradyanın varlığına duyarlı olmasıdır. Gradyan yokluğunda, algoritma, uygunluk fonksiyonu değerlerinde önemli bir artışa sahip olmayan yerel alanların yakınında hızla durur. Dahası, BA algoritması, COA'da uygulanan mekanizmaya (Levy uçuşları) benzer şekilde, yeni bilinmeyen alanlara "atlamaya" izin veren mekanizmalardan yoksundur.

BA için çok sayıda ayardan da bahsetmeliyim. Sadece çok sayıda parametre (serbestlik derecesi) var olmakla kalmaz, aynı zamanda bunların her biri hem arama özelliklerinin doğasını hem de genel yakınsama oranlarını büyük ölçüde etkilemektedir. Bazı parametreler düzgün fonksiyonlarda, bazıları ise ayrık ve kıvrımlı fonksiyonlarda mükemmel sonuçlar verebilir. Farklı türdeki test fonksiyonlarıyla eşit derecede iyi başa çıkmayı mümkün kılan bazı evrensel parametreler bulmak zor bir iştir. Makale, bana en uygun görünen parametrelerle birlikte yarasa algoritmasının kaynak kodunu içermektedir. Genel olarak, optimizasyon sonuçları büyük ölçüde değişebileceğinden, optimizasyon algoritmalarıyla çalışma konusunda çok az deneyimi olan kullanıcılar için BA'yı kullanmanızı tavsiye etmem.  

rastrigin

  Rastrigin test fonksiyonu üzerinde BA

forest

Forest test fonksiyonu üzerinde BA

megacity

Megacity test fonksiyonu üzerinde BA

Test fonksiyonlarının görselleştirilmesine odaklanıldığında, yarasa algoritmasının karakteristik özellikleri hakkında bir fikir edinilebilir. Özellikle, tüm test fonksiyonları üzerinde çalışırken, algoritma koordinatları çok küçük yerel alanlarda gruplandırarak karakterize olur. Düzgün bir fonksiyon için bu özellik, uygunluk fonksiyonunun gradyanının hafifçe değiştiği yerlerde bile hareket etmeyi mümkün kılarken, ayrık bir fonksiyonda bu özellik, algoritmanın düz platolarda takılıp kalması nedeniyle bir dezavantaj olduğunu kanıtlamaktadır.

Optimizasyon algoritmalarının puanlarını hesaplayan komut dosyası tarafından elde edilen sonuçlar:

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

Şimdi nihai derecelendirme tablosuna bir göz atalım. Yukarıda belirtildiği gibi, algoritmaların değerlendirme özelliklerini hesaplama metodolojisi değişmiştir, böylece algoritmalar yeni bir konuma sahip olmuştur. Bazı klasik algoritmalar tablodan çıkarılmış ve sadece testlerde daha yüksek performans gösteren değiştirilmiş versiyonları bırakılmıştır. Artık test sonuçları daha önce olduğu gibi mutlak değil (test fonksiyonu değerlerinin mutlak normalleştirilmiş sonuçları), algoritmaların birbirleriyle karşılaştırılmasının sonuçlarına dayalı olarak görecelidir.

Tablo ACOm'nin (karınca kolonisi optimizasyonu) şu anda lider olduğunu göstermektedir. Algoritma dokuz testten beşinde en iyi sonuçları göstermiştir, bu nedenle nihai sonuç 100 puandır. Guguk kuşu optimizasyon algoritmasının değiştirilmiş bir versiyonu olan COAm ikinci sırada yer almaktadır. Bu algoritmanın düzgün Rastrigin fonksiyonunda en iyi olduğu ortaya çıkmıştır ve diğer test katılımcılarına kıyasla diğer testlerde de iyi sonuçlar göstermiştir. Değiştirilmiş ateş böceği algoritması FAm ise üçüncü sırada yer almıştır. Megacity ayrık fonksiyonu üzerinde en iyi sonuçları göstermiştir. Bu testte sadece FSS aynı sonucu göstermiştir.

AO

Açıklama

Rastrigin

Rastrigin için nihai sonuç

Forest

Forest için nihai sonuç

Megacity (ayrık)

Megacity için nihai sonuç

Nihai sonuç

10 parametre (5 F)

50 parametre (25 F)

1000 parametre (500 F)

10 parametre (5 F)

50 parametre (25 F)

1000 parametre (500 F)

10 parametre (5 F)

50 parametre (25 F)

1000 parametre (500 F)

ACOm

Karınca kolonisi optimizasyonu (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

Guguk kuşu optimizasyon algoritması (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

Ateş böceği algoritması (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

Yarasa algoritması

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

Yapay arı kolonisi

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

Balık sürüsü arama

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

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

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

Rastgele

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

Gri kurt optimizasyonu

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


Algoritma test sonuçlarının histogramı:

rating

Şekil 4. Test algoritmalarının nihai sonuçlarının histogramı

Yarasa algoritmasının özelliklerine ilişkin sonuçlar:

Avantajları:
1. Yüksek hız.
2. Algoritma düzgün fonksiyonlarla iyi çalışmaktadır.
3. Ölçeklenebilirlik.

Dezavantajları:
1. Çok fazla ayar vardır.
2. Ayrık fonksiyonlar üzerine vasat sonuçlar.


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

Ekli dosyalar |
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.
Popülasyon optimizasyon algoritmaları: Ateş böceği algoritması (Firefly Algorithm, FA) Popülasyon optimizasyon algoritmaları: Ateş böceği algoritması (Firefly Algorithm, FA)
Bu makalede ateş böceği algoritması (Firefly Algorithm, FA) optimizasyon yöntemini ele alacağız. Yapılan değişiklik sayesinde algoritma, dışarıdan bakan bir oyuncudan gerçek bir derecelendirme tablosu liderine dönüştü.
Alligator göstergesine dayalı bir ticaret sistemi nasıl geliştirilir? Alligator göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?
Bu makalede, yine bir başka popüler teknik göstergeye odaklanacağız ve ona dayalı bir ticaret sisteminin nasıl geliştirileceğini öğreneceğiz. Alligator göstergesini tanıyacağız ve ona dayalı bir ticaret sistemi tasarlayacağız.
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.