
الگوریتم ژنتیک (Genetic Algorithm) 🧬⚙️
الگوریتم ژنتیک (GA) یک تکنیک بهینهسازی هوشمند است که از اصول تکامل طبیعی و ژنتیک الهام گرفته شده است. این الگوریتم برای حل مسائل پیچیدهای که روشهای سنتی در آنها ناکارآمد هستند، استفاده میشود.
🔹 الگوریتم ژنتیک چگونه کار میکند؟
-
جمعیت اولیه (Initial Population) 🧑🤝🧑
-
مجموعهای از راهحلهای تصادفی ایجاد میشود.
-
هر راهحل به صورت یک کروموزوم (رشتهای از ژنها) نمایش داده میشود.
-
-
تابع برازندگی (Fitness Function) 🏆
-
هر فرد در جمعیت بر اساس یک تابع ارزیابی میشود تا میزان بهینگی آن مشخص شود.
-
-
انتخاب (Selection) 🎯
-
افراد برتر (با Fitness بالاتر) برای تولید نسل بعد انتخاب میشوند.
-
روشهای رایج: چرخه رولت، انتخاب رقابتی.
-
-
تقاطع (Crossover) 🔀
-
دو فرد والد ترکیب میشوند تا فرزندان جدید تولید شوند.
-
مثلاً تکنقطهای، دو نقطهای یا یکنواخت.
-
-
جهش (Mutation) 🧬
-
برای حفظ تنوع ژنتیکی، برخی ژنها به صورت تصادفی تغییر میکنند.
-
-
جایگزینی (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 است.
-
انتخاب: از روش چرخه رولت برای انتخاب والدین استفاده میشود.
-
تقاطع: با احتمال ۷۰٪، دو فرزند از ترکیب والدین ایجاد میشوند.
-
جهش: هر ژن با احتمال ۱۰٪ تغییر میکند.
🔹 بهبود کد
✅ میتوانید طول کروموزوم را افزایش دهید تا دقت بالاتر برود.
✅ از توابع پیچیدهتر برای مسائل واقعی استفاده کنید.
✅ شرط توقف را بر اساس همگرایی اضافه کنید.
✨ نتیجهگیری
الگوریتم ژنتیک یک روش قدرتمند و انعطافپذیر برای حل مسائل بهینهسازی است که از طبیعت الهام گرفته شده است. با وجود چالشهایش، در بسیاری از حوزههای علمی و صنعتی کاربرد دارد.

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