Αλγόριθμος εξελικτικής αναζήτησης (Evolutionary Search) σε C++- Επεξήγηση, Παράδειγμα και Κώδικας

Ο αλγόριθμος εξελικτικής αναζήτησης είναι μια μέθοδος βελτιστοποίησης που βασίζεται στον μηχανισμό της φυσικής εξέλιξης. Αυτός ο αλγόριθμος προσομοιώνει τη διαδικασία εξέλιξης των ατόμων μέσα σε έναν πληθυσμό από γενιά σε γενιά για να βρεθεί η καλύτερη λύση για ένα πρόβλημα.

Πως δουλεύει

  1. Αρχικοποίηση πληθυσμού: Δημιουργήστε έναν αρχικό πληθυσμό ατόμων που δημιουργήθηκαν τυχαία.
  2. Αξιολόγηση: Αξιολογήστε την ποιότητα κάθε ατόμου στον πληθυσμό με βάση την αντικειμενική λειτουργία ή τα κριτήρια αξιολόγησης.
  3. Επιλογή: Επιλέξτε ένα υποσύνολο των καλύτερων ατόμων από τον τρέχοντα πληθυσμό με βάση πιθανότητες ή κριτήρια επιλογής.
  4. Εξέλιξη: Δημιουργήστε μια νέα γενιά εφαρμόζοντας λειτουργίες διασταύρωσης και μετάλλαξης στα επιλεγμένα άτομα.
  5. Επανάληψη: Επαναλάβετε τα βήματα 2 έως 4 σε πολλές γενιές μέχρι να επιτευχθεί μια ικανοποιητική λύση ή να επιτευχθεί ένας προκαθορισμένος αριθμός επαναλήψεων.

Παράδειγμα: Βελτιστοποίηση της Fibonacci συνάρτησης χρησιμοποιώντας την Evolutionary Search

Θεωρήστε το πρόβλημα βελτιστοποίησης της Fibonacci συνάρτησης F(x) = F(x-1) + F(x-2) με 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;  
}  

Σε αυτό το παράδειγμα, χρησιμοποιούμε τη μέθοδο Evolutionary Search για να βελτιστοποιήσουμε τη Fibonacci συνάρτηση. Δημιουργούμε έναν πληθυσμό τυχαίων τιμών x, τις εξελίσσουμε σε γενεές επιλέγοντας τα καλύτερα άτομα και εφαρμόζοντας λειτουργίες διασταύρωσης και μετάλλαξης.