"Popülasyon optimizasyon algoritmaları: Fidan dikimi ve büyütme (Saplings Sowing and Growing up, SSG)" makalesi için tartışma - sayfa 12
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Evet, çok ilginç bir organizma.))
Ancak, sümüklü böcek sadece 2 boyut kullanır ve en basit AO'lar bile 2 boyutla başa çıkabilir. 1000 boyutta nasıl davranacağı büyük bir sorudur, çünkü sorunun karmaşıklığı boyut sayısı ile doğrusal olmayan bir şekilde artar.
Slime Mould Algoritması, slime küflerinin davranışına dayanan sezgisel bir optimizasyon yöntemidir. Bu algoritma Chiaro D'Ambrosio tarafından geliştirilmiştir ve "doğal" optimizasyon algoritmaları grubuna aittir.
Algoritmanın özü, belirli bir noktaya bir "sümüklü böcek" yerleştirmek ve maksimum yiyecek arayışı içinde bu noktanın etrafında nasıl yayıldığını gözlemlemektir. Bu algoritma sırasında, sümüklü böcek arkasında yavaş yavaş buharlaşan bir iz bırakır. Bir bölgede ne kadar çok iz bırakılırsa, başka bir "sümüklüböceğin" bu izi daha yüksek bir yiyecek konsantrasyonuna giden bir yol olarak benimseme olasılığı o kadar artar.
Optimizasyon bağlamında, bu sümüklü böcek davranışı parametre uzaylarında en uygun çözümleri bulmak için kullanılır. Örneğin, bu algoritmayı verilen parametre sınırları dahilinde bir fonksiyonun minimum değerini bulmak için kullanabiliriz.
Bu algoritmanın avantajları basitliği ve çok boyutlu uzaylarda optimum çözümlere hızlı bir şekilde yakınsama yeteneğidir. Bununla birlikte, daha karmaşık ve doğrusal olmayan problemlerde optimum çözüme yakınsama konusunda sorunlar yaşayabilir.
Karınca algoritması aynıdır, ancak çok boyutlu durumlar için genelleştirilmiştir.
Karıncanın yakınsaması artan boyutlulukla azalır, hızla azalır. tüm algoritmalar genel olarak aynı şekilde davranır. arama stratejisine bağlıdır ve sümüklüböceğin stratejisini bilmiyoruz)))).
artan boyutluluk ile yakınsama karmaşıklık artışından daha yavaş düşer - AO ölçeklenebilirliğini düşünüyorum. ölçeklenebilirlik fonksiyonun türüne bağlıdır, farklı algoritmalar farklı fonksiyonlarda farklı şekilde ölçeklenir.
Slime Mould Algoritması, slime küflerinin davranışına dayanan sezgisel bir optimizasyon yöntemidir. Bu algoritma Chiaro D'Ambrosio tarafından geliştirilmiştir ve "doğal" optimizasyon algoritmaları grubuna aittir.
Algoritmanın özü, belirli bir noktaya bir "sümüklü böcek" yerleştirmek ve maksimum yiyecek arayışı içinde bu noktanın etrafında nasıl yayıldığını gözlemlemektir. Bu algoritma sırasında, sümüklü böcek arkasında yavaş yavaş buharlaşan bir iz bırakır. Bir bölgede ne kadar çok iz bırakılırsa, başka bir "sümüklüböceğin" bu izi daha yüksek bir yiyecek konsantrasyonuna giden bir yol olarak benimseme olasılığı o kadar artar.
Optimizasyon bağlamında, bu sümüklü böcek davranışı parametre uzaylarında en uygun çözümleri bulmak için kullanılır. Örneğin, bu algoritmayı verilen parametre sınırları dahilinde bir fonksiyonun minimum değerini bulmak için kullanabiliriz.
Bu algoritmanın avantajları basitliği ve çok boyutlu uzaylarda optimum çözümlere hızlı bir şekilde yakınsama yeteneğidir. Bununla birlikte, daha karmaşık ve doğrusal olmayan problemlerde optimum çözüme yakınsama konusunda da sorunlar yaşayabilir.
vay canına, ne kadar ilginç. bu algo'yu arayacağım, tabii ki parçalara ayırmak ilginç. ve bir araya getirmek)))))))
vay canına, ne kadar ilginç. bu algo'yu arayacağım, tabii ki parçalara ayırmak ilginç. ve bir araya getirmek))))))
İşte MQL programlama dilinde sümüklü böcek algoritmasının uygulanmasına bir örnek:
```
double slimeMouldAlgorithm(double(*f)(double[]), double x[], int n, double LB[], double UB[], int maxIter, int N)
{
const double k = 0.1; // iz buharlaşma katsayısı
const double stepSize = 0.001; // "sümüklü böcek" hareket adımının boyutu
double iz[N]; // her parçacığın izlerinin dizisi
double bestTrail[N]; // en iyi iz dizisi
double bestFitness = DBL_MAX; // en iyi uygunluk fonksiyonunun başlangıç değeri
double bestX[N]; // en iyi ize karşılık gelen parametre değerleri dizisi
for (int i = 0; i < N; i++) {
for (int j = 0; j < n; j++) {
x[j] = LB[j] + (UB[j] - LB[j]) * (double)rand() / RAND_MAX; // "slug "ları belirtilen parametre aralığına rastgele yerleştirin
}
iz[i] = f(x); // bu parametreler için uygunluk fonksiyonunun değerini hesaplayın
if (trail[i] < bestFitness) { // uygunluk fonksiyonu değeri mevcut en iyi değerden daha iyiyse, bunu yeni en iyi değer olarak saklayın
bestFitness = iz[i];
memcpy(bestX, x, sizeof(bestX)); // bulunan parametrelerin değerlerini en iyi değerler dizisine kopyalayın
memcpy(bestTrail, trail, sizeof(bestTrail)); // bulunan parametreler için fonksiyon değerlerini en iyi fonksiyon değerleri dizisine kopyalayın
}
}
for (int iter = 0; iter < maxIter; iter++) { // yineleme sayısına göre döngü
for (int i = 0; i < N; i++) {
double r[n], d[n];
for (int j = 0; j < n; j++) {
r[j] = (double)rand() / RAND_MAX - 0.5; // rastgele artış vektörü
d[j] = r[j] * stepSize * (UB[j] - LB[j]); // adım genişliğini hesaplayın
x[j] += d[j]; // parametreye bir adım ekleyin
if (x[j] < LB[j]) { // parametre aralık dışındaysa, sınırda bırakın
x[j] = LB[j];
} else if (x[j] > UB[j]) {
x[j] = UB[j];
}
}
double newTrail = f(x); // yeni parametreler için fonksiyon değerini hesaplayın
if (newTrail <= trail[i]) { // fonksiyon değeri iyileşmişse veya değişmemişse, yeni parametreleri ve fonksiyon değerini kaydedin
memcpy(bestX, x, sizeof(bestX)); // yeni parametreleri en iyi parametre değerleri dizisine kopyalayın
memcpy(bestTrail, &newTrail, sizeof(newTrail)); // yeni fonksiyon değerini en iyi fonksiyon değerleri dizisine kopyalayın
trail[i] = newTrail; // yeni parametreler için fonksiyon değerini tüm "slug "lar için fonksiyon değerleri dizisine kaydet
if (bestTrail[i] < bestFitness) { // mevcut en iyi çözümün mevcut en iyi çözümden daha iyi olup olmadığını kontrol edin
bestFitness = bestTrail[i];
}
} else { // fonksiyon değerleri kötüleşmişse, eski parametrelere geri dönün
memcpy(x, bestX, sizeof(bestX));
trail[i] = bestTrail[i];
}
}
for (int i = 0; i < N; i++) {
iz[i] *= (1.0 - k); // yerel maksimumda takılıp kalmamak için sümüklü böcek izini buharlaştırın
}
}
return bestFitness;
}
```
Bu kod, başlangıç noktası olarak seçilen parametrelerin rastgele değerlerini kullanır, ardından her bir parçacığı sırayla işler. Her parçacık için rastgele bir artış vektörü oluşturur, adım boyutunu hesaplar ve bunu her parametreye ekler. Daha sonra yeni parametreler için fonksiyon değerini hesaplar ve değer azalırsa veya aynı kalırsa saklar. Her döngünün sonunda, yerel bir maksimumda takılmayı önlemek için sümüklü böcek izini buharlaştırır.
Muhtemelen orada ince ayar yapmanız gerekecek 😀 gpt yayınlandı
Haklısınız, MQL'de `memcpy` fonksiyonu yoktur. Değerleri bir değişkenden diğerine kopyalamak için `=` atama operatörünü kullanabilirsiniz. İşte `memcpy` fonksiyonunu kullanmadan değiştirilmiş kodun bir örneği:
```
double slimeMouldAlgorithm(double(*f)(double[]), double x[], int n, double LB[], double UB[], int maxIter, int N)
{
const double k = 0.1; // iz buharlaşma katsayısı
const double stepSize = 0.001; // "sümüklü böcek" hareket adımının boyutu
double iz[N]; // her parçacığın izlerinin dizisi
double bestTrail[N]; // en iyi iz dizisi
double bestFitness = DBL_MAX; // en iyi uygunluk fonksiyonunun başlangıç değeri
double bestX[N]; // en iyi ize karşılık gelen parametre değerleri dizisi
for (int i = 0; i < N; i++) {
for (int j = 0; j < n; j++) {
x[j] = LB[j] + (UB[j] - LB[j]) * (double)rand() / RAND_MAX; // "slug "ları belirtilen parametre aralığına rastgele yerleştirin
}
iz[i] = f(x); // bu parametreler için uygunluk fonksiyonunun değerini hesaplayın
if (trail[i] < bestFitness) { // uygunluk fonksiyonu değeri mevcut en iyi değerden daha iyiyse, bunu yeni en iyi değer olarak saklayın
bestFitness = iz[i];
for (int j = 0; j < n; j++) {
bestX[j] = x[j]; // bulunan parametrelerin değerlerini en iyi değerler dizisine kopyalayın
}
bestTrail[i] = trail[i]; // bulunan parametreler için fonksiyon değerini en iyi fonksiyon değerleri dizisine kopyalayın
}
}
for (int iter = 0; iter < maxIter; iter++) { // yineleme sayısı boyunca döngü
for (int i = 0; i < N; i++) {
double r[n], d[n];
for (int j = 0; j < n; j++) {
r[j] = (double)rand() / RAND_MAX - 0.5; // rastgele artış vektörü
d[j] = r[j] * stepSize * (UB[j] - LB[j]); // adım genişliğini hesaplayın
x[j] += d[j]; // parametreye bir adım ekleyin
if (x[j] < LB[j]) { // parametre aralık dışındaysa, sınırda bırakın
x[j] = LB[j];
} else if (x[j] > UB[j]) {
x[j] = UB[j];
}
}
double newTrail = f(x); // yeni parametreler için fonksiyon değerini hesaplayın
if (newTrail <= trail[i]) { // fonksiyon değeri iyileşmişse veya değişmemişse, yeni parametreleri ve fonksiyon değerini kaydedin
for (int j = 0; j < n; j++) {
bestX[j] = x[j]; // yeni parametreleri en iyi parametre değerleri dizisine kopyalayın
}
bestTrail[i] = newTrail; // yeni fonksiyon değerini en iyi fonksiyon değerleri dizisine kopyalayın
trail[i] = newTrail; // yeni parametreler için fonksiyon değerini tüm "slug "lar için fonksiyon değerleri dizisinde saklayın
if (bestTrail[i] < bestFitness) { // mevcut en iyi çözümün mevcut en iyi çözümden daha iyi olup olmadığını kontrol edin
bestFitness = bestTrail[i];
}
} else { // fonksiyon değerleri kötüleşmişse, eski parametrelere geri dönün
for (int j = 0; j < n; j++) {
x[j] = bestX[j];
}
trail[i] = bestTrail[i];
}
}
for (int i = 0; i < N; i++) {
iz[i] *= (1.0 - k); // yerel maksimumda takılmayı önlemek için sümüklü böcek izini buharlaştırın
}
}
return bestFitness;
}
```
Gördüğünüz gibi, dizi değerlerini öğe öğe kopyalamak için basitçe döngüler kullanıyoruz.
Bu demir her şeyi biliyor...))))
Genel durumda, muhtemelen, görev için algo seçme konusunda donanıma güvenebilirsiniz, ancak ben derecelendirme tabloma bakmayı tercih ederim)))
```
double slimeMouldAlgorithm(double(*f)(double[]), double x[], int n, double LB[], double UB[], int maxIter, int N)
Makalelerdeki tüm algoritmalarda olduğu gibi, bunu bir şemaya ayırmak gerekecektir.
Makalelerdeki tüm algoritmalar yapıldığı için şemaya göre parçalamak gerekecektir. bu haliyle işe yaramaz.
Sohbet yoluyla deneyin, böyle bir görevi yerine getirip getirmeyeceğini merak ediyorum :) Jetonlarım bitti, bu yüzden bazen uğraşıyorum. Ona örnek bir makale verin ve stili takip etmesini sağlayın. Bu arada, bir kuruş için harika bir girişim, bir sepet içinde böyle bir bot.
Ne yazık ki, ya da belki neyse ki, bot yeni bilgi üretmiyor ve kamuya açık olan bilgiler genellikle çarpıtılıyor. bunun bilgi enterpolasyon mekanizmalarından kaynaklandığını düşünüyorum. yalan söylüyor, algoritmaların var olmayan kısaltmalarını uyduruyor, hatta anında yazarların adlarını ve algoritmanın ortaya çıkış tarihlerini uyduruyor))). bu tür bilgilere çok dikkat etmelisiniz.
Metin düzenlemede, stilistik düzeltmelerde ve makale yazarken referans olarak - evet, vazgeçilmez bir asistan.