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

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

 

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

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

 

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

ابتدا لازم به ذکر است که در موارد ماتریسی، نسخه هایی از روشهای مطرح بهینه سازی وجود دارند که در همان ابتدا، مسئله را به صورت یک ماتریس کد می کنند و تمام عملیات را روی آنها بازتعریف می کنند. اما درعمل نیازی به چنین کاری نیست. برای حل مشکل کافی است ما ماتریس متغیرها را reshape کنیم. مثلاً فرض کنید ۲۰ مجهول مسئله بهینه سازی به صورت یک ماتریس ۴*۵ قرار گرفته اند. کاری که ما انجام می دهیم این هست که مسئله بهینه سازی را برای بردار ۲۰*۱ تعریف می کنیم (که در این حالت همانگونه که بیان شد روشهای بهینه سازی با آن مشکلی ندارند). اما در داخل تابع هزینه یک دستور reshape (در صورت استفاده از متلب) به کار می بریم تا قبل از ارزیابی تابع هزینه برای بردار ۲۰*۱، ابتدا آن را به ماتریس ۴*۵ تبدیل کند. یعنی در خط اول تابع هزینه می نویسیم:

 

function Cost  = CostFunction(X)
XR = reshape(X,5,4);
Cost = evaluate cost at XR
end

 

با این کار بدون اینکه برنامه بهینه سازی متوجه شود، ما تمام ارزیابی ها را به صورت ماتریس انجام می دهیم، در حالی که الگوریتم با یک بردار ۲۰*۱ کار می کند. تابع هزینه محاسبات را برای ماتریس انجام می دهد و مقداری که بر می گرداند، همان هزینه مرتبط با رشته ۲۰*۱ می باشد.

مطالب پیشنهادی‎

1 پاسخ
  1. rezvan
    rezvan says:

    با سلام
    من هم همین مشکل را دارم اما از این دستور که گفتی نتوانستم استفاده کنم. من می خواهم خروجی شبکه عصبی را به GA بدم که به صورت ماتریس هستش. اما نتونستم به بردار تبدیلش کنم تا GA خطا نگیرد.؟؟؟؟
    ممنون میشم اگه بیشتر و بیشتر راهنمائی کنید. یا با یه برنامه کوتاه آموزش بدید. بسیار سپاسگزارم
    سر افراز باشید .

    پاسخ دادن

ارسال یک پاسخ

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

پاسخ دهید

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