قدم صفرم: تعريف رشته يا كروموزوم
تمامي متغير هاي طراحي بايد به صورت يك رشته تعريف شوند. روش GA ايجاب مي كند كه متغير ها مانند يك كروموزوم باشند تا بتوان فرآيند هايي نظير جهش را روي آن ها پياده سازي كرد. عمل تبديل متغير هاي طراحي به رشته را Coding مي گويند. فرضا" اگر متغير طراحي ما طول تير باشد مي توان براي تبديل آن به يك رشته آن مقدار طول را در مبناي عدد 2 بيان كرد. در اين صورت اگر طول تير 3 متر باشد، كروموزوم به شكل زير تعريف مي شود:
1|1|0|0|0|0|0|0
طول يك كروموزوم بستگي به گستردگي فضاي جست و جو ما دارد. در مثال بالا از 8 بيت استفاده شده است. فرض بر اين بوده است كه طول تير فقط در واحد هاي يك متري تغيير مي كند و در نتيجه اين مدل كدينگ مي تواند تيري با طول صحيحي بين 0 تا 255 متر را پوشش دهد. بديهي است كه براي گستره ي طول بزرگ تر بايد تعداد بيت ها را افزايش داد.
متغير هاي طراحي ما همواره مقادير عددي نيستند. مسئله ي فروشنده ي دوره گرد (برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]) در نظر بگيريم. در اين مسئله فروشنده بايد فرضا" از هشت جزيره ي A، B تا H به ترتيبي عبور كند كه حداقل فاصله ي ممكن براي سفر به تمام اين جزيره ها را پيموده باشد. در اين مسئله ترتيب پيمايش جزيره ها، متغير طراحي است و مسافت طي شده، تابع هدف خواهد بود كه مقدار آن بايد كمينه شود. براي كد كردن متغير طراحي مي توان اين ايده را به كار بست:
يك كروموزوم 8 بيتي تعريف مي كنيم كه بيت اول آن از سمت چپ، نام اولين جزيره اي است كه فروشنده به آن سفر مي كند. بيت دوم نام دومين جزيره اي خواهد بود كه فروشنده به آن مي رود و الي آخر. پس كروموزوم زير نشان مي دهد:
B|A|C|E|H|F|D|G
كه فروشنده سفر خود را از جزيره ي B آغاز كرده است. بعد به جزيره ي A رفته است و طبق همين روند، سفر او در جزيره ي G خاتمه يافته است.
همان طور كه ملاحظه مي كنيم روش Coding اختياري و به شكلي قراردادي است و ممكن است براي يك مسئله روش هاي مختلفي براي كدينگ وجود داشته باشد اما هر روش كدينگ حتما" (تاكيد مي شود حتما") بايد دو ويژگي زير را داشته باشد:
- روش كد كردن بايد تمام فضاي جست و جو ي متغير هاي طراحي را پوشش دهد. از ديد رياضي كد كردن بايد از فضاي جست و جو به فضاي رشته ها پوشا باشد. اگر روشي حتي اگر يكي از حالت هاي فضاي جست و جو را نتواند پوشش دهد، آن روش كدينگ مناسب نخواهد بود. به عنوان مثال اگر روش كد كردن يكي از مقادير طول تير و يا يكي از حالت هاي سفر فروشنده در مثال هاي فوق را نتواند به شكل يك كروموزوم نشان دهد، نمي توان از آن روش كدينگ استفاده كرد.
- روش كدينگ نبايد دو مقدار و يا دو حالت در فضاي جست و جو را با يك رشته ي يكسان نشان دهد. از ديد رياضي كد كردن بايد از فضاي جست و جو به فضاي رشته ها رفتار تابع را داشته باشد. در مثال فوق اگر روش كد كردن، دو طول مختلف تير را با رشته ي يكساني نمايش دهد، نمي توان از آن روش استفاده كرد.
لازم به ذكر است كه اگر كدينگ براي يك حالت در فضاي جست و جو، دو يا تعداد بيش تري رشته در نظر بگيرد، آن روش همچنان معتبر است. از ديد رياضي روش كدينگ الزما" نبايد يك تابع يك به يك باشد. در مثال فروشنده ي دوره گرد، مسافت طي شده در دو حالت زير با هم برابر اند:
B|A|C|E|H|F|D|G
G|D|F|H|E|C|A|B
به عبارتي يكي حالت مسير رفت و ديگري حالت مسير برگشت را نشان مي دهند.
توجه داشته باشيم كه هرچه روش Coding ساده تر باشد و براي تعريف آن از تعداد كم تري بيت استفاده شود، الگوريتم ژنتيك سريع تر عمل مي كند و عمل Decoding نيز ساده تر خواهد بود.
قدم اول: توليد جمعيت تصادفي
جمعيت اوليه: مجموعه اي از كروموزوم ها هستند كه به شكل تصادفي توليد مي شوند و اولين نسل را براي سير تكامل به وجود مي آورند. در اين جمعيت تصادفي، هم احتمال حضور كروموزوم هاي برتر و هم احتمال حضور كروموزوم هاي معيوب وجود دارد.
فرض كنيم كه متغير هاي طراحي ما از جنس عدد هستند. اين اعداد را به مبناي 2 برده و با كروموزوم هايي به طول 8 بيت كد مي كنيم. در نتيجه يك كروموزوم تصادفي ،0 ها و يا 1 هايي را شامل مي شود كه به شكلي تصادفي در كنار هم قرار گرفته اند و يك رشته ي 8 بيتي را توليد مي كنند.
تعداد جمعيت اوليه:
تعداد جمعيت اوليه پارامتري تجربي است و به عوامل زير بستگي دارد:
- طول كروموزوم ها: هر چه طول كروموزوم بيش تر باشد، تعداد جمعيت اوليه بايد افزايش يابد.
- نوع داده در هر بيت كروموزوم : هر چه داده اي كه در يك بيت قرار مي گيرد تنوع بيش تري داشته باشد، تعداد جمعيت اوليه افزايش يابد. رشته اي كه هر بيت آن يكي از حروف الفبا را در خود جاي مي دهد نسبت به حالتي كه هر بيت مي تواند تنها مقدار صفر و يا يك را قبول مي كند، نياز به جمعيت اوليه ي بيش تري دارد.
سورس MATLAB براي توليد 150 رشته ي تصادفي به طول 8 بيت:
کد:
for i=1:150
for j=1:m
a=rand;
if a>=0.5
a=1;
else
a=0;
end
P(i,j)=a;
end
end
حال ماتريس P جمعيت اوليه ي ما را شامل شده است.
عملگر هاي GA: زادولد و جهش
زادولد (Crossover)
عملي است كه از تركيب دو كروموزوم به عنوان والدين (Parents)؛ دو كروموزوم جديد به عنوان فرزند (Offspring) به وجود مي آورد. فرزندان بخشي از اطلاعات مادر و بخشي از اطلاعات پدر را به ارث مي برند. گونه هاي متداول توليد مثل به شكل زير است:
- One-point Crossover
- Two-point Crossover
- Scattering Crossover
One-point Crossover
در اين روش كرموزوم مادر از يك نقطه ي مشخص به دو بخش تقسيم مي شود. كروموزوم پدر نيز از همان نقطه ي مشخص به دو بخش تقسيم مي شود. حال فرزند اول از اتصال بخش اول كروموزوم مادر و بخش دوم كروموزوم پدر متولد مي شود. فرزند دوم نيز از اتصال بخش اول كرموزوم پدر و بخش دوم كرموزوم مادر به وجود مي آيد. محل برش بايد به شكل تصادفي تعيين شود.
1|1|0|0|1|1|0|1 مادر
0|1|0|1|0|1|0|1 فرزند اول
1|1|0|0|1|1|0|0 فرزند دوم
0|1|0|1|0|1|0|0 پدر
Two-point Crossover
در اين روش كرموزوم مادر از دو نقطه ي مشخص به سه بخش تقسيم مي شود. كروموزوم پدر نيز از همان دو نقطه ي مشخص به سه بخش تقسيم مي شود. حال فرزند اول از اتصال بخش اول كروموزوم مادر ، بخش دوم كروموزوم پدر و بخش سوم كروموزوم مادر متولد مي شود. فرزند دوم نيز از اتصال بخش اول كروموزوم پدر ، بخش دوم كروموزوم مادر و بخش سوم كروموزوم پدر به وجود مي آيد. محل نقاط برش همچنان بايد به شكل تصادفي تعيين شود.
1|1|0|0|1|1|0|1 مادر
1|1|0|1|0|1|0|1 فرزند اول
0|1|0|0|1|1|0|0 فرزند دوم
0|1|0|1|0|1|0|0 پدر
Scattering Crossover
در اين روش ابتدا يك رشته ي باينري متشكل از صفر و يا يك هاي تصادفي به طول كرموزوم هاي جمعيت توليد مي شود. حال اگر بيت اول رشته ي باينري توليد شده يك باشد، بيت اول كروموزوم مادر و بيت اول كروموزوم پدر جاي خود را با يكديگر عوض مي كنند. ولي اگر بيت اول رشته ي باينري صفر باشد، اين جايگزيني صورت نمي گيرد. همين روند براي بيت هاي بعدي نيز تكرار مي شود. در نهايت مادر و پدر با جايگزيني بيت هاي خود طبق الگوي رشته ي باينري، دو فرزند به وجود مي آورند.
مادر:
A|C|D|A|B|C
پدر:
B|A|B|C|D|A
رشته ي باينري توليد شده به شكل تصادفي:
0|1|0|0|1|1
فرزند اول:
B|A|D|A|D|C
فرزند دوم:
A|C|B|C|B|A
جهش (Mutation)
عملي است كه يك بيت كروموزوم را به شكل تصادفي انتخاب كرده و مقدار آن را تغيير مي دهد:
0|1|1|0|0|0|1|1
<< جهش
0|1|1|0|1|0|1|1
1 :تعداد فایل پیوست
جمع بندي الگوريتم ژنتيك تك هدفه
در اين پست يك جمع بندي از GA براي بهينه سازي تك هدفه (تنها با يك تابع هدف) ارايه مي شود.
مراحل:
- ما در ابتدا يك روش كد گذاري براي تبديل متغير هاي طراحي به كروموزوم تعريف كرديم.
- به تعداد مشخص جمعيت اوليه به شكل تصادفي توليد كرديم.
- ميزان برازندگي هر يك از كروموزوم ها را تعيين نموديم.
- سپس عملگر هاي زاد ولد و جهش را پياده سازي كرديم و جمعيتي را براي نسل جديد انتخاب كرديم.
نسل جديد در قدم بعدي مي تواند يك جمعيت اوليه ي ديگر باشد. در نتيجه مراحل 2 تا 4 را دوباره مي توان روي آن اجرا كرد و نسل جديد تري را به وجود آورد. اين روند مي تواند باز هم ادامه يابد كه هر نسل جديد تر كروموزوم هاي برتري نسبت به نسل هاي قبلي دارد. اين كروموزوم هاي برتر اگر رمزگشايي شوند همان جواب بهينه ي مسئله خواهند بود.
ولي اين سوال پيش مي آيد:
نقل قول:
توليد نسل هاي جديد تا چه موقع بايد ادامه پيدا كند؟
جواب:
تا زماني كه رشد توليد كروموزوم هاي برتر در نسل هاي بعدي متوقف شود. تعداد توليد نسل ها (تعداد تكرار) حداقل بايد 3 برابر تعداد جمعيت اوليه باشد.
بحث الگوريتم ژنتيك براي بهينه سازي تك هدفه در اين جا به پايان رسيد. فلوچارت اين الگوريتم نيز پيوست شده است. در ادامه سعي مي شود سورس كد هاي پياده سازي GA هم قرار داده شود.
به اميد خدا پس از اين مورد، بحث بهينه سازي چند هدفه با الگوريتم ژنتيك (MOGA) را آغاز خواهيم كرد.
:give_rose:
1 :تعداد فایل پیوست
حل مسئله ی فروشنده ی دوره گرد با الگوریتم ژنتیک
اجازه دهید که یک بار دیگر این مسئله و نحوه ی تعریف آن با GA را مرور کنیم:
نقل قول:
در اين مسئله فروشنده بايد فرضا" از هشت جزيره ي A، B تا H به ترتيبي عبور كند كه حداقل فاصله ي ممكن براي سفر به تمام اين جزيره ها را پيموده باشد. در اين مسئله
ترتيب پيمايش جزيره ها، متغير طراحي است و
مسافت طي شده، تابع هدف خواهد بود كه مقدار آن بايد كمينه شود. براي كد كردن متغير طراحي مي توان اين ايده را به كار بست:
يك كروموزوم 8 بيتي تعريف مي كنيم كه بيت اول آن از سمت چپ، نام اولين جزيره اي است كه فروشنده به آن سفر مي كند. بيت دوم نام دومين جزيره اي خواهد بود كه فروشنده به آن مي رود و الي آخر. پس كروموزوم زير نشان مي دهد:
B|A|C|E|H|F|D|G
كه فروشنده سفر خود را از جزيره ي B آغاز كرده است. بعد به جزيره ي A رفته است و طبق همين روند، سفر او در جزيره ي G خاتمه يافته است.
در مسئله ی فروشنده ی دوره گرد (TSP) مجاز نیستیم از یک شهر بیش از یک بار عبور کنیم. در نتیجه اگر براساس تولید مثل های معرفی شده در برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ] بخواهیم این مسئله را حل کنیم در کروموزوم فرزند ممکن است یک شهر دو یا چند بار تکرار شود که برخلاف فرض مسئله خواهد بود. در چنین مواردی از تولید مثل هایی تحت عنوان Order Crossover استفاده می شود. روند کامل حل TSP با GA را می توانید از پیوست دریافت نمایید.
پاسخ: الگوريتم ژنتيك (GA)
سلام.خستاه نباشيد..
با تشكر از سايت خوبتون ميخواستم خواهش كنم در مورد الگوريتم ژنتيك چند هدفي و NSGA و SPEA و نمودارهاي PDF و CDF بيشتر توضيح بدين..22 خرداد امتحان دارم...اكه ميتونين واسم ميل كنين..با تشكر
porebrahimisadegh@برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ].com
پاسخ: الگوريتم ژنتيك (GA)
نقل قول:
سلام.خستاه نباشيد..
با تشكر از سايت خوبتون ميخواستم خواهش كنم در مورد الگوريتم ژنتيك چند هدفي و NSGA و SPEA و نمودارهاي PDF و CDF بيشتر توضيح بدين..22 خرداد امتحان دارم...اكه ميتونين واسم ميل كنين..با تشكر
porebrahimisadegh@<a href="http://ww...>Gmail</a>.com
سلام!
عضویت تون رو در شهر سخت افزار تبریک می گم. :party:
الگوریتم ژنتیک چند هدفی (MOGA) بهینه سازی یه مسئله با الگوریتم ژنتیک هستش که در اون بیش از یک تابع هدف (Cost Function) وجود داشته باشه؛ فرضا" یه سازه رو چه جوری بهینه کنیم که هم جرم مناسبی داشته و هم مقاومت مناسبی. در این صورت بهینه کردن جرم و مقاومت به عنوان دو تابع هدف در تزاحم، یه بهینه سازی چند هدفی به حساب میاد. غالبا" در MOGA از مفهومی به نام Pareto جهت شناسایی نقاط بهینه ی طراحی استفاده میشه.
NSGA نسخه ای از الگوریتم ژنتیک برای بهینه سازی مسائلی با دو تابع هدف هستش. نسخه ی اولیه ی این الگوریتم سال 2002 توسط Deb ارایه شد و بعدا" نسخه ی بهبود یافته ی اون تحت عنوان NSGA-II توسط ایشون مطرح شد. در NSGA-II توسط مفهومی به نام معیار شلوغی، نقاط طراحی در جبهه ها (Pareto Front) انتخاب میشن به طوری که نفاط نزدیک به هم حذف و نقاط تنها به نسل بعد منتقل میشن. مفهوم معیار شلوغی تنها در فضای دو بعدی قابل تصوره. این الگوریتم پاسخ های بهتری رو نسبت به الگوریتم های هم رده ی خودش ارایه میده. برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
SPEA نسخه ای از الگوریتم ژنتیک برای بهینه سازی مسائلی با بیش از یک تابع هدف هستش. در این الگوریتم با مفهومی به نام فضای غالب (قابل تعریف در هر فضای n بعدی) نقاط طراحی در جبهه ها انتخاب میشن. برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
PDF یا تابع چگالی احتمالات نحوه ی توزیع احتمالاتی مقادیر یه متغیر رو بیان می کنه. فرضا" این تابع میگه اگه شما برید بازار و یه میله ی یک متری بخرید چقدر احتمال داره که این میله دقیقا" یک متر باشه و چقدر احتمال داره که این میله یک متر و دو سانتی متر باشه. برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
CDF یا تابع توزیع تجمعی انتگرال زیر سطح PDF هستش. طبق مثال این تابع بهتون میگه میله ی یک متری که شما خریدید چقدر احتمال داره که طولش از یک متر و دو سانتی متر بیش تر باشه و یا چقدر احتمال داره که طول از یک متر کم تر باشه. برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
لازم به ذکره که PDF و CDF دو تابع پرکاربرد در الگوریتم های بهینه سازی مقاوم (Robust) نظیر RDO یا RBDO محسوب میشن که نمونه ای از سورس متلب این نوع بهینه سازی ها از برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ] قابل دریافته.
موفق باشید
آرمین
پاسخ: الگوريتم ژنتيك (GA)
سلام ببخشید این مثال میشه بگید چطور حل میشه
اعداد یک تا هفتاد به صورت هشت بیتی تعداد ژن سی تایی هفت عملگر جمع منها ضرب تقسیم رادیکال فاکتوریل رادیکال انجام بده
خیلی فوری
- - - Updated - - -
ایمیل من aria.abounouri@برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ].com
پاسخ: الگوريتم ژنتيك (GA)
نقل قول:
سلام ببخشید این مثال میشه بگید چطور حل میشه
اعداد یک تا هفتاد به صورت هشت بیتی تعداد ژن سی تایی هفت عملگر جمع منها ضرب تقسیم رادیکال فاکتوریل رادیکال انجام بده
خیلی فوری
با سلام!
به شهر سخت افزار خوش آمدید.
بنده فقط بخش اول سوالتون رو متوجه شدم:
اگر بخواهیم اعداد بین 1 تا 70 را با یک کروموزوم 8 بیتی بیان کنیم باید از یک نگاشت بهره ببریم. برای رمز کردن عدد آن را از یک کم کرده و سپس جز صحیح حاصل ضرب آن را در 3.71 می یابیم. در نهایت حاصل را از مبنای 10 به مبنای 2 می بریم.
برای رمز گشایی ما ابتدا کروموزوم 8 بیتی را از مبنای 2 به مبنای 10 می بریم و حاصل را بر 256 تقسیم می کنیم. عدد به دست آمده را در 69 ضرب کرده و در نهایت با یک جمع می کنیم.
موفق باشید
آرمین