C++-এ বিবর্তনীয় অনুসন্ধান (Evolutionary Search) অ্যালগরিদম- ব্যাখ্যা, উদাহরণ এবং কোড

বিবর্তনীয় অনুসন্ধান অ্যালগরিদম প্রাকৃতিক বিবর্তনের প্রক্রিয়ার উপর ভিত্তি করে একটি অপ্টিমাইজেশন পদ্ধতি। এই অ্যালগরিদম একটি সমস্যার জন্য সর্বোত্তম সমাধান খুঁজে পেতে প্রজন্মের মধ্যে একটি জনসংখ্যার মধ্যে ব্যক্তিদের বিবর্তন প্রক্রিয়ার অনুকরণ করে।

কিভাবে এটা কাজ করে

  1. জনসংখ্যা সূচনা: এলোমেলোভাবে উত্পন্ন ব্যক্তিদের একটি প্রাথমিক জনসংখ্যা তৈরি করুন।
  2. মূল্যায়ন: উদ্দেশ্যমূলক কার্য বা মূল্যায়নের মানদণ্ডের ভিত্তিতে জনসংখ্যার প্রতিটি ব্যক্তির গুণমান মূল্যায়ন করুন।
  3. নির্বাচন: সম্ভাব্যতা বা নির্বাচনের মানদণ্ডের ভিত্তিতে বর্তমান জনসংখ্যা থেকে সেরা ব্যক্তিদের একটি উপসেট নির্বাচন করুন।
  4. বিবর্তন: নির্বাচিত ব্যক্তিদের ক্রসওভার এবং মিউটেশন অপারেশন প্রয়োগ করে একটি নতুন প্রজন্ম তৈরি করুন।
  5. পুনরাবৃত্তি: একটি সন্তোষজনক সমাধান অর্জিত না হওয়া পর্যন্ত বা পুনরাবৃত্তির একটি পূর্বনির্ধারিত সংখ্যায় না পৌঁছানো পর্যন্ত একাধিক প্রজন্ম ধরে 2 থেকে 4 ধাপগুলি পুনরাবৃত্তি করুন।

উদাহরণ: Fibonacci বিবর্তনীয় অনুসন্ধান ব্যবহার করে ফাংশনটি অপ্টিমাইজ করা

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

এই উদাহরণে, আমরা ফাংশন অপ্টিমাইজ করতে বিবর্তনীয় অনুসন্ধান পদ্ধতি ব্যবহার করি Fibonacci । আমরা এলোমেলো x মানগুলির একটি জনসংখ্যা তৈরি করি, সেরা ব্যক্তিদের নির্বাচন করে এবং ক্রসওভার এবং মিউটেশন অপারেশনগুলি প্রয়োগ করে প্রজন্ম ধরে তাদের বিকাশ করি।