English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
Popülasyon optimizasyon algoritmaları: Guguk kuşu optimizasyon algoritması (Cuckoo Optimization Algorithm, COA)

Popülasyon optimizasyon algoritmaları: Guguk kuşu optimizasyon algoritması (Cuckoo Optimization Algorithm, COA)

MetaTrader 5Örnekler | 8 Ağustos 2023, 09:28
514 0
Andrey Dik
Andrey Dik

İçindekiler

1. Giriş
2. Algoritma tanımı, karar ağacı ve Levy uçuşu
3. COA kodu
4. Test sonuçları


1. Giriş

Guguk kuşu sadece ötüşüyle değil, aynı zamanda diğer kuşların yuvalarına yumurta bırakmaktan oluşan agresif üreme stratejisi nedeniyle de büyüleyici bir kuştur. Bu şekilde kuş, ebeveynlik sorumluluklarını tamamen diğer türlere kaydırır. Her guguk kuşu türü, çeşitli bakıcı ebeveynlerin yumurtalarıyla en iyi şekilde uyacak şekilde belirli bir renk ve büyüklükte yumurta bırakır. Diğer kuşların yuvalarına bırakılan guguk kuşu yavruları genellikle yuva sahiplerinin kendi yavrularından daha büyük ve daha güçlüdür, bu nedenle guguk kuşlarının daha fazla yiyeceğe ihtiyacı vardır. Hodgson guguk kuşu yavruları gelişimleri sırasında kanatlarında açık bir gaga şeklinde özel bir desen geliştirir, bu da bakıcı ebeveynlerden daha fazla yiyecek almalarını sağlar. Böyle bir özellik gösteren tek kuş guguk kuşu değildir. Yuva parazitliği en az 80 kuş türünde görülmektedir. Ayrıca bu fenomen, dişileri başka bir koloniye girip kraliçeyi öldüren ve yumurtalarını bırakan yaban arıları, arılar ve karıncalar gibi bazı sosyal böcek türlerinde de yaygındır. Afrika'daki Tanganyika Gölü'nde yaşayan yayın balığı gibi bazı balıklar da yumurtalarını, ağızlarında kuluçkaya yatan diğer balıklara atarak yuva parazitliği yapmaktadır.


Guguk kuşu araması, Yang ve Deb tarafından 2009 yılında geliştirilmiş, doğadan ilham alan en yeni sezgisel algoritmalardan biridir. Bazı guguk kuşu türlerinin parazitliğine dayanır. Bu algoritma, basit izotropik rastgele yürüyüş yöntemleri yerine Levy uçuşları olarak adlandırılan yöntemlerle daha da geliştirilmiştir.


2. Algoritma tanımı

Guguk kuşu optimizasyon algoritması (Cuckoo Optimization Algorithm, COA) lineer olmayan sürekli optimizasyon için kullanılır. COA bu kuşun yaşam tarzından ilham almıştır. Bu optimizasyon algoritmasının geliştirilmesi, guguk kuşlarının yumurtlama ve üreme özelliklerine dayanmaktadır. Diğer evrimsel yaklaşımlar gibi COA da bir başlangıç popülasyonu ile başlar. Algoritmanın temeli hayatta kalma çabasıdır. Hayatta kalmak için rekabet ederken, bazı kuşlar ölür. Hayatta kalan guguk kuşları daha iyi konumlara taşınarak üremeye ve yumurtlamaya başlar. Son olarak, hayatta kalan guguk kuşları, benzer uygunluk değerlerine sahip bir guguk kuşu topluluğu elde edilecek şekilde yakınsar.
Bu yöntemin ana avantajı basitliğidir: guguk kuşu araması sadece dört anlaşılabilir parametre gerektirir, dolayısıyla ayarlama yapmak zahmetsizdir.

Guguk kuşu arama algoritmasında, yuvadaki yumurtalar optimizasyon probleminin olası çözümleri olarak yorumlanır ve guguk kuşu yumurtası da yeni çözümü temsil eder. Yöntemin nihai hedefi, bu yeni (ve potansiyel olarak daha iyi) parazitik guguk kuşu yumurtası çözümlerini mevcut yuva yumurtası çözümünün yerine kullanmaktır. Yinelemeli olarak gerçekleştirilen bu değiştirme, sonunda bir çözüme götürür.

Profesörler Yang ve Deb, algoritma için aşağıdaki üç ideal durumu önermiştir:
1. Her guguk kuşu bir yumurta yumurtlar ve rastgele seçilen bir yuvaya bırakır.
2. Yüksek kaliteli yumurtalara sahip en iyi yuvalar gelecek nesillere aktarılacaktır.
3. Mevcut yuva sayısı sabittir ve yuva yabancı bir yumurtayı 'pa' olasılığı ile tespit edebilir. Bu durumda ev sahibi kuş yumurtayı atabilir ya da yuvayı terk edebilir ve dolayısıyla yumurta ölür.

Basitlik açısından, üçüncü varsayım n yuvanın pa kesri ile yaklaşık olarak ifade edilebilir. Maksimizasyon problemi için, çözümün kalitesi veya uygunluğu basitçe hedef fonksiyonu ile orantılı olabilir. Ancak, uygunluk fonksiyonu için başka (daha karmaşık) ifadeler de tanımlanabilir.

Her yineleme g için, bir guguk kuşu yumurtası i rastgele seçilir ve bir tür rastgele yürüyüş olan Levy uçuşu kullanılarak yeni çözümler xi (g + 1) üretilir. Burada, adımlar belirli bir olasılık dağılımına sahip adım uzunlukları sınırları içerisinde belirlenir ve adımların yönleri izotropik ve rastgeledir. Yöntemin orijinal yaratıcılarına göre, Levy uçuşlarını kullanma stratejisi, daha iyi genel performansla sonuçlandığı için diğer basit rastgele yürüyüşlere tercih edilir. Genel Levy uçuşu denklemi aşağıdaki gibidir:

xi(g + 1) = xi(g) + α ⊕ levy(λ)

Burada g, mevcut nesil numarasını ve α > 0 da incelenen problemin ölçeği ile ilişkili olması gereken adım büyüklüğünü gösterir. ⊕ sembolü eleman bazında çarpmayı belirtmek için kullanılır. Bunun esasen bir Markov zinciri olduğuna dikkat edin, çünkü g + 1 neslindeki bir sonraki konum yalnızca g neslindeki mevcut konuma ve sırasıyla birinci ve ikinci terimler tarafından belirlenen geçiş olasılığına bağlıdır. Bu geçiş olasılığı Levy dağılımı tarafından şu şekilde modüle edilir: 

levy(λ) ∼ g-λ, (1 < λ ≤ 3)

Sonsuz ortalama ile sonsuz varyansa sahiptir. Pratik, en iyi sonuçların 2.0 sabit derece ile elde edildiğini göstermiştir. Burada, adımlar esasen ağır kuyruklu (kuvvet yasası) adım uzunluğu dağılımına sahip rastgele bir yürüyüş süreci oluşturur. Hesaplama açısından bakıldığında, Levy uçuşları kullanılarak rastgele sayıların üretilmesi iki aşamadan oluşur: ilk olarak, tekdüze bir dağılıma göre rastgele bir yön seçilir, ardından seçilen Levy dağılımına göre adımlar üretilir. Algoritma daha sonra yeni çözümün uygunluğunu değerlendirir ve mevcut çözümle karşılaştırır. Yeni çözümün daha iyi uygunluk sağlaması durumunda, mevcut çözümün yerini alır. Öte yandan, daha iyi çözümler bulmak amacıyla arama uzayının keşfini artırmak adına bazı yuvalar terk edilir (yuva sahibi guguk kuşu yumurtasını dışarı atar veya yuvayı terk eder ve dolayısıyla yumurta ölür). Değiştirme hızı, performansı artırmak için ayarlanması gereken bir model parametresi olan pa olasılığı tarafından belirlenir. Algoritma, durma kriteri karşılanana kadar yinelemeli olarak uygulanır. Yaygın sonlanma kriterleri, daha düşük bir eşiği karşılayan bir çözümün bulunması, sabit bir nesil sayısına ulaşılması veya ardışık yinelemelerin artık daha iyi sonuçlar üretmemesidir.

Guguk kuşunun yumurtlama süreci üzerinde daha ayrıntılı olarak duralım. Tüm yuvalar arasından, yumurtanın bırakılması gereken bir yuva rastgele seçilecektir. Yumurta bir çözüm olduğundan, yumurtanın kalitesi ile temsil edilebilir. Eğer guguk kuşu yumurtası bakıcı ebeveynin yumurtasından daha kaliteliyse, değiştirilecektir. Aksi takdirde, bakıcı ebeveynin yumurtası yuvada kalacaktır. Bir sonraki evrim hayatta kalan yavrudan devam edecektir. Bu, bakıcı ebeveynin yumurtasının yavrusu hayatta kaldıysa, evrimin aynı konumdan devam edeceği anlamına gelir. İleri gelişme ancak guguk kuşu yumurtası yaşayabilirse mümkündür ve böylece problemi çözme arayışı yeni bir konumdan devam edecektir. Karar ağacı şematik olarak Şekil 1'de gösterilmektedir.


decision tree

Şekil 1. Karar ağacı. Kırmızı nokta başlangıç, yeşil nokta ise son karardır


Karar ağacından sonra algoritmanın temelini oluşturan ikinci bileşen Levy uçuşudur. Levy uçuşu, sıçrama uzunluğunun adımlarla değiştiği, sıçramaların yönünün rastgele değiştiği ve olasılık dağılımının Pareto dağılımının özel bir durumu olduğu ve ağır kuyruklarla karakterize edildiği rastgele bir yürüyüştür (bir Markov istatistiksel sürecidir). Uzayda bir sıçrama olarak tanımlanır ve sıçrama rastgele yönlerde izotropiktir. Levy uçuşu, anormal stokastik süreçleri tanımlamak için bir araçtır. Varyans sonsuzdur (büyük uzunlukta sıçramalar mümkündür), sıçramaların uzunlukları tüm seviyelerde kendine benzerdir (kısa sıçramalar uzun uçuşlarla serpiştirilmiştir). Levy uçuşu terimi bazen sürekli bir uzay yerine ayrık bir ızgara üzerinde meydana gelen rastgele bir yürüyüşü içerecek şekilde genişletilir.

