ევოლუციური ძიების (Evolutionary Search) ალგორითმი C++-ში- ახსნა, მაგალითი და კოდი

ევოლუციური ძიების ალგორითმი არის ოპტიმიზაციის მეთოდი, რომელიც დაფუძნებულია ბუნებრივი ევოლუციის მექანიზმზე. ეს ალგორითმი ახდენს ინდივიდების ევოლუციის პროცესს პოპულაციაში თაობების განმავლობაში პრობლემის საუკეთესო გადაწყვეტის მოსაძებნად.

Როგორ მუშაობს

  1. პოპულაციის ინიციალიზაცია: შექმენით შემთხვევით გენერირებული ინდივიდების საწყისი პოპულაცია.
  2. შეფასება: შეაფასეთ პოპულაციის თითოეული ინდივიდის ხარისხი ობიექტური ფუნქციის ან შეფასების კრიტერიუმების საფუძველზე.
  3. შერჩევა: შეარჩიეთ საუკეთესო ინდივიდების ქვეჯგუფი მიმდინარე პოპულაციიდან, ალბათობის ან შერჩევის კრიტერიუმების საფუძველზე.
  4. ევოლუცია: შექმენით ახალი თაობა შერჩეულ პირებზე კროსოვერის და მუტაციის ოპერაციების გამოყენებით.
  5. გამეორება: გაიმეორეთ ნაბიჯები 2-დან 4-მდე რამდენიმე თაობის განმავლობაში, სანამ არ მიიღწევა დამაკმაყოფილებელი გამოსავალი ან არ მიიღწევა გამეორებების წინასწარ განსაზღვრული რაოდენობა.

მაგალითი: Fibonacci ფუნქციის ოპტიმიზაცია ევოლუციური ძიების გამოყენებით

განვიხილოთ F(x) = F(x-1) + F(x-2) ფუნქციის ოპტიმიზაციის ამოცანა Fibonacci F(0) = 0, F(1) = 1. ჩვენ გვინდა ვიპოვოთ x-ის მნიშვნელობა, რომლისთვისაც F(x) არის მაქსიმალური. ევოლუციური ძიების მეთოდს შეუძლია წარმოქმნას შემთხვევითი x მნიშვნელობების პოპულაცია, განავითაროს ისინი თაობებში ოპტიმალური x მნიშვნელობის მოსაძებნად.

კოდის მაგალითი 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;  
}  

ამ მაგალითში ჩვენ ვიყენებთ ევოლუციური ძიების მეთოდს ფუნქციის ოპტიმიზაციისთვის Fibonacci. ჩვენ ვქმნით შემთხვევით x მნიშვნელობების პოპულაციას, ვავითარებთ მათ თაობებში საუკეთესო ინდივიდების შერჩევით და კროსოვერის და მუტაციის ოპერაციების გამოყენებით.