پرسش و پاسخ – تعیین بازه های متغیرها در کدهای مختلف بهینه سازی

http://www.icasite.info/icasite/post_i/ques_ans.png
در بخش پرسش و پاسخ وبسایت محاسبات تکاملی، معمولاً متنی پستی را منتتشر می کنیم که به پاسخ یک پرسش عمومی می پردازد. یکی از نسخه های برنامه الگوریتم رقابت استعماری در متلب و سی شارپ را جناب آقای مهندس کلامی تهیه کرده اند (در این لینک). در این پست، ایشان در پاسخ به پرسش زیر، نحوه تعیین و تغییر بازه های متغیرها در یک برنامه نوشته شده با روشهای مختلف بهینه سازی تکاملی را نشان می دهند.
پرسش:

با عرض سلام و خسته نباشید
می خواستم بدانم، اگر در الگوریتم رقابت استعماری (یا الگوریتم های دیگر) بخواهم حدود متغیرها با یکدیگر فرق داشته باشد چگونه باید کد الگوریتم را تغییر دهم؟ مثلا می خواهم متغیر اول بین 0 تا 1 و متغیر دوم بین 1 تا 30 و متغیر سوم بین 10 تا 20 باشد.

 پاسخ:
یکی از ساده ترین راه ها این است که تمام متغیرهای خود را به یک بازه (مثلا 0 تا 1) نگاشت کنید. در این روش باید در برنامه تابع هدف، ابتدا بایستی اعداد بین صفر و یک را به ترتیب به اعداد اصلی (که در رنج های متفاوت قرار دارند) تصویر کنید. این کار با دو نگاشت خطی که عکس همدیگر هستند عملی می باشند. این روش ساده است، اما ایراد عمده ای که دارد این است که هر بار که بخواهید به مقادیر واقعی متغیرها دسترسی داشته باشد، بایستی از نگاشت خطی استفاده کنید. هر چند روش هایی هم وجود دارد که در آن می توان همواره در کنار مقادیر نرمال شده متغیرها، مقدار واقعی آن ها را نیز ذخیره کرد.اگر از برنامه ای که توسط من نوشته شده است (اینجا) استفاده می کنید، راه حل دیگری نیز وجود دارد.

در روش دوم، مقدار VarMin و VarMax را به جای یک عدد، به صورت یک بردار افقی تعریف کنید. دقت کنید که حتما باید تعداد المان های ماتریس های VarMin و VarMax برابر با تعداد متغیرها (یعنی nVar) باشد. مثلا اگر 3 متغیر دارید که به بازه تغییرات آن ها به ترتیب بین 0 تا 1، بین 1 تا 30، و بین 10 تا 20 باشد، بخش ابتدایی برنامه را باید به این صورت تغییر دهید:

nVar = 3;
VarMin = [0 1 10];
VarMax = [1 30 20];
البته در این روش احتمالا (بسته به نسخه متلبی که استفاده می کنید) برنامه در جاهایی پیغام خطا صادر کند که مربوط به استفاده از پارامتر VarSize است. مثلا در مرحله تلید پاسخ های اولیه، بایستی به جای فراخوانی تابع unifrnd به صورت 

unifrnd(VarMin,VarMax,VarSize);
به این صورت فراخوانی شود: 

unifrnd(VarMin,VarMax);
زیرا سایز و تعداد متغیرها در قالب VarMin و VarMax گنجانده شده است و نیازی به متغیر سوم (VarSize)، که سایز متغیرها را تنظیم می کرد، وجود ندارد.البته به زودی، جعبه ابزار بسیار کاملی که تمام این کارها را به صورت خودکار تنظیم می کند، در متلب سایت و وبسایت محاسبات تکاملی، ارائه خواهد شد.

همچنین این نکته را در نظر بگیرید که در کدهای الگوریتم رقابت استعماری که به همراه فیلم آموزشی قابل دانلود، در همین سایت (در این لینک)، ارائه شده است، تمام موارد فوق به صورت آماده، لحاظ شده است و شما می توانید در همان ابتدای برنامه، به سادگی بازه دلخواه هر متغیر را تعیین نمایید. در هر صورت یادگیری سیستماتیک نحوه انجام این کار را با در نظر گرفتن نکات آموزشی فوق، به شما توصیه می کنیم.



0 پاسخ

ارسال یک پاسخ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *