الگوریتم ژنتیک (Genetic Algorithm) 🧬⚙️

الگوریتم ژنتیک (Genetic Algorithm) 🧬⚙️

الگوریتم ژنتیک (GA) یک تکنیک بهینه‌سازی هوشمند است که از اصول تکامل طبیعی و ژنتیک الهام گرفته شده است. این الگوریتم برای حل مسائل پیچیده‌ای که روش‌های سنتی در آن‌ها ناکارآمد هستند، استفاده می‌شود.

🔹 الگوریتم ژنتیک چگونه کار می‌کند؟

  1. جمعیت اولیه (Initial Population) 🧑‍🤝‍🧑

    • مجموعه‌ای از راه‌حل‌های تصادفی ایجاد می‌شود.

    • هر راه‌حل به صورت یک کروموزوم (رشته‌ای از ژن‌ها) نمایش داده می‌شود.

  2. تابع برازندگی (Fitness Function) 🏆

    • هر فرد در جمعیت بر اساس یک تابع ارزیابی می‌شود تا میزان بهینگی آن مشخص شود.

  3. انتخاب (Selection) 🎯

    • افراد برتر (با Fitness بالاتر) برای تولید نسل بعد انتخاب می‌شوند.

    • روش‌های رایج: چرخه رولت، انتخاب رقابتی.

  4. تقاطع (Crossover) 🔀

    • دو فرد والد ترکیب می‌شوند تا فرزندان جدید تولید شوند.

    • مثلاً تک‌نقطه‌ای، دو نقطه‌ای یا یکنواخت.

  5. جهش (Mutation) 🧬

    • برای حفظ تنوع ژنتیکی، برخی ژن‌ها به صورت تصادفی تغییر می‌کنند.

  6. جایگزینی (Replacement) ♻️

    • نسل جدید جایگزین نسل قبلی می‌شود و فرآیند تکرار می‌شود تا به جواب بهینه برسد.

🔹 کاربردهای الگوریتم ژنتیک

✅ بهینه‌سازی مسائل پیچیده (مانند مسیریابی)
✅ یادگیری ماشین و شبکه‌های عصبی
✅ طراحی مدارهای الکترونیکی
✅ پیش‌بینی مالی و مدیریت پرتفوی
✅ هوش مصنوعی در بازی‌ها

🔹 مزایای الگوریتم ژنتیک

✔ عدم نیاز به اطلاعات اولیه دقیق
✔ قابلیت کار در فضای جستجوی بزرگ
✔ مقاومت در برابر بهینه‌سازی محلی (Local Optima)

🔹 محدودیت‌ها

❌ ممکن است به زمان زیادی برای همگرایی نیاز داشته باشد.
❌ تنظیم پارامترها (مانند نرخ جهش) نیاز به تجربه دارد.

 

🔹 کد کامل الگوریتم ژنتیک در پایتون


import numpy as np

# تنظیمات اولیه
POPULATION_SIZE = 50  # تعداد افراد در جمعیت
GENES_LENGTH = 5     # طول هر کروموزوم (به صورت باینری)
MUTATION_RATE = 0.1  # نرخ جهش
CROSSOVER_RATE = 0.7 # نرخ تقاطع
GENERATIONS = 100    # تعداد نسل‌ها

# تابع برازندگی (Fitness Function)
def fitness(individual):
    x = binary_to_decimal(individual)
    return x ** 2  # هدف: ماکزیمم کردن x^2

# تبدیل عدد باینری به دسیمال
def binary_to_decimal(binary):
    return int("".join(map(str, binary)), 2)

# ایجاد یک فرد تصادفی
def create_individual():
    return np.random.randint(0, 2, size=GENES_LENGTH)

# ایجاد جمعیت اولیه
def initialize_population():
    return [create_individual() for _ in range(POPULATION_SIZE)]

# انتخاب والدین با روش چرخه رولت
def selection(population, fitness_values):
    total_fitness = sum(fitness_values)
    probabilities = [f / total_fitness for f in fitness_values]
    selected_indices = np.random.choice(len(population), size=2, p=probabilities, replace=False)
    return population[selected_indices[0]], population[selected_indices[1]]

# تقاطع (Crossover) - تک نقطه‌ای
def crossover(parent1, parent2):
    if np.random.rand() < CROSSOVER_RATE:
        crossover_point = np.random.randint(1, GENES_LENGTH)
        child1 = np.concatenate([parent1[:crossover_point], parent2[crossover_point:]])
        child2 = np.concatenate([parent2[:crossover_point], parent1[crossover_point:]])
        return child1, child2
    return parent1.copy(), parent2.copy()

# جهش (Mutation)
def mutate(individual):
    for i in range(GENES_LENGTH):
        if np.random.rand() < MUTATION_RATE:
            individual[i] = 1 - individual[i]  # تغییر 0 به 1 و برعکس
    return individual

# اجرای الگوریتم ژنتیک
def genetic_algorithm():
    population = initialize_population()
    
    for generation in range(GENERATIONS):
        fitness_values = [fitness(ind) for ind in population]
        
        new_population = []
        for _ in range(POPULATION_SIZE // 2):
            parent1, parent2 = selection(population, fitness_values)
            child1, child2 = crossover(parent1, parent2)
            child1 = mutate(child1)
            child2 = mutate(child2)
            new_population.extend([child1, child2])
        
        population = new_population
        
        # نمایش بهترین فرد در هر نسل
        best_individual = max(population, key=fitness)
        best_fitness = fitness(best_individual)
        print(f"نسل {generation}: بهترین مقدار = {binary_to_decimal(best_individual)}, برازندگی = {best_fitness}")
    
    best_solution = max(population, key=fitness)
    return binary_to_decimal(best_solution), fitness(best_solution)

# اجرای الگوریتم
best_x, best_fitness = genetic_algorithm()
print(f"\n🔥 بهترین جواب: x = {best_x}, مقدار تابع = {best_fitness}")

🔹 خروجی نمونه


نسل 0: بهترین مقدار = 28, برازندگی = 784  
نسل 1: بهترین مقدار = 30, برازندگی = 900  
...  
نسل 99: بهترین مقدار = 31, برازندگی = 961  

🔥 بهترین جواب: x = 31, مقدار تابع = 961 

🔹 توضیحات کد

  • جمعیت اولیه: هر فرد یک رشته باینیر با طول ۵ است (مثلاً [1, 0, 1, 1, 0]).

  • تابع برازندگی: هدف، ماکزیمم کردن x2x2 است.

  • انتخاب: از روش چرخه رولت برای انتخاب والدین استفاده می‌شود.

  • تقاطع: با احتمال ۷۰٪، دو فرزند از ترکیب والدین ایجاد می‌شوند.

  • جهش: هر ژن با احتمال ۱۰٪ تغییر می‌کند.

🔹 بهبود کد

✅ می‌توانید طول کروموزوم را افزایش دهید تا دقت بالاتر برود.
✅ از توابع پیچیده‌تر برای مسائل واقعی استفاده کنید.
✅ شرط توقف را بر اساس همگرایی اضافه کنید.

✨ نتیجه‌گیری

الگوریتم ژنتیک یک روش قدرتمند و انعطاف‌پذیر برای حل مسائل بهینه‌سازی است که از طبیعت الهام گرفته شده است. با وجود چالش‌هایش، در بسیاری از حوزه‌های علمی و صنعتی کاربرد دارد.

Avatar

نویسنده

سیدهادی موسوی

تعداد لایک‌ها: 4

Tags: #علمی #تئوری #برنامه_نویسی #مقاله

ارسال نظر

نظرات