Levy uçuşunun guguk kuşu algoritmasındaki net uygulaması, tek parametreli bir optimizasyon problemini ele alırsak gösterilebilir. Tanım kümesinin çoğunda değişmeyen varsayımsal bir fonksiyonu (Şekil 2'deki siyah çizgi), yani yatay çizgiyi (y=x) ele alalım. Sadece küçük bir alanda fonksiyon değişir ve bir maksimuma sahiptir. Maksimum değer arayışına Şekil 2'deki turuncu noktadan başlarsak, ardından da Levy dağılımıyla rastgele bir x değeri elde edersek, fonksiyonda bir değişiklik olmazken başlangıç noktasından uzaklaşırız. Bununla birlikte, dağılımın kuyruğunda güçlü bir sıçrama ile, orijinal turuncu noktadan daha iyi bir çözüm olan yeşil noktayı elde ederiz ve devamında sadece yeşil noktadan fonksiyonun maksimumuna yaklaşarak sonucu iyileştirebiliriz. Bu örnekte, Levy uçuşu algoritmanın arama kabiliyetini önemli ölçüde artırmaktadır.

levy flight

Şekil 2. Levy uçuşunu kullanarak varsayımsal tek boyutlu bir fonksiyona çözüm bulma örneği

Levy uçuşları kavramı kaos teorisinde, rastgele veya yalancı rastgele doğa olaylarını (örneğin, uzun ve kısa yörüngeleri birleştiren bir albatrosun kuşunun uçuşu) modellerken kullanılır. Örnekler arasında deprem veri analizi, finansal matematik, kriptografi, sinyal analizi, türbülanslı hareketin yanı sıra astronomi, biyoloji ve fizikteki birçok uygulama yer almaktadır.

COA algoritmasının yalancı kodu (Şekil 3):

1. Guguk kuşlarını rastgele değerlerle başlat.
2. Uygunluğu tanımla.
3. Yumurtaları rastgele yuvalara bırak.
4. Belirli bir olasılıkla yuvayı boşalt.
5. Guguk kuşlarını mevcut konumdan Levy uçuş mesafesi içerisinde rastgele bir yöne gönder
6. Uygunluğu tanımla.
7. Yumurtaları rastgele yuvalara bırak.
8. Belirli bir olasılıkla yuvayı boşalt.
9. Durdurma kriteri karşılanana kadar 5. adımı tekrarla.

scheme

Şekil 3. COA algoritmasının blok diyagramı 


3. COA kodu

Algoritmanın koduna geçelim. Problemin çözümü, aynı zamanda yumurta olan guguk kuşudur. Bu, arama uzayındaki koordinatları ve uygunluk fonksiyonunun değerini (yumurta kalitesi) içeren basit bir yapıdır.

//——————————————————————————————————————————————————————————————————————————————
struct S_Cuckoo
{
  double c []; //coordinates (egg parameters)
  double e;    //egg quality 
};
//——————————————————————————————————————————————————————————————————————————————

Yuvayı bir yapı şeklinde tanımlayalım. Burada, tıpkı bir yumurtanın yapısında olduğu gibi, uzaydaki koordinatlar ve uygunluk fonksiyonunun değeri vardır. "Yumurtayı yuvaya bırakmak" esasen yumurtanın yapısını yuvanın yapısına kopyalamak anlamına gelir. Olasılık parametresi pa kullanılarak, 0.0 ile pa arasından rastgele bir sayı [0.0;1.0] aralığının dışarısına düştüğünde, yumurta yuvadan atılır ve e değeri -DBL_MAX olarak ayarlanır.

//——————————————————————————————————————————————————————————————————————————————
struct S_Nest
{
  void Init (int coordinates)
  {
    ArrayResize (c, coordinates);
    e = -DBL_MAX;
  }
  double c []; //coordinates (egg parameters)
  double e;    //egg quality
};
//——————————————————————————————————————————————————————————————————————————————

Algoritma sınıfı. Public başlatma metotları, kullanıcı programındaki ana iki çağrı metodu, optimizasyon probleminin argümanlarının değer aralıkları ve hizmet fonksiyonlarını yerine getiren ek private metotlar burada bildirilir.

//——————————————————————————————————————————————————————————————————————————————
class C_AO_COA
{
  //============================================================================
  public: double rangeMax  []; //maximum search range
  public: double rangeMin  []; //manimum search range
  public: double rangeStep []; //step search
  public: S_Cuckoo cuckoos []; //all the cuckoos
  public: double cB        []; //best coordinates (egg parameters)
  public: double eB;           //best eggs quality

  public: void Init (const int    coordinatesP, //number of opt. parameters
                     const int    cuckoosP,     //number of cuckoos
                     const int    nestsP,       //number of cuckoo nests
                     const double koef_paP,     //probability of detection of cuckoo eggs
                     const double koef_alphaP); //step control value

  public: void CuckooFlight ();
  public: void LayEggs      ();


  //============================================================================
  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);

  private: S_Nest nests [];      //nests
  private: int    cuckoosNumber; //number of cuckoos
  private: int    nestsNumber;   //number of cuckoo nests
  private: double koef_pa;       //probability of detection of cuckoo eggs
  private: double koef_alpha;    //step control value
  private: double v     [];
  private: int    coordinates;   //coordinates number
  private: bool   clutchEggs;    //clutch of eggs
};
//——————————————————————————————————————————————————————————————————————————————

