Evolucijski iskalni (Evolutionary Search) algoritem v C++- razlaga, primer in koda

Algoritem evolucijskega iskanja je optimizacijska metoda, ki temelji na mehanizmu naravne evolucije. Ta algoritem simulira razvojni proces posameznikov znotraj populacije med generacijami, da bi našel najboljšo rešitev za problem.

Kako deluje

  1. Inicializacija populacije: ustvarite začetno populacijo naključno ustvarjenih posameznikov.
  2. Vrednotenje: Ocenite kakovost vsakega posameznika v populaciji na podlagi objektivne funkcije ali kriterijev vrednotenja.
  3. Izbor: izberite podmnožico najboljših posameznikov iz trenutne populacije na podlagi verjetnosti ali izbirnih meril.
  4. Evolucija: ustvarite novo generacijo z uporabo operacij križanja in mutacije za izbrane posameznike.
  5. Ponovitev: Ponavljajte korake od 2 do 4 v več generacijah, dokler ne dosežete zadovoljive rešitve ali dokler ne dosežete vnaprej določenega števila ponovitev.

Primer: Optimizacija Fibonacci funkcije z uporabo evolucijskega iskanja

Razmislite o optimizacijskem problemu funkcije Fibonacci F(x) = F(x-1) + F(x-2) s F(0) = 0, F(1) = 1. Želimo najti vrednost x, za katero F(x) je maksimiziran. Metoda evolucijskega iskanja lahko ustvari populacijo naključnih vrednosti x, jih razvija med generacijami, da poišče optimalno vrednost x.

Primer kode v C++

#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;  
}  

V tem primeru uporabljamo metodo evolucijskega iskanja za optimizacijo funkcije Fibonacci. Ustvarimo populacijo naključnih vrednosti x, jih razvijamo med generacijami z izbiro najboljših posameznikov in uporabo operacij križanja in mutacije.