Evrimsel Arama algoritması, doğal evrim mekanizmasına dayalı bir optimizasyon yöntemidir. Bu algoritma, bir problem için en iyi çözümü bulmak için nesiller boyunca bir popülasyondaki bireylerin evrim sürecini simüle eder.
Nasıl çalışır
- Nüfus Başlatma: Rastgele oluşturulmuş bireylerden oluşan bir başlangıç popülasyonu oluşturun.
- Değerlendirme: Amaç işlevine veya değerlendirme kriterlerine dayalı olarak popülasyondaki her bireyin kalitesini değerlendirin.
- Seçim: Olasılıklara veya seçim kriterlerine göre mevcut popülasyondan en iyi bireylerin bir alt kümesini seçin.
- Evrim: Seçilen bireylere çaprazlama ve mutasyon işlemlerini uygulayarak yeni bir nesil yaratın.
- Yineleme: Tatmin edici bir çözüm elde edilene veya önceden tanımlanmış bir yineleme sayısına ulaşılana kadar 2 ila 4 arasındaki adımları birden çok nesilde tekrarlayın.
Örnek: Fibonacci Evrimsel Aramayı Kullanarak İşlevi Optimize Etme
Fibonacci F(0) = 0, F(1) = 1 ile F(x) = F(x-1) + F(x-2) fonksiyonunun optimizasyon problemini ele alalım. F(x) maksimize edilir. Evrimsel Arama yöntemi, rastgele x değerlerinden oluşan bir popülasyon oluşturabilir, en uygun x değerini bulmak için nesiller boyunca bunları geliştirebilir.
C++'da Kod Örneği
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
int fibonacci(int n) {
if(n <= 0) return 0;
if(n == 1) return 1;
return fibonacci(n- 1) + fibonacci(n- 2);
}
int evolutionSearchFibonacci(int populationSize, int numGenerations) {
srand(time(0));
std::vector<int> population(populationSize);
for(int i = 0; i < populationSize; ++i) {
population[i] = rand() % populationSize;
}
for(int gen = 0; gen < numGenerations; ++gen) {
int bestIndex = 0;
for(int i = 1; i < populationSize; ++i) {
if(fibonacci(population[i]) > fibonacci(population[bestIndex])) {
bestIndex = i;
}
}
// Crossover and mutation operations can be applied here
// Example: Replace the worst individual with the best individual
population[0] = population[bestIndex];
}
return population[0];
}
int main() {
int populationSize = 50;
int numGenerations = 100;
int result = evolutionSearchFibonacci(populationSize, numGenerations);
std::cout << "Optimal x for maximum Fibonacci value: " << result << std::endl;
return 0;
}
Bu örnekte, işlevi optimize etmek için Evrimsel Arama yöntemini kullanıyoruz Fibonacci. Rastgele x değerlerinden oluşan bir popülasyon oluşturuyoruz, en iyi bireyleri seçerek ve çaprazlama ve mutasyon işlemlerini uygulayarak bunları nesiller boyunca geliştiriyoruz.