Init () public metodu. Burada değişkenlerin değerleri sıfırlanır ve diziler için bellek tahsis edilir.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_COA::Init (const int    coordinatesP,  //number of opt. parameters
                     const int    cuckoosP,     //number of cuckoos
                     const int    nestsP,       //number of cuckoo nests
                     const double koef_paP,     //probability of detection of cuckoo eggs
                     const double koef_alphaP)  //step control value
{
  MathSrand (GetTickCount ());
  clutchEggs = false;
  eB         = -DBL_MAX;

  coordinates   = coordinatesP;
  cuckoosNumber = cuckoosP;
  nestsNumber   = nestsP;
  koef_pa       = koef_paP;
  koef_alpha    = koef_alphaP;

  ArrayResize (nests, nestsNumber);
  for (int i = 0; i < nestsNumber; i++)
  {
    nests  [i].Init (coordinates);
  }

  ArrayResize (rangeMax,  coordinates);
  ArrayResize (rangeMin,  coordinates);
  ArrayResize (rangeStep, coordinates);
  ArrayResize (cB,        coordinates);

  ArrayResize (v, coordinates);

  ArrayResize (cuckoos, cuckoosNumber);
  for (int i = 0; i < cuckoosNumber; i++)
  {
    ArrayResize (cuckoos [i].c, coordinates);
  }
}
//——————————————————————————————————————————————————————————————————————————————

"Guguk kuşlarının uçuşu"nun her yinelemesinde çağrılan ilk public metot. clutchEggs bayrağı devre dışıysa, ilgili koordinat aralığında rastgele sayılar üreterek guguk kuşlarını rastgele yönlere göndeririz. Bayrak etkinse, guguk kuşunun uçuşu, Levy uçuşunun v vektörü aralığındaki dağılımına göre gerçekleştirilir. Her koordinat farklı bir değer aralığına sahip olabileceğinden, v vektörü Init () içerisinde her koordinat için ayrı olarak önceden hesaplanır.

