نحوه مقدار دهی اولیه کشورها در الگوریتم رقابت استعماری – پرسش و پاسخ مطرح شده
این پست در پاسخ به سوال مطرح شده توسط یکی از دوستان دانشجو، تهیه شده است. به دلیل اینکه همین سوالات ممکن است برای دیگران نیز مطرح شود، به نظر رسید که انتشار آن در قالب یک پست عمومی خالی از لطف نباشد.
متن سوال مطرح شده به صورت زیر است.
______________________________________
با سلام و احترام،
من به الگوریتم ICA علاقمند شده و میخواهم روی آن کار کنم. ضمن مطالعه آن، یکسری سوالات برایم پیش آمدند. ممنون میشم جواب سوالاتم را بدهید.
۱- اول کار مقدار دهی اولیه (Intialization) کشورها با چه مقداری انجام میشوند؟ تولید رندم در چه بازه ایی است؟
۲- زاویهٔ theta موقع محاسبهٔ x به چه صورتی تاثیر میگذارد؟
۳- آیا مقدار x که با توزیع یکنواخت (uniform) محاسبه میشود، به شکل زیر در متلب محاسبه میشود؟
۴- اگر قرار باشد به امپراتوریای در اول کار مثلاً ۵ مستعمره تعلق بگیرد و ما مثلاً ۱۷ تا مستعمره داشته باشیم، کدام ۵ تا مستعمره به آن تعلق میگیرند؟
متن مشروح پاسخ ها نیز در ادامه آمده است.
______________________________________
پاسخ اغلب این سوالات با مراجعه به متن آموزشی فارسی الگوریتم رقابت استعماری که در حقیقت متن کامل یک پایان نامه در این حوزه است، قابل دریافت است. البته مطالعه کدهای نوشته شده در متلب الگوریتم نیز که کاملاً خوانا و منظم هستند، می تواند در پاسخ به این سوالات و سوالات احتمالی بعدی مفید باشد. متن آموزشی و کدهای آماده الگوریتم را می توانید از لینکهای زیر دریافت کنید.
در ادامه پاسخ تک تک سوالات را می بینیم.
1) همانگونه که در متن اموزشی بیان شده، تولید x با توزیع یکنواخت در بازه بین صفر و بتا ضربدر d انجام می گیرد. که در ان d فاصله میان مستعمره و امپریالیست است. بتا را نیز معمولاً حدود 2 در نظر می گیریم. وجود ضریب بتا بزرگتر از یک باعث ميشود تا کشور مستعمره در حين حرکت به سمت کشور استعمارگر، از جهتهاي مختلف به آن نزديک شود.
2) در الگوريتم معرفي شده، با افزودن يک زاويه تصادفي به مسير جذب مستعمرات، انحرافی در مسیر حرکت انجام ميگيرد. بدين منظور، در حرکت مستعمرات به سمت استعمارگر، کمي زاويه تصادفي نيز به جهت حرکت مستعمره، اضافه ميکنيم. بدين منظور اينبار به جاي حرکت به اندازه x، به سمت کشور استعمارگر و در جهت بردار واصل مستعمره به استعمارگر، به همان ميزان، ولي با انحراف theta در مسير، به حرکت خود ادامه ميدهيم. theta را به صورت تصادفي و با توزيع يکنواخت در نظر ميگيريم (اما هر توزيع دلخواه و مناسب ديگر نيز ميتواند استفاده شود). در حالت دو بعدی پیاده سازی این مورد بسیار ساده است. کافی است از ماتریس دوران دو بعدی استفاده کنیم. یعنی بردار کنونی را داریم. بردار موقعیت جدید از ضرب ماتریس دوران به ادهزه theta در ماتریس موقعیت قبلی ایجاد می گردد.
در حالتهای با بعد بزرگتر، این نوع نگاه ممکن است در پیاده سازی (کد نویسی برنامه) کمی پیچیدگی ایجاد کند. به همین منظور می توانیم مولفه های تک تک ابعاد را در اعداد تصادفی متفاوت ضرب کرده و بردار نهایی را نرمالیزه (هم اندازه با بردار اولیه) کنیم. اگر کدهای نوشته شده را ببینید، به همین صورت عمل شده است.
3) بله دقیقاً همین طور هست. باز هم توصیه می شود کد ها را ببینید.
4) این مستعمرات کاملاً تصادفی انتخاب می شوند و هیچ اولویتی بین آنها نیست. تابع randperm در متلب می تواند در انتخاب مستعمرات به ما کمک کند. این تابع جایگشت تصادفی n عدد را به ما می دهد. راهنمای متلب را برای همین موضوع ببینید.