loop الـ genetic algorithm
أربع قرارات بيبقوا ست parameters ملموسة. الـ encoding، والـ selection، والـ crossover، والـ mutation، والـ elitism، والـ replacement — والمقبض الواحد اللي كلهم بيحرّكوه.
خمس خطوات بتتكرّر
- اعمل initialization لـ population عشوائية
- قيّم كل candidate — وهنا التكلفة كلها
- اختار الـ parents، واعمل crossover، واعمل mutation للأبناء
- بدّل عشان تكوّن الـ population الجاية
- رجّع أحسن candidate شفته في أي وقت
أربع طرق تكتب بيها candidate
- bit string — مفاتيح، أو رقم متفكوك
- real vector — رقم عشري لكل parameter
- permutation — ترتيب، كل عنصر مرة واحدة
- شجرة — تعبير أو برنامج
الاختبار: هل الـ crossover الطبيعي بتاعه بيطلّع candidates صحيحين؟
من bits لرقم محدود
المجموع بيقرا الـ L bit كرقم صحيح؛ والكسر بيعيد scaling ليه على المدى بتاعك. والعيب هو الـ resolution — الـ L bit بيعبّروا عن العدد ده من القيم ومش أكتر.
تلات طرق تختار بيها الـ parents
- الـ tournament — k عشوائي، والأحسن بيكسب؛ وk هو المقبض
- الـ roulette — قطاع لكل fitness؛ حسّاس للمقياس
- الـ rank — اعمل sort، وبعدين اتجاهل القيم الخام
الـ tournament محتاج مقارنات بس: من غير مجاميع ولا sorting.
الضغط كرقم واحد
الـ rank 1 هو أحسن candidate. عند s = 1 الكل بياخد 1/N ومفيش ضغط خالص؛ وعند s = 2 الأحسن بياخد ضعف النصيب المتوسط والأوحش مبياخدش حاجة.
قطع، أو لزق، أو رمي عملة
الـ one-point والـ two-point crossover بيخلّوا الـ genes اللي جنب بعض مع بعض، فـ مكان كتابة الـ parameter على الـ string بيبدأ يفرق. والـ uniform crossover من غير تحيّز مكاني — ومن غير حماية لأي بلوك كمان.
لما القطع بيكسر الحل
الزق مسارين وهتاخد جولة بتزور الموقع 3 مرتين وعمرها ما بتزور الموقع 7. والـ order crossover بينسخ حتة من A، وبعدين يملا الفراغات بترتيب B.
المصدر الوحيد للمادة الجديدة
الـ crossover بيخلط اللي الـ population شايلاه أصلًا. bit flip، أو خطوة Gaussian، أو swap — ومعدل قد مقلوب طول الـ string بيخلّي التغيير المتوقّع bit واحد لكل ابن.
إنك تخسر الأحسن bug
- الـ selection عشوائي: الأحسن ممكن ميتختارش
- الـ variation مدمّر: ولو اتختار هيتغيّر
- فأحسن fitness في الـ population ممكن تقل
- الحل: انسخ أحسن e candidates من غير تغيير
- واحتفظ بنسخة الأحسن على الإطلاق بره الـ population
كله مرة واحدة، ولا واحد واحد
الـ generational replacement بيبدّل الـ population كلها — بسيط ومتوازي بسهولة، وهو الأكتر احتياجًا للـ elites. والـ steady-state بيدخّل ابن كل مرة، فالـ gene الكويس بيتعاد استخدامه على طول.
ست إعدادات، trade-off واحد
استكشف بـ population N أكبر، وk أصغر، وmutation أكتر، وelites أقل. واعمل exploitation بالعكس. ارسم التنوّع جنب الـ fitness، وافتكر إن N في عدد الأجيال هو الفاتورة.