Evoliucinės paieškos algoritmas yra optimizavimo metodas, pagrįstas natūralios evoliucijos mechanizmu. Šis algoritmas imituoja individų evoliucijos procesą populiacijoje iš kartos į kartą, kad rastų geriausią problemos sprendimą.
Kaip tai veikia
- Populiacijos inicijavimas: sukurkite pradinę atsitiktinai sugeneruotų asmenų populiaciją.
- Įvertinimas: Įvertinkite kiekvieno individo kokybę populiacijoje pagal objektyvią funkciją arba vertinimo kriterijus.
- Atranka: pagal tikimybes arba atrankos kriterijus pasirinkite geriausių individų poaibį iš dabartinės populiacijos.
- Evoliucija: sukurkite naują kartą pasirinktiems asmenims taikydami kryžminimo ir mutacijos operacijas.
- Iteracija: kartokite 2–4 veiksmus per kelias kartas, kol bus pasiektas patenkinamas sprendimas arba iš anksto nustatytas iteracijų skaičius.
Pavyzdys: Fibonacci funkcijos optimizavimas naudojant evoliucinę paiešką
Apsvarstykite funkcijos F(x) = F(x-1) + F(x-2) optimizavimo uždavinį Fibonacci, kai F(0) = 0, F(1) = 1. Norime rasti x reikšmę, kuriai F(x) yra maksimalus. Evoliucinės paieškos metodas gali generuoti atsitiktinių x reikšmių populiaciją, jas plėtoti iš kartos į kartą, kad būtų galima rasti optimalią x reikšmę.
Kodo pavyzdys 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;
}
Šiame pavyzdyje funkcijai optimizuoti naudojame evoliucinės paieškos metodą Fibonacci. Sugeneruojame atsitiktinių x reikšmių populiaciją, evoliucionuojame iš kartos į kartą atrinkdami geriausius asmenis ir taikydami kryžminimo ir mutacijos operacijas.