هوش مصنوعی با پایتون – الگوریتم های ژنتیک
هوش مصنوعی با پایتون – الگوریتم های ژنتیک
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، الگوریتم های ژنتیک هوش مصنوعی (Genetic Algorithms) به طور مفصل مورد بحث قرار می گیرد.
الگوریتم های ژنتیک چیست؟
الگوریتم های ژنتیک (GA) الگوریتم های جستجوگر مبتنی بر مفاهیم انتخاب طبیعی و ژنتیک هستند. GA زیرمجموعه ای از شاخه محاسبات بسیار بزرگتر است که به عنوان محاسبات تکاملی شناخته می شود.
GA توسط جان هالند و دانشجویان و همکارانش در دانشگاه میشیگان، به ویژه دیوید گلدبرگ، توسعه داده شد. از آن زمان تاکنون روی موفقیت های مختلف در زمینه مشکلات مختلف بهینه سازی آزمایش شده است.
پیشنهاد ویژه : پکیج آموزش پروژه محور پایتون
در GA، ما مجموعه ای از راه حل های ممکن برای مشکل ارائه شده داریم. سپس این راه حل ها تحت ترکیب مجدد و جهش قرار می گیرند (مانند ژنتیک طبیعی)، بچه های جدیدی تولید می کنند و این روند برای نسل های مختلف تکرار می شود. به هر فرد (یا راه حل کاندیدا) مقدار تناسب اندام اختصاص داده می شود (بر اساس مقدار عملکرد هدف آن) و به افراد برازنده شانس بیشتری برای جفت گیری و تولید افراد مناسبتر می رسد. این مطابق با تئوری بقای داروین است.
بنابراین، افراد و یا راه حل های بهتر در طی نسل ها ادامه می یابد، تا زمانی که به یک معیار توقف برسد.
الگوریتم های ژنتیک ماهیت کاملاً تصادفی دارند، اما عملکرد آنها بسیار بهتر از جستجوی محلی تصادفی است (جایی که ما فقط راه حل های تصادفی را امتحان می کنیم و بهترین ها را ردیابی می کنیم)، زیرا از اطلاعات تاریخی نیز بهره برداری می کنند.
چگونه می توان از GA برای مشکلات بهینه سازی استفاده کرد؟
بهینه سازی عملی است که باعث می شود طراحی، وضعیت، منابع و سیستم تا حد ممکن موثر باشد. نمودار بلوکی زیر روند بهینه سازی را نشان می دهد –
مراحل مکانیسم GA برای فرآیند بهینه سازی
موارد زیر دنباله ای از مراحل مکانیسم GA است که برای بهینه سازی مشکلات استفاده می شود.
- مرحله 1 – جمعیت اولیه را به طور تصادفی ایجاد کنید.
- مرحله 2 – راه حل اولیه را با بهترین مقادیر تناسب اندام انتخاب کنید.
- مرحله 3 – راه حلهای انتخاب شده را با استفاده از عملگرهای جهش و کراس اوور ترکیب کنید.
- مرحله 4 – فرزندان را در جمعیت وارد کنید.
- مرحله 5 – اکنون ، اگر شرط توقف برآورده شود ، محلول را با بهترین مقدار تناسب اندام خود برگردانید. در غیر اینصورت به مرحله 2 بروید.
نصب پکیج های ضروری
برای حل مسئله با استفاده از الگوریتم های ژنتیک در پایتون، ما قصد داریم از یک بسته قدرتمند برای GA به نام DEAP استفاده کنیم. این کتابخانه ای از چارچوب محاسبات تکاملی جدید برای نمونه سازی سریع و آزمایش ایده ها است. ما می توانیم این پکیج را با کمک دستور زیر در خط فرمان نصب کنیم –
1 |
pip install deap |
اگر از محیط anaconda استفاده می کنید، برای نصب deap می توان از دستور زیر استفاده کرد –
1 |
conda install -c conda-forge deap |
پیاده سازی راه حل ها با استفاده از الگوریتم های ژنتیک
این بخش نحوه اجرای راه حل ها را با استفاده از الگوریتم های ژنتیک توضیح می دهد.
ایجاد الگوهای بیت
مثال زیر به شما نشان می دهد که چگونه بر اساس مشکل One Max یک رشته بیتی که شامل 15 رشته باشد را ایجاد کنید.
پکیج های لازم را همانطور که نشان داده شده وارد کنید –
1 2 |
import random from deap import base, creator, tools |
تابع ارزیابی را تعریف کنید. این اولین قدم برای ایجاد یک الگوریتم ژنتیک است.
1 2 3 |
def eval_func(individual): target_sum = 15 return len(individual) - abs(sum(individual) - target_sum), |
اکنون جعبه ابزار را با پارامترهای مناسب ایجاد کنید –
1 2 3 |
def create_toolbox(num_bits): creator.create("FitnessMax", base.Fitness, weights=(1.0,)) creator.create("Individual", list, fitness=creator.FitnessMax) |
جعبه ابزار را اولیه کنید
1 2 3 4 5 |
toolbox = base.Toolbox() toolbox.register("attr_bool", random.randint, 0, 1) toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, num_bits) toolbox.register("population", tools.initRepeat, list, toolbox.individual) |
ثبت اپراتور ارزیابی –
1 |
toolbox.register("evaluate", eval_func) |
اکنون، اپراتور کراس اوور را ثبت کنید –
1 |
toolbox.register("mate", tools.cxTwoPoint) |
ثبت یک اپراتور جهش –
1 |
toolbox.register("mutate", tools.mutFlipBit, indpb = 0.05) |
اپراتور را برای پرورش مشخص کنید –
1 2 3 4 5 6 7 8 9 10 |
toolbox.register("select", tools.selTournament, tournsize = 3) return toolbox if __name__ == "__main__": num_bits = 45 toolbox = create_toolbox(num_bits) random.seed(7) population = toolbox.population(n = 500) probab_crossing, probab_mutating = 0.5, 0.2 num_generations = 10 print('\nEvolution process starts') |
کل جمعیت را ارزیابی کنید –
1 2 3 4 |
fitnesses = list(map(toolbox.evaluate, population)) for ind, fit in zip(population, fitnesses): ind.fitness.values = fit print('\nEvaluated', len(population), 'individuals') |
ایجاد و تکرار در طول نسل –
1 2 |
for g in range(num_generations): print("\n- Generation", g) |
انتخاب افراد نسل بعدی –
1 |
offspring = toolbox.select(population, len(population)) |
اکنون، افراد انتخاب شده را شبیه سازی کنید –
1 |
offspring = list(map(toolbox.clone, offspring)) |
کراس اوور و جهش را بر روی فرزندان اعمال کنید –
1 2 3 |
for child1, child2 in zip(offspring[::2], offspring[1::2]): if random.random() < probab_crossing: toolbox.mate(child1, child2) |
ارزش تناسب اندام کودک را حذف کنید
1 2 |
del child1.fitness.values del child2.fitness.values |
اکنون، جهش را اعمال کنید –
1 2 3 4 |
for mutant in offspring: if random.random() < probab_mutating: toolbox.mutate(mutant) del mutant.fitness.values |
افراد دارای تناسب اندام نامعتبر را ارزیابی کنید –
1 2 3 4 5 |
invalid_ind = [ind for ind in offspring if not ind.fitness.valid] fitnesses = map(toolbox.evaluate, invalid_ind) for ind, fit in zip(invalid_ind, fitnesses): ind.fitness.values = fit print('Evaluated', len(invalid_ind), 'individuals') |
اکنون، جمعیت را با نسل بعدی جایگزین کنید –
1 |
population[:] = offspring |
چاپ آمار برای نسل های فعلی –
1 2 3 4 5 6 7 8 9 |
fits = [ind.fitness.values[0] for ind in population] length = len(population) mean = sum(fits) / length sum2 = sum(x*x for x in fits) std = abs(sum2 / length - mean**2)**0.5 print('Min =', min(fits), ', Max =', max(fits)) print('Average =', round(mean, 2), ', Standard deviation =', round(std, 2)) print("\n- Evolution ends") |
خروجی نهایی را چاپ کنید –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
best_ind = tools.selBest(population, 1)[0] print('\nBest individual:\n', best_ind) print('\nNumber of ones:', sum(best_ind)) Following would be the output: Evolution process starts Evaluated 500 individuals - Generation 0 Evaluated 295 individuals Min = 32.0 , Max = 45.0 Average = 40.29 , Standard deviation = 2.61 - Generation 1 Evaluated 292 individuals Min = 34.0 , Max = 45.0 Average = 42.35 , Standard deviation = 1.91 - Generation 2 Evaluated 277 individuals Min = 37.0 , Max = 45.0 Average = 43.39 , Standard deviation = 1.46 … … … … - Generation 9 Evaluated 299 individuals Min = 40.0 , Max = 45.0 Average = 44.12 , Standard deviation = 1.11 - Evolution ends Best individual: [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1] Number of ones: 15 |
مشکل رگرسیون نمادین
این یکی از بهترین مشکلات شناخته شده در برنامه نویسی ژنتیکی است. تمام مشکلات رگرسیون نمادین از توزیع دلخواه داده استفاده می کنند و سعی می کنند دقیق ترین داده ها را با یک فرمول نمادین متناسب کنند. معمولاً برای اندازه گیری تناسب اندام فردی از معیارهایی مانند (RMSE (Root Mean Square Error استفاده می شود. این یک مسئله رگرسیون کلاسیک است و در اینجا ما از معادله 5×3-6×2 + 8x = 1 استفاده می کنیم. ما باید تمام مراحل را مانند مثال بالا دنبال کنیم ، اما قسمت اصلی ایجاد مجموعه های ابتدایی است زیرا آنها عناصر سازنده افراد هستند تا ارزیابی شروع شود. در اینجا ما از مجموعه کلاسیک بدوی استفاده خواهیم کرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import operator import math import random import numpy as np from deap import algorithms, base, creator, tools, gp def division_operator(numerator, denominator): if denominator == 0: return 1 return numerator / denominator def eval_func(individual, points): func = toolbox.compile(expr=individual) return math.fsum(mse) / len(points), def create_toolbox(): pset = gp.PrimitiveSet("MAIN", 1) pset.addPrimitive(operator.add, 2) pset.addPrimitive(operator.sub, 2) pset.addPrimitive(operator.mul, 2) pset.addPrimitive(division_operator, 2) pset.addPrimitive(operator.neg, 1) pset.addPrimitive(math.cos, 1) pset.addPrimitive(math.sin, 1) pset.addEphemeralConstant("rand101", lambda: random.randint(-1,1)) pset.renameArguments(ARG0 = 'x') creator.create("FitnessMin", base.Fitness, weights = (-1.0,)) creator.create("Individual",gp.PrimitiveTree,fitness=creator.FitnessMin) toolbox = base.Toolbox() toolbox.register("expr", gp.genHalfAndHalf, pset=pset, min_=1, max_=2) toolbox.expr) toolbox.register("population",tools.initRepeat,list, toolbox.individual) toolbox.register("compile", gp.compile, pset = pset) toolbox.register("evaluate", eval_func, points = [x/10. for x in range(-10,10)]) toolbox.register("select", tools.selTournament, tournsize = 3) toolbox.register("mate", gp.cxOnePoint) toolbox.register("expr_mut", gp.genFull, min_=0, max_=2) toolbox.register("mutate", gp.mutUniform, expr = toolbox.expr_mut, pset = pset) toolbox.decorate("mate", gp.staticLimit(key = operator.attrgetter("height"), max_value = 17)) toolbox.decorate("mutate", gp.staticLimit(key = operator.attrgetter("height"), max_value = 17)) return toolbox if __name__ == "__main__": random.seed(7) toolbox = create_toolbox() population = toolbox.population(n = 450) hall_of_fame = tools.HallOfFame(1) stats_fit = tools.Statistics(lambda x: x.fitness.values) stats_size = tools.Statistics(len) mstats = tools.MultiStatistics(fitness=stats_fit, size = stats_size) mstats.register("avg", np.mean) mstats.register("std", np.std) mstats.register("min", np.min) mstats.register("max", np.max) probab_crossover = 0.4 probab_mutate = 0.2 number_gen = 10 population, log = algorithms.eaSimple(population, toolbox, probab_crossover, probab_mutate, number_gen, stats = mstats, halloffame = hall_of_fame, verbose = True) |
توجه داشته باشید که تمام مراحل اساسی همان مراحل استفاده شده هنگام تولید الگوهای بیت است. این برنامه پس از 10 تعداد نسل، خروجی را به صورت min ، max ، std (انحراف معیار) به ما می دهد.
لیست جلسات قبل آموزش هوش مصنوعی با برنامه نویسی پایتون
- آموزش هوش مصنوعی با برنامه نویسی پایتون – مفهوم کلی
- شروع آموزش هوش مصنوعی با برنامه نویسی پایتون
- یادگیری ماشین در هوش مصنوعی با برنامه نویسی پایتون
- هوش مصنوعی با برنامه نویسی پایتون، آماده سازی داده ها
- هوش مصنوعی با پایتون، یادگیری نظارت شده و طبقه بندی
- هوش مصنوعی با برنامه نویسی پایتون – یادگیری تحت نظارت: رگرسیون
- هوش مصنوعی با برنامه نویسی پایتون – برنامه نویسی منطقی
- هوش مصنوعی با پایتون – یادگیری بدون نظارت: خوشه بندی
- هوش مصنوعی با پایتون – پردازش زبان طبیعی
- هوش مصنوعی با پایتون – پکیج NLTK
- هوش مصنوعی با پایتون – تجزیه و تحلیل داده های سری زمانی
- هوش مصنوعی با پایتون – تشخیص گفتار
- هوش مصنوعی با پایتون – جستجوی کاشف
- هوش مصنوعی با پایتون – بازی
- هوش مصنوعی با پایتون – شبکه های عصبی
- هوش مصنوعی با پایتون – یادگیری Reinforcement
دیدگاه شما