Popülasyon optimizasyon algoritmaları: Yarasa algoritması (Bat Algorithm, BA)
İç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.
Ş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.
Ş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.
Ş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 test fonksiyonu üzerinde BA
Forest test fonksiyonu üzerinde BA
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ı:
Ş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
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz