نحوه کد کردن کروموزوم، ذره و یا کشور در الگوریتم های بهینه سازی به صورت ماتریس

http://www.icasite.info/icasite/post_i/ques_ans.png
در برخی موارد، متغیرهای بهینه سازی ما در قالب یک ماتریس قرار دارند. سوالی که مطرح می شود این هست که چگونه می توان موارد این چنینی را توسط کدهای آماده روشهای مطرح بهینه سازی همچون الگوریتم ژتتیک، الگوریتم ازدحام ذرات و الگوریتم رقابت استعماری حل کرد؛ در حالی که این کدها، غالباً با دنباله متغیرهایی به صورت یک رشته با طول N کار می کنند نه یک ماتریس! مثلاً سوال زیر را در نظر بگیرید، که توسط یکی از دوستان در مورد نحوه انجام این کار در الگوریتم رقابت استعماری پرسیده بودند:

آیا می توان به جای این که در تابع ارزیابی برداری از متغیرها داشته باشیم برداری از ماتریس ها یا بردارها داشته باشیم. به عبارت دیگر رمزگذاری مسئله به شکلی باشد که برای  نمایش هر کروموزوم (کشور)یک ماتریس داشته باشیم.  آنگاه آیا می توان از کدهای متلب الگوریتم رقابت استعماری که در حال حاضر در وبسایت محاسبات تکاملی (icaSite.info) قرار دارد برای این رمزگذاری استفاده کرد یا باید نسخه ای دیگر از این برنامه تولید کرد؟ اگر تغییراتی در کدفعلی لازم است لطفا بفرمایید.

با سپاس فراوان

 

پاسخ سوال بسیار ساده می باشد.

ابتدا لازم به ذکر است که در موارد ماتریسی، نسخه هایی از روشهای مطرح بهینه سازی وجود دارند که در همان ابتدا، مسئله را به صورت یک ماتریس کد می کنند و تمام عملیات را روی آنها بازتعریف می کنند. اما درعمل نیازی به چنین کاری نیست. برای حل مشکل کافی است ما ماتریس متغیرها را reshape کنیم. مثلاً فرض کنید 20 مجهول مسئله بهینه سازی به صورت یک ماتریس 4*5 قرار گرفته اند. کاری که ما انجام می دهیم این هست که مسئله بهینه سازی را برای بردار 20*1 تعریف می کنیم (که در این حالت همانگونه که بیان شد روشهای بهینه سازی با آن مشکلی ندارند). اما در داخل تابع هزینه یک دستور reshape (در صورت استفاده از متلب) به کار می بریم تا قبل از ارزیابی تابع هزینه برای بردار 20*1، ابتدا آن را به ماتریس 4*5 تبدیل کند. یعنی در خط اول تابع هزینه می نویسیم:
function Cost  = CostFunction(X)
XR = reshape(X,5,4);
Cost = evaluate cost at XR
end
 با این کار بدون اینکه برنامه بهینه سازی متوجه شود، ما تمام ارزیابی ها را به صورت ماتریس انجام می دهیم، در حالی که الگوریتم با یک بردار 20*1 کار می کند. تابع هزینه محاسبات را برای ماتریس انجام می دهد و مقداری که بر می گرداند، همان هزینه مرتبط با رشته 20*1 می باشد.
0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

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

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