
شنو كيدير هاد المشروع
self-driving-car هي محاكاة مختصرة للسياقة الذاتية مكتوبة بجافاسكريبت عادي. شبكة عصبية صغيرة كتتعلم بالتطور باش تسوق فطريق سريع منحني فيه ثلاثة ديال المسالك، وتحافظ على المسلك ديالها، وتفرمل قدّام حركة السير، وتشعل الإشارة، وتتجاوز العربات البطيئة، وترجع لليمين ملي كيكون هاد الشي مناسب.
ما كاين حتى سائق نموذجي كيبين السلوك الصحيح. بلاصة من هاد الشي، كل جيل كيدفع مجموعة من الشبكات العصبية لنفس الطريق. الشبكات اللي كتقطع أكبر مسافة كتاخذ نقاط لياقة أعلى وكتولي آباء الجيل الموالي.
المشروع فيه تقريباً 1,300 سطر من وحدات ES كتشمل الطريق، وفيزياء العربات، والإدراك، وحركة السير، والشبكة العصبية، والخوارزمية الجينية، والمخطط، والرسم، وواجهة المستخدم. ما كايناش تبعيات وقت التشغيل، ونفس وحدات المحاكاة كتخدم فالمتصفح وفـ Node.js.
تقدر تحل العرض المباشر باش تتفرج على السائق المدرّب مسبقاً، ولا تطوّر مجموعة فالمتصفح، ولا تسوق الطوموبيل براسك.
كيفاش كيخدم نظام السياقة
المحاكاة كتتقدم بمعدل ثابت ديال 60 خطوة فالثانية. فكل خطوة، الطوموبيل كتمسح المسالك القريبة، وكتحوّل الملاحظات لـ 19 مدخلاً ديال الشبكة العصبية، وكتخرج جوج ديال النتائج: أمر ديال الدواسة ومسلك مطلوب.
الإدراك والشبكة العصبية
الشبكة ما كتعالجش بكسيلات الكاميرا ولا أشعة المسافة الخام. كتتوصل بمعلومات منظمة شبيهة باللي يقدر يوفرها نظام الإدراك لمخطط السياقة:
- واش المسلك اللي فاليسار، والمسلك الحالي، والمسلك اللي فاليمين موجودين.
- أقرب طوموبيل قدّام وورّا فكل مسلك مهم.
- السرعة اللي كيتسد بها كل فراغ.
- السرعة الحالية ديال الطوموبيل اللي كتتعلم.
- أشد منعطف فـ 100 متر الجاية.
- الحالة الحالية ديال مخطط تبديل المسلك.
البنية هي 19 · 12 · 8 · 2، كتستعمل تفعيلات tanh، وفيها 362 وزناً. مخرج واحد كيتحكم فالدواسة. والآخر كيختار المسلك: قيمة فوق +0.5 كاتطلب المسلك اللي فاليسار، وقيمة تحت -0.5 كاتطلب المسلك اللي فاليمين.
المخطط ونموذج الطوموبيل
الشبكة العصبية كتقرر فاش ولفين تتحرك، ولكن ما كتسوقش مباشرة. مخطط مكتوب باليد كيحوّل طلب المسلك لمناورة آمنة وناعمة. كيشعل الإشارة لمدة 0.7 ثانية، وكيشيك على المسلك الهدف، وكيستعمل منحنى S من الدرجة الخامسة لمدة 2.6 ثانية، وكيستعمل توجيه المطاردة المباشرة باش يتبع المسار المخطط.
إلا كانت شي عربة أخرى فمستوى الطوموبيل ولا غادي تدخل للنقطة العمياء ديالها، المخطط كيبقى مشعل الإشارة وكيستنى حتى يتفتح الفراغ. إلغاء الطلب فمرحلة الإشارة كيلغي المناورة.
الطوموبيل نفسها كتستعمل نموذج دراجة حركي بوحدات SI. المعاملات ديالها كتشبه هاتشباك عائلية: الطول 4.4 متر، من 0 حتى 100 km/h فـ 9.8 ثواني، سرعة قصوى 115 km/h، وفرملة حتى لـ 8 m/s². التماسك المتوفر فالمنعطفات كيحد من السرعة اللي تقدر بها تدوز المنعطف.
حركة السير، واللياقة، والتطور
حركة السير فالخلفية كتتبع نموذج السائق الذكي. العربات عندها سرعات مرغوبة بين 61 و94 km/h، كتتجاوز من اليسار، وكتعاود ترجع لليمين من بعد التجاوز، وكتشعل الإشارة قبل تبديل المسلك، وكتتفاعل مع الطوموبيل اللي كتتعلم.
اللياقة هي بالأساس عدد الأمتار المقطوعة. الطوموبيل كتخسر 300 نقطة إلا تصدمات ولا لحقاتها صف بطيء كيجرف الطريق. وكتخسر حتى أربعة أمتار على كل ثانية كتقضيها فمسلك يساري ملي كيكون المسلك اللي على اليمين خاوي بوضوح. ما كاين حتى مكافأة مباشرة على التجاوز؛ التجاوز كيولي مفيد حيث كيخلي الطوموبيل تقطع مسافة أكبر.
التطور كيستعمل أربعة تقنيات رئيسية:
- النخبوية: أحسن أربعة شبكات كيدوزو بلا تغيير فالتدريب عبر سطر الأوامر.
- الاختيار بالبطولة: الشبكات الأقوى عندها احتمال أكبر تولي آباء.
- التقاطع BLX-0.25: أوزان الآباء كتمتزج باش تخلق نسل جديد.
- الطفرة الغاوسية: معدل الطفرة وحجمها كينقصو بنصف عمر ديال 40 جيلاً.
التثبيت والإعداد المحلي
نسخ المستودع وشغّل الخادم المحلي الثابت ديالو:
git clone https://github.com/Stxqq/self-driving-car.git
cd self-driving-car
npm run serve
الأمر serve كيشغّل خادم HTTP ديال Python فالمنفذ 5101. حل http://localhost:5101 فالمتصفح.
ما كايناش حتى حزمة خاصك تثبتها. أي خادم ويب ثابت يقدر يستضيف المشروع، ولكن فتح الصفحة مباشرة عبر file:// ما غاديش يخدم حيث المتصفحات كاتقيّد وحدات ES فهاد السياق.
خاص Node.js 22 ولا أحدث باش تخدم اختبارات وسكريبتات سطر الأوامر. شغّل مجموعة الاختبارات بهاد الأمر:
npm test
استعمال واجهة المتصفح
تفرج على السائق المدرّب مسبقاً
استعمل تجربة المشاهدة باش تراقب الشبكة اللي جاية مع المشروع وهي كتسوق وسط حركة السير. الصفحة كتعرض المدخلات ديالها، والمخرجات، والمسار المخطط، وحالة تبديل المسلك، وإحصائيات الطوموبيل. الشريط الزرق كيمثل المسار اللي نتجه عليه المخطط.
سوق يدوياً
فالوضع Drive، كتبدل الشبكة العصبية وكتبقى مستعمل نفس المخطط. الطوموبيل كتبدا بمثبت سرعة مضبوط على 70 km/h.
- شد
↑باش تطلع السرعة المضبوطة. - ضغط على
↓باش تفرمل وتنقص السرعة المضبوطة. - ضغط على
←باش تطلب تبديل المسلك لليسار. - ضغط على
→باش تطلب تبديل المسلك لليمين.
بطاقة الشبكة كتبقى كاتعرض شنو كان غادي يدير الدماغ المدرّب مسبقاً، وهاد الشي كيخلي هاد الوضع مفيد لمقارنة قراراتك مع قراراتو.
درّب فالمتصفح
مود التدريب كيبدا بـ60 طوموبيل بأوزان عشوائية للشبكة. كاع الطوموبيلات كيتقاسمو نفس الطريق فكل جيل، وحركة السير كتدخل بالتدريج خلال أول 15 جيل. الجولات اللّولة كاتبدا بـ45 ثانية. ملي كتقدر شي طوموبيل تبقى حتى للنهاية، مدة الجولات اللي من بعد كتكبر بالنص حتى توصل لأقصى مدة ديال خمس دقايق.
التدريب فالمتصفح كيلقا بسرعة سلوك الحفاظ على المسار واتباع الطوموبيلات، ولكن التجاوز أصعب بزاف. الاختبارات اللي موصوفة فالمشروع لقات أن التجمعات اللي مبدية بأوزان عشوائية كانت كتدير غالباً غير من 0.1 حتى 0.5 تبديلة ديال المسار فالكيلومتر حتى للجيل 15. السائق الأصلي المدرّب مسبقاً كان محتاج تقريباً لـ170 جيل بتجمعات ديال 200 قبل ما تولّي تبديلات المسار مفيدة.
اختار من المدرّب مسبقاً إلا بغيتي تطوّر طفرات خفيفة من الدماغ اللي جاي مع المشروع بلا ما تبدا بأوزان عشوائية. الأدمغة اللي تدرّبات فالصفحة يمكن تصدّرها بصيغة JSON ومن بعد تحمّلها باستعمال زر الاستيراد.
التدريب من سطر الأوامر
التدريب من سطر الأوامر كيجري بلا واجهة عبر خيوط العمل. المثال التالي كيدرّب تجمع ديال 120 شبكة لمدة 10 أجيال، وكيقيّم كل شبكة فثلاثة ديال الطرق مهيّئين ببذور معروفة، بحلقات مدتها 60 ثانية:
node scripts/train.mjs --generations 10 --population 120 --seeds 3 --seconds 60
افتراضياً، الدماغ الناتج كيتكتب فـruns/brain.json. هاد الشي كيخلي التجارب منفصلة على الشبكة اللي جاية مع المشروع فـsrc/brains/pretrained.json.
المدرّب كيعرض إحصائيات بحال أحسن مسافة ومتوسط المسافة، وعدد الطوموبيلات اللي بقات، ونسبة الطفرات، والوقت اللي داز. الجيل صفر يقدر يكون فيه من اللول طوموبيلات كتصمد فحلقة قصيرة كاملة حيث المخطط كيخليها وسط المسارات ديالها. لذلك، التقدم كيبان غالباً أسهل فارتفاع متوسط التجمع من نتيجة أحسن طوموبيل بوحدها.
خيارات مفيدة للتدريب
--densityكيبدّل كمية حركة السير.--resumeكيبدا من الدماغ الموجود فالمسار المحدد بـ--outوكيستعمل طفرات أخف.--generationsكيتحكم فعدد الجولات التطورية.--populationكيتحكم فعدد الأدمغة اللي كتتقيّم فكل جيل.--seedsكيتحكم فعدد بذور الطرق المستعملة.--secondsكيحدد مدة كل حلقة.
عملية التدريب المستعملة فالدماغ اللي جاي مع المشروع مسجلة فـscripts/curriculum.sh. كتمشي من حلقات مدتها جوج دقايق فحركة سير كاملة حتى لحلقات مدتها خمس دقايق فطرق أكثر، ومن بعد كتكمل بمرحلة ضبط دقيقة على البقاء فاليمين. حسب توثيق المشروع، هاد المنهج خد تقريباً ساعة فوق حاسوب محمول فيه 14 نواة.
تقييم دماغ مدرّب
التقييم كيقيس أداء الدماغ فطرق محددة سلفاً وما شافهاش أثناء التدريب. شغّل المقيّم بلائحة ديال بذور الطرق:
node scripts/evaluate.mjs --seeds 9001,9002,9003,9004,9005
النتائج كتعرض المسافة، والوقت اللي داز، ومتوسط السرعة، وتبديلات المسار، وواش كل تشغيل سالا حيث سالا الوقت ولا حيث طاحت الطوموبيل. وكيحسب حتى القيم الإجمالية بحال متوسط ووسيط المسافة.
باش تقيّم شبكة مصدّرة ولا شبكة تدرّبات جديداً بلاصة الدماغ اللي جاي مع المشروع، دوز ملف JSON ديالها باستعمال --brain:
node scripts/evaluate.mjs --brain runs/brain.json --seeds 9001,9002,9003
النتائج الرسمية يمكن تعاود تولّدها بهاد الأمر:
npm run evaluate -- --write
هاد الأمر كيكتب scripts/results.json، والواجهة ديال المتصفح كتقرا هاد الملف حتى هي.
فهم النتائج المنشورة
الشبكة اللي جاية مع المشروع، وفيها 362 وزناً، تجرّبات لمدة خمس دقايق على 30 بذرة ما كانتش مستعملة فالتدريب، وسط حركة سير كاملة. حققات متوسط مسافة قدره 6.90 كلم، ووسيط قدره 7.23 كلم، ومتوسط سرعة قدره 87 كلم/س. 28 من أصل 30 تشغيل بقاو خدامين من بعد خمس دقايق، والطوموبيل دارت فالمتوسط 5.1 تبديلة مسار فالكيلومتر.
المشروع كيقارن هاد النظام مع نسخة أقدم كانت كتوجّه مباشرة باستعمال 14 حساس أشعة. الشبكة القديمة حققات فالمتوسط 4.05 كلم و56 كلم/س، وبقاو 20 من أصل 30 تشغيل خدامين من بعد خمس دقايق. المقارنة ماشي اختبار مضبوط حيث نموذج حركة السير تبدّل حتى هو، ولكن كاتبيّن علاش الفصل بين القرارات المتعلّمة والتوجيه المخطط خلّى اكتشاف التجاوز أسهل.
الشبكة كتختار دواسة التسارع والمسار الهدف؛ والمخطط كيتكلف بالإشارات، وفحص الفجوات، والتوجيه السلس.
نصائح متقدمة
استعمل بزاف ديال البذور باش تنقص فرط التكيّف
الدماغ اللي كيخدم مزيان فطريق وحدة يقدر يفشل فطريق أخرى. زيد عدد بذور التدريب وخلي بذور منفصلة للتحقق والتقييم النهائي. المدرّب بلا واجهة كيقيّم كل دماغ بوحدو فطريقو حيث حركة السير كتتفاعل مع الطوموبيل اللي كتتعلم؛ وهاد الشي كيمنع سلوك مرشح واحد من تبديل النقطة ديال مرشح آخر.
عاود كمّل قبل ما تبدا من جديد
إلا كان الدماغ المدرّب كيشد المسارات وكيتهرب من حركة السير، استعمل --resume ولا اختيار الدماغ المدرّب مسبقاً فالمتصفح. البداية بأوزان عشوائية مناسبة باش تشوف التطور من الصفر، ولكن سلوك التجاوز المتقدم يقدر يحتاج أجيال أكثر بزاف وتجمعات أكبر.
كبّر الصعوبة بالتدريج
تبع طريقة المنهج ديال المستودع: بدا بمدد حلقات معقولة، ومن بعد زيد المدة، وتنوع الطرق، وعمق التقييم. الحلقات الطويلة كتعطي دليل أحسن على السياقة المتينة، ولكن كاتخلي كل جيل أغلى.
حافظ على الحتمية
المحاكاة حتمية حتى فالخطوات الزمنية الثابتة ديالها: نفس البذور ونفس الأدمغة كيعطيو نفس المسارات. أدوات السرعة كتشغّل خطوات محاكاة أكثر ديال 1/60 من الثانية فكل إطار مرسوم، بلا ما تبدّل خطوة الفيزياء. هاد الشي كيسمح بتسريع التدريب بلا ما يبدّل النتيجة.
عرف فين تبدّل المشروع
src/sim/فيها كود الطريق، الطوموبيل، الإدراك، التخطيط، الترافيك، العالم، الدماغ، والتطوّر، بلا تبعيات ديال DOM.src/render/فيها مرحلة canvas، وتصوير الشبكة، وعرض البنية، والرسم البياني.src/ui/فيها جلسات التفرّج، والتدريب، والسياقة، والتخزين، ومعالجة الكلافيي.src/brains/فيها الشبكة المدرَّبة من قبل.scripts/فيها ملفات التدريب، والمنهج التدريجي، والتقييم، والنتائج.test/فيها اختبارات Node.js، بما فيها اختبارات إعادة التشغيل على بيانات ما تدرباتش عليها.
الخلاصة
كيبيّن هاد المشروع كيفاش شبكة عصبية صغيرة بزاف تقدر تتعلّم قرارات السياقة على مستوى عالي، ملي كيتكلف مخطِّط تقليدي بالتوجيه الدقيق وتنفيذ تبديل المسار. بدا بتشغيل العرض التجريبي فالمتصفح، وقارن بين القرارات اليدوية والقرارات العصبية، ومن بعد استعمل سكريبتات Node.js باش تدرّب وتقيّم الأدمغة ديالك. والتنفيذ ديالو بلا تبعيات والمحاكاة الحتمية ديالو كيخليوه حتى هو قاعدة كود عملية لدراسة التعلّم بالتطوّر، ونماذج العربات، وسلوك الترافيك، والتخطيط.
