3- تشریح الگوریتم ژنتیک :
3-1- مفهوم الگوریتم ژنتیک :
الگوریتم ژنتیک را میتوان به طور ساده، یک روش جستجوگر نامید که بر پایهی مشاهدهی خصوصیات فرزندان نسلهای متوالی، و انتخاب فرزندان بر اساس اصل (اثبات نشدهی) بقای بهترین، پایهریزی شده است. الگوریتم ژنتیک بر روی فرزندان یک نسل، (مجموعه جوابهای مسئله در یک مرحله)، از قوانین موجود در علم ژنتیک تقلید کرده و با بکار بردن آنها، به تولید فرزندان با خصوصیات بهتر، (جوابهای نزدیکتر به هدف مسئله) میپردازد و در هر نسل به کمک فرآیندی انتخابی که بر اساس ارزش جوابها میباشد و تولید مثل فرزندان (جوابهای) جدید، تقریب بهتری از جواب نهایی را بدست میآورد. این فرآیند باعث میشود که نسلهای جدید با شرایط مسئله سازگارتر باشند، این رقابت میان فرزندان (جوابها) و پیروز شدن فرزندِ شایستهتر (جواب بهتر) و انتخاب شدنشان توسط الگوریتم ژنتیک برای تولید مثل بعدی و کنار رفتن فرزندان یا همان ژنهای مغلوب که در حقیقت جوابهای دور از هدف مسئله میباشند روش کارآمدی برای حل مسائل پیچیده به خصوص مسائل پیچیدهی بهینه سازی که باید بهترین جواب را از میان جوابهای قابل قبول انتخاب کرد میباشد.
3-2- معرفی اصطلاحاتی که در ژنتیک الگوریتم به کار میرود :
3-2-1- افراد[1] و کروموزمها[2]:
نقاطی که میتوانند ورودی تابع شایستگی باشند، افراد نامیده میشوند، این افراد که تقریبهایی از جواب نهایی هستند زمانی که این مقادیر، به صورت رشتههایی از ارقام یا حروف کدگذاری میشوند به آن ها کروموزم گفته میشود به هر یک از مؤلفههای برداری یا بیتهای تشکیل دهندهی یک کروموزم که ویژگیهای آن کروموزم را مشخص میکند ژن[3] گفته میشود . متداولترین روش کدگذاری افراد، سیستم کدگذاری دودویی[4] با اعداد صفر و یک است که از کنار هم قرار گرفتن این کدها یک کروموزم ایجاد میگردد.
همچنین در هر مسئلهی الگوریتم ژنتیک، تابع برازندگی از چند متغیر مستقل تشکیل میشود که به هر یک از این متغیرها یک فنوتایپ[5] گویند. بنابر این کروموزمِ معرفِ هرفرد، برای اینکه در یک تابع برازندگی صدق کند باید از فنوتایپها تشکیل شود در نتیجه هر کروموزم از چند فنوتایپ تشکیل شده است.
جمعیت، به مجموعهای از افراد گویند که در هر مرحله به صورت یک آرایه نوشته میشوند. به طور مثال اگر تابع شامل سه متغیر و تعداد جمعیت 100 نفر باشد، آن را به صورت ماتریسی در 100 ردیف و با 3 ستون نمایش میدهند.
الگوریتم ژنتیک در هر مرحله بر روی این جمعیت کار خواهد کرد و به طور معمول برای هر متغیر جمعیت شامل 30 تا 100 فرد است.
3-2-3- جمعیت اولیه[8] :
بعد از تصمیمگیری در مورد نحوهی کدگذاریِ کروموزمها، جمعیت اولیه باید ایجاد گردد. این مرحله معمولاً با انتخاب تصادفیِ مقادیر در محدودهی مجاز صورت میگیرد. به محدودهی مجاز فضای جستجو[9] گفته میشود که فضای شامل مجموعه جواب امکانپذیر برای حل مسئله را شامل میشود؛ هر نقطه از این محدوده میتواند یک جواب برای حل مسئله باشد ولی واضح است که لزوماً بهترین جواب برای حل مسئله نخواهند بود.
جمعیت اولیه فوقالعاده مهم است، اگر ما بدانیم نقطه بهینه، تقریباً کجا واقع شده است درنتیجه گسترهی جمعیت اولیه را بر همین اساس تنظیم میکنیم امّا در صورت عدم آگاهی از مکان حدودیِ نقطهی بهینه کار دشوار میشود چون نسل اولیه خوبی تعیین نشده و به احتمال فراوان زمان رسیدن به جواب مطلوب را کاهش داده و احتمال یافتن کمینهی مطلق مسئله کاهش میدهد.
3-2-4- والدین[10] و فرزندان[11] :
الگوریتم ژنتیک بیشتر، افرادی را که مقادیر بهتری دارند به عنوان والدین انتخاب می کند و با کار بر روی آنها فرزندانی برای نسل بعد به وجود می آورد. (مقادیر تابع به ازای هر فرد را نمرهی[12] آن فرد مینامند.)
3-2-5- تابع هدف[13] :
تابع هدف، هدف و خواستهی ما از طرح مسأله است. تابع هدف، شاخصی از نحوهی عملکرد افراد در فضای مسئله است. برای مثال اگر هدف ما از حل مسئله یافتن جواب کمینه باشد، مناسبترین فرد آن است که تابع هدفش کمترین مقدار را داشته باشد.
3-2-6- تابع برازندگی[14] :
این تابع برای تبدیل مقادیر تابع هدف به مقیاسی برای سازگاری و کارایی نسبی افراد، به کار میرود و از تابع هدف مشتق میشود. اصولاً ژنتیک الگوریتم برای حل مسائل بیشینه مناسب است، بنابر این برای حل مسائل کمینه سازی باید با استفاده از یک سری تبدیلها آن را به مقدار بیشینه تبدیل کنیم.
اگر تابع هدف را با f(x) و تابع برازش را با F(x) نشان دهیم آنگاه از تبدیل های زیر میتوانیم برای بدست آوردن تابع برازش از تابع هدف استفاده کنیم.
برای مسائل بیشینه سازی : (3) F(x) = f(x) برای مسائل کمینه سازی : (4) if f(x) ¹ 0 F(x) = 1/f(x) F(x) = 1/(1+f(x)) if f(x) = 0 (5)
3-2-6- تنوع جمعیتی[15] :
فاصلهی متوسط بین افراد در یک جمعیت را تنوع جمعیت گویند. یک جمعیت در صورتی تنوع بالایی دارد که فاصلهی بین افراد آن زیاد باشد ودر غیر این صورت تنوع کم است.
3-2-7- انتخاب[16] :
هرگاه فردی در یک نسل انتخاب شود، به این معنی است که این فرد شایستگی تولید مثل و یا حضور مستقیم در مرحله بعد را خواهد داشت. مرحلهی اول انتخاب؛ مربوط به تعیین برازندگی افراد باتوجه به نمرهی آنها می باشد که تعیین کنندهی احتمال شرکت آنها در مرحلهی تکثیر است و مرحلهی دوم انتخاب احتمالی افراد است که بر اساس برازش نسبی صورت میگیرد.
انتخاب، شیوهها و تکنیکهای متنوعی دارد که بسته به نوع مسئله و شرایط حاکم بر آن از این از هر یک از این تکنیکها و روشها استفاده میشود.
3-2-7-1- روش انتخاب چرخ گردان[17] :
مهمترین و معمولترین روش انتخاب، روش چرخ گردان است. هر فرد یک نمرهی برازندگی را نسبت به عملکردش در تابع برازندگی بدست میآورد، در این روش باید تمام این نمرات را با هم جمع زد و در یک فاصلهی از یک تا مجموع نمرات برازشها در نظر گرفت، حال با تقسیم نمرهی برازش هر فرد بر حاصل جمع نمراتِ برازشِ افراد، احتمال انتخاب هر فرد در طی فرآیند انتخاب بدست میآید و طبیعتاً حاصل جمع این احتمالها برابر یک خواهد بود.
برای انتخاب هر فرد، عددی تصادفی بین صفر تا یک در نظر گرفته میشود و فردی که این نقطه در محدودهی مربوط به آن قرار میگیرد انتخاب میشود. برای تعیین محدودهی هر فرد باید به شکل زیر عمل کرد:
اگر تعداد افراد را n در نظر گیرم، محدودهی هر فرد با استفاده از روش احتمال تجمیعی[18] مشخص می شود. یعنی برای پیدا کردن محدودهی مربوط به i امین فرد، ابتدا مجموع احتمالات مربوط به (i-1) نفر قبل را بدست میآوریم که مثلاً می شود عدد A، حال اگر احتمال فرد i ام را که مثلاً عددی برابر با B میباشد با A جمع کنیم عدد C بدست میآید. محدودهی مربوط به فرد i ام ازA آغاز میشود و در C به پایان میرسد.
در این روش میتوان برای جلوگیری از تولید مثل زیاد یک والد و در نتیجه یک نواختی جوابها اندازهی احتمال هر والد را بعد از انتخاب شدنش کاهش داد.
البته در برخی مسائل با توجه به نوع مسئله و ویژگیهای آن، روش انتخاب میزِ گردان چندان مناسب نیست، به خصوص در مواردی که نمرات برازندگی افراد خیلی با هم تفاوت داشته باشد که نتیجهی این امرکندی وهمگرایی ناگهانی جستجو به خاطر کوچکی سریع فضای جستجو میباشد.
در این موارد میتوان از سایر روشهای انتخاب مانند روش رقابتی[19]، روش رتبهبندی[20] و روشهای و متدهای انتخابی ِدیگر استفاده کرد.
3-2-8- تولید نسل جدید[21] یا تولید مثل[22] :
در این بخش به مهمترین عملگرهای الگوریتم ژنتیک که برای تولید نسل بعدی از روی نسل قبل
به کار میرود اشاره میشود.
3-2-8-1- عملگر نخبه[23]گرا :
بر طبق این عملگر افرادی که در نسل فعال از بهترین نمرهی برازندگی برخوردارند، به طور خودکار به نسل بعد منتقل میشوند. این عملگر باعث افزایش کارایی الگوریتم ژنتیک میشود، زیرا مانع از گم شدن جوابهایِ خوبِ بدست آمده میشود.
معمولاً بهترین افرادِ نسل فعال، یعنی والدین را جایگزینِ بدترین فرزندان تولید شده مینمایند. البته باید توجه داشت در مواردی که تعداد زیادی جواب نزدیک به هم وجود داشته باشد، این روش از ثبات لازم برخوردار نیست ولی در مواردی که مسئله یک بهینهی کلی داشته باشد این عملگر مؤثر و مناسب به نظر میرسد.
3-2-8-2- عملگر تقاطع[24] :
وقتی که افراد یک نسل بر اساس برازندگی خود در مرحلهی انتخاب، گزینش شوند این عملگر با ترکیب ژنهای یک جفت والدِ برگزیده، کروموزمِ معرف فرد جدید را به وجود میآورد. همانند کروموزمها در طبیعت، فرزندان حاصل از این عملگر هر یک بخشی از اطلاعات روی کروموزمهای والد را دارند
میتوان گفت عملگر اصلیِ ایجاد نسل جدید در مرحلهی تکثیر، تقاطع یا همان پیوند است.
این عملگر یک عملگرِ ترکیبی است که شامل سه مرحله میشود. در مرحله نخست یک جفت از کروموزمهای برگزیده را به طور تصادفی انتخاب میکند؛ در مرحلهی دوم محلی را برای ادغام به طور تصادفی در طول رشتهی کروموزم انتخاب میکند و سرانجام در مرحلهی سوم، مقدار دو رشته را با توجه به محل ادغام که مشخص کردهایم جابجا میکند.
روش های مختلفی برای ادغام و تقاطع وجود دارد که بسته به نظر کاربر و شرایط مسئله باید از آنها استفاده کرد. مهمترین این روشها عبارتند از : روش تقاطع تک نقطهای[25]، روش تقاطع دو نقطهای[26]، روش تقاطع چند نقطهای[27]، روش تقاطع یک نواخت[28]، روش تقاطع ماتریسی[29] و...
در اینجا لازم است به یک مفهوم مهم دیگر یعنی نرخ تقاطع اشاره کنیم. با تعیین این نرخ که عددی بین صفر تا یک است ما تعیین میکنیم که چند درصد از جمعیت فعالِ حاضر باید در عمل تقاطع شرکت کنند.
دقت شود اگر این مقدار خیلی زیاد باشد، باعث میشود تا فرصت تطابق در کروموزم از دست برود وهمچنین اگر این مقدار خیلی کم باشد تعداد فرزندان تولید شده کافی نخواهد بود. معمولاً کمترین مقداری را که برای نرخ تقاطع در نظر میگیرند نباید از 5/0 کمتر باشد. بر طبق نتایج تجربی بهترین نرخ تقاطع باید بین 80 تا 95 درصد باشد
3-2-8-3- عملگر جهش[30] :
در این عملگر با تغییرات تصادفی بر روی ژن یا ژنهایِ کروموزم یک والد، کروموزمهایِ معرّف فرد جدید به وجود میآیند. در جهش، کروموزمِ هر فرد به تنهایی و بدون نیاز به ادغام با کروموزم فرد دیگر بر اساس قوانین احتمال میتواند تغییر کند.
جهش معمولاً به عنوان یک عملگر اصلی در الگوریتم ژنتیک شناخته میشود که مسئول تولید مجدد ژنهای گمشده و جلوگیری از کوچک شدن فضای جستجوی الگوریتم ژنتیک از طریق فراهم آوردن افراد تصادفی در همسایگی جمعیت میباشد.به عبارت دیگر به کمک این عملگر میتوان امید داشت که کروموزمهای خوبی که در مراحل انتخاب یا تکثیر حذف شدهاند، دوباره احیا شوند این عملگر همچنین تضمین میکند که بدون توجه به پراکندگی اولیه، احتمال جستجوی هر نقطه از فضای مسأله هیچگاه صفر نشود. این عملگر منجر به تولید افرادی میشود که قبلاً هرگز وجود نداشتهاند و ممکن است منجر به یافتن راه حل بهتری برای مسئله بشوند؛ همچنین این عملگر در جلوگیری از به دام افتادنِ الگوریتمِ جستجو در کمینههای محلی مفید است.
معمولاً تصور میشود که عملگر تقاطع اصلیترین عملگری است که منجر به انجام یک جستجوی کامل در فضای جستجو میشود. تکامل ساده که شامل عملیات انتخاب و جهش میشود، حتی بدون عملیات تقاطع دارای قدرت بالایی برای جستجو میباشد. در واقع میتوان گفت الگوریتم ژنتیکی که تنها حاوی عملگر جهش باشد از الگوریتم ژنتیکی که تنها از عملگر تقاطع بهره میبرد بهتر عمل میکند زیرا با همگرایی جمعیت، جهش تأثیر بیشتری از تقاطع خواهد داشت. بدون جهش، تقاطع تنها منجر به همگرایی زودرس خواهد شد. در نتیجه میتوان گفت که جهش با وجود احتمال وقوع کم (معمولاً بین001/0 تا 01/0) تأثیر بسیار زیادی درعملکرد الگوریتم ژنتیک دارد.
در نمایش دودوییِ کروموزم افراد، جهش به معنای تغییرمقدار یکی از ژنهای کروموزم از صفر به یک و یا بلعکس میباشد. عملگر برای این کار یک احتمال کوچک نظیر Pm را در نظر میگیرد که به آن اصطلاحاً نرخِ جهش[31] گفته میشود؛ همانطور که اشاره شد این احتمال معمولاً عددی کوچک
بین001/0 تا 01/0 است، سپس یک عدد تصادفی بین صفر تا یک در تولید میشود، اگر این عدد کوچکتر از Pm بود مقدار بیت یا همان ژن کروموزم تغییر میکند و در غیر این صورت مقدار بیت تغییری نخواهد کرد. بیتهای یک رشته به صورت مستقل جهش مییابند، به این ترتیب که جهش یک بیت بر روی احتمال جهش سایر بیتها تأثیری ندارد.
البته جهش علاوه بر مزایایی که دارد دارای اشکالاتی نیز میباشد، از جمله اینکه جهش، احتمال تمایل به سمت افراد با برازندگی کمتر را افزایش میدهد، در نتیجه میتواند زمان همگرایی را به تأخیر بیاندازد. به همین علت پیشنهاد میشود که این عملگر پارامتریزه شود، بدین صورت که با افزایش همگرایی جمعیت، نرخ جهش کاهش یابد.
توجه داشته باشید که غالباً عملگر جهش برروی افرادی که برای عمل تقاطع در نظر گرفته میشوند عمل نمیکند.
سه عملگر نخبهگرا، تقاطع و جهش، مهمترین عملگرها در تولید نسل جدید میباشند که به صورت شماتیک در شکل ----- نشان داده شدهاند
به جز این سه عملگر، الگوریتم ژنتیک از عملگرهای دیگری نیز برای تولید مثل استفاده میکند که با توجه به شرایط حاکم بر مسئله و نوع آن به کار میروند. برخی از این عملگرها عبارتند از: عملگر مهاجرت[32]، عملگر حذف[33]، عملگر معکوس کردن[34]، عملگر جداسازی[35] و...
3-2-9- دستور خاتمهی الگوریتم :
از آنجا که الگوریتم ژنتیک یک روش جستجوی تصادفی است، ارائهی فرمولی خاص برای پایان آن مشکل است. ممکن است برازش جمعیت برای تعدادی از نسلها ثابت باقی مانده و باعث ایجاد این تصور شود که به جواب نهایی رسیدهایم. یکی از شیوههای معمول برای پایاندادن به الگوریتم، متوقف کردن آن بعد از تولید تعداد مشخصی نسل است. از آنجا که در بعضی عملگرها نیاز است که تعداد کل نسلها را بدانیم، این شیوه مناسب به نظر میرسد. بعد از اتمام تکرار الگوریتم تا تعداد نسلی که به عنوان ورودی به الگوریتم دادهایم، کیفیت جوابهای نهایی بررسی میشود که در صورت ارضا نشدنِ جوابهای مدنظر، الگوریتم تا تعداد مشخصِ دیگری ادامه پیدا کرده و یا از ابتدا و با چینش جمعیت اولیهی متفاوتی و احیاناً برخی تنظیمات جدید، اجرا میشود.
3-2-11- بعضی از مهمترین مزایا و محاسن الگوریتم ژنتیک :
1- الگوریتم ژنتیک همزمان با یک مجموعه از نقاط جستجو را شروع میکند، نه با یک نقطهی تنها.
2- الگوریتم ژنتیک به مشتقگیری و یا هرگونه اطلاعات کمکی نیاز ندارد وتنها تابع هدف و شیوهی تعیین برازش از اطلاعات خام، روند جستجو را مشخص میکند.
3- الگوریتم ژنتیک به سرعت میتواند یک مجموعهی بزرگ از راه حلها را پویش نماید، همچنین راه حلهای نامناسب تأثیر منفیای بر روی راه حل نهایی نداشته و به آسانی حذف میشوند.
4- در این روش هیچ نیازی به خطی سازی مسئله وجود ندارد.
5- سایر الگوریتمهای بهینه سازی یک نقص بزرگ نسبت به الگوریتم ژنتیک دارند. زیرا این الگوریتمها نیاز به یک حدس اولیه در ارتباط با راه حل میباشند که این حدس اولیه تأثیر زیادی بر روی نتیجهی نهایی دارد. بر خلاف این الگوریتمها الگوریتم ژنتیک تنها نیاز به یک محدودهی جستجو میباشد که این محدوده با توجه به دانش اولیه در مورد خصوصیات فیزیکیِ سیستم قابل طرح است. الگوریتم ژنتیک به صورت مؤثر کل فضای راه حلها را جستجو میکند. این نوع جستجوی الگوریتم ژنتیک را بر خلاف سایر روشها از افتادن در تلهی نقاط کمینهی محلی دور نگه میدارد.
6- الگوریتم ژنتیک نیازی ندارد که تابع هدف خوش رفتار باشد.
7- الگوریتم ژنتیک یک مجموعه از جوابهای بالقوه را ارائه میدهد و انتخاب جواب نهایی بر عهدهی کاربر است. در مواردی که مسئله جواب واحد ندارد، مانند بهینه سازی چند هدفه، الگوریتم ژنتیک برای مشخصکردن همزمان جوابها مفید خواهد بود.
8- در مسائل گسسته یا پیوسته با کمینههای محلی بسیار زیاد به دنبال کمینهی کلی میگردد.(حال آنکه بتوان به این کمینه مطلق رسید یا نه به تنظیمات ما برای حل آن مسئله بستگی دارد.)
9- الگوریتم ژنتیک از قوانین احتمال گذرا استفاده میکند و نه از نوع قطعی آن بر خلاف دیگر روشهای بهینه سازی.
[1] - Individuals
[2] - Chromosomes
[3] - Gene
[4] - Binary
[5] - Phenotypes
[6] - Populations
[7] - Generations
[8] - Initial Population
[9] - Search space
[10] - Parents
[11] - Children
[12] - score
[13] - Objective function
[14] - Fitness function
[15] - Diversity
[16] - Selection
[17] - Roulette wheel
[18] - Expected count
[19] - Tournament
[20] - Rank
[21] - Creating the next Generation
[22] - Reproduction
[23] - Elite
[24] - Crossover
[25] - Single-Sight Crossover
[26] - Tow-point Crossover
[27] - Multi point Crossover
[28] - Uniform Crossover
[29] - Matrix Crossover
[30] - Mutation
[31] - Mutation Rate
[32] - Migration
[33] - Deletion
[34] - Inversion
[35] - Segregation
واقعاً عالی بود.ممنون