بسم الله الرحمن الرحیم
الگوریتم های تکاملی یک برنامه ی کامپیوتری مبتنی بر هوش مصنوعی تکاملی است که با استفاده از فرآیندهایی که رفتارهای موجودات زنده را تقلید میکنند، مسایل را حل میکند. به این ترتیب، از مکانیسم هایی استفاده می کند که معمولاً با تکامل بیولوژیکی مرتبط هستند، مانند تولید مثل، جهش و جایگزینی ترکیب.
به طور کلی الگوریتمهای تکاملی یک رویکرد مبتنی بر اکتشافات و برای حل مسائلی هستند که به راحتی در زمان چند جملهای قابل حل نیستند، مانند مسائل کلاسیک سخت از درجه NP-Hard، و هر چیز دیگری که پردازش کامل آنها بسیار طولانی است وزمانی که به تنهایی مورد استفاده قرار می گیرند، معمولاً برای مسایل ترکیبی استفاده می شوند. با این حال، الگوریتمهای تکاملی ژنتیک اغلب همراه با روشهای دیگر مورد استفاده قرار میگیرند تا عنوان یک راه حل سریع برای یافتن یک مکان شروع بهینه برای الگوریتم دیگرعمل میکنند.
اگر شما با فرآیند انتخاب طبیعی و تصادفی آشنا باشید،به عنوان مثال در الگوریتم ژنتیک شناخت یک الگوریتم تکاملی (که بیشتر به عنوان EA شناخته می شود) بسیار ساده است. یک EA یا همان الگوریتم تکاملی شامل چهار مرحله کلی است: مقداردهی اولیه، انتخاب، عملگرهای ژنتیکی و خاتمه. این مراحل هر کدام تقریباً با جنبه خاصی از انتخاب طبیعی مطابقت دارند و راههای آسانی برای مدلسازی و پیادهسازیهای این دسته الگوریتم ارائه میدهند. به بیان ساده، در یکEA، اعضای مناسبتر یا همان انتخاب های مناسب زنده میمانند و تکثیر میشوند، در حالی که اعضای نامناسب از بین میروند و مانند انتخاب طبیعی، به مخزن ژنی نسلهای بعدی (انتخاب های بعدی) کمک نمیکنند.
مقداردهی اولیه (Initialization)
در اینجا، به طور کلی مسیله را اینگونه تعریف می کنیم:
برای شروع الگوریتم خود، ابتدا باید یک جمعیت اولیه از راه حل ها ایجاد کنیم. جمعیت شامل تعداد دلخواه از راه حل های ممکن برای مسیله است که اغلب اعضا یا جمعیت نامیده می شوند. اغلب بهطور تصادفی (در چارچوب محدودیتهای مسئله) ایجاد میشود، واصولا حول محور چیزی است که تصور میشود ایدهآل است. مهم است که جمعیت طیف وسیعی از راه حل ها را در بر گیرد، زیرا اساساً نشان دهنده یک مخزن ژنی یا مجموعه ای از ژن ها است. بنابراین، اگر بخواهیم بسیاری از احتمالات مختلف را در طول الگوریتم کاوش کنیم، باید ژنهای مختلف را در اختیار داشته باشیم.
پس از ایجاد یک جمعیت، اعضای جمعیت اکنون باید بر اساس یک تابع تناسب برازش ارزیابی شوند. تابع تناسب تابعی است که ویژگی های یک عضو را می گیرد و یک نمایش عددی از میزان قابل اجرا بودن یک راه حل را به بیرون ارائه می دهد. ایجاد تابع برازش اغلب می تواند بسیار دشوار باشد، و یافتن یک تابع خوب که به طور دقیق داده ها را نشان می دهد مهم است. این بسیار مشکل خاص است. حال، تابع تناسب برازش همه ی اعضا را محاسبه کرده و بخشی از اعضای دارای امتیاز برتر را انتخاب می کنیم.
EA ها (الگوریتم های تکاملی )همچنین می توانند برای استفاده از چندین عملکرد تابع برازش گسترش یابند. این روند تا حدودی پیچیده می باشد زیرا به جای اینکه بتوانیم یک نقطه بهینه را شناسایی کنیم، یا در هنگام استفاده از چندین تابع برازش با مجموعه ای از نقاط بهینه مواجه می شویم. مجموعه راه حل های بهینه مرز پارتو نامیده می شود و شامل عناصری است که به همان اندازه بهینه هستند به این معنا که هیچ راه حلی بر هیچ راه حل دیگری در الگوریتم غالب نیست. سپس از یک الگوریتم تصمیمگیرنده استفاده می کنیم تا مجموعه را به یک راهحل یکتا، بر اساس تیوری مسئله یا برخی معیارهای دیگر محدود کند.
این مرحله واقعاً شامل دو مرحله فرعی است: ترکیب و جهش. پس از انتخاب اعضای برتر (با فرض مثال 2 نفر برتر، اما این تعداد می تواند متغیر باشد)،حال از این اعضا برای ایجاد نسل بعدی در الگوریتم استفاده می کنیم و با استفاده از ویژگیهای والدین منتخب، فرزندان جدیدی خلق میشوند که ترکیبی از ویژگیهای والدین هستند. انجام این کار بسته به نوع دادهها اغلب ممکن است دشوار باشد، اما معمولاً در مسائل ترکیبی، میتوان ترکیبها را با هم ترکیب کرد و جایگزین کرد و ترکیبهای معتبر خروجی را از این ورودیها به دست آورد. اکنون باید موارد ژنتیکی جدیدی را وارد نسل کنیم.
اگر این مرحله حیاتی را انجام ندهیم، خیلی سریع در مرحله های بعدی اشتباه می کنیم و به نتایج مطلوب نمی رسیم. این مرحله یک جهش است وما این کار را به سادگی با تغییر دادن بخش کوچکی از فرزندان (همان انتخاب های مناسب) به گونهای انجام میدهیم که دیگر زیرمجموعهها از ژنهای والدین را کاملاً منعکس نکند. جهش معمولاً به صورت احتمالی و تصادفی اتفاق میافتد، به این صورت که اگر شانس دریافت جهش و همچنین شدت جهش توسط یک توزیع احتمالی کنترل شود.
در نهایت بعد از گذر از مراحل انتخاب. جهش و ترکیب، الگوریتم باید به پایان برسد. معمولاً دو مورد وجود دارد: یا الگوریتم به حداکثر زمان اجرا رسیده است یا الگوریتم به آستانه ی عملکرد خود رسیده است. در این مرحله، یک راه حل نهایی انتخاب شده و برگردانده می شود و الگوریتم درست اجرا می شود.
حال می خواهیم بدانیم مزایای کسب و کار الگوریتم های تکاملی چیست؟
افزایش انعطاف پذیری مفاهیم الگوریتم های تکاملی را می توان برای حل پیچیده ترین مشکلاتی که انسان ها با آن مواجه هستند و به اهداف مورد نظر دست یافتن، اصلاح و تطبیق داد.
بهینه سازی بهتر یا “جمعیت” گسترده همه ی راه حل های ممکن را در نظر می گیرد. این بدان معناست که الگوریتم به یک راه حل خاص محدود نمی شود.
راه حل های نامحدود برخلاف روشهای کلاسیک که بهترین راهحل را ارائه میکنند و تلاش میکنند تا بهترین راهحل را حفظ کنند، اما الگوریتمهای تکاملی شامل راهحلهای بالقوه متعدد برای یک مسئله هستند و میتوانند راه حل هایی را ارائه دهند.
در مرحله ی اول، ما به مسیری سوق داده می شویم که برای رمزگذاری راه حل هایی برای انتخاب در مسیله نیاز داریم. سادهترین رمزگذاری که توسط بسیاری از الگوریتمهای ژنتیک استفاده میشود، یک رشته بیت است. هر انتخاب ما به سادگی دنباله ای از صفر و یک است.
این رمزگذاری، جهش وترکیب یا متقاطع را بسیار ساده می کند، اما این بدان معنا نیست که نمی توانیم از نمایش های پیچیده تری استفاده کنیم. در واقع، چندین نمونه ی پیشرفته تر از انتخاب ها را در مرحله های بعدی الگوریتم خواهیم دید. تا زمانی که بتوانیم طرح یا مدلی دقیق برای تکامل انتخاب ها طراحی کنیم، واقعاً هیچ محدودیتی برای انواعی که می توانیم استفاده کنیم وجود ندارد. برنامه نویسی ژنتیکی (GP) مثال خوبی برای این موضوع است. GP برنامه های کامپیوتری را که به صورت پیمایش درخت های نحوی نمایش داده می شوند، تکامل می دهد.
گام دوم برای به کارگیری الگوریتم های تکاملی این است که باید راهی برای ارزیابی راه حل های جزئی برای مسئله وجود داشته باشد . تابع برازش یا ارزیابی درست یا غلط راه حل ها کافی نیست، ارزیابی تابع برازش باید نشان دهد که راه حل انتخابی چقدر درست است یا اگر لیوان شما نیمه خالی است، چقدر خالی است. بنابراین تابعی که 0 یا 1 را برمی گرداند بی فایده است. تابعی که امتیازی را در مقیاس 1 تا 100 برمی گرداند بهترو بهینه تر است. ما به سایههای خاکستری نیاز داریم، نه فقط سیاه و سفید، چون این روشی است که الگوریتم های تکاملی تصادفی را برای یافتن راهحلهای بهتر هدایت میکند.
محاسبات تکاملی چیست؟-سایت فرادرس
در این مطلب، با مبحث «محاسبات تکاملی» (Evolutionary Computation)، مفاهیم این حوزه و مهمترین الگوریتمهای تکاملی آشنا خواهید شد. روشهای محاسبات تکاملی، محققان و فعالان حوزه هوش مصنوعی و «بهینهسازی عددی» (Numerical Optimization) را قادر میسازند تا از ایده فرایندهای تکاملی (Evolutionary Process) و شبیهسازی (Simulation) آنها برای حل مسائل جهان واقعی استفاده کنند؛ مسائلی که شاید پیش از این برای حل آنها، راهکار امکانپذیر (Feasible) و معقولی وجود نداشت.
اولین مفهومی که برنامهنویسان و یا توسعهدهندگان برنامههای کاربردی با آن دست و پنجه نرم میکنند، مفهوم «الگوریتم» (Algorithm) است. وقتی که کاربر یا یک برنامهنویس به دنبال راه حل برای یک مسأله (به عنوان نمونه، یک مسأله بهینهسازی (Optimization)) است، یک استراتژی یا مجموعه دقیقی از دستورالعملهای لازم برای حل مسأله مورد نظر را مشخص میکند که به آن الگوریتم گفته میشود. حال سناریویی را فرض کنید که در آن مسأله داده شده به قدری پیچیده باشد که حل آن توسط الگوریتمهای مرسوم امکانپذیر نباشد. در چنین حالتی، چگونه میتوان استراتژی لازم برای حل این مسأله (الگوریتم حل مسأله) را کد نویسی کرد؟
این سناریو، یکی از حوزههای اصلی کاربرد «هوش مصنوعی» (Artificial Intelligence) در حل مسائل جهان واقعی محسوب میشود. به عبارت دیگر، زمانی میتوان از پتانسیل کامل الگوریتمهای هوش مصنوعی بهرهبرداری کرد که الگوریتمهای مرسوم حل مسأله پاسخگوی نیازهای مسأله مورد نظر نباشند و برای حل کردن این دسته از مسائل، روشهای بدیع حل مسأله با استفاده از تکنیکهای هوش مصنوعی نیاز باشد.
یکی از مقرون به صرفهترین و سادهترین تکنیکهای حل مسأله (از لحاظ بار محاسباتی و زمان لازم برای اجرای الگوریتم) در حوزه هوش مصنوعی، روشهای محاسبات تکاملی هستند. به طور کلی، الگوریتمهای محاسبات تکاملی بر پایه بهکارگیری «نظریه تکامل داروین» (Darwin's Theory of Evolution) جهت پیادهسازی برنامههای کامپیوتری شکل گرفتهاند.
یکی از اهداف مهم روشهای محاسبات تکاملی و الگوریتمهای تکاملی به طور خاص، بهبود کیفیت راه حلهای ضعیف تولید شده برای یک مسأله داده شده است. جهت بهبود کیفیت راه حلهای ضعیف تولید شده، الگوریتمهای محاسبات تکاملی از فرایندهای تکاملی نظیر «جهش» (Mutation) و سایر موارد استفاده میکنند؛ به عبارت دیگر، الگوریتمهای محاسبات تکاملی، در یک فرایند تکراری (Iterative Process)، آنقدر راه حلهای ضعیف تولید شده را با استفاده از عملگرهایی نظیر جهش (Mutation) دستکاری میکنند تا سیستم بتواند با دقت (Accuracy) مطلوبی مسأله مورد نظر را حل کند.
در حوزه «علوم کامپیوتر» (Computer Science) و هوش مصنوعی، محاسبات تکاملی خانوادهای از الگوریتمها جهت «بهینهسازی سراسری» (General Optimization) هستند که از فرایندهای «تکامل زیستی» (Biological Evolution) الهام گرفته شدهاند. به عبارت دیگر، به زیر شاخهای از هوش مصنوعی و «محاسبات نرم» (Soft computing) که به مطالعه و پیادهسازی الگوریتمهای الهام گرفته شده از فرایندهای تکامل زیستی میپردازد، الگوریتمهای محاسبات تکاملی گفته میشود.
از دیدگاه فنی، الگوریتمهای محاسبات تکاملی خانوادهای از روشهای حل مسأله محسوب میشوند که مبتنی بر جمعیت (Population-based) و آزمون و خطا (Trial and Error) هستند و از مکانیزمهای بهینهسازی تصادفی (Stochastic Optimization) یا بهینهسازی فرا اکتشافی (Meta-Heuristic) جهت همگرایی به جواب بهینه سراسری یا تقریبی (Approximation) از جواب بهینه استفاده میکنند.
در محاسبات تکاملی، ابتدا یک مجموعه ابتدایی متشکل از «جوابهای کاندید» (Candidate Solutions) تشکیل میشود. در طول فرایند تکاملی، الگوریتمهای محاسبات تکاملی با دستکاری و بهروزرسانی جمعیت متشکل از جوابهای کاندید، جمعیت را به سمت ناحیه حاوی جواب «بهینه سراسری» (Global Optimum) حرکت میدهند. در هر تکرار از الگوریتمهای محاسبات تکاملی (که به آن «نسل» (Generation) نیز گفته میشود)، از طریق حذف کردن جوابهای نامطلوب در جمعیت و ایجاد تغییرات بسیار کوچک و البته تصادفی در جوابهای کاندید، فرایند تکاملی شکل خواهد گرفت.
با الگو گرفتن از فرایندهای تکامل طبیعی در زیستشناسی، جمعیت متشکل از جوابهای کاندید (در الگوریتمهای محاسبات تکاملی)، تحت تاثیر فرایندهای تکاملی نظیر «انتخاب طبیعی» (Natural Selection) و جهش قرار میگیرد؛ در واژهشناسی الگوریتمهای محاسبات تکاملی، به فرایند انتخاب طبیعی، فرایند انتخاب مصنوعی (Artificial Selection) نیز گفته میشود. در نتیجه، بر اساس مکانیزمهای تعریف شده در فرایند تکامل، جمعیت متشکل از جوابهای کاندید (در الگوریتمهای محاسبات تکاملی) به نحوی تکامل پیدا میکنند که با مرور زمان و گذر نسلهای متوالی، «برازندگی» (Fitness) آنها افزایش پیدا کند؛ از «تابع برازندگی» (Fitness Function) برای محاسبه برازندگی جوابهای کاندید در الگوریتمهای محاسبات تکاملی استفاده میشود.روشهای محاسبات تکاملی قادر هستند تا مجموعهای از جوابهای بهینه (Optimized Solutions) را برای یک مسأله خاص و در شرایط مختلف آن تولید نمایند؛ چنین ویژگی مهمی در سیستمهای محاسبات تکاملی و الگوریتمهای تکاملی، آنها را در نقطه مقابل روشهای بهینهسازی مرسومی قرار میدهد که قادر هستند تنها یک جواب قطعی (Deterministic Solutions) و یا تعداد محدودی جواب تقریبی (Approximated Solutions) برای مسأله مورد نظر تولید نمایند. علاوه بر این، قابلیت تولید مجموعهای از جوابهای کاندید برای یک مسأله مورد نظر، الگوریتمهای محاسبات تکاملی را به یکی از محبوبترین روشهای حل مسأله در حوزه علوم کامپیوتر تبدیل کرده است.
تاکنون نسخههای مختلفی از الگوریتمهای محاسبات تکاملی ارائه شده است. بسیاری از الگوریتمهای محاسبات تکاملی که در سالهای اخیر ارائه شدهاند، «مستقل از دامنه» (Domain-independent) و «مستقل از مسأله» (Problem-independent) هستند که آنها را به گزینه بسیار مناسبی برای حل دامنه وسیعی از مسائل، به ویژه مسائل و ساختارهای دادهای (Data Structures) خاص، تبدیل میکند. بعضا از الگوریتمهای محاسبات تکاملی، به عنوان یک روش آزمایش کامپیوتری (In Silico Experimental Procedure)، جهت مطالعه جنبههای مشترک فرایندهای تکاملی عمومی استفاده میشود.
هدف از پیادهسازی الگوریتمهای محاسبات تکاملی (Evolutionary Computation)، شبیهسازی فرایند تکامل در یک سیستم کامپیوتری است. نتیجه شبیهسازی فرایند تکامل، تولید مجموعهای از الگوریتمهای بهینهسازی (Optimization Algorithm) است که معمولا مبتنی بر یک مجموعه ساده از ویژگیهای مشخصه (ژنها) و دستکاری آنها در یک فرایند تکراری و تکاملی هستند. ویژگی مهم الگوریتمهای محاسبات تکاملی این است که در هر تکرار از فرایند تکامل، به صورت تدریجی، کیفیت جوابهای تولید شده برای یک مسأله بهینهسازی بهبود بخشیده میشود و در نهایت، یک جواب بهینه (یا حداقل یک تقریب مناسب از جواب بهینه) حاصل میشود.
همانطور که پیش از این نیز اشاره شد، ایده اصلی محاسبات تکاملی بر پایه نظریه تکامل داروین (Darwin's Theory of Evolution) بنا نهاده شده است. اصول مهم در نظریه تکامل داروین عبارتند از:
نظریه تکامل داروین از چهار فرضیه اصلی تشکیل شده است:
با توجه به اصول و فرضیههای مطرح شده در محاسبات تکاملی، یک الگوریتم تکاملی از چهار مؤلفه اصلی تشکیل خواهد شد:
در ادامه، با مهمترین مفاهیم موجود در حوزه محاسبات تکاملی و شبیهسازی فرایند تکامل آشنا خواهید شد.
همانطور که پیش از این نیز اشاره شد، یکی از اصول اساسی الگوریتمهای محاسبات تکاملی (الگوریتمهای تکاملی) بقای برازندهترینها (Survival of the Fittest) است. به عبارت دیگر، بقاء در طبیعت بسیار سخت است و موجوداتی که میتواند به بقای خود در طبیعت ادامه دهند، شانس بیشتری برای تولید مثل خواهند داشت. محیط زندگی موجودات زنده (طبیعت)، به طور طبیعی موجوداتی را که از بیشترین برازندگی برخوردار هستند، برای تولید مثل انتخاب میکند و باقی موجوداتی را که قادر به بقا نیستند از بین میبرد.
نمونه مهم چنین فرایندی در مورد زرافهها کاملا مشهود است. گردن درازتر به زرافه کمک میکند تا بتواند از شاخههای بالاتر تغذیه کند. به مرور زمان، ظاهرا چنین ویژگی در زرافهها موجب شد تا زرافههایی که گردن درازتری دارند از شانس بیشتر برای بقاء برخوردار باشند؛ به عبارت دیگر، هیچ نیروی مستقیمی در طبیعت وجود نداشت که سبب درازتر شدن گردن زرافهها شود. بلکه، زرافههایی که به طور طبیعی از گردن درازتری برخوردار بودند، شانس بیشتری برای بقاء در طبیعت و تولید مثل پیدا میکردند.
مکانیزم مشابه با انتخاب طبیعی را میتوان در برنامههای کامپیوتری و جهت پیادهسازی الگوریتمهای محاسبات تکاملی مورد استفاده قرار داد. اگر سیستم محاسبات تکاملی یک جواب تقریبی (Approximate Solution) برای یک مسأله بهینهسازی در اختیار داشته باشد، با ایجاد تغییرات تصادفی در جواب و محاسبه برازندگی جوابهای جدید میتوان مشخص کرد که آیا تغییرات ایجاد شده، سبب بهبود کیفیت جوابها شده است یا نه. در صورتی که چنین فرایندی به صورت متوالی و تکراری انجام شود، به احتمال زیاد در هر مرحله، به حداقل یک جواب بهتر (با برازندگی بیشتر) یا برابر دست پیدا خواهد شد. انتخاب طبیعی یکی از حیاتیترین مؤلفههای محاسبات تکاملی محسوب میشود که قوه محرکه آن عملگرهای تکاملی نظیر جهش تصادفی در ژنها (متغیرها) است.
جهت درک بهتر چگونگی شبیهسازی فرایندهای تکامل طبیعی در الگوریتمهای محاسبات تکاملی، ابتدا نیاز است تا نقش تکامل در زیستشناسی مشخص شود. در طبیعت، تمامی موجودات از شاکله (بدن | Body) و مجموعهای از رفتارها تشکیل شدهاند. به این ویژگیها، فنوتایپ (Phenotype) آن موجود زنده گفته میشود؛ به عبارت دیگر، به شکل ظاهر و رفتاری یک موجود زنده فنوتایپ گفته میشود. رنگ مو، چشم و پوست، همگی بخش از فنوتایپ (Phenotype) موجودات زنده هستند.
شکل ظاهری موجودات زنده توسط مجموعهای از دستورالعملهای کدبندی شده (Encoded) در سلولهای آنها مشخص میشود. به این مجموعه دستورالعملهای کدبندی شده، ژنوتایپ (Genotype) گفته میشود. به عبارت دیگر، ژنوتایپ به اطلاعاتی اطلاق میشود که در DNA موجودات زنده کدبندی شده است.با اینکه فنوتایپ شکل ظاهری موجودات زنده پس از پدید آمدن را مشخص میکند، ژنوتایپ موجودات زنده همان طرح (Blueprint) ابتدایی است که شکل نهایی طاهر موجودات زنده از آن مشتق شده است.
دلیل اینکه فنوتایپ و ژنوتایپ در موجودات زنده، به عنوان دو مفهوم جدا از یکدیگر شناخته میشوند، بسیار ساده است. محیط (طبیعت نقش محیط را برای موجودات زنده ایفا میکند) نقش مهمی در شکلگیری ظاهر موجودات زنده دارد. به عنوان نمونه، در صورتی که دو خانه، با طرح (BluePrint) یکسان ولی با بودجههای متفاوت، ساخته شوند، بدون شک شکل و ظاهر تفاوتی از یکدیگر پیدا خواهند کرد.
در اغلب شرایط، این محیط است که موفقیت ژنوتایپها را مشخص میکند. به عبارت دیگر، موجودی در محیط موفق است که بتواند به بقای خود ادامه دهد و ژنوتایپهای خود را از طریق تولید مثل به فرزندان (Offspring | Child) خود منتقل کند. اطلاعات لازم برای طراحی شاکله و رفتار موجودات زنده در DNA آنها نقش بسته است. هر بار که موجودات زنده تولید مثل میکنند، DNA آنها کپی و به فرزندانشان منتقل میشود.
در این میان و در حین انجام فرایند کپی شدن DNA والدین و انتقال به فرزندان ممکن است جهشهای تصادفی در DNA رخ بدهد که سبب ایجاد تغییراتی در DNA فرزندان شود. چنین تغییراتی پتانسیل ایجاد تغییر در فنوتایپ موجودات زنده را دارند.
در الگوریتمهای محاسبات تکاملی نظیر الگوریتم ژنتیک (Genetic Algorithm)، به جمعیت جوابهای کاندید یک مسأله بهینهسازی که به سمت جواب بهینه همگرا میشوند، فنوتایپ (Phenotype) گفته میشود. همچنین، هر کدام از جوابهای کاندید، مجموعهای از ویژگیهای مختص به خود دارند که از طریق اعمال عملگرهای تکاملی تغییر پیدا میکند؛ به این مجموعه از ویژگیها (مقادیر متغیرهای یک نمونه)، ژنوتایپ گفته میشود.
بیشتر الگوریتمهای محاسبات تکاملی، از طریق همانندسازی مکانیزمهای تکامل طبیعی نظیر انتخاب طبیعی، اقدام به بهینهسازی مسائل مختلف میکنند. ساختار کلی الگوریتمهای محاسبات تکاملی در شکل زیر نمایش داده شده است:
کاری که فرایندهای تکاملی انجام میدهند این است که برازندگی جمعیت متشکل از جوابهای کاندید را افزایش میدهند. به عبارت دیگر، در الگوریتمهای محاسبات تکاملی یک تابع برازندگی برای مسأله تعریف شده است. هدف الگوریتمهای تکاملی پیدا کردن نقطه بهینه این تابع است (در مسائل کمینهسازی هدف پیدا کردن نقطه کمینه تابع برازندگی و هدف مسائل بیشنهسازی، پیدا کردن نقطه بیشینه تابع برازندگی است). با این حال، شکل و توزیع تابع برازندگی مشخص نیست. تنها کاری که الگوریتمهای بهینهسازی میتوانند انجام دهند این است که جوابهای جدیدی را اطراف نقطهای که بهترین جواب کاندید یافت شده در آن قرار دارد، نمونهگیری (Sampling) کنند.
شکل بالا نشان میدهد که جهشهای مختلف ایجاد شده در نمونههای جمعیت (در محور افقی)، سبب تولید امتیازات برازندگی متفاوت (در محور عمودی) خواهد شد. کاری که الگوریتمهای محاسبات تکاملی انجام میدهند این است که با هدف افزایش برازندگی جوابهای کاندید، نمونههای جدیدی را در همسایگی محلی (Local Neighborhood) نقطه X نمونهگیری میکنند. بسته به اندازه همسایگی انتخاب شده، تعداد نسلهای (تکرار) متفاوتی نیاز است تا الگوریتم بتواند به نقطه بهینه سراسری همگرا شود.
در صورتی که اندازه همسایگی کوچکی انتخاب شود، الگوریتم محاسبات تکاملی در دام بهینه محلی (کمینه یا بیشینه محلی) گرفتار خواهد شد. بهینههای محلی، جوابهای کاندیدی هستند که بهترین جواب در همسایگی محلی محسوب میشوند ولی نه به صورت سراسری. برخی از توابع بهینهسازی ممکن است حاوی بهینههای محلی متعددی باشند ولی تنها یک بهینه سراسری داشته باشند. در حالتی که الگوریتم در بهینه محلی گرفتار شود قادر نخواهد بود تا جواب بهتری برای مسأله بهینهسازی پیدا کند.
در حوزه «هوش مصنوعی» (Artificial Intelligence)، یک الگوریتم تکاملی (Evolutionary Algorithm) زیر مجموعهای از خانواده روشهای هوش محاسباتی است. بنابراین، الگوریتم تکاملی را میتوان یک الگوریتم فرا اکتشافی و مبتنی بر جمعیت برای حل مسائل بهینهسازی به شمار آورد. یک الگوریتم تکاملی از مکانیزمهایی استفاده میکند که از فرایندهای تکامل زیستی نظیر «تولید مثل» (Reproduction)، جهش، ترکیب یا آمیزش و انتخاب الهام گرفته شدهاند. به فرایندهای تکامل زیستی در محاسبات تکاملی، «عملگرهای تکاملی» (Evolational Operators) گفته میشود.
در الگوریتمهای مبتنی بر محاسبات تکاملی (الگوریتمهای تکاملی)، جوابهای کاندید برای یک مسأله بهینهسازی نقش «نمونهها» (Individuals) در یک جمعیت (Population) را ایفا خواهند کرد. تابع برازندگی نیز کیفیت جوابهای کاندید تولید شده را مشخص میکند. «تکامل جمعیت» (Evolution of Population) زمانی حاصل میشود که در یک فرایند تکراری و در نسلهای متوالی از الگوریتم تکاملی، عملگرهای تکاملی روی نمونههای موجود در جمعیت اعمال و جمعیت به سمت ناحیه حاوی جواب بهینه سراسری مسأله بهینهسازی همگرا شود.
از آنجایی که الگوریتمهای مبتنی بر محاسبات تکاملی (الگوریتمهای تکاملی) هیچ فرضی در مورد تابع برازندگی (جهت مشخص کردن کیفیت جوابهای کاندید) انجام نمیدهند، عملکرد بسیار خوبی در تقریب زدن جوابهای دامنه وسیعی از مسائل بهینهسازی از خود نشان میدهند. در الگوریتمهای تکاملی، با در اختیار داشتن یک مسأله، از فرایند «تکامل طبیعی» (Natural Evolution) به عنوان الگویی برای پیادهسازی استراتژیهای لازم جهت یافتن جوابهای بهینه و یا «تقریبا بهینه» (Near Optimum) مسأله داده شده استفاده میشود. همانطور که پیش از این نیز اشاره شد، تکامل زمانی اتفاق میافتد که عملگرهای تکاملی روی جوابهای کاندید اعمال میشوند و با تغییر کدهای ژنتیکی (یا مقادیر متغیرهای) جوابهای کاندید، جمعیت را به سمت نقطه بهینه سراسری (و یا تقریب مناسبی از آن) سوق میدهند.
یکی از ویژگیهای مهم الگوریتمهای محاسبات تکاملی این است که در یافتن جوابهای بهینه (یا تقریب مناسبی از جوابهای بهینه) مسائل بهینهسازی، عملکرد بسیار خوبی از خود نشان میدهند. دستهای از مسائل که جهت بهینهسازی آنها از الگوریتمهای محاسبات تکاملی استفاده میشود، «مسائل بهینهسازی ترکیبیاتی» (Combinatorial Optimization Problems) نام دارند که از لحاظ محاسباتی بسیار سخت و پیچیده هستند؛ انتظار میرود که زمان محاسباتی لازم برای بهینهسازی چنین مسائلی، با زیاد شدن ابعاد (اندازه) مسأله، به طور نمایی افزایش پیدا کند.
به عنوان نمونه، «مسأله فروشنده دورهگرد» (Travelling Salesman Problem) یکی از مسائل بهینهسازی ترکیبیاتی محسوب میشود. در الگوریتمهای مرسوم ارائه شده برای حل مسأله فروشنده دورهگرد، پیش از این که بتوان یکی از مسیرهای موجود در فضای جستجوی مسأله را به عنوان مسیر بهینه انتخاب کرد، باید تعداد قابل توجهی از مسیرهای ممکن میان شهر پیمایش و ارزیابی شوند. حالا فرض کنید که تعداد شهرهای موجود در مسأله یک عدد بسیار بزرگ باشد.
در چنین حالتی، تعداد گامهای محاسباتی لازم برای پیدا کردن جواب بهینه، با افزایش تعداد شهرهای موجود در فضای مسأله، به طور نمایی افزایش پیدا میکند. در نتیجه، افزایش تعداد شهرها در فضای جستجوی مسأله سبب میشود تا اختصاص دادن قدرت محاسباتی لازم برای پیدا کردن جواب بهینه، حتی روی کامپیوترهای قدرتمند امروزی، عملا غیر ممکن شود. بنابراین، بسیاری از الگوریتمهای مرسوم جهت حل چنین مسائلی، به جای اینکه به دنبال جواب بهینه برای مسائل بهینهسازی ترکیبیاتی سخت باشند، به یافتن یک تقریب از جواب بهینه بسنده میکنند.
مسأله فروشنده دورهگرد را به راحتی میتوان با استفاده از الگوریتمهای محاسبات تکاملی (به عنوان نمونه، الگوریتم ژنتیک (Genetic Algorithm)) و به شکل به مراتب بهینهتری نسبت به روشهای مرسوم حل مسأله، بهینهسازی کرد. برای چنین کاری، از ساختاری که در ادامه نمایش داده شده است استفاده میشود:
در ادامه کدهای پیادهسازی الگوریتم ژنتیک، جهت حل مسأله فروشنده دورهگرد، در زبانهای متلب و پایتون نمایش داده شده است. الگوریتمهای محاسبات تکاملی، با استفاده از فرایند تکاملی تصادفی قادر هستند تا با سرعت به مراتب بهتری به جواب بهینه مسأله یا تقریب مناسبی از آن دست پیدا کنند.
[برای مشاهده کدها به اصل مقاله مراجعه فرمایید.]
از یک دیدگاه انتزاعیتر به الگوریتمهای محاسبات تکاملی، چنین رویکردهایی در دسته «الگوریتمهای احتمالی» (Probabilistic Algorithms) طبقهبندی میشوند. الگوریتمهایی نظیر «شبیهسازی تبرید» (Simulated Annealing)، الگوریتم بهینهسازی فاخته (Cuckoo Optimization Algorithm)، الگوریتم کلونی مورچگان (Ant Colony Optimization) و الگوریتم کرم شب تاب (Firefly Algorithm)، از جمله الگوریتمهای تکاملی محسوب میشوند. الگوریتم شبیهسازی تبرید که مدل یک فرایند طبیعی و فیزیکی را شبیهسازی میکند، ویژگیهای مشترک زیادی با الگوریتم ژنتیک دارد:
به چنین فرایندی «تپه نوردی» (Hill Climbing) در فضای جستجوی مسأله نیز گفته میشود. با این حال، از آنجایی که معمولا معیار دقیقی برای مشخص کردن میزان نزدیکی یا همگرایی یک جواب کاندید به جواب بهینه وجود ندارد و فرایند تکامل در الگوریتمهای محاسبات تکاملی یک فرایند تصادفی است، یک جواب کاندید با برازندگی کمتر (جواب کاندیدی که همگرایی کمی با جواب بهینه دارد) نیز میتواند در فرایند تکامل شرکت کند و مقادیر متغیرهای آن دستخوش تغییر شود؛ البته، جوابهای کاندیدی که برازندگی کمتری نسبت به دیگر جوابها دارند، با احتمال کمتری نسبت به جوابهای کاندید برازندهتر، میتوانند در فرایند تکامل شرکت کنند.
اگر چه در تئوری نشان داده شده است که «استراتژیهای تکاملی» (Evolutionary Strategies) را میتوان در دامنه وسیعی از مسائل بهینهسازی مورد استفاده قرار داد، ولی بهکارگیری آنها به صورت عملی و در مسائل جهان واقعی نشان داد که استفاده از الگوریتمهای محاسبات تکاملی در مسائل خاص، نیازمند ایجاد تغییرات در فرایند تکاملی تعبیه شده است تا جوابهای حاصل از کیفیت مناسبی برخوردار باشند.
در یک دستهبندی جامع و کلیتر، الگوریتمهای محاسبات تکاملی در روشهای «هوش محاسباتی» (Computational Intelligence) یا «محاسبات نرم» (Soft Computing) طبقهبندی میشوند.
دستهبندی کلی الگوریتمهای هوش محاسباتی در ادامه نمایش داده شده است:
تفاوت میان تکنیکهای مختلفی محاسبات تکاملی، در نحوه «نمایش کدبندی جوابهای کاندید» (Representation of Candidate Solutions Representation)، جزئیات مرتبط با پیادهسازی این دسته از الگوریتمها و ذات مسأله بهینهسازی مورد نظر است.
در ادامه، به طور مختصر با مهمترین انواع الگوریتمهای محاسبات تکاملی آشنا خواهید شد:
پیادهسازی الگوریتم ژنتیک در زبان متلب: در ادامه، کدهای پیادهسازی الگوریتم ژنتیک برای مدلسازی و حل «الگوریتم راسو» (Weasel algorithm) [+] نمایش داده شده است. هدف این الگوریتم این است که نشان دهد تغییرات تصادفی در ژنها و ترکیب آنها با یک مکانیزم انتخاب غیر تصادفی، منجر به تولید نتایجی متفاوت و بهتر از شانس خالص در فرایندهای تکاملی خواهد شد. مشخصات این مسأله به شکل زیر است:
«برنامهنویسی ژنتیک» (Genetic Programming): در این روش محاسبات تکاملی، جوابها به فرم برنامههای کامپیوتری و معمولا در قالب درخت LISP نمایش داده میشوند. همچنین، برازندگی جوابهای کاندید به وسیله قابلیت آنها در حل یک مسأله محاسباتی سنجیده میشود.