فراخوانی الگوریتم ژنتیک در متلب *
در آموزش قبل با عنوان آموزش استفاده از الگوریتم ژنتیک در متلب (gatool یا optimtool) نحوه استفاده از الگوریتم ژنتیک توسط تولباکس یا جعبهافزار مخصوص الگوریتم ژنتیک یا همان gatool یا optimtool را آموزش دادیم. این تولباکس میتواند برای حل مسایل بهینهسازی توسط الگوریتم ژنتیک استفاده گردد. در این صورت اجرای الگوریتم ژنتیک برای یک مساله خاص به صورت مستقل توسط این تولباکس راحت است. ولی گاهی اوقات قصد داریم تا از الگوریتم ژنتیک به صورت کدنویسی استفاده کنیم.در این صورت است که میتوانیم از الگوریتم ژنتیک در میان کدهای یک برنامه خاص متلب استفاده کنیم، به طوریکه بهینهسازی توسط کد الگوریتم ژنتیک، قسمتی از کد یک برنامه دیگر باشد. برای این کار مجبور هستیم تا الگوریتم ژنتیک را به صورت کد وارد برنامهمان کنیم. علاوه بر این استفاده از الگوریتم ژنتیک در متلب به صورت کد، میتواند اجراهای چندباره از این روش بهینهسازی را آسان سازد. زیرا که تنها با یکبار نوشتن کد فراخوانی الگوریتم ژنتیک و ذخیره آن کد به صورت M-File، میتوانیم در استفادههای بعدی نیز از این کد برای حل این مساله خاص بهره ببریم. حال آنکه در استفاده از تولباکس gatool یا optimtool، پس از اجرای بهینهسازی و خارجشدن از تولباکس برای استفادههای بعدی بایستی تنظیمات الگوریتم ژنتیک و قیود مساله را دوباره انجام دهیم. بنابراین در این مقاله از الکاران بر آن شدیم که نحوه فراخوانی الگوریتم ژنتیک در متلب را آموزش دهیم.
برای آموزش این مقاله نیز از مثال مورد استفاده در مقاله آموزش استفاده از الگوریتم ژنتیک در متلب بهره میگیریم. باید این نکته را یادآور شویم که برای آموزش بهتر فراخوانی الگوریتم ژنتیک در متلب در این مقاله بهتر است مقاله قبلی نوشتهشده در این مورد را از اینجا مطالعه کنید. چرا که نوشتن برخی از قسمتهای تنظیمات قیود ریاضی مساله در دو روش استفاده از تولباکس و همچنین کد فراخوانی مشابه است.
خب! کد کلی فراخوانی الگوریتم ژنتیک در متلب به صورت زیر است:
[x,fval]=ga(@elecaranfun,2,Aineq,bineq,Aeq,beq,lb,ub,@nonlfun,options); |
دستوری که برای فراخوانی الگوریتم ژنتیک به کار میگیریم دستور ga است که آرگومان یا اعضای متفاوتی در داخل پرانتز را برای اجرا میطلبد. در نهایت نیز دو مقدار را به عنوان خروجی میدهد (البته خروجیهای زیادی را میتوان گرفت ولی برای بهینهسازیهای مرسوم دو خروجی کافی است). این دو خروجی یکی مختصات نقطه بهینه (x) و دیگری مقدار تابع هدف را در آن نقطه بهینه (fval) مشخص میکند. برای ابتدای کار یکبار دیگر مثالی که توسط الگوریتم ژنتیک آن را بهینهسازی مینماییم در این قسمت یادآوری میکنیم:
تابع هدف ما در این مثال تابع ساده زیر است:
Min F=x۱+۳x۲ (۱)
قیود روی متغیرها نیز به صورت زیر هستند:
x۱+x۲ <= 2 (۲)
-x۱+۲x۲ <= 2 (۳)
۲x۱+x۲ <= 3 (۴)
x۱+۲x۲ = -۵ (۵)
۳x۱+۴x۲ = -۱۰ (۶)
-۱۰<=x۱<=10 (۷)
-۵<=x۱<=15 (۸)
آرگومانها یا ورودیهای دستور ga به صورت زیر تعریف میشوند:
قسمت اول: نام فانکشن متلب (function) که تابع هدف در آن تعریف شده است، به همراه علامت @ در این قسمت نوشته میشود. در این مثال تابع هدفمان همان تابع F هست. این تابع بایستی به صورت یک تابع متلب تعریف گردد. برای این کار یک کد ساده برای این کار به صورت زیر مینویسیم:
function result=elecaranfun(x) result=x(1)+3*x(2); end |
این تابع را به هر اسم دلخواهی به عنوان فایل جداگانهای ذخیره میکنیم. فقط باید اسم تابع در داخل کد قسمت آبیرنگ و اسمی که کد را به آن ذخیره میکنیم، همنام باشند. ما این کد را به اسم elecaranfun ذخیره میکنیم. سپس در تابع ga در قسمت اول همراه با علامت @ به صورت elecaranfun@ مینویسیم.
قسمت دوم: در این قسمت بایستی تعداد متغیرهای مساله را وارد میکنیم. در مثالمان چون ما دو متغیر x۱ و x۲ را داریم، عدد ۲ را وارد میکنیم.
قسمت سوم و چهارم: در قسمت سوم نام ماتریس ضریب قیود خطی نامساوی مساله را مینویسیم. ما در اینجا نام تابع را با Aineq تعریف میکنیم. در قسمت چهارم نیز نام ماتریس ثابت قیود خطی نامساوی یا همان bineq را وارد میکنیم. با توجه به قیود نامسای خطی در روابط ۲ تا ۴ مثال بالا، ماتریسهای Aineq و bineq به صورت زیر تعریف میشوند:
این ماتریسها را به صورت زیر قبل از دستور ga و در بالای آن تعریف میکنیم:
Aineq=[1 1;-1 2;2 1]; bineq=[2;2;3]; |
قسمت پنجم و ششم: در قسمت پنجم نام ماتریس ضریب قیود خطی مساوی مساله را مینویسیم. ما در اینجا نام تابع را با Aeq تعریف میکنیم. در قسمت چهارم نیز نام ماتریس ثابت قیود خطی نامساوی یا همان beq را وارد میکنیم. با توجه به قیود نامسای خطی در روابط ۵ و ۶ مثال بالا، ماتریسهای Aeq و beq به صورت زیر تعریف میشوند:
این ماتریسها را نیز به صورت زیر قبل از دستور ga و در بالای آن تعریف میکنیم:
Aeq=[1 2;3 4]; beq=[-5 -10]; |
قسمت هفتم و هشتم: در قسمت هفتم نام ماتریس مقادیر کران پایین متغیرها را مینویسیم. در قسمت هشتم نیز نام ماتریس مقادیر کران بالای متغیرها را مینویسیم. این ماتریس ها با توجه به روابط ۷ و ۸ به صورت زیر تعریف میشوند.
این ماتریسها را نیز به صورت زیر قبل از دستور ga و در بالای آن تعریف میکنیم:
lb=[-10;-5]; ub=[10;15]; |
قسمت نهم و دهم: در قسمت نهم و دهم به ترتیب نام تابع متلب تعریفکننده قیود غیرخطی و نام متغیر تنظیمات اجرای متلب وارد میگردد. این قسمتها در مقالهای دیگر توضیح داده خواهد شد. در این مثال ما قیود غیرخطی نداریم. همچنین تنظیمات اجرای متلب را همان تنظیمات پیشفرض قرار میدهیم. بنابراین میتوان این قسمت را با ماتریس خالی جایگذاری کنیم.
تمام کد فراخوانی الگوریتم ژنتیک در متلب برای این مثال به صورت زیر خواهد بود. کد متلب فراخوانی الگوریتم ژنتیک و همچنین کد تعریف تابع هدف در کنار هم را میتوانید از اینجا دانلود کنید. (پسورد فایل: www.elecaran.ir)
Aineq=[1 1;-1 2;2 1]; bineq=[2;2;3]; Aeq=[1 2;3 4]; beq=[-5 -10]; lb=[-10;-5]; ub=[10;15]; [x,fval]=ga(@elecaranfun,2,Aineq,bineq,Aeq,beq,lb,ub,[],[]);disp([‘x1=’ num2str(x(1))]) disp([‘x2=’ num2str(x(2))]) disp([‘Fitness value=’ num2str(fval)]) |
سه خط آخر، نتایج اجرای الگوریتم ژنتیک را نمایش میدهند.
دقت کنید که دو کد فراخوانی الگوریتم ژنتیک و کد تابع هدف در کنار هم در یک پوشه یا فولدر باشند. پس از اجرای کد بالا در متلب نتایج زیر حاصل میگردند:
x1=0.0029995 x2=-2.502 Fitness value=-7.503 |
که مقادیر مجهولات و همچنین مقدار تابع هدف در این نقطه را نشان میدهد. این نتایج با نتایج حاصل از اجرای الگوریتم ژنتیک توسط تولباکس gatool یا optimtool که در این مقاله آمده است، یکسان است. حال میتوانید این کد را نگه دارید، تغییرات بدهید، یا در کنار دیگر کدها استفاده کنید. در مقالات بعدی دیگر قسمتهای کدنویسی الگوریتم ژنتیک را در متلب توضیح خواهیم داد.
پسورد فایل: www.elecaran.ir
امیدواریم از این مقاله الکاران نیز راضی باشید. با نظرات خود ما را در توسعه مطالب سایت یاری دهید.
سلام
خیلی خیلی خیلی ممنون. فوق العاده مفید بود.
سلام آموزشتون خیلی خوب بود.
اگه امکان داره مثال بیشتری استفاده کنید.
سلام
خوشحالیم که این آموزش براتون مفید بوده.
حتما. در زمینه الگوریتم های بهینه سازی نظیر الگوریتم ژنتیک، آموزش های بیشتری روی سایت خواهد آمد.
خیلی عالی بود . اگه ممکنه روش تنطیمات را هم توضح بدید چگونگی انتخاب تابع برازندگی چرخه ویل نوع جهش و تولید مثل
ممنون.
خوشحالیم که مطالب این مقاله براتون مفید بوده. پیشنهاد شما در توسعه این مقاله و مطالب بعدی سایت مدنظر قرار میگیرد.
ضمن تشکر از زحمات شما .موفقیت شما را خواستاریم
خيلي عالي بود
ممنون
ممنون و متشکرم
عالی…….
سلام .ممنون از سایت خوبتون واقعا عالی و کاربردی هستش. سوال من اینه که اگه بخوایم جمعیت اولیه و همچنین جمعیت های بعدی رو مشاهده کنیم یا بخوایم اونا رو توی یه فایلی ذخیره کنه باید از چه دستوری استفاده کنیم؟
سلام
خوشحالیم که مطالب سایت مورد توجهتان بوده.
برای کارهای جزیی تر باید تنظیمات پیچیده تری برای تنظیمات فراخوانی الگوریتم ژنتیک انجام بدید. این تنظیمات در آموزش های بعدی توضیح داده خواهد شد. بعضی کارها رو میشه انجام داد ولی برای دسترسی به جزییات بیشتر مراحل الگوریتم ژنتیک باید خودتان الگوریتم ژنتیک را پیاده سازی کنید که این مورد نیز توضیح داده خواهد شد.
سلام واقعا عالی بود ممنونم
اگر که میشه لطفا فایل آموزشی مشخص کردن ثوابت یک تابع را در صورتی که متغیرهای مستقل و وابسته آن مشخص هستند هم قرار دهید.
با سلام
خوشحالیم که مطالب سایت برایتان مفید بوده اند
این کاری که منظور مساله مطرح شده شما هست، با نام برازش منحنی یا Curve fitting مطرح می شود. با توجه به علاقه شما و چندی از دوستان دیگر، در مطالب بعدی سایت به این موضوع نیز خواهیم پرداخت.
با سلام وعرض ادب
سپاس از مطلب مفیدتون
میشه لطفا بفرمایید که محدودیت استفاده از دستورga و یا تولباکس به چه شکل هست؟ و در چه شرایطی ما مجبوریم که خودمون کدش رو بنویسیم؟
سلام
خوشحالیم که این آموزش مورد پسند بوده.
تولباکس الگوریتم ژنتیک و فراخوانی الگوریتم ژنتیک با کد تقریبا تفاوتی ندارند. ولی در پروژه های سنگین تر استفاده از روش فراخوانی الگوریتم ژنتیک با کد توصیه می شود. چون در این صورت دستتون بازتر خواهد بود و می توانید برای ران های بعدی هم کدتون رو ذخیره و و تغییر دهید. همچنین در استفاده از روش فراخوانی با کد می توانید این کد رو با کدهای تخصصی رشته خودتون در یک m-file ترکیب کنید تا یک کد آماده همه جانبه داشته باشید.
اما در مورد این موضوع که خودتون کد الگوریتم ژنتیک رو بنویسید، توصیه می کنم برای کارهای تخصصی تر که از طبیعت مساله، متغیرها و قیود مساله اطلاعات کافی و کامل دارید، این کار رو بکنید. بنا به تجربه خودم استفاده از الگوریتم ژنتیک که خودتون کدش رو نوشتید، سرعت و دقت حل مساله رو بالا میبره ولی همانطور که گفتم باید اطلاعات کافی از روش های ترکیب و جهش داشته باشید و طبیعت مساله مورد نظر رو خوب بشناسید. در غیر این صورت ممکن است کد نوشته شده موثر نباشد و به جواب های محلی همگرا شود و به اصطلاح گیر کند.
موفق باشید
سپاس گذارم از توضیح بسیار جامع و دقیقی که لطف کردید و فرمودید.
در صورت داشتن سوال تخصصی و مشاوره از چه طریقی میشه با جنابعالی در ارتباط بود؟
خوشحالیم که مطالب سایت برایتان مفید بوده
برای ارتباط با ما می توانید از ایمیل یا آیدی تلگرام زیر استفاده کنید.
ایمیل: ELECARAN.ir@gmail.com
آیدی تلگرام: ELECARAN_CU
شماره تلفن: ۰۹۳۰۴۰۴۸۳۵۰
با سلام.
و خسته نباشید.
بنده با استفاده از روش بالا و پخش بار پیشرو پسرو بهینه سازی کردم ولی یک خطای میدهد که آرایه ها و یا ساختار ماتریس شما همخوانی ندارد. اما همین پخش توان رو وقتی از طریق پخش توان دی سی حل میکنم جواب میدهد. جفت پخش توان ها درست و یه جواب دارن اما هنگام بهینه سازی این جواب نمیده
سلام
در هنگام استفاده از کد پخش بار در داخل کد بهینه سازی بایستی دقت کنید که کدام یک از ماتریس ها در فرآیند ترتیبی الگوریتم بهینه سازی، توسط عملگرهای روش بهینه سازی (مانند crossover و mutation در الگوریتم ژنتیک) تغییر داده می شوند. این تغییرات در اندازه ماتریس ها بایستی با کد پخش بار همخوانی داشته باشند. در غیر اینصورت با مشکل ذکرشده مواجه خواهید شد.
با توجه به اینکه از روش بهینه سازی و تغییرات اعمالی آن در کد پخش بار اطلاعاتی نداده اید، نمی توان به طور دقیق برای حل مشکل راهکار ارایه داد. ولی از راهکار کلی ذکرشده می توان برای حل مشکل استفاده کنید.
موفق باشید.
سلام روز بخیر
من میخوام کد بهینه سازی یک مسئله رو بنویسم چطور میتونم ازشما کمک بگیرم؟
سلام
روزتون بخیر
می توانید برای درخواست موردنظرتون از طریق این لینک درخواست خودتون رو ثبت کنید. در اسرع وقت با توجه به درخواستتون رسیدگی می شود.
سلام من همین مثال را خودم در تولباکس که می خوام حل کنم مادام error میده علتش چیه
با اینکه فیلمتان هم نگاه کردم بازم error میده
سلام
لطفا نوع خطا را بیان کنید تا نحوه رفع آن را بررسی کنیم.
دمت گرم بزرگوار. عالی بود