cuckoos [i].c [c] = cuckoos [i].c [c] + r1 * v [c] * pow (r2, -2.0) ifadesi, r1 * v [c] * pow (r2, -2.0) ofsetini mevcut guguk kuşu koordinatına eklediğimiz anlamına gelir; burada r1, orijinal konumdan ofsetin yönünü belirleyen -1 veya 1'dir, v yer değiştirme vektörüdür, r2 ise -2.0 kuvvetine yükseltilmiş 0.0 ila 20.0 aralığından rastgele bir sayıdır. Rastgele bir sayıyı bir kuvvete yükseltmek Levy uçuşu fonksiyonudur. Grafiği Şekil 2'den görülebilir.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_COA::CuckooFlight ()
{
  //----------------------------------------------------------------------------
  if (!clutchEggs)
  {
    for (int i = 0; i < coordinates; i++) v [i] = (rangeMax [i] - rangeMin [i]) * koef_alpha;

    for (int i = 0; i < cuckoosNumber; i++)
    {
      for (int c = 0; c < coordinates; c++)
      {
        cuckoos [i].c [c] = RNDfromCI (rangeMin [c], rangeMax [c]);
        cuckoos [i].c [c] = SeInDiSp (cuckoos [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
      }
    }

    clutchEggs = true;
  }
  else
  {
    double r1 = 0.0;
    double r2 = 0.0;

    for (int i = 0; i < cuckoosNumber; i++)
    {
      for (int c = 0; c < coordinates; c++)
      {
        r1 = RNDfromCI (0.0, 1.0);
        r1 = r1 > 0.5 ? 1.0 : -1.0;
        r2 = RNDfromCI (1.0, 20.0);

        cuckoos [i].c [c] = cuckoos [i].c [c] + r1 * v [c] * pow (r2, -2.0);
        cuckoos [i].c [c] = SeInDiSp (cuckoos [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
      }
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

Her yinelemede çağrılan ikinci public metot "yumurtanın yuvaya bırakılması" metodudur. Bu metotta, bir guguk kuşu yumurtasının bir yuvaya bırakılması simülasyonu algoritmik olarak yeniden üretilir. Bu, mevcut tüm yuvalar arasından rastgele bir yuva seçilerek gerçekleştirilir. Devamında, guguk kuşu yumurtasının kalitesi ile halihazırda yuvada bulunan yumurtanın kalitesi karşılaştırılır. Eğer guguk kuşu yumurtası daha iyiyse, değiştirme yapılır. Bu metottaki algoritmanın ilginç bir özelliği, guguk kuşu yumurtası daha uygun olsa bile, yumurtanın ölüp ölmeyeceği olasılığının yumurtanın bırakılmasından sonra gerçekleştirilmesidir. Bu, tıpkı doğada olduğu gibi, yuvanın içerisinde hangi kaliteden yumurta olursa olsun, her yumurtanın ölme olasılığı (koef_pa) olduğu anlamına gelir. Eğer yumurta ölürse ya da yuvadan atılırsa, ki bu da aslında aynı şeydir, yuva, herhangi bir uygunluktaki (daha düşük bile olabilir) yeni bir yumurtanın bırakılması için boş olacaktır; bu, algoritmik olarak yeni bir konumun araştırılması anlamına gelir.

Bu şekilde, yuva parazitliği gibi doğal evrim yöntemlerinden biri sadece birkaç satır kodla tanımlanabilir. Yayınlarında birçok yazar, yumurta çıkarıldıktan sonra yuvanın yeni rastgele değerlerle başlatılmasını önermektedir, bu da aramaya en baştan başlamak anlamına gelmektedir. Çoğu durumda bu, algoritmanın keşif yeteneğini artırmak açısından istenen sonucu vermeyecektir. Kendi araştırmalarım, yuvayı boş bırakmanın daha uygun olduğunu ve guguk kuşlarından birinin, yumurtanın kalitesi ne olursa olsun, yuvanın içerisine bir yumurta bırakacağını gösterdi. Bu, rastgele değerlerden daha iyidir. Çalışmadaki değişkenlik, mevcut koordinatlardan rastgele yönlerde rastgele sıçramalarla sağlanmaktadır. Sonuç olarak, en iyi çözümü ararken daha az yinelemeye ihtiyaç duyacağız ve böylece algoritmanın bir bütün olarak yakınsama hızını artıracağız.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_COA::LayEggs ()
{
  int ind = 0;

  //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  for (int i = 0; i < cuckoosNumber; i++)
  {
    ind = (int)round (RNDfromCI (0.0, nestsNumber - 1));

    if (cuckoos [i].e > nests [ind].e)
    {
      nests [ind].e = cuckoos [i].e;
      ArrayCopy (nests [ind].c, cuckoos [i].c, 0, 0, WHOLE_ARRAY);

      if (cuckoos [i].e > eB)
      {
        eB = cuckoos [i].e;
        ArrayCopy (cB, cuckoos [i].c, 0, 0, WHOLE_ARRAY);
      }
    }
    else
    {
      ArrayCopy (cuckoos [i].c, nests [ind].c, 0, 0, WHOLE_ARRAY);
    }
  }
  //vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

  for (int n = 0; n < nestsNumber; n++)
  {
    if (RNDfromCI (0.0, 1.0) < koef_pa)
    {
      nests [ind].e = -DBL_MAX;
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————


4. Test sonuçları

İşte test sonuçları:

2022.11.30 11:31:54.490    Test_AO_COA_fast (EURUSD,M1)    =============================
2022.11.30 11:31:54.507    Test_AO_COA_fast (EURUSD,M1)    1 Skin's; Func runs 10000 result: 4.918379100238852
2022.11.30 11:31:54.507    Test_AO_COA_fast (EURUSD,M1)    Score: 1.00000
2022.11.30 11:31:54.854    Test_AO_COA_fast (EURUSD,M1)    20 Skin's; Func runs 10000 result: 4.257477577760983
2022.11.30 11:31:54.854    Test_AO_COA_fast (EURUSD,M1)    Score: 0.84220
2022.11.30 11:32:02.346    Test_AO_COA_fast (EURUSD,M1)    500 Skin's; Func runs 10000 result: 1.3521208312080903
2022.11.30 11:32:02.346    Test_AO_COA_fast (EURUSD,M1)    Score: 0.14849
2022.11.30 11:32:02.346    Test_AO_COA_fast (EURUSD,M1)    =============================
2022.11.30 11:32:02.368    Test_AO_COA_fast (EURUSD,M1)    1 Forest's; Func runs 10000 result: 1.7600394018343262
2022.11.30 11:32:02.368    Test_AO_COA_fast (EURUSD,M1)    Score: 0.99557
2022.11.30 11:32:02.775    Test_AO_COA_fast (EURUSD,M1)    20 Forest's; Func runs 10000 result: 0.4968964923017033
2022.11.30 11:32:02.775    Test_AO_COA_fast (EURUSD,M1)    Score: 0.28107
2022.11.30 11:32:13.125    Test_AO_COA_fast (EURUSD,M1)    500 Forest's; Func runs 10000 result: 0.07638950254648778
2022.11.30 11:32:13.125    Test_AO_COA_fast (EURUSD,M1)    Score: 0.04321
2022.11.30 11:32:13.125    Test_AO_COA_fast (EURUSD,M1)    =============================
2022.11.30 11:32:13.148    Test_AO_COA_fast (EURUSD,M1)    1 Megacity's; Func runs 10000 result: 12.0
2022.11.30 11:32:13.148    Test_AO_COA_fast (EURUSD,M1)    Score: 1.00000
2022.11.30 11:32:13.584    Test_AO_COA_fast (EURUSD,M1)    20 Megacity's; Func runs 10000 result: 2.69
2022.11.30 11:32:13.584    Test_AO_COA_fast (EURUSD,M1)    Score: 0.22417
2022.11.30 11:32:24.379    Test_AO_COA_fast (EURUSD,M1)    500 Megacity's; Func runs 10000 result: 0.40800000000000003
2022.11.30 11:32:24.379    Test_AO_COA_fast (EURUSD,M1)    Score: 0.03400
2022.11.30 11:32:24.379    Test_AO_COA_fast (EURUSD,M1)    =============================
2022.11.30 11:32:24.379    Test_AO_COA_fast (EURUSD,M1)    All score for C_AO_COA: 0.507633670637353

Levy uçuşu guguk kuşu arama algoritması etkileyici sonuçlar gösterdi. Çoğu testte, diğer optimizasyon algoritmalarından daha iyi performans sergiledi. Özellikle, algoritma iki değişkenli düzgün Skin fonksiyonu ve iki değişkenli ayrık Megacity fonksiyonu üzerinde %100 yakınsama göstermiştir. Daha da şaşırtıcı bir şekilde, ayrık fonksiyon üzerinde mükemmel ölçeklenebilirlik göstermiştir. Diğer testlerde, karınca kolonisi algoritmasından sadece biraz daha düşüktür. Şu anda derecelendirme tablosunda tartışmasız yeni bir liderimiz vardır.

Tüm algoritmaların, nihai sonuçları bir dereceye kadar etkileyen ayar parametrelerine sahip olduğunu açıklığa kavuşturmak isterim, bu nedenle bu algoritmalardan bazılarının daha da optimum parametrelere sahip olması ve dolayısıyla da derecelendirme tablosunun farklı görünmesi oldukça olasıdır. Ben sadece en iyi sonuçları verdiğini tespit ettiğim parametrelerle yapılan testlerin sonuçlarını gösterdim. Daha uygun parametreler bulmayı ve daha iyi sonuçlar almayı başarırsanız, derecelendirme tablosunu onlara göre düzenleyebilirim. Karınca algoritmasının mevcut liderle başarılı bir şekilde rekabet edebileceği varsayımı vardır, çünkü bazı göstergelerde guguk kuşu arama algoritmasının önündedir ve nihai göstergeler açısından da minimum düzeyde gerisindedir. GWO, 1000 değişkenli Skin fonksiyonunda hala lider konumdadır. Her halükarda, projelerinde kendi optimizasyon problemlerini çözerken algoritmaları kullanacak olanlar, tabloda gezinebilir ve özel ihtiyaçları için bir algoritma seçebilir.


Skin

Skin test fonksiyonu üzerinde COA

Forest

  Forest test fonksiyonu üzerinde COA

Megacity

  Megacity test fonksiyonu üzerinde COA

Test ortamını görsel olarak incelediğimizde, algoritmanın davranışının daha önce tartışılanlardan farklı olduğunu görüyoruz, ancak görevi keşfedilebilir alanlara bölen algoritmaların (arı kolonisi algoritması gibi) karakteristik bazı özellikleri dikkat çekmektedir. Bu, algoritmanın tek bir ekstremuma odaklanmak yerine, potansiyel olarak umut verici birkaç alanı keşfetme yeteneğini karakterize eder ve algoritmaya yerel ekstremumlarda takılmaya karşı direnç sağlar. Bu bağlamda, guguk kuşunun yuvaları kalitelerine göre sıralaması ve aralarından seçim yapmasını sağlayarak algoritmayı iyileştirmek mümkün olabilir. Bu, guguk kuşunun rastgele seçilen bir yuvaya yumurta bırakmak yerine algoritmanın kanonik versiyonunda olduğu gibi bir yuva seçtiği anlamına gelir. Ancak bunu yapmak sonuçları iyileştirmemiş ve rastgele yuva seçiminin pratikliğini göstermiştir. Belki de bu, doğada olanları yansıtmaktadır. Daha elverişli yuvaların olması durumunda yumurtayı değiştirmek, rastgele olandan daha zordur ve istatistiksel olarak gerekçesizdir.

Algoritmanın bir diğer özelliği de çok değişkenli fonksiyonlar üzerinde rastgele yürüyüşe benzer bir davranış sergilemesidir. Görsel olarak beyaz gürültü veya eski bir TV ekranı gibi görünmektedir. Koordinatların yerel ekstremumlarda bir miktar yoğunlaşması ancak yinelemelerin sonunda fark edilebilmektedir. Karınca kolonisi algoritmasında olduğu gibi, parametrelerin daha net bir şekilde "kristalleşmesini" sağlamak istiyorum. Böylece, genel bir çözümü olmayan tüm optimizasyon algoritmalarının ortak sorununa gelmiş bulunuyoruz. Birçok klasik ve oldukça yeni algoritma yazarı bu sorunu çözmeye çalışmıştır.

Sorunun özü şudur: incelenen fonksiyonun optimize edilen parametrelerinden hangisinin öncelikli veya güçlü olduğu belli değildir, dolayısıyla parametrelerin her birinin sonucu ne ölçüde ve nasıl etkilediği bilinmemektedir. Örneğin, birkaç parametre vardır ve algoritma halihazırda doğru olanı bulmuştur, ancak onlardan hangisinin olduğu tam olarak bilinmemektedir. Algoritma, global ekstremuma ulaşmak için sadece bazılarını değiştirmek yeterli olsa dahi, hepsini değiştirmeye çalışmaya devam edecektir. Onlarca ve binlerce değişkeni olan bir fonksiyon söz konusu olduğunda sorun daha da kötüleşir. Ne kadar çok değişken olursa, sorun da o kadar ciddileşir. Görsel olarak bu, ekranda beyaz gürültü gibi görünür. 

Bu sorunu en azından kısmen olarak çözmek için bir girişimde bulundum. İncelenen fonksiyonun hangi parametrelerinin değiştirilmesi ve hangilerinin aynı kalması gerektiği önceden bilinmiyorsa, bunu olasılıksal bir şekilde çözmeyi deneyebiliriz. Tüm parametrelerin hepsinin aynı anda değil, yalnızca bir kısmının değiştirilmesi gerektiği varsayıyoruz. PSO algoritması karakteristik bir şekilde davranmaktadır: optimize edilen fonksiyonun parametre (argüman) sayısı arttıkça, konsantre olma yeteneği olmayan bir bulut gibi davranmaktadır. Bu amaçla, algoritmaya koordinatın değiştirilme olasılığını belirleyen yeni bir parametre ekledim, aksi takdirde koordinat aynı bırakılacaktır.

Ve sonuç... İşe yaradı! Test sonuçları iyileşti. Çok değişkenli fonksiyonlarda elde etmek istediğimiz "kristalleşme" kendini gösterdi.

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

2022.12.03 16:01:26.256    Test_AO_COAm (EURUSD,M1)    =============================
2022.12.03 16:01:27.511    Test_AO_COAm (EURUSD,M1)    1 Skin's; Func runs 10000 result: 4.918367945334852
2022.12.03 16:01:27.511    Test_AO_COAm (EURUSD,M1)    Score: 1.00000
2022.12.03 16:01:30.291    Test_AO_COAm (EURUSD,M1)    20 Skin's; Func runs 10000 result: 4.328327964103814
2022.12.03 16:01:30.291    Test_AO_COAm (EURUSD,M1)    Score: 0.85911
2022.12.03 16:01:59.306    Test_AO_COAm (EURUSD,M1)    500 Skin's; Func runs 10000 result: 1.3297901702583084
2022.12.03 16:01:59.306    Test_AO_COAm (EURUSD,M1)    Score: 0.14316
2022.12.03 16:01:59.306    Test_AO_COAm (EURUSD,M1)    =============================
2022.12.03 16:02:00.511    Test_AO_COAm (EURUSD,M1)    1 Forest's; Func runs 10000 result: 1.755200932219688
2022.12.03 16:02:00.511    Test_AO_COAm (EURUSD,M1)    Score: 0.99283
2022.12.03 16:02:03.566    Test_AO_COAm (EURUSD,M1)    20 Forest's; Func runs 10000 result: 0.5089243656052672
2022.12.03 16:02:03.566    Test_AO_COAm (EURUSD,M1)    Score: 0.28787
2022.12.03 16:02:35.468    Test_AO_COAm (EURUSD,M1)    500 Forest's; Func runs 10000 result: 0.08044934398920801
2022.12.03 16:02:35.468    Test_AO_COAm (EURUSD,M1)    Score: 0.04551
2022.12.03 16:02:35.468    Test_AO_COAm (EURUSD,M1)    =============================
2022.12.03 16:02:36.628    Test_AO_COAm (EURUSD,M1)    1 Megacity's; Func runs 10000 result: 12.0
2022.12.03 16:02:36.628    Test_AO_COAm (EURUSD,M1)    Score: 1.00000
2022.12.03 16:02:39.628    Test_AO_COAm (EURUSD,M1)    20 Megacity's; Func runs 10000 result: 2.9899999999999998
2022.12.03 16:02:39.628    Test_AO_COAm (EURUSD,M1)    Score: 0.24917
2022.12.03 16:03:11.892    Test_AO_COAm (EURUSD,M1)    500 Megacity's; Func runs 10000 result: 0.4244
2022.12.03 16:03:11.892    Test_AO_COAm (EURUSD,M1)    Score: 0.03537
2022.12.03 16:03:11.892    Test_AO_COAm (EURUSD,M1)    =============================
2022.12.03 16:03:11.892    Test_AO_COAm (EURUSD,M1)    All score for C_AO_COAm: 0.5125572342985216

Görselleştirmede "kristalleşmeyi" açıkça görebiliyoruz. İlk başta beyaz gürültü gibi görünen ekran temizleniyor, koordinatlar konsantre olmaya başlıyor ve konsantrasyon merkezleri hareketli hale geliyor:

cristal

Megacity test fonksiyonu üzerinde COAm. "Kristalleşme" etkisi açık bir şekilde görünmektedir.

Bir yandan değişkenlik, yani dinamik olarak yeni alanlar arama yeteneği, diğer yandan da halihazırda ulaşılmış ekstremumların koordinatlarını netleştirme yeteneği sağlar. Aşağıda, karşılaştırma için belirgin bir "kristalleşmeye" sahip karınca kolonisi algoritmasının animasyonu yer almaktadır:

cristACO

  Forest test fonksiyonu üzerinde ACOm

Test sonuçları

Optimizasyon algoritması

Açıklama

Skin

Forest

Megacity (ayrık)

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)

COAm

Guguk kuşu optimizasyon algoritması

1.00000

0.85911

0.14316

0.99283

0.28787

0.04551

1.00000

0.24917

0.03537

0.51255778

ACOm

Karınca kolonisi optimizasyonu

0.98229

0.79108

0.12602

1.00000

0.62077

0.11521

0.38333

0.44000

0.02377

0.49805222

ABCm

Yapay arı kolonisi

1.00000

0.63922

0.08076

0.99908

0.20112

0.03785

1.00000

0.16333

0.02823

0.46106556

ABC

Yapay arı kolonisi

0.99339

0.73381

0.11118

0.99934

0.21437

0.04215

0.85000

0.16833

0.03130

0.46043000

GWO

Gri kurt optimizasyonu

0.99900

0.48033

0.18924

0.83844

0.08755

0.02555

1.00000

0.10000

0.02187

0.41577556

PSO

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

0.99627

0.38080

0.05089

0.93772

0.14540

0.04856

1.00000

0.09333

0.02233

0.40836667

RND

Karmaşık

0.99932

0.44276

0.06827

0.83126

0.11524

0.03048

0.83333

0.09000

0.02403

0.38163222


Guguk kuşu arama algoritmasının bir avantajı, global aramada standart rastgele yürüyüşler yerine uçuşları veya Levy sürecini kullanmasıdır. Levy uçuşları sonsuz ortalama ve varyansa sahip olduğundan, COA arama uzayını standart Gauss süreci algoritmalarından daha verimli bir şekilde keşfedebilir. Levy uçuşu: kuvvet yasası kuyruğuna sahip bir olasılık yoğunluk fonksiyonundan seçilen bir dizi anlık sıçrama ile karakterize edilen bir rastgele yürüyüş sürecidir.

Şu anda algoritma, belirli testlerde diğer algoritmalardan önemli ölçüde daha iyi performans göstererek ve diğer “disiplinlerde” de çok geride kalmayarak tablonun lideri konumundadır. Megacity ayrık fonksiyonunda 1000 argümanla elde edilen mükemmel sonuçlar, guguk kuşu aramasını yatırımcıların görevleri için (çoğu durumda ayrık olan) harika bir araç haline getirmektedir. Skin fonksiyonunda 1000 argümanla elde edilen mükemmel (ancak en iyisi değil) sonuçlar, algoritmanın özellikle sinir ağlarını ve genel olarak makine öğrenimini eğitmek için uygun olduğunu göstermektedir.

Avantajları:
1. Yüksek hız.
2. Çok yönlüdür. Algoritma çeşitli optimizasyon problemlerinde kullanılabilir.
3. Sadece yerel ekstremumlara odaklanmaz.
4. Hem düzgün hem de ayrık fonksiyonlar için iyi yakınsar.
5. Ölçeklenebilirdir.

Dezavantajları:
1. Çok sayıda ayar vardır.

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

Ekli dosyalar |
Forex ticaretinin arkasındaki temel matematik Forex ticaretinin arkasındaki temel matematik
Makale, Forex ticaretinin temel özelliklerini olabildiğince basit ve hızlı bir şekilde açıklamayı ve bazı temel fikirleri yeni başlayanlarla paylaşmayı amaçlamaktadır. Ayrıca, basit bir göstergenin nasıl geliştirileceği gösterilecek ve ticaret topluluğundaki en endişe verici sorular yanıtlanmaya çalışılacaktır.
Popülasyon optimizasyon algoritmaları: Gri kurt optimizasyonu (Grey Wolf Optimizer, GWO) Popülasyon optimizasyon algoritmaları: Gri kurt optimizasyonu (Grey Wolf Optimizer, GWO)
Bu makalede en yeni modern optimizasyon algoritmalarından biri olan gri kurt optimizasyonunu ele alacağız. Test fonksiyonları üzerindeki orijinal davranışı, bu algoritmayı daha önce incelenenler arasında en dikkat çekici olanlardan biri haline getirmektedir. Bu, sinir ağlarının, çok değişkenli düzgün fonksiyonların eğitiminde kullanılan en iyi algoritmalardan biridir.
Model aramada brute force yaklaşımı Model aramada brute force yaklaşımı
Bu makalede, piyasa modellerini arayacağız, belirlenen modellere dayalı Uzman Danışmanlar oluşturacağız ve bu modellerin geçerliliklerini koruyup korumadıklarını, ne kadar süreyle geçerli kaldıklarını kontrol edeceğiz.
VIDYA göstergesine dayalı bir ticaret sistemi nasıl geliştirilir? VIDYA göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?
En popüler teknik göstergelere dayalı ticaret sistemlerinin nasıl geliştirileceğine ilişkin serimizin yeni makalesine hoş geldiniz. Bu makalede, Variable Index Dynamic Average (VIDYA) teknik göstergesini konuk edeceğiz.