قدم صفرم: تعريف رشته يا كروموزوم
تمامي متغير هاي طراحي بايد به صورت يك رشته تعريف شوند. روش 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: