چکیده:
الگوریتم های ژنتیک از اصول انتخاب طبیعی داروین برای یافتن فرمول بهینه جهت پیش بینی یا تطبیق الگو استفاده می کنند. الگوریتم های ژنتیک اغلب گزینه خوبی برای تکنیک های پیش بینی بر مبنای رگرسیون هستند. همچنین ساده خطی وپارامتریک نیزگفته می شود، به الگوریتم های ژنتیک می توان غیر پارامتریک نیز گفت.
مختصراً گفته می شود که الگوریتم ژنتیک (یا GA) یک تکنیک برنامه نویسی است که از تکامل ژنتیکی به عنوان یک الگوی حل مسئله استفاده می کند. مسئله ای که باید حل شود ورودی است و راه حل ها طبق یک الگو کد گذاری می شود ومتریک که تابع fitness هم نام دارد هر راه حل کاندید را ارزیابی می کندکه اکثر آنها به صورت تصادفی انتخاب می شوند. یکی از مهمترین کاربردهای الگوریتم های ژنتیک حل مسئله فروشنده دوره گرد می باشد که در بخش دوم به طور کامل به آن می پردازیم.
کلاً این الگوریتم ها از بخش های زیر تشکیل می شوند :
انتخاب مجدد selection
ترکیب combination
جهش ژنی mutation
که در ادامه آنها را توضیح خواهیم داد.
مقدمه:
قانون انتخاب طبیعی بدین صورت است که تنها گونههایی از یک جمعیت ادامه نسل میدهند که بهترین خصوصیات را داشته باشند و آنهایی که این خصوصیات را نداشته باشند به تدریج و در طی زمان از بین میروند.
مثلا فرض کنید گونه خاصی از افراد هوش بسیار بیشتری از بقیه افراد یک جامعه یا کولونی دارند. در شرایط کاملا طبیعی این افراد پیشرفت بهتری خواهند کرد و رفاه نسبتا بالاتری خواهند داشت و این رفاه خود باعث طول عمر بیشتر و باروری بهتر خواهد بود(توجه کنید شرایط طبیعی است نه در یک جامعه سطح بالا با ملاحظات امروزی یعنی طول عمر بیشتر در این جامعه نمونه با زاد و ولد بیشتر همراه است). حال اگر این خصوصیت(هوش)ارثی باشد به طبع در نسل بعدی همان جامعه تعداد افراد باهوش به دلیل زاد و ولد بیشتر اینگونه افراد بیشتر خواهد بود. اگر همین روند را ادامه دهید خواهید دید که در طی نسلهای متوالی دائما جامعه نمونه ما باهوش و باهوشتر میشود. بدین ترتیب یک مکانیزم ساده طبیعی توانسته است در طی چند نسل عملا افراد کم هوش را از جامعه حذف کند علاوه بر اینکه میزان هوش متوسط جامعه نیز دائما در حال افزایش است.
بدین ترتیب میتوان دید که طبیعت با بهرهگیری از یک روش بسیار ساده(حذف تدریجی گونههای نامناسب و در عین حال تکثیر بالاتر گونههای بهینه) توانسته است دائما هر نسل را از لحاظ خصوصیات مختلف ارتقا بخشد.
در این میان آنچه شاید بتواند تا حدودی ما را در فهم این مساله یاری کند مفهومیست به نام :
تصادف یا جهش.
هدف اصلی روشهای هوشمند به کار گرفته شده در هوش مصنوعی یافتن پاسخ بهینه مسائل مهندسی است. به عنوان مثال اینکه چگونه یک موتور را طراحی کنیم تا بهترین بازدهی را داشته باشد یا چگونه بازوهای یک ربات را محرک کنیم تا کوتاهترین مسیر را تا مقصد طی کند(دقت کنید که در صورت وجود مانع یافتن کوتاهترین مسیر دیگر به سادگی کشیدن یک خط راست بین مبدا و مقصد نیست) همگی مسائل بهینهسازی هستند.
در مورد نکته دوم باید بگوییم که روشهای ریاضی بهینهسازی اغلب منجر به یک فرمول یا دستورالعمل خاص برای حل هر مسئله میشوند. در حالی که روشهای هوشمند دستورالعملهایی هستند که به صورت کلی میتوانند در حل هر مسئلهای به کار گرفته شوند. این نکته را پس از آشنایی با خود الگوریتم بیشتر و بهتر خواهید دید.
اما یک موجود چگونه قادر است که شکل و فرم موجودات بعد از خود را تعیین کند؟ برای اینکه جواب سوال را دریابیم، ابتدا باید فرآیند تولید مثل موجودات را بررسی کنیم.
در جریان تولید مثل یک موجود کروموزومهای والدین موجود با یکدیگر ترکیب میشوند و سلول تخم را تشکیل می دهند. تکثیر این سلول تخم منجر به تشکیل یک فرزند تقریباً مشابه والدینش میشود. این موجود ترکیبی از خصوصیات والدین خود را به همراه خواهد داشت. این روند باعث تکامل یک موجود میشود.
اما تا اینجای کار اتفاق خاصی که باعث ایجاد یک موجود جدید گردد به وقوع نپیوسته است. نکته کار اینجاست که در حین تشکیل سلول تخم تغییرات ناخواستهای درون کروموزوم(های) سلول بوجود میآید. این تغییرات اگر کوچک باشند، در حین تکثیر سلول تخم و تشکیل موجود اصلی اصلاح میشوند. اما تغییرات بزرگ اصلاح نمیشوند و منجر به تشکیل یک موجود جدید میشوند.
اگر موجود جدید (و بطور کلی فرزند) ایجاد شده نسبت به والدین در تقابل با محیط برتری داشته باشد، قطعاً در جریان زندگی موفقتر است و امکان تولید مثل پیدا میکند و در نتیجه میتواند خصوصیات خوبش را به فرزندانش منتقل نماید. با توجه به اینکه این فرزندان نیز در تقابل با محیط موفقتر هستند، امکان تولید مثل پیدا میکنند.
با توجه به مطالب فوق متوجه میشوید که سه فاکتور اصلی مبنای نظریه داروین را تشکیل میدهند، این سه فاکتور عبارتند از:
· تنوع: ترکیب شدن مشخصات والدین متفاوت باعث میشود که خصوصیات خوب آنها ترکیب شود و یک موجود بهتر بوجود آید.
· تصادف: عامل ایجاد تغییرات در موجودات فرزند
· انتخاب: که توسط محیط انجام میشود، به این معنی که موجودات با شایستگی پائین احتمال ادامه حیات و تولید مثل کمتری دارند. (بقای شایستهترین)
روند فوق و مخصوصاً سه فاکتور فوق مبنای کار دانشمندان رشته کامپیوتر قرار گرفت و در نتیجه الگوریتمهای ژنتیک بوجود آمدند. این روش در سال 1970 توسط John Holland معرفی گردید
این روشها با نام Evolutionary Algorithms نیز خوانده میشوند. پیشرفت این الگوریتمها باعث شد که کلاً مجموعه روشهای حل مساله با نام پردازش تکاملی بوجود بیاید.
پردازش تکاملی از شاخههای زیر تشکیل شده است:
1. الگوریتمهای ژنتیک (Genetic Algorithms)
2. برنامه نویسی ژنتیک (Genetic Programming)
3. استراتژی های تکاملی (Evolutionary Strategies)
4. برنامه نویسی تکاملی (Evolutionary Programming)
نحوه ارائه مطالب به این صورت است که در ابتدا قسمتهای مختلف یک الگوریتم ژنتیک را بیان کرده و هریک را به اختصار تشریح میکنیم. سپس بیان میکنیم که یک الگوریتم ژنتیک چه خصوصیاتی باید داشته باشد،
بخش اول : الگوریتم ژنتیک
الگوریتم ژنتیک چیست؟
همانطور که گفتیم یکی از شاخههای پردازش تکاملی، الگوریتمهای ژنتیک میباشد. این الگوریتمها با الهام از روند تکاملی طبیعت، مسائل را حل میکنند. به این معنی که مانند طبیعت یک جمعیت از موجودات تشکیل میدهند و درون این موجودات اقدام به انجام اعمالی چون انتخاب والدین، تولید مثل، جهش و ... میکنند و این اعمال را آنقدر تکرار میکنند تا به مجموعه بهینه و یا موجود بهینه برسند.
این الگوریتمها با توجه به خصوصیات خاصی که دارند، به خوبی از عهده حل مسائلی که نیاز به بهینهسازی دارند و یا پارامترهای زیادی در آنها دخیل است، برمیآیند. در این قسمت به معرفی این الگوریتمها میپردازیم.
تشریح ساختار الگوریتمهای ژنتیک:
روند اجرای الگوریتمهای ژنتیک به صورت زیر است:
مساله
بازنمائی
جستجوی ژنتیکی
جواب
تشکیل جمعیت اولیه
همانطور که میبینید، برای حل یک مساله با استفاده از الگوریتمهای ژنتیک بایستی مراحل زیر را طی کنیم:
1. مدلسازی مساله یا بازنمائی
2. تشکیل جمعیت اولیه
3. ارزیابی جمعیت
4. انتخاب والدین
5. بازترکیبی
6. جهش
7. انتخاب فرزندان
8. شرط خاتمه الگوریتم
متغیر هایی که هر فرمول داده شده را مشخص می کنند به عنوان یکسری از اعداد نشان داده شده اند که معادل دی ان ای آن فرد را تشکیل می دهند.
موتور الگوریتم ژنتیک یک جمعیت آغازین از فرمول ایجاد می کند.هر فرد در برابر مجموعه ای از داده های مورد آزمایش قرار می گیرد و مناسبترین آنها انتخاب می شود که شاید 10 درصد از مناسبترین ها باقی بمانند و بقیه کنار گذاشته می شوند. مناسبترین افراد با هم جفتگیری (جابجایی عناصر دی ان ای)وتغییر(تغییر تصادفی عناصر دی ان ای) کرده اند.مشاهده می شود که با گذشت از میان تعداد زیادی از نسلها،الگوریتم ژنتیک به سمت ایجاد فرمول هایی که خیلی دقیق ترهستند،میل می کنند.جذابیت زیاد الگوریتم های ژنتیک این است که نتایج نهایی قابل ملاحظه ترند.فرمول نهایی برای کاربر انسانی قابل مشاهده خواهد بود،و برای ارائه سطح اطمینان نتایج می توان تکنیک های آماری متعارف رابر روی این فرمول ها اعمال کرد.فناوری الگوریتم های ژنتیک همواره در حال بهبود است.
الگوریتم ژنتیک GA یک تکنیک جستجو در علم کامپیوتربرای یافتن راه حل بهینه ومسائل جستجو است.الگوریتم های ژنتیک یکی از انواع الگوریتم های تکاملی اند که از علم زیست شناسی مثل وراثت، جهش،انتخاب ناگهانی ، انتخاب طبیعی و ترکیب الهام گرفته شده اند.
عموماً راه حلها به صورت 2 تایی 0 و1 نشان داده می شوند ولی روشهای نمایش دیگری هم وجود دارد.تکامل از یک مجموعه کاملاً تصادفی از موجودیت ها شروع می شود و در نسلهای بعدی تکرار می شود.در هر نسل،مناسبترین ها انتخاب می شوند نه بهترین ها.
یک راه حل برای مسئله مورد نظر،با یک لیست از پارامترها نشان داده می شود که به آنها کروموزوم یا ژنوم می گویند. کروموزوم ها عموماً به صورت یک رشته ساده از داده ها نمایش داده می شوند،البته انواع ساختمان داده های دیگر هم می توانند مورد استفاده قرار گیرند:
1. اعداد صحیح
2. رشتههای بیتی
3. اعداد حقیقی در فرم نقطه شناور
4. اعداد حقیقی به فرم رشته های بیتی
5. یک مجموعه از اعداد حقیقی یا صحیح
6. ماشینهای حالت محدود
7. هر فرم دیگری که بتوانیم عملگرهای ژنتیک را بر روی آنها تعریف کنیم
در ابتدا چندین مشخصه به صورت تصادفی برای ایجاد نسل اول تولید می شوند. در طول هر نسل ،هر مشخصه ارزیابی می شود وارزش تناسب(fitness) توسط تابع تناسب اندازه گیری می شود.
سپس باید نسل اولیه را مشخص کنیم. بعد از اینکه شکل کروموزومها را تعریف نمودیم، بایستی جمعیتی را تشکیل دهیم، که میخواهیم عناصر آنرا تکامل دهیم. تعداد عناصر موجود در این جمعیت معمولاً ثابت است. به این معنی که هنگامی که تعدادی عنصر در جریان تولید مثل به این جمعیت اضافه میکنیم، بایستی به همین تعداد عنصر نیز از جمعیت قبلی حذف کنیم.
قبل از اینکه الگوریتم بتواند آغاز به کار کند، بایستی یک جمعیت اولیه از کروموزومها تشکیل بدهیم. در اکثر الگوریتمها این جمعیت اولیه به صورت تصادفی تشکیل میشود. به این معنی که به اندازه طول جمعیت، کروموزوم تصادفی ایجاد میکنیم و آنها را به جمعیت اولیه اضافه میکنیم.
البته برای اینکه الگوریتم سریعتر به جواب برسد، میتوانیم بوسیله یکی از الگوریتمهای کم هزینه تعدادی از جوابهای تقریباً بهینه را محاسبه کرده و از آنها بعنوان جمعیت اولیه استفاده میکنیم. دیده شده است که در بعضی مسائل انجام این عمل تاثیر بسزائی در سرعت همگرائی الگوریتم دارد. البته نباید فراموش کنیم که انجام این عمل در مواردی باعث می شود، الگوریتم در مینیممهای محلی ناشی از جمعیت آغازی گیر افتاده و نتواند جوابهای بهتری را پیدا کند. برای جلوگیری از این مشکل علاوه بر جوابهای بهینه پیدا شده، تعدادی عنصر نیز به صورت تصادفی به جمعیت اضافه میکنیم.
گام بعدی ایجاد دومین نسل از جامعه است که بر پایه فرآیندهای انتخاب ،تولید از روی مشخصه های انتخاب شده با عملگرهای ژنتیکی است: اتصال کروموزوم ها به سر یکدیگر و تغییر.
برای هر فرد ،یک جفت والد انتخاب می شود.در هر نسل تعدادی از عناصر جمعیت این فرصت را پیدا میکنند که تولید مثل کنند. به این عناصر که از میان جمعیت انتخاب میشوند، والدین میگویند. روشهای مختلفی برای انتخاب والدین وجود دارند. در زیر به چند مورد از این روشها اشاره میکنیم:
1. انتخاب تمام جمعیت به عنوان والدین: در واقع هیچگونه انتخابی انجام نمیدهیم.
2. انتخاب تصادفی: بصورت تصادفی تعدادی از موجودات جمعیت را به عنوان والدین انتخاب میکنیم، این انتخاب میتواند با جایگذاری یا بدون جایگذاری باشد.
3. روشهای مبتنی بر شایستگی: در این روشها عناصر با شایستگی بیشتر شانس بیشتری برای انتخاب شدن به عنوان والدین را دارند.
4. سایر روشها: این روشها با استفاده از تکنیکهایی سعی میکنند که انتخابهایی را ارائه دهند، که هم رسیدن به جواب نهایی را تسریع کنند و هم اینکه کمک میکنند که جواب بهینهتری پیدا شود.
انتخابها به گونه ای اند که مناسبترین عناصر انتخاب شوند تا حتی ضعیفترین عناصر هم شانس انتخاب داشته باشند تا از نزدیک شدن به جواب محلی جلوگیری شود.سایر الگوهای انتخاب عبارتند از: چرخ منگنه دار(رولت)،انتخاب مسابقه ای (Tournament) ،... .
به عنوان نمونه اگر بخواهیم رولت را بررسی کنیم باید به مسائل زیر توجه شود:
در روش معرفی شده در الگوریتم ساده GA احتمال انتخاب یک فرضیه برای استفاده در جمعیت بعدی بستگی به نسبت fitness آن به fitness بقیه اعضا دارد. این روش Roulette Wheel selectionنامیده میشود.
P(hi) = Fitness (hi) / Σj Fitness (hj)
A
C
1/6 = 17%
3/6 = 50%
B
2/6 = 33%
fit(A)=3 , fit(B)=1 , fit(C)=2
معمولاً الگوریتم های ژنتیک یک عدد احتمال اتصال دارد که بین 0.6 و1 است که احتمال به وجود آمدن فرزند را نشان می دهد.ارگانیسم ها با این احتمال دوباره با هم ترکیب می شوند.اتصال 2 کروموزوم فرزند ایجاد می کند،که به نسل بعدی اضافه می شوند.این کارها انجام می شوند تا این که کاندیدهای مناسبی برای جواب،در نسل بعدی پیدا شوند. مرحله بعدی تغییر دادن فرزندان جدید است. الگوریتم های ژنتیک یک احتمال تغییر کوچک وثابت دارند که معمولاً درجه ای در حدود 0.01 یا کمتر دارد. بر اساس این احتمال ،کروموزوم های فرزند به طور تصادفی تغییر می کنند یا جهش می یابند.مخصوصاً با جهش بیتها در کروموزوم ساختمان داده یمان.
این فرآیند باعث به وجود آمدن نسل جدیدی از کروموزوم ها یی می شود، که با نسل قبلی متفاوت است.کل فرآیند برای نسل بعدی هم تکرار می شود،جفتها برای ترکیب انتخاب می شوند،جمعیت نسل سوم به وجود می آیندو... .
پس به صورت خلاصه مراحل به ترتیب زیر می باشد:
< value="1" > selectتعداد(1-r)p فرضیه از میان P انتخاب و به Ps اضافه کنید. احتمال انتخاب یک فرضیه hi از میانP عبارت است از:P(hi) = Fitness (hi) / Σj Fitness (hj) < value="2" >: Crossoverبا استفاده از احتمال بدست آمده توسط رابطه فوق، تعداد(rp)/2 زوج فرضیه از میان P انتخاب و با استفاده از اپراتورCrossover دو فرزند از آنان ایجاد کنید. فرزندان را به Ps اضافه کنید.: Mutateتعداد m درصد از اعضا Ps را با احتمال یکنواخت انتخاب و یک بیت از هر یک آنها را بصورت تصادفی معکوس کنیدPß Ps :Updateبرای هر فرضیه h در P مقدار تابع Fitness را محاسبه کنیدایده اصلی:
در دهه هفتاد میلادی دانشمندی از دانشگاه میشیگان به نام جان هلند ایده استفاده از الگوریتم ژنتیک را در بهینهسازیهای مهندسی مطرح کرد. ایده اساسی این الگوریتم انتقال خصوصیات موروثی توسط ژنهاست. فرض کنید مجموعه خصوصیات انسان توسط کروموزومهای او به نسل بعدی منتقل میشوند. هر ژن در این کروموزومها نماینده یک خصوصیت است. بعنوان مثال ژن 1 میتواند رنگ چشم باشد ، ژن 2 طول قد، ژن 3 رنگ مو و الی آخر. حال اگر این کروموزوم به تمامی، به نسل بعد انتقال یابد، تمامی خصوصیات نسل بعدی شبیه به خصوصیات نسل قبل خواهد بود. بدیهیست که در عمل چنین اتفاقی رخ نمیدهد. در واقع بصورت همزمان دو اتفاق برای کروموزومها میافتد. اتفاق اول موتاسیون (Mutation) است. موتاسیون به این صورت است که بعضی ژنها بصورت کاملا تصادفی تغییر میکنند. البته تعداد این گونه ژنها بسیار کم میباشد اما در هر حال این تغییر تصادفی همانگونه که پیشتر دیدیم بسیار مهم است. مثلا ژن رنگ چشم میتواند بصورت تصادفی باعث شود تا در نسل بعدی یک نفر دارای چشمان سبز باشد. در حالی که تمامی نسل قبل دارای چشم قهوهای بودهاند. علاوه بر موتاسیون اتفاق دیگری که میافتد و البته این اتفاق به تعداد بسیار بیشتری نسبت به موتاسیون رخ میدهد چسبیدن ابتدای یک کروموزوم به انتهای یک کروموزوم دیگر است. این مساله با نام Crossover شناخته میشود. این همان چیزیست که مثلا باعث میشود تا فرزند تعدادی از خصوصیات پدر و تعدادی از خصوصیات مادر را با هم به ارث ببرد و از شبیه شدن تام فرزند به تنها یکی از والدین جلوگیری میکند. برای عمل ترکیب ویژگی های والد می توان به صورت زیر عمل کرد:
همانطور که میدانیم یک کروموزوم در طبیعت از تعداد زیادی ژن تشکیل شده است، در حین عملیات تشکیل سلول تخم، کروموزومهای والدین با یکدیگر ترکیب میشوند و کروموزومهای جدیدی را بوجود میآورند، در جریان این کار به صورت اتفاقی بخش هایی از کروموزومها با یکدیگر عوض میشوند. این موضوع باعث میشود که فرزندان ترکیبی از خصوصیات والدین خود را به همراه داشته باشند و دقیقاً مشابه یکی از والدین نباشند.