الگوریتم ژنتیک (Genetic Algorithm - GA) تکنیک جستجویی در علم رایانه برای یافتن راهحل تقریبی برای بهینهسازی و مسائل جستجو است. الگوریتم ژنتیک نوع خاصی از الگوریتمهای تکامل است که از تکنیکهای زیستشناسی فرگشتی مانند وراثت و جهش استفاده میکند.
در واقع الگوریتمهای ژنتیک از اصول انتخاب طبیعی داروین برای یافتن فرمول بهینه جهت پیشبینی یا تطبیق الگو استفاده میکنند.الگوریتمهای ژنتیک اغلب گزینه خوبی برای تکنیکهای پیشبینی بر مبنای رگرسیون هستند. مختصراً گفته می شود که الگوریتم ژنتیک (یا GA) یک تکنیک برنامهنویسی است که از تکامل ژنتیکی به عنوان یک الگوی حل مسئله استفاده میکند.مسئلهای که باید حل شود ورودی است و راهحلها طبق یک الگو کد گذاری می شوند که تابع fitness نام دارد هر راه حل کاندید را ارزیابی میکند که اکثر آنها به صورت تصادفی انتخاب میشوند.
مقدمه
هنگامی که لغت تنازع بقا به کار میرود اغلب بار ارزشی منفی آن به ذهن میآید. شاید همزمان قانون جنگل به ذهن برسد و حکم بقای قویترها!
البته همیشه هم قویترینها برنده نبودهاند. مثلاً دایناسورها با وجود جثه عظیم و قویتر بودن در طی روندی کاملاً طبیعی بازیِ بقا و ادامه نسل را واگذار کردند در حالی که موجوداتی بسیار ضعیفتر از آنها حیات خویش را ادامه دادند. ظاهراً طبیعت، بهترینها را تنها بر اساس هیکل انتخاب نمیکند! در واقع درستتر آنست که بگوییم طبیعت مناسب ترینها (Fittest) را انتخاب میکند نه بهترینها.
قانون انتخاب طبیعی بدین صورت است که تنها گونههایی از یک جمعیت ادامه نسل میدهند که بهترین خصوصیات را داشته باشند و آنهایی که این خصوصیات را نداشته باشند به تدریج و در طی زمان از بین میروند.
مثلا فرض کنید گونه خاصی از افراد، هوش بیشتری از بقیه افرادِ یک جامعه یا کولونی دارند. در شرایط کاملاً طبیعی، این افراد پیشرفت بهتری خواهند کرد و رفاه نسبتاً بالاتری خواهند داشت و این رفاه، خود باعث طول عمر بیشتر و باروری بهتر خواهد بود (توجه کنید شرایط، طبیعیست نه در یک جامعه سطح بالا با ملاحظات امروزی؛ یعنی طول عمر بیشتر در این جامعه نمونه با زاد و ولد بیشتر همراه است). حال اگر این خصوصیت (هوش) ارثی باشد بالطبع در نسل بعدی همان جامعه تعداد افراد باهوش به دلیل زاد و ولد بیشترِ اینگونه افراد، بیشتر خواهد بود. اگر همین روند را ادامه دهید خواهید دید که در طی نسلهای متوالی دائماً جامعه نمونه ما باهوش و باهوشتر میشود. بدین ترتیب یک مکانیزم ساده طبیعی توانسته است در طی چند نسل عملاً افراد کم هوش را از جامعه حذف کند علاوه بر اینکه میزان هوش متوسط جامعه نیز دائماً در حال افزایش است.
بدین ترتیب میتوان دید که طبیعت با بهرهگیری از یک روش بسیار ساده (حذف تدریجی گونههای نامناسب و در عین حال تکثیر بالاتر گونههای بهینه)، توانسته است دائماً هر نسل را از لحاظ خصوصیات مختلف ارتقاء بخشد.
البته آنچه در بالا ذکر شد به تنهایی توصیف کننده آنچه واقعاً در قالب تکامل در طبیعت اتفاق میافتد نیست. بهینهسازی و تکامل تدریجی به خودی خود نمیتواند طبیعت را در دسترسی به بهترین نمونهها یاری دهد. اجازه دهید تا این مسأله را با یک مثال شرح دهیم:
پس از اختراع اتومبیل به تدریج و در طی سالها اتومبیلهای بهتری با سرعتهای بالاتر و قابلیتهای بیشتر نسبت به نمونههای اولیه تولید شدند. طبیعیست که این نمونههای متأخر حاصل تلاش مهندسان طراح جهت بهینهسازی طراحیهای قبلی بودهاند. اما دقت کنید که بهینهسازی یک اتومبیل، تنها یک "اتومبیل بهتر" را نتیجه میدهد.
اما آیا میتوان گفت اختراع هواپیما نتیجه همین تلاش بوده است؟ یا فرضاً میتوان گفت فضاپیماها حاصل بهینهسازی طرح اولیه هواپیماها بودهاند؟
پاسخ اینست که گرچه اختراع هواپیما قطعاً تحت تأثیر دستاورهای صنعت اتومبیل بوده است؛ اما بههیچ وجه نمیتوان گفت که هواپیما صرفاً حاصل بهینهسازی اتومبیل و یا فضاپیما حاصل بهینهسازی هواپیماست. در طبیعت هم عیناً همین روند حکمفرماست. گونههای متکاملتری وجود دارند که نمیتوان گفت صرفاً حاصل تکامل تدریجی گونه قبلی هستند.
در این میان آنچه شاید بتواند تا حدودی ما را در فهم این مسأله یاری کند مفهومیست به نام تصادف یا جهش.
به عبارتی طرح هواپیما نسبت به طرح اتومبیل یک جهش بود و نه یک حرکت تدریجی. در طبیعت نیز به همین گونهاست. در هر نسل جدید بعضی از خصوصیات به صورتی کاملاً تصادفی تغییر مییابند سپس بر اثر تکامل تدریجی که پیشتر توضیح دادیم در صورتی که این خصوصیت تصادفی شرایط طبیعت را ارضا کند حفظ میشود در غیر اینصورت به شکل اتوماتیک از چرخه طبیعت حذف میگردد.
در واقع میتوان تکامل طبیعی را به اینصورت خلاصه کرد: جستوجوی کورکورانه (تصادف یا Blind Search) + بقای قویتر.
حال ببینیم که رابطه تکامل طبیعی با روشهای هوش مصنوعی چیست. هدف اصلی روشهای هوشمندِ به کار گرفته شده در هوش مصنوعی، یافتن پاسخ بهینه مسائل مهندسی است. بعنوان مثال اینکه چگونه یک موتور را طراحی کنیم تا بهترین بازدهی را داشته باشد یا چگونه بازوهای یک ربات را متحرک کنیم تا کوتاهترین مسیر را تا مقصد طی کند (دقت کنید که در صورت وجود مانع یافتن کوتاهترین مسیر دیگر به سادگی کشیدن یک خط راست بین مبدأ و مقصد نیست) همگی مسائل بهینهسازی هستند.
روشهای کلاسیک ریاضیات دارای دو اشکال اساسی هستند. اغلب این روشها نقطه بهینه محلی (Local Optima) را بعنوان نقطه بهینه کلی در نظر میگیرند و نیز هر یک از این روشها تنها برای مسأله خاصی کاربرد دارند. این دو نکته را با مثالهای سادهای روشن میکنیم.
به این شکل توجه کنید. این منحنی دارای دو نقطه ماکزیمم میباشد. که یکی از آنها تنها ماکزیمم محلی است. حال اگر از روشهای بهینهسازی ریاضی استفاده کنیم مجبوریم تا در یک بازه بسیار کوچک مقدار ماکزیمم تابع را بیابیم. مثلاً از نقطه 1 شروع کنیم و تابع را ماکزیمم کنیم. بدیهی است اگر از نقطه 1 شروع کنیم تنها به مقدار ماکزیمم محلی دست خواهیم یافت و الگوریتم ما پس از آن متوقف خواهد شد. اما در روشهای هوشمند، به ویژه الگوریتم ژنتیک بدلیل خصلت تصادفی آنها حتی اگر هم از نقطه 1 شروع کنیم باز ممکن است در میان راه نقطه A به صورت تصادفی انتخاب شود که در این صورت ما شانس دستیابی به نقطه بهینه کلی (Global Optima) را خواهیم داشت.در مورد نکته دوم باید بگوییم که روشهای ریاضی بهینهسازی اغلب منجر به یک فرمول یا دستورالعمل خاص برای حل هر مسئله میشوند. در حالی که روشهای هوشمند دستورالعملهایی هستند که به صورت کلی میتوانند در حل هر مسئلهای به کار گرفته شوند. این نکته را پس از آشنایی با خود الگوریتم بیشتر و بهتر خواهید دید.
الگوریتم ژنتیک چیست؟
الگوریتم ژنتیک یک جمعیت اولیه از فرمول ایجاد میکند. هر فرد در برابر مجموعهای از دادههای مورد آزمایش قرار میگیرند و مناسبترین آنها (شاید 10 درصد از مناسبترینها) باقی میمانند؛ بقیه کنار گذاشته میشوند. مناسبترین افراد با هم جفتگیری (جابجایی عناصر دی ان ای) و تغییر (تغییر تصادفی عناصر دی ان ای) کردهاند. مشاهده میشود که با گذشت از میان تعداد زیادی از نسلها، الگوریتم ژنتیک به سمت ایجاد فرمولهایی که دقیقتر هستند، میل میکنند. در حالی که شبکههای عصبی هم غیرخطی و غیرپارامتریک هستند، جذابیت زیاد الگوریتمهای ژنتیک این است نتایج نهایی قابل ملاحظهترند. فرمول نهایی برای کاربر انسانی قابل مشاهده خواهد بود، و برای ارائه سطح اطمینان نتایج میتوان تکنیکهای آماری متعارف را بر روی این فرمولها اعمال کرد. فناوری الگوریتمهای ژنتیک همواره در حال بهبود است و برای مثال با مطرح کردن معادله ویروسها که در کنار فرمولها و برای نقض کردن فرمولهای ضعیف تولید میشوند و در نتیجه جمعیت را کلاً قویتر میسازند.
مختصراً گفته میشود که الگوریتم ژنتیک (یا GA) یک تکنیک برنامهنویسی است که از تکامل ژنتیکی به عنوان یک الگوی حل مسئله استفاده میکند. مسئلهای که باید حل شود ورودی است و راه حلها طبق یک الگو کدگذاری میشوند که تابع fitness نام دارد و هر راه حل کاندید را ارزیابی میکند که اکثر آنها به صورت تصادفی انتخاب میشوند.
الگوریتم ژنتیک (GA) یک تکنیک جستجو در علم رایانه برای یافتن راه حل بهینه و مسائل جستجو است. الگوریتمهای ژنتیک یکی از انواع الگوریتمهای تکاملیاند که از علم زیستشناسی مثل وراثت، جهش، [انتخاب ناگهانی(زیستشناسی)|انتخاب ناگهانی]، انتخاب طبیعی و ترکیب الهام گرفته شده.
عموماً راهحلها به صورت 2 تایی 0 و 1 نشان داده میشوند، ولی روشهای نمایش دیگری هم وجود دارد. تکامل از یک مجموعه کاملاً تصادفی از موجودیتها شروع میشود و در نسلهای بعدی تکرار میشود. در هر نسل، مناسبترینها انتخاب میشوند نه بهترینها.
یک راهحل برای مسئله مورد نظر، با یک لیست از پارامترها نشان داده میشود که به آنها کروموزوم یا ژنوم میگویند. کروموزومها عموماً به صورت یک رشته ساده از دادهها نمایش داده میشوند، البته انواع ساختمان دادههای دیگر هم میتوانند مورد استفاده قرار گیرند. در ابتدا چندین مشخصه به صورت تصادفی برای ایجاد نسل اول تولید میشوند. در طول هر نسل، هر مشخصه ارزیابی میشود وارزش تناسب (fitness) توسط تابع تناسب اندازهگیری میشود.
گام بعدی ایجاد دومین نسل از جامعه است که بر پایه فرآیندهای انتخاب، تولید از روی مشخصههای انتخاب شده با عملگرهای ژنتیکی است: اتصال کروموزومها به سر یکدیگر و تغییر.
برای هر فرد، یک جفت والد انتخاب میشود. انتخابها به گونهایاند که مناسبترین عناصر انتخاب شوند تا حتی ضعیفترین عناصر هم شانس انتخاب داشته باشند تا از نزدیک شدن به جواب محلی جلوگیری شود. چندین الگوی انتخاب وجود دارد: ساده،رولت، انتخاب مسابقهای و ... . (مثلاً در روش ساده: اگر قرار است تنها 100 فرد از 150 فرد موجود انتخاب شوند باید جمعیت بر اساس تابع برازش مرتب شده و سپس 100 تا از بهترین ها انتخاب شود )
معمولاً الگوریتمهای ژنتیک یک عدد احتمال اتصال دارد که بین 0.6 و 1 است که احتمال به وجود آمدن فرزند را نشان میدهد. ارگانیسمها با این احتمال دوباره با هم ترکیب میشوند. اتصال 2 کروموزوم والد فرزند ایجاد میکند (کراس اور)، که به نسل بعدی اضافه میشوند. این کارها انجام میشوند تا این که کاندیدهای مناسبی برای جواب، در نسل بعدی پیدا شوند. مرحله بعدی تغییر دادن فرزندان جدید است. الگوریتمهای ژنتیک یک احتمال تغییر کوچک و ثابت دارند که معمولاً درجهای در حدود 0.01 یا کمتر دارد. بر اساس این احتمال، کروموزومهای فرزند به طور تصادفی تغییر میکنند یا جهش (موتاسیون) مییابند، مخصوصاً با جهش بیتها در کروموزوم ساختمان دادهمان.
این فرآیند باعث به وجود آمدن نسل جدیدی از کروموزومهایی میشود، که با نسل قبلی متفاوت است. کل فرآیند برای نسل بعدی هم تکرار میشود، جفتها برای ترکیب انتخاب میشوند، جمعیت نسل سوم به وجود میآیند و .... این فرآیند تکرار میشود تا این که به آخرین مرحله برسیم. (در واقع این فرایند یک loop ایجاد می کند و نیازمند شرطی برای پایان دادن به حلقه هستیم)
شرط های پایان حلقه الگوریتمهای ژنتیک عبارتند از:
* به تعداد ثابتی از نسلها برسیم.
* بودجه اختصاص دادهشده تمام شود(زمان محاسبه/پول).
* یک فرد(فرزند تولید شده) پیدا شود که مینیمم (کمترین) ملاک را برآورده کند.
* بیشترین درجه برازش فرزندان حاصل شود یا دیگر نتایج بهتری حاصل نشود. (در واقع تغییرات تابع برازش کم شود)
* بازرسی دستی.
* ترکیبی از حالات بالا.
شبه کد:
آغاز الگوریتم ژنتیک:
- جمعیت اولیه را ایجاد کن
- آغاز حلقه:
- تعدادی جفت انتخاب کن (درواقع چند والد برای ایجاد فرزند انتخاب کن)
- عمل کراس اور را انجام بده (ایجاد فرزندی که پاره ای از صفات پدر و پاره ای از صفات مادر را داراست)
- عمل موتاسیون (ایجاد جهش در فرد، که باعث می شود پاره ای از صفات تغییر کند)
- مقدار تابع برازش را برای افراد تعیین کن
- جمعیت مورد نظر را انتخاب کن (انتخاب طبیعی)
- در صورتی که به شرط پایان نرسیدی به آغاز حلقه برو
- پایان
منبع: ویکیپدیا، با خلاصه سازی و
تغییراتی برگرفته از جزوه ی دکتر رمضانی





