English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
Popülasyon optimizasyon algoritmaları: İstilacı yabancı ot optimizasyonu (Invasive Weed Optimization, IWO)

Popülasyon optimizasyon algoritmaları: İstilacı yabancı ot optimizasyonu (Invasive Weed Optimization, IWO)

MetaTrader 5Örnekler | 12 Mart 2024, 15:54
95 0
Andrey Dik
Andrey Dik

İçindekiler

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


1. Giriş

İstilacı yabancı ot metasezgisel algoritması, bir yabancı ot kolonisinin uyumluluğunu ve rastgeleliğini simüle ederek optimize edilen fonksiyonun genel optimumunu bulan popülasyon tabanlı bir optimizasyon algoritmasıdır.
Yabancı ot optimizasyon algoritması, doğadan ilham alan popülasyon algoritmalarındandır ve sınırlı bir alandaki yabancı otların sınırlı bir süre boyunca hayatta kalma mücadelesindeki davranışlarını yansıtır.

Yabancı otlar, saldırgan büyümeleriyle mahsuller için ciddi bir tehdit oluşturan güçlü otlardır. Çok dayanıklıdırlar ve çevresel değişikliklere adapte olabilirler. Bu özellikleri göz önünde bulundurarak güçlü bir optimizasyon algoritmasına sahibiz diyebiliriz. Bu algoritma, doğadaki yabancı otlar topluluğunun sağlamlığını, uyum sağlama yeteneğini ve rastgeleliğini taklit etmeye çalışır.

Yabancı otları bu kadar özel yapan şey nedir? Yabancı otlar ilk hareket edenler olma eğilimindedir ve çeşitli mekanizmalar aracılığıyla her yere yayılırlar. Bu nedenle, nadiren nesli tükenmekte olan türler kategorisine girerler.
Aşağıda yabancı otların doğaya uyum sağlama ve hayatta kalma yollarından sekiz tanesinin kısa açıklamaları yer almaktadır:

1. Evrensel genotip. Çalışmalar, küresel iklim değişikliğine yanıt olarak yabancı otlarda meydana gelen evrimsel değişiklikleri ortaya koymuştur.

2. Yaşam döngüsü stratejileri, üreme. Yabancı otlar çok çeşitli yaşam döngüsü stratejileri sergiler. Toprak işleme sistemleri değiştikçe, belirli bir ürün yetiştirme sisteminde daha önce önemli bir sorun olmayan yabancı otlar daha dirençli hale gelebilmektedir. Örneğin, azaltılmış toprak işleme sistemleri, farklı yaşam döngüsü stratejilerine sahip çok yıllık yabancı otların ortaya çıkmasına neden olmaktadır. Buna ek olarak, meydana gelen küresel iklim değişikliği, değişen koşullara yaşam süreçleri daha iyi adapte olan yabancı ot türleri veya genotipleri için yeni fırsatlar yaratmıştır. Artan karbondioksit emisyonlarına yanıt olarak yabancı otlar daha uzun, daha büyük ve daha güçlü hale gelmektedir, bu da daha fazla tohum oluşturabilecekleri ve aerodinamik özellikleri nedeniyle daha uzun bitkilerden daha uzağa yayılabilecekleri anlamına gelir. Üreme yetenekleri muazzamdır. Örneğin, eşek marulu 19.000'e kadar tohum üretebilir.

3. Hızlı evrim (çimlenme, basit büyüme, rekabet gücü, çiftleşme sistemi, tohum oluşturma ve dağılma özellikleri). Tohumları dağıtma yeteneğinin artması, buna eşlik eden dağılma ve büyümenin basitliği hayatta kalma fırsatları verir. Yabancı otlar toprak koşullarına karşı son derece duyarsızdır ve sıcaklık ve nemdeki keskin dalgalanmalara kararlılıkla dayanabilir.

4. Epigenetik. Hızlı evrime ek olarak, birçok istilacı bitki, gen ifadelerini değiştirerek değişen çevresel faktörlere hızlı bir şekilde yanıt verme yeteneğine sahiptir. Sürekli değişen bir ortamda, bitkilerin ışık, sıcaklık, su mevcudiyeti ve toprak tuzu seviyelerindeki dalgalanmalar gibi streslere dayanabilmeleri için esnek olmaları gerekir. Esnek olmak için, bitkiler kendi başlarına epigenetik modifikasyona uğrayabilirler.

5. Melezleşme. Melez yabancı ot türleri genellikle heterozis olarak da bilinen melez gücü sergiler. Yavrular, her iki ebeveyn türe kıyasla gelişmiş bir biyolojik işlev gösterir. Tipik olarak bir melez, yeni bölgelere yayılma ve istila edilen bölgelerde rekabet etme kabiliyetinin artmasıyla daha agresif bir büyüme gösterecektir.

