آموزش استفاده از الگوریتم ژنتیک در متلب (gatool یا optimtool) :
الگوریتم ژنتیک یکی از قویترین روشهای بهینهسازی مبتنی بر روشهای هیوریستیک یا فراابتکاری است. این الگوریتم به منظور بهینهسازی مسایل ریاضی با مقیاسهای پایین تا مقیاسهای بالا کاربرد دارد. تعداد و کیفیت مقالات چاپشده در مجلههای معتبر دنیا که از این روش برای بهینهسازی مدل ریاضی خود استفاده کردهاند، نشان میدهد که این روش میتواند به عنوان راهحل مناسب برای کاربرد در مطالعات مهندسی و ریاضی باشد. این نکته را نباید از یاد ببریم که این الگوریتم بهینهسازی توسط هیچ محققی ابداع نشده است، بلکه سالهای بسیاری است که این روند در طبیعت در حال انجام است و تنها محققین به مدلسازی و استفاده از این روش حیرتانگیر پرداختهاند. بله! الگوریتم ژنتیک از روشهای تکاملی موجود در طبیعت پیرامون ما الهام گرفته شده است و این نکته جالب توجه است که در مورد مسایل ریاضی و مهندسی بشری که نمونه کوچکی از مسایل موجود در طبیعت هستند، میتواند پاسخگو باشد. در این مقاله قصد داریم به استفاده از این الگوریتم ژنتیک در نرمافزار متلب (MATLAB) بپردازیم.
نرمافزار متلب (MATLAB) خود دارای تولباکسی است که حاوی کدهای آماده الگوریتم ژنتیک است و محققین میتوانند از این تولباکس برای بهینهسازی مسایل ریاضی خود بهره بگیرند. ذکر این نکته ضروری است که الگوریتم ژنتیک را میتوان از صفر تا صد در نرمافزار متلب کدنویسی کرد که در مقالات آموزشی مرتبط به این موضوع در الکاران پرداخته شده است. ولی در این مقاله قصد داریم که از الگوریتم ژنتیک آماده متلب (MATLAB) برای بهینهسازی مسایل ریاضی استفاده کنیم.
برای شروع کار وارد نرمافزار متلب میشویم و در قسمت اصلی کدنویسی یا Command Window عبارت زیر را وارد میکنیم و سپس دکمه Enter را میزینم:
optimtool |
پس از این با پنجرهای مشابه با عکس زیر روبرو خواهید شد
آموزش استفاده از الگوریتم ژنتیک در متلب
این تولباکس شامل الگوریتمهای بهینهسازی متفاوت میباشد که همه این الگوریتمها در قسمت solver لیست شدهاند. بنا به ورژن نرمافزار متلب شما این حلکنندهها متفاوت میباشند. از این قسمت بایستی الگوریتم ژنتیک را انتخاب کنید که در منوی کشوی solver با عبارت ga-genetic algorithm مشخص است. پس از انتخاب الگوریتم ژنتیک به عنوان الگوریتم بهینهسازی موردنظر در قسمت Problem بایستی مشخصات تابع ریاضی خود را وارد نمایید که در زیر هر یک از این قسمتها توضیح داده میشود:
Fitness function: در این قسمت باید نام کد متلبی را که تابع ریاضی شما در آن تعریف شده است، همراه با علامت @ در ابتدای آن وارد کنید. تعریف تابع ریاضی به صورت کد تابع متلب در ادامه توضیح داده خواهد شد. برای مثال اگر نام دلخواه برای تابع متلب شما که تابع ریاضیتان در آن کدنویسی شده است، elecaranfun باشد در این قسمت بایستی عبارت elecaranfun@ را وارد نمایید. این قسمت در انتهای مقاله به طور مفصل توضیح داده شده است.
Number of variables: در این قسمت باید تعداد متغیرهای مساله ریاضی را وارد کنید.
قسمت بعدی مربوط به قیدهای روی متغیرهای مساله ریاضی میباشد. قیود مساله ریاضی به دو نوع خطی و غیرخطی تقسیمبندی میگردند. قیود خطی نیز به دو نوع قیود خطی مساوی و قیود خطی نامساوی تقسیمبندی میگردند. در ادامه نحوه نوشتن قیود را بیان میکنیم:
Linear inequalities: در این قسمت باید ثابتهای مربوط به قیود خطی نامساوی مساله ریاضی را بنویسیم. نحوه نوشتن این ثابتها به صورت خاصی است که از قبل در متلب تعریف شده است. در نتیجه بایستی قیود خطی نامساوی خود را به این شکل استاندارد دربیاوریم. اگر مساله ریاضی ما دارای دو متغیر x۱ و x۲ باشد و سه قید نامساوی خطی روی این دو متغیر به شکل زیر باشد:
x۱+x۲ <= 2
-x۱+۲x۲ <= 2
۲x۱+x۲ <= 3
در این صورت روابط بالا را میتوان به صورت ماتریسی به شکل زیر نوشت:
ماتریس سمت چپ همان ماتریس Aineq است و ماتریس سمت راست رابطه همان ماتریس bineq است. ماتریس مجهولات نیز ماتریس X است. این رابطه به شکل کلی زیر تعریف میگردد:
AineqX<=bineq
دقت شود که روابط بزرگتر مساوی نیز باید به صورت روابط کوچکتر مساوی درآیند و به شکل استاندارد بالا نوشته شوند. در قسمت Linear inequalities باید Aineq و bineq را به صورت ماتریسی و به شکل آمده در شکل اول نوشت.
Linear equalities: این قسمت نیز مشابه با قسمت مربوط به روابط نامساوی خطی نوشته میشود با این تفاوت که در این قسمت بایستی روابط مساوی خطی مابین متغیرها را نوشت. شکل کلی روابط مساوی خطی نیز به صورت زیر است:
AeqX=beq
اگر دو رابطه مساوی خطی زیر مابین متغیرها برقرار باشد:
x۱+۲x۲ = -۵
۳x۱+۴x۲ = -۱۰
در این صورت رابطه استاندارد مساوی خطی به صورت زیر تعریف میگردد:
در قسمت Linear equalities باید Aeq و beq را به صورت ماتریسی و به شکل آمده در شکل اول نوشت.
Bounds: در این قسمت محدوده بالا و پایین متغیرها را مشخص میکنیم. اگر محدوده بالا و پایین متغیرها بصورت زیر باشد:
-۱۰<=x۱<=10
-۵<=x۱<=15
در این صورت ماتریسهای محدوده بالا و پایین به شکل زیر تعریف خواهند میشوند:در قسمت Bounds باید محدودههای بالا و پایین را به صورت ماتریسی و به شکل آمده در شکل اول نوشت.
Nonlinear constraints function: در این قسمت باید نام تابع متلب را که معادلات ریاضی غیرخطی مابین متغیرهای مساله بهینهسازی نوشته شده است، وارد کنیم. در اینجا مانند قسمت Fitness function باید از علامت @ در کنار نام تابع استفاده کنیم. در این مثال فرض میکنیم که تابع غیرخطی برای قیود مساله وجود ندارد. به همین خاطر این قسمت را خالی میگذاریم.
نوشتن تابع هدف مساله به صورت تابع متلب برای الگوریتم ژنتیک
همانطور که در قسمت Fitness function گفته شد، باید در این قسمت نام تابع متلب که تابع هدف مساله بهینهسازی در آن نوشته شده است، وارد کنیم. در اینجا فرض میکنیم که معادله ریاضی که میخواهیم به عنوان تابع هدف بهینهسازی کنیم به صورت زیر باشد:
F=x۱+۳x۲
در این صورت یک m-file متلب باز کرده و تابع متلب را به صورت دسته کد زیر در آن مینویسیم:
function result=elecaranfun(x) result=x(1)+3*x(2); end |
این فایل را با نام elecaranfun در مسیر حال حاضر متلب ذخیره میکنیم. میتوانید این فایل را از اینجا نیز دانلود کنید. همانطور که در ابتدا نیز گفته شد در تولباکس optimtool و در قسمت fitness function نام این تابع را همراه با علامت @ بصورت elecaranfun@ وارد میکنیم. تمام!
حال با کلیک بر روی start در پایین تولباکس optimtool میتوانیم بهینهسازی را توسط الگوریتم ژنتیک انجام دهیم. برای اجرای بهینهسازی باید کمی صبر کنیم. پس از اجرای الگوریتم ژنتیک نتایج آن در قسمت Result و final point دیده میشود. برای مساله بهینهسازی ما مینیمم مساله ریاضی برابر ۷٫۵- است و این مقدار به ازای مقادیر زیر برای متغیرها ایجاده شده است که در قسمت final point نوشته شده است:
x۱=۰.۰۰۳
x۲=-۲.۵۰۲
به همین سادگی توانستیم مساله بهینهسازی خود را توسط الگوریتم ژنتیک حل کنیم!
دقت شود که برای اجرای مسایل بهینهسازی ماکسیممسازی تابع هدف بایستی ابتدا مساله خود را به یک مساله بهینهسازی مینیممسازی تبدیل کنیم. برای این کار میتوان یک علامت منفی پشت تابع هدف خود در کد متلب قرار دهیم تا مساله ماکسیممسازی به مساله مینیممسازی تبدیل شود.
شما میتوانید توسط الگوریتم ژنتیک توابع هدف متفاوت را بهینهسازی کنید. برای این کار فقط بایستی تابع هدف خود را به صورت کد متلب بنویسید و قیود خود را به صورت آموزش داده شده وارد کنید.
همانطور که در تولباکس optimtool مشاهده میکنید میتوانید الگوریتم ژنتیک را با تنظیمات مختلف اجرا کنید.این تنظیمات در ستون وسط تولباکس قابل دسترس هست. این تنظیمات در مقالات بعدی به طور مفصل توضیح داده خواهد شد.
اگر میخواهید الگوریتم ژنتیک را به جای تولباکس با کدنویسی اجرا کنید، مقاله فراخوانی الگوریتم ژنتیک در متلب را مطالعه کنید.
امیدواریم این آموزش موردپسند شما واقع شده باشد. با نظرات خود ما را در غنیترکردن مطالب سایت یاری کنید.
دانلود مثال الگوریتم ژنتیک PDF
اگر داده های گسسته داشتیم چطور؟
یکی از راههای سادهای که میتوانیم در بهینهسازی توسط الگوریتم ژنتیک در متلب، دادههای گسسته یا به عبارت بهتر متغیرهای گسسته را در بهینهسازی الگوریتم ژنتیک وارد کنیم، استفاده از توابعی مانند جز صحیح، روند به بالا و یا روند به پایین هست. به این صورت که در تولباکس الگوریتم ژنتیک به همین صورت که در آموزش آمده است عمل میکنیم ولی در داخل تابعی که برای تابع هدف نوشتهایم قبل از به کاربردن متغیرهای بهینهسازی (x(1) و x(2)) در تابع هدف (در اینجا معادله F ) از مقادیر متغیرهایی که میخواهیم به صورت گسسته در نظر گرفته شوند با دستور زیر روند (round) میگیرم و این کدها را به ابتدای تابع هدف اضافه میکنیم (در این مثال توضیحی فرض میشود که هر دو متغیر x(1) و x(2) گسسته هستند):
x(1)=round(x(1));
x(2)=round(x(2));
در این صورت با اینکه متغیرهای x(1) و x(2) در تولباکس الگوریتم ژنتیک به صورت گسسته تعریف نشدهاند، ولی در تابع elecaranfun به صورت گسسته مورد استفاده قرار گرفتهاند. اگر با این تغییرات الگوریتم ژنتیک را اجرا کنیم جوابهای زیر به دست میآیند:
x(1)=3.33e-16
x(2)=-2.500
ولی چون ما روند متغیرها را در نظر گرفتیم، روند جوابهای به دستآمده جواب نهایی موردنظر ما هستند. پس جوابهای زیر به عنوان مقادیر نهایی جواب الگوریتم ژنتیک برای تابع F با متغیرهای گسسته خواهند بود:
x(1)=0
x(2)=-2
که همانطور مشخص است خیلی نزدیک به جوابهای به دستآمده در حالت درنظرگیری متغیر پیوسته هستند.
ممنون از مطلبتون فقط یک سوال :
قیدهایی که در آن ها مقادیر x1 و x2 به یکدیگر ضرب شده اند رو چطور به toolbox وارد کنیم ؟
مثال : x1)*(x2)^2 <13 )
خواهش میکنم. نظر لطفتون هست.
این نوع از قیدها، غیرخطی هستند و باید توسط یک ام-فایل جداگانه تعریف بشوند و در تولباکس فراخوانی بشوند که در مطالب بعدی که در سایت گذاشته میشه به اون پرداخته خواهد شد.
سلام بخشی مثال پیچیده تر مثلا سینوسی با استفاده از gatool در متلب ندارید؟ با سپاس
سلام
هدف از این آموزش، یادگیری استفاده از ژنتیک متلب با مثال ساده بود تا با مطلب کاملا جا بیفتد.
باز هم اگر شما مثالی خاص مدنظر دارید، میتونید مطرح کنید تا به حل آن با آموزش بپردازیم.
سلام
چگونه میتوان ماتریس متغیر ها را دو بعدی تعریف کرد؟
سلام
دقیقا منظور شما از متغیر دو بعدی چیست؟ در روش گفته شده، متغیرها به صورت سری متغیرهای با اسم مشخص تعریف می شوند که خود هر متغیری می تواند دارای چند عضو باشد که می توانند به عنوان بعد آن تعریف شوند. مثلا می توان دو متغیر x , y را داشت که x دارای دو عضو x1 و x2 و y دارای دو عضو y1 و y2 باشد. در نتیجه می توان دو متغیر دو بعدی را تعریف کرد. هرچند، نحوه استفاده از این متغیرهاست که به بعد آن ها معنی می دهد.
موفق باشید
ممنون از پاسختون، منظورم همین بود که توضیح دادید.
یک سوال دیگه هم داشتم، زمانی که الگوریتم ژنتیک پس از چند گام مقدارش تغییر نمی کند و توقف می کند، ایا جواب حال رو میتوان به عنوان مقدار بهینه در نظر گرفت؟ برای مطمئن شدن از جواب چ میشه کرد؟
اگر مقدار بهینه بدست آمده پس از چند تکرار تغییر ننماید دو حالت را می شود در نظر گرفت. در حالت اول می گوییم که جواب بدست آمده جواب بهینه نهایی است و جواب بهینه تری (یا جواب بهینه خیلی متفاوت) وجود ندارد. حالت دوم این است که الگوریتم ژنتیک به یک نقطه بهینه محلی همگرا شده است و چون جواب های حاصل از دیگر جمعیت ها نیز در این همسایگی قرار دارد در نتیجه با عملیات ترکیب و جهش نمی توان نقطه بهینه تری را پیدا کرد؛ هرچند نقطه بهینه در مکان دیگری از فضای جواب مساله وجود دارد ولی به قول معروف الگوریتم ژنتیک در نقطه بهینه محلی گیر کرده است و نمی تواند به نقطه بهینه کلی برسد. تشخیص این دو حالت از هم سخت است. در جواب به این سوال و سوال بعدی می توان از این روش استفاده کرد که با اجرای چندباره الگوریتم ژنتیک سعی کرد تا به الگوریتم ژنتیک این فرصت را بدهیم تا در هر اجرای جدید از مسیر مختلف دیگری به سمت نقطه بهینه کلی (Global) حرکت کند تا احتمال اینکه در نقطه بهینه محلی گیر کند، کمتر بشود. در این صورت بهترین جواب از این چندین اجرا، می تواند به عنوان جواب نهایی در نظر گرفته شود.