6. Herbisitlere karşı direnç ve tolerans. Son birkaç on yılda çoğu yabancı otta herbisit direncinde keskin bir artış olmuştur.

7. Yabancı otların insan faaliyetleriyle ilişkili olarak evrimi. Herbisit uygulaması ve yabancı otların ayıklanması gibi yabancı ot kontrol uygulamaları nedeniyle yabancı otlar direnç mekanizmaları geliştirmiştir. Toprak işleme sırasında kültür bitkilerine kıyasla daha az zarar görürler. Aksine, bu zararlar genellikle vejetatif olarak üreyen yabancı otların (örneğin, kök veya rizom parçaları yoluyla çoğalanlar) çoğalması için faydalı bile olmaktadır.

8. Giderek sıklaşan küresel iklim değişiklikleri, yabancı otların "sera" kültür bitkilerine kıyasla daha yaşayabilir olması için bir fırsat sunmaktadır. Yabancı otlar tarıma büyük zarar verir. Yetişme koşulları açısından daha az talepkar olduklarından, büyüme ve gelişme bakımından kültür bitkilerini geride bırakırlar. Nemi, besin maddelerini ve güneş ışığını emen yabancı otlar verimi keskin bir şekilde düşürür, tarla ürünlerinin hasadını ve harmanlanmasını zorlaştırır ve ürün kalitesini kötüleştirir.

2. Algoritma tanımı

İstilacı yabancı ot algoritması, yabancı otların doğadaki büyüme sürecinden esinlenmiştir. Bu yöntem Mehrabian ve Lucas tarafından 2006 yılında tanıtılmıştır. Doğal olarak yabancı otlar güçlü bir şekilde büyür ve bu güçlü büyüme faydalı bitkiler için ciddi bir tehdit oluşturur. Yabancı otların önemli bir özelliği, IWO algoritmasının optimizasyonunun temelini oluşturan doğadaki dirençleri ve yüksek adaptasyon kabiliyetleridir. Bu algoritma, verimli optimizasyon yaklaşımları için bir temel olarak kullanılabilir.

IWO, yabancı otların kolonileşme davranışını taklit eden sürekli bir stokastik sayısal algoritmadır. İlk olarak, başlangıç tohum popülasyonu tüm arama uzayına rastgele dağıtılır. Bu yabancı otlar sonunda büyüyecek ve algoritmanın diğer adımlarını gerçekleştirecektir. Algoritma, yalancı kod olarak gösterilebilecek yedi adımdan oluşmaktadır:

1. Tohumları rastgele ek
2. FF’i hesapla
3. Yabancı otlardan tohumları ek
4. FF’i hesapla
5. Yavru yabancı otları ebeveyn yabancı otlarla birleştir
6. Tüm yabancı otları sırala
7. Durma koşulu karşılanana kadar 3. adımdan itibaren tekrarla

Blok diyagramı, algoritmanın bir yinelemedeki çalışmasını temsil etmektedir. IWO çalışmaya tohum başlatma işlemi ile başlar. Tohumlar, arama alanının "tarlasına" rastgele ve eşit olarak dağıtılır. Sonrasında, tohumların çimlendiğini ve uygunluk fonksiyonu tarafından değerlendirilmesi gereken yetişkin bitkiler oluşturduğunu varsayarız.

Bir sonraki adımda, her bitkinin uygunluğunu bilerek, yabancı otların tohumlar yoluyla çoğalmasına izin verebiliriz; burada tohum sayısı uygunlukla orantılıdır. Daha sonra çimlenen tohumları ebeveyn bitkilerle birleştirip sıralıyoruz. Genel olarak, istilacı yabancı ot algoritmasının kodlanması, değiştirilmesi ve üçüncü taraf uygulamalarla birlikte kullanılması basit olarak kabul edilebilir.

scheme

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

Yabancı ot algoritmasının özelliklerinin değerlendirilmesine geçelim. Yabancı otların hayatta kalmaya yönelik adaptasyon özelliklerinin çoğuna sahiptir. Genetik, arı ve diğer bazı algoritmaların aksine bir yabancı ot kolonisinin ayırt edici özelliği, istisnasız olarak kolonideki tüm bitkiler tarafından tohum ekiminin garanti olmasıdır. Bu, en kötü adapte olmuş bitkilerin bile yavru bırakmasını mümkün kılar, çünkü her zaman en kötü olanın global ekstremuma en yakın olma olasılığı sıfır değildir.

Daha önce de söylediğim gibi, yabancı otların her biri mümkün olan minimum miktardan mümkün olan maksimum miktara kadar olan aralıkta tohum üretir (algoritmanın dış parametreleri). Doğal olarak, bu koşullar altında, her bitki en az bir veya daha fazla tohum bıraktığında, ebeveyn bitkilerden daha fazla yavru bitki olacaktır - bu özellik kodda ilginç bir şekilde uygulanmıştır ve aşağıda tartışılacaktır. Algoritma genel hatlarıyla Şekil 2'de görsel olarak sunulmuştur. Ebeveyn bitkiler, tohumları uygunluklarıyla orantılı olarak saçar.

Yani 1 numaradaki en iyi bitki 6 tohum eker ve 6 numaradaki bitki sadece bir tohum (garantili olan) eker. Çimlenen tohumlar, daha sonra ebeveyn tohumlarla birlikte sıralanan bitkiler üretir. Bu, hayatta kalmanın bir taklididir. Sıralanan tüm gruptan yeni ebeveyn bitkiler seçilir ve yaşam döngüsü bir sonraki yinelemede tekrarlanır. Algoritma, "aşırı nüfus" ve tohum ekme yeteneğinin eksik gerçekleştirilmesi sorunlarını çözme mekanizmasına sahiptir.

Örneğin, algoritma parametrelerinden biri olan tohum sayısını 50 ve ebeveyn bitki sayısını 5 olarak alalım, minimum tohum sayısı 1 iken maksimum tohum sayısı 6'dır. Bu durumda, 5 * 6 = 30, yani 50'den küçüktür. Bu örnekten de görebileceğimiz gibi, ekim olanakları tam olarak gerçekleşmemiştir. Bu durumda, bir yavru bırakma hakkı, tüm ebeveyn bitkilerde izin verilen maksimum yavru sayısına ulaşılana kadar listedeki bir sonrakine geçer. Listenin sonuna ulaşıldığında, hak listenin ilk sırasına gider ve sınırı aşan bir yavru bırakmasına izin verilir. 

IWO

Şekil 2. IWO algoritması çalışması. Yavru sayısı ebeveynin uygunluğu ile orantılıdır

Dikkat edilmesi gereken bir sonraki husus tohum dağılımıdır. Algoritmadaki tohum dağılımı, yineleme sayısı ile orantılı olarak azalan doğrusal bir fonksiyondur. Dış dağılım parametreleri tohum dağılımının alt ve üst sınırlarıdır. Böylece, yinelemelerdeki artışla birlikte tohumlama yarıçapı azalır ve bulunan ekstremumlar iyileştirilir. Algoritma yazarlarının önerisine göre normal tohum dağılımı uygulanmalıdır, ancak ben hesaplamaları basitleştirdim ve kübik fonksiyon uyguladım. Yineleme sayısına göre dağılım fonksiyonu Şekil 3'te görülebilir.

disp

Şekil 3. Dağılımın yineleme sayısına bağımlılığı (maksimum sınır 3 ve minimum sınır 2'dir)

Şimdi IWO koduna geçelim. Kodun yürütülmesi basit ve hızlıdır.

Algoritmanın en basit birimi (temsilci) "yabancı ot"tur. Ayrıca yabancı otun tohumlarını da tanımlayacaktır. Bu, sıralama için aynı veri türünü kullanmamızı sağlayacaktır. Yapı, bir koordinat dizisi, uygunluk fonksiyonunun değerini saklamak için bir değişken ve tohumların (yavruların) sayısı için bir sayaçtan oluşur. Bu sayaç, her bitki için izin verilen minimum ve maksimum tohum sayısını kontrol etmemize olanak tanıyacaktır.

//——————————————————————————————————————————————————————————————————————————————
struct S_Weed
{
  double c []; //coordinates
  double f;    //fitness
  int    s;    //number of seeds
};
//——————————————————————————————————————————————————————————————————————————————

Ebeveynleri uygunluklarıyla orantılı olarak seçme olasılık fonksiyonunu uygulamak için bir yapıya ihtiyacımız olacaktır. Bu durumda, daha önce arı kolonisi algoritmasında gördüğümüz rulet prensibi uygulanır. 'start' ve 'end' değişkenleri olasılık alanının başlangıcından ve sonundan sorumludur.

//——————————————————————————————————————————————————————————————————————————————
struct S_WeedFitness
{
  double start;
  double end;
};
//——————————————————————————————————————————————————————————————————————————————

Yabancı ot algoritmasının sınıfını bildirelim. İçerisinde, ihtiyacımız olan tüm gerekli değişkenleri bildiririz - optimize edilen parametrelerin sınırları ve adımı, yabancı otları tanımlayan dizi, tohum dizisi, en iyi global koordinatlar dizisi ve algoritma tarafından elde edilen en iyi uygunluk fonksiyonu değeri. Ayrıca ilk yinelemenin 'sowing' bayrağına ve algoritma parametrelerinin sabit değişkenlerine de ihtiyacımız vardır.

//——————————————————————————————————————————————————————————————————————————————
class C_AO_IWO
{
  //============================================================================
  public: double rangeMax  []; //maximum search range
  public: double rangeMin  []; //manimum search range
  public: double rangeStep []; //step search
  public: S_Weed weeds     []; //weeds
  public: S_Weed weedsT    []; //temp weeds
  public: S_Weed seeds     []; //seeds
  public: double cB        []; //best coordinates
  public: double fB;           //fitness of the best coordinates

  public: void Init (const int    coordinatesP,      //Number of coordinates
                     const int    numberSeedsP,      //Number of seeds
                     const int    numberWeedsP,      //Number of weeds
                     const int    maxNumberSeedsP,   //Maximum number of seeds per weed
                     const int    minNumberSeedsP,   //Minimum number of seeds per weed
                     const double maxDispersionP,    //Maximum dispersion
                     const double minDispersionP,    //Minimum dispersion
                     const int    maxIterationP);    //Maximum iterations

  public: void Sowing      (int iter);
  public: void Germination ();

  //============================================================================
  private: void   Sorting        ();
  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: double vec [];            //Vector
  private: int    ind [];
  private: double val [];
  private: S_WeedFitness wf [];      //Weed fitness
  private: bool   sowing;            //Sowing
  private: int    coordinates;       //Coordinates number
  private: int    numberSeeds;       //Number of seeds
  private: int    numberWeeds;       //Number of weeds
  private: int    totalNumWeeds;     //Total number of weeds
  private: int    maxNumberSeeds;    //Maximum number of seeds
  private: int    minNumberSeeds;    //Minimum number of seeds
  private: double maxDispersion;     //Maximum dispersion
  private: double minDispersion;     //Minimum dispersion
  private: int    maxIteration;      //Maximum iterations
};
//——————————————————————————————————————————————————————————————————————————————

Başlatma fonksiyonunun public metodunda, sabit değişkenlere değerler atarız ve algoritmanın girdi parametrelerini geçerli değerler için kontrol ederiz, böylece ebeveyn bitkilerin tohumların mümkün olan minimum değeri ile çarpımı toplam tohum sayısını aşamaz. Sıralama yapılacak diziyi belirlemek için ebeveyn bitkilerin ve tohumların toplamına ihtiyaç duyulacaktır.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_IWO::Init (const int    coordinatesP,      //Number of coordinates
                     const int    numberSeedsP,      //Number of seeds
                     const int    numberWeedsP,      //Number of weeds
                     const int    maxNumberSeedsP,   //Maximum number of seeds per weed
                     const int    minNumberSeedsP,   //Minimum number of seeds per weed
                     const double maxDispersionP,    //Maximum dispersion
                     const double minDispersionP,    //Minimum dispersion
                     const int    maxIterationP)     //Maximum iterations
{
  MathSrand (GetTickCount ());
  sowing = false;
  fB     = -DBL_MAX;

  coordinates    = coordinatesP;
  numberSeeds    = numberSeedsP;
  numberWeeds    = numberWeedsP;
  maxNumberSeeds = maxNumberSeedsP;
  minNumberSeeds = minNumberSeedsP;
  maxDispersion  = maxDispersionP;
  minDispersion  = minDispersionP;
  maxIteration   = maxIterationP;


  if (minNumberSeeds < 1) minNumberSeeds = 1;
  if (numberWeeds * minNumberSeeds > numberSeeds) numberWeeds = numberSeeds / minNumberSeeds;
  else numberWeeds = numberWeedsP;

  totalNumWeeds  = numberWeeds + numberSeeds;

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

  ArrayResize (weeds,  totalNumWeeds);
  ArrayResize (weedsT, totalNumWeeds);
  ArrayResize (seeds,  numberSeeds);

  for (int i = 0; i < numberWeeds; i++)
  {
    ArrayResize (weeds  [i].c, coordinates);
    ArrayResize (weedsT [i].c, coordinates);
    weeds [i].f = -DBL_MAX;
    weeds [i].s = 0;
  }
  for (int i = 0; i < numberSeeds; i++)
  {
    ArrayResize (seeds [i].c, coordinates);
    seeds [i].s = 0;
  }

  ArrayResize (ind, totalNumWeeds);
  ArrayResize (val, totalNumWeeds);

  ArrayResize (wf, numberWeeds);
}
//——————————————————————————————————————————————————————————————————————————————

Sowing ()’in her yinelemesinde çağrılan ilk public metot. Algoritmanın ana mantığını içerir. Anlama kolaylığı açısından metodu birkaç bölüme ayıracağım.

Algoritma ilk yinelemedeyken, arama uzayı boyunca tohumların ekilmesi gerekir. Bu genellikle rastgele ve eşit bir şekilde yapılır. Optimize edilen parametrelerin kabul edilebilir değerleri aralığında rastgele sayılar ürettikten sonra, elde edilen değerlerin aralığın dışına çıkıp çıkmadığını kontrol ederiz ve algoritma parametreleri tarafından tanımlanan ayrıklığı ayarlarız. Burada ayrıca, kodun ilerleyen kısımlarında tohum ekerken ihtiyaç duyacağımız bir dağılım vektörünü de atarız. Tohum uygunluk değerlerini minimum double değerle başlatıyoruz ve tohum sayacını sıfırlıyoruz (tohumlar, tohum sayacını kullanacak bitkiler haline gelecektir).

//the first sowing of seeds---------------------------------------------------
if (!sowing)
{
  fB = -DBL_MAX;

  for (int s = 0; s < numberSeeds; s++)
  {
    for (int c = 0; c < coordinates; c++)
    {
      seeds [s].c [c] = RNDfromCI (rangeMin [c], rangeMax [c]);
      seeds [s].c [c] = SeInDiSp (seeds [s].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);

      vec [c] = rangeMax [c] - rangeMin [c];
    }

    seeds [s].f = -DBL_MAX;
    seeds [s].s = 0;
  }

  sowing = true;
  return;
}

Kodun bu bölümünde, dağılım mevcut yinelemeye bağlı olarak hesaplanır. Daha önce bahsettiğimiz her ebeveyn yabancı ot için garantili minimum tohum sayısı burada uygulanmaktadır. Minimum tohum sayısının garanti edilmesi iki döngü ile sağlanacaktır; bunlardan ilkinde ebeveyn bitkileri sıralayacağız ve ikincisinde tohum sayacını artırırken yeni tohumlar üreteceğiz. Gördüğümüz gibi, yeni bir yavru oluşturmanın anlamı, daha önce hesaplanan ana koordinat varyansına sahip kübik bir fonksiyonun dağılımıyla rastgele bir sayıyı artırmaktır. Yeni koordinatın elde edilen değerini kabul edilebilir değerler için kontrol ederiz ve ayrıklığı atarız.

//guaranteed sowing of seeds by each weed-------------------------------------
int    pos = 0;
double r   = 0.0;
double dispersion = ((maxIteration - iter) / (double)maxIteration) * (maxDispersion - minDispersion) + minDispersion;

for (int w = 0; w < numberWeeds; w++)
{
  weeds [w].s = 0;

  for (int s = 0; s < minNumberSeeds; s++)
  {
    for (int c = 0; c < coordinates; c++)
    {
      r = RNDfromCI (-1.0, 1.0);
      r = r * r * r;

      seeds [pos].c [c] = weeds [w].c [c] + r * vec [c] * dispersion;
      seeds [pos].c [c] = SeInDiSp (seeds [pos].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
    }

    pos++;
    weeds [w].s++;
  }
}

Bu kodla, rulet prensibine göre uygunlukla orantılı olarak ebeveyn bitkilerin her biri için olasılık alanları sağlayacağız. Yukarıdaki kod, her bir bitki için garantili sayıda tohum sağlar, burada tohum sayısı rastgele bir yasaya tabidir; bu nedenle yabancı ot ne kadar adapteyse, o kadar çok tohum bırakabilir ve bunun tersi de geçerlidir. Bitki ne kadar az adapteyse, o kadar az tohum üretecektir.

//============================================================================
//sowing seeds in proportion to the fitness of weeds--------------------------

//the distribution of the probability field is proportional to the fitness of weeds
wf [0].start = weeds [0].f;
wf [0].end   = wf [0].start + (weeds [0].f - weeds [numberWeeds - 1].f);

for (int f = 1; f < numberWeeds; f++)
{
  if (f != numberWeeds - 1)
  {
    wf [f].start = wf [f - 1].end;
    wf [f].end   = wf [f].start + (weeds [f].f - weeds [numberWeeds - 1].f);
  }
  else
  {
    wf [f].start = wf [f - 1].end;
    wf [f].end   = wf [f].start + (weeds [f - 1].f - weeds [f].f) * 0.1;
  }
}

Elde edilen olasılık alanlarına dayanarak, bir yavru bırakma hakkına sahip olan ebeveyn bitkiyi seçiyoruz. Tohum sayacı izin verilen maksimum değere ulaştıysa, hak sıralı listedeki bir sonrakine geçer. Listenin sonuna ulaşıldığında, hak bir sonrakine geçmez, listenin ilk sırasındakine geçer. Daha sonra, hesaplanan dağılım ile yukarıda açıklanan kurala göre bir yavru bitki oluşturulur.

bool seedingLimit = false;
int  weedsPos = 0;

for (int s = pos; s < numberSeeds; s++)
{
  r = RNDfromCI (wf [0].start, wf [numberWeeds - 1].end);

  for (int f = 0; f < numberWeeds; f++)
  {
    if (wf [f].start <= r && r < wf [f].end)
    {       
      weedsPos = f;
      break;
    }
  }

  if (weeds [weedsPos].s >= maxNumberSeeds)
  {
    seedingLimit = false;
    while (!seedingLimit)
    {
      weedsPos++;
      if (weedsPos >= numberWeeds)
      {
        weedsPos = 0;
        seedingLimit = true;
      }
      else
      {
        if (weeds [weedsPos].s < maxNumberSeeds)
        {
          seedingLimit = true;
        }
      }
    }
  }

  for (int c = 0; c < coordinates; c++)
  {
    r = RNDfromCI (-1.0, 1.0);
    r = r * r * r;

    seeds [s].c [c] = weeds [weedsPos].c [c] + r * vec [c] * dispersion;
    seeds [s].c [c] = SeInDiSp (seeds [s].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
  }

  seeds [s].s = 0;
  weeds [weedsPos].s++;
}

İkinci public metot, her yinelemede zorunludur ve her yavru yabancı ot için uygunluk fonksiyonu hesaplandıktan sonra gereklidir. Sıralamayı uygulamadan önce, çimlenmiş tohumları listenin sonundaki ebeveyn bitkilerle ortak bir diziye yerleştiririz, böylece önceki yinelemeden hem yavruları hem de ebeveynleri içerebilen önceki neslin yerini alacaktır. Böylece, doğada olduğu gibi zayıf adapte olmuş yabancı otları yok ediyoruz. Sonrasında sıralamayı uygularız. Ortaya çıkan listedeki ilk yabancı ot, gerçekten daha iyiyse global olarak elde edilen en iyi çözümü güncellemeye değer olacaktır.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_IWO::Germination ()
{
  for (int s = 0; s < numberSeeds; s++)
  {
    weeds [numberWeeds + s] = seeds [s];
  }

  Sorting ();

  if (weeds [0].f > fB) fB = weeds [0].f;
}
//——————————————————————————————————————————————————————————————————————————————


3. Test sonuçları

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

2023.01.13 18:12:29.880    Test_AO_IWO (EURUSD,M1)    C_AO_IWO:50;12;5;2;0.2;0.01
2023.01.13 18:12:29.880    Test_AO_IWO (EURUSD,M1)    =============================
2023.01.13 18:12:32.251    Test_AO_IWO (EURUSD,M1)    5 Rastrigin's; Func runs 10000 result: 79.71791976868334
2023.01.13 18:12:32.251    Test_AO_IWO (EURUSD,M1)    Score: 0.98775
2023.01.13 18:12:36.564    Test_AO_IWO (EURUSD,M1)    25 Rastrigin's; Func runs 10000 result: 66.60305588198622
2023.01.13 18:12:36.564    Test_AO_IWO (EURUSD,M1)    Score: 0.82525
2023.01.13 18:13:14.024    Test_AO_IWO (EURUSD,M1)    500 Rastrigin's; Func runs 10000 result: 45.4191288396659
2023.01.13 18:13:14.024    Test_AO_IWO (EURUSD,M1)    Score: 0.56277
2023.01.13 18:13:14.024    Test_AO_IWO (EURUSD,M1)    =============================
2023.01.13 18:13:16.678    Test_AO_IWO (EURUSD,M1)    5 Forest's; Func runs 10000 result: 1.302934874807614
2023.01.13 18:13:16.678    Test_AO_IWO (EURUSD,M1)    Score: 0.73701
2023.01.13 18:13:22.113    Test_AO_IWO (EURUSD,M1)    25 Forest's; Func runs 10000 result: 0.5630336066477166
2023.01.13 18:13:22.113    Test_AO_IWO (EURUSD,M1)    Score: 0.31848
2023.01.13 18:14:05.092    Test_AO_IWO (EURUSD,M1)    500 Forest's; Func runs 10000 result: 0.11082098547471195
2023.01.13 18:14:05.092    Test_AO_IWO (EURUSD,M1)    Score: 0.06269
2023.01.13 18:14:05.092    Test_AO_IWO (EURUSD,M1)    =============================
2023.01.13 18:14:09.102    Test_AO_IWO (EURUSD,M1)    5 Megacity's; Func runs 10000 result: 6.640000000000001
2023.01.13 18:14:09.102    Test_AO_IWO (EURUSD,M1)    Score: 0.55333
2023.01.13 18:14:15.191    Test_AO_IWO (EURUSD,M1)    25 Megacity's; Func runs 10000 result: 2.6
2023.01.13 18:14:15.191    Test_AO_IWO (EURUSD,M1)    Score: 0.21667
2023.01.13 18:14:55.886    Test_AO_IWO (EURUSD,M1)    500 Megacity's; Func runs 10000 result: 0.5668
2023.01.13 18:14:55.886    Test_AO_IWO (EURUSD,M1)    Score: 0.04723

Algoritmanın test fonksiyonları üzerindeki yüksek sonuçlarını fark etmek için hızlı bir bakış yeterlidir. Düzgün fonksiyonlar üzerinde çalışmak için gözle görülür bir tercih vardır, ancak şimdiye kadar dikkate alınan algoritmaların hiçbiri ayrık fonksiyonlar üzerinde düzgün olanlardan daha iyi yakınsama göstermemiştir, bu da istisnasız tüm algoritmalar için Forest ve Megacity fonksiyonlarının karmaşıklığı ile açıklanmaktadır. Er ya da geç, testler sırasında ayrık fonksiyonları düzgün fonksiyonlardan daha iyi çözecek bir algoritma elde etmemiz muhtemeldir.


rastrigin

  Rastrigin test fonksiyonu üzerinde IWO

forest

Forest test fonksiyonu üzerinde IWO

mega

Megacity test fonksiyonu üzerinde IWO

İstilacı yabancı ot algoritması, özellikle 10 ve 50 parametreli düzgün Rastrigin fonksiyonu üzerinde olmak üzere çoğu testte etkileyici sonuçlar göstermiştir. Performansı sadece 1000 parametreli testte biraz düşmüştür, bu da genel olarak düzgün fonksiyonlarda iyi performansa işaret etmektedir. Bu, algoritmayı karmaşık düzgün fonksiyonlar ve sinir ağları için önermemi sağlıyor. Forest fonksiyonunda, algoritma 10 parametre ile ilk testte iyi sonuçlar göstermiş, ancak yine de genel olarak ortalama sonuçlar vermiştir. Megacity ayrık fonksiyonunda ise istilacı yabancı ot algoritması ortalamanın üzerinde performans göstermiş, özellikle 1000 değişkenli testte mükemmel ölçeklenebilirlik göstererek birinciliği ateş böceği algoritmasına kaptırmış, ancak 10 ve 50 parametreli testlerde ondan önemli ölçüde daha iyi performans göstermiştir.

İstilacı yabancı ot algoritması oldukça fazla sayıda parametreye sahip olsa da, parametreler çok anlaşılır olduğundan ve kolayca yapılandırılabildiğinden bu bir dezavantaj olarak görülmemelidir. Buna ek olarak, algoritmada yapılan ince ayarlar genellikle sadece ayrık fonksiyon test sonuçlarını etkilerken, düzgün fonksiyon üzerindeki sonuçlar iyi kalmaktadır.

Test fonksiyonlarının görselleştirilmesinde, algoritmanın arama uzayının belirli kısımlarını izole etme ve keşfetme yeteneği, tıpkı arı algoritmasında ve bazı diğerlerinde olduğu gibi açıkça görülebilir. Her ne kadar bazı yayınlarda algoritmanın takılmaya eğilimli olduğu ve zayıf arama yeteneklerine sahip olduğu belirtilse de. Algoritmanın global ekstremuma bir referansı ve yerel tuzaklardan "atlama" mekanizmaları olmamasına rağmen, IWO bir şekilde Forest ve Megacity gibi karmaşık fonksiyonlar üzerinde yeterince çalışmayı başarmaktadır. Ayrık bir fonksiyon üzerinde çalışırken, ne kadar çok optimize edilen parametre olursa, sonuçlar o kadar istikrarlı olmaktadır.

Tohum dağılımı her yinelemede doğrusal olarak azaldığından, ekstremumu iyileştirme optimizasyonun sonuna doğru daha da artar. Bana göre, bu tamamen optimal değildir, çünkü algoritmanın keşif yetenekleri zaman içerisinde eşit olmayan bir şekilde dağılmaktadır, bunu test fonksiyonlarının görselleştirilmesinde sabit beyaz gürültü olarak fark edebiliriz. Ayrıca, aramanın düzensizliği test ortamı penceresinin sağ kısmındaki yakınsama grafikleri ile değerlendirilebilir. Optimizasyonun başlangıcında, neredeyse tüm algoritmalar için tipik olan bir miktar yakınsama ivmesi gözlenmektedir. Keskin bir başlangıçtan sonra, optimizasyonun çoğu için yakınsama yavaşlamaktadır. Sadece sona yaklaştıkça önemli bir yakınsama ivmesi görebiliyoruz. Dağılımdaki dinamik değişim, daha ayrıntılı çalışmalar ve deneyler için bir nedendir. Zira yineleme sayısının daha fazla olması durumunda yakınsamanın devam edebileceğini görebiliyoruz. Ancak, objektifliği ve pratik geçerliliği korumak amacıyla yapılan karşılaştırmalı testlerde sınırlamalar vardır. 

Nihai derecelendirme tablosuna geçelim. Tablo, IWO'nun şu anda lider olduğunu göstermektedir. Algoritma dokuz testten ikisinde en iyi sonuçları göstermiştir, geri kalanında ise sonuçlar ortalamadan çok daha iyidir, bu nedenle nihai sonuç 100 puandır. Modifiye karınca kolonisi algoritması (ACOm) ikinci sırada gelmektedir. Yapılan 9 testin 5'inde en iyisi olmaya devam ediyor.

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)

IWO

İstilacı yabancı ot optimizasyonu

1.00000

1.00000

0.33519

2.33519

0.79937

0.46349

0.41071

1.67357

0.75912

0.44903

0.94088

2.14903

100.000

ACOm

Karınca kolonisi optimizasyonu (m)

0.36118

0.26810

0.17991

0.80919

1.00000

1.00000

1.00000

3.00000

1.00000

1.00000

0.10959

2.10959

95.996

COAm

Guguk kuşu optimizasyon algoritması (m)

0.96423

0.69756

0.28892

1.95071

0.64504

0.34034

0.21362

1.19900

0.67153

0.34273

0.45422

1.46848

74.204

FAm

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

0.62430

0.50653

0.18102

1.31185

0.55408

0.42299

0.64360

1.62067

0.21167

0.28416

1.00000

1.49583

71.024

BA

Yarasa algoritması

0.42290

0.95047

1.00000

2.37337

0.17768

0.17477

0.33595

0.68840

0.15329

0.07158

0.46287

0.68774

59.650

ABC

Yapay arı kolonisi

0.81573

0.48767

0.22588

1.52928

0.58850

0.21455

0.17249

0.97554

0.47444

0.26681

0.35941

1.10066

57.237

FSS

Balık sürüsü arama

0.48850

0.37769

0.11006

0.97625

0.07806

0.05013

0.08423

0.21242

0.00000

0.01084

0.18998

0.20082

20.109

PSO

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

0.21339

0.12224

0.05966

0.39529

0.15345

0.10486

0.28099

0.53930

0.08028

0.02385

0.00000

0.10413

14.232

RND

Rastgele

0.17559

0.14524

0.07011

0.39094

0.08623

0.04810

0.06094

0.19527

0.00000

0.00000

0.08904

0.08904

8.142

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


İstilacı yabancı ot algoritması global arama için harikadır. Bu algoritma, popülasyonun en iyi üyesi kullanılmamasına ve yerel ekstremumlarda potansiyel takılmaya karşı koruma mekanizmaları olmamasına rağmen iyi bir performans göstermektedir. Algoritmada keşif ve sömürü arasında bir denge yoktur, ancak bu durum algoritmanın doğruluğunu ve hızını olumsuz etkilememektedir. Bu algoritmanın başka dezavantajları da vardır. Optimizasyon boyunca aramanın eşit olmayan performansı, yukarıda dile getirilen sorunların çözülebilmesi halinde IWO'nun performansının potansiyel olarak daha yüksek olabileceğini göstermektedir.

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

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

İstilacı yabancı ot optimizasyonu (IWO) algoritmasının özelliklerine ilişkin sonuçlar:

Avantajları:
1. Yüksek hız.
2. Algoritma, hem düzgün hem de ayrık çeşitli fonksiyon türleriyle iyi çalışmaktadır.
3. İyi ölçeklenebilirlik.

Dezavantajları:
1. Çok sayıda parametre (her ne kadar kendi kendilerini açıklıyor olsalar da).


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

Ekli dosyalar |
Fractals göstergesine dayalı bir ticaret sistemi nasıl geliştirilir? Fractals göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?
En popüler teknik göstergelere dayalı ticaret sistemleri tasarladığımız serimizin yeni makalesindeyiz. Bu makalede Fractals göstergesini ve ona dayalı olarak MetaTrader 5 terminalinde yürütülecek bir ticaret sisteminin nasıl geliştirileceğini öğreneceğiz.
ONNX modellerinin regresyon metrikleri kullanılarak değerlendirilmesi ONNX modellerinin regresyon metrikleri kullanılarak değerlendirilmesi
Regresyon, etiketlenmemiş bir örnekten gerçek değeri tahmin etme görevidir. Regresyon metrikleri, regresyon modeli tahminlerinin doğruluğunu değerlendirmek için kullanılır.
Sıfırdan bir ticaret Uzman Danışmanı geliştirme (Bölüm 26): Geleceğe doğru (I) Sıfırdan bir ticaret Uzman Danışmanı geliştirme (Bölüm 26): Geleceğe doğru (I)
Bugün emir sistemimizi bir üst seviyeye taşıyacağız. Ancak önce üzerinde durmamız gereken birkaç şey var. Şimdi, nasıl ticaret yapmak istediğimizle ilgili bazı çözülmesi gereken konulara odaklanacağız.
ONNX modellerini sınıflara sarma ONNX modellerini sınıflara sarma
Nesne yönelimli programlama, okunması ve değiştirilmesi kolay olan daha kompakt bir kod oluşturulmasını sağlar. Burada üç ONNX modeli için örneğe bir göz atacağız.