يعد العثور على طرق لتجنب العقبات في الألعاب مهمة كلاسيكية يجب على جميع مطوري الألعاب التعامل معها. هناك عدد من الخوارزميات المعروفة بدرجات متفاوتة من الكفاءة. جميعهم ، بدرجة أو بأخرى ، يحللون الموقف النسبي للعقبة واللاعب ، وبناءً على النتائج ، يتم اتخاذ قرار واحد أو آخر للتحرك. حاولت استخدام شبكة عصبية مدربة لحل مشكلة تجنب العوائق. أريد أن أشارك تجربتي في تنفيذ هذا النهج في Unity3D في هذه المقالة القصيرة.
المفهوم
يتم استخدام التضاريس القائمة على التضاريس القياسية كمساحة للألعاب. لا تعتبر الاصطدامات مع السطح في هذه المقالة. تم تجهيز كل نموذج بمجموعة من المصادمات ، بأكبر قدر ممكن من الدقة في وصف هندسة العوائق. النموذج ، الذي يجب أن يتجاوز العقبات ، أربعة
مستشعر التصادم (في لقطة الشاشة ، يُشار إلى موقع ومسافة المستشعرات بخطوط فيروزية). في الأساس ، تكون المستشعرات ريكاست ، حيث يمر كل منها المسافة إلى كائن التصادم في خوارزمية التحليل. تختلف المسافة من 0 (يقع الكائن في أقرب وقت ممكن) إلى 1 (لا تصادم ، هذا الاتجاه خالٍ من العوائق).
بشكل عام ، عمل خوارزمية تجنب العوائق هو كما يلي:
- يتم تغذية أربع قيم من أجهزة استشعار التصادم إلى المدخلات الأربعة لشبكة عصبية مدربة
- يتم حساب حالة الشبكة العصبية. عند الإخراج ، نحصل على ثلاث قيم:
أ. قوة دوران النموذج بعكس اتجاه عقارب الساعة (تأخذ قيمة من 0 إلى 1)
ب. قوة دوران النموذج في اتجاه عقارب الساعة (تأخذ قيمة من 0 إلى 1)
ج. تسريع الكبح (يأخذ قيمة من 0 إلى 1) - يتم تطبيق الجهود على النموذج مع المعاملات المناسبة.
التنفيذ
بصراحة ، لم يكن لدي أي فكرة عما إذا كان سيأتي أي شيء من هذا المشروع. بادئ ذي بدء ، قمت بتطبيق فئة neuroNet في الوحدة. لن أسهب في الحديث عن رمز الفصل الدراسي ، لأنه مفهوم كلاسيكي متعدد الطبقات. في هذه العملية ، نشأ السؤال على الفور عن عدد طبقات الشبكة. كم منهم مطلوب لتوفير السعة المطلوبة من جهة ، وسرعة حساب مقبولة من جهة أخرى؟ بعد سلسلة من التجارب ، استقرت على اثني عشر طبقة (ثلاث شروط أساسية لأربعة مدخلات).
بعد ذلك ، كان من الضروري تنفيذ عملية تدريب الشبكة العصبية. للقيام بذلك ، كان علي إنشاء تطبيق منفصل يستخدم نفس فئة neuroNet. والآن ارتفعت مشكلة بيانات التدريب إلى ارتفاعها الكامل. في البداية ، أردت استخدام القيم التي تم الحصول عليها مباشرة من تطبيق اللعبة. للقيام بذلك ، قمت بتنظيم تسجيل البيانات من أجهزة الاستشعار ، بحيث في المستقبل لكل مجموعة من قيم أجهزة الاستشعار الأربعة للإشارة إلى برنامج التدريب قيم المخرجات الصحيحة. ولكن ، بالنظر إلى النتيجة ، شعرت بالإحباط. والحقيقة هي أنه لا يكفي الإشارة إلى قيمة مناسبة لكل مجموعة من قيم الاستشعار الأربعة ؛ هذه القيم يجب أن تكون متسقة. هذا مهم جدا للتدريب الناجح للشبكة العصبية. بالإضافة إلى ذلك ، لم يكن هناك ما يضمن أن العينة الناتجة تمثل جميع المواقف الممكنة.
كان الحل البديل هو جدول تم تجميعه يدويًا للخيارات الأساسية لقيم المستشعرات والمخرجات. تم أخذ الخيارات الأساسية بالقيم: 0.01 - العائق قريب ، 0.5 - العائق في منتصف الطريق ، 1 - الاتجاه مجاني. وقد أدى ذلك إلى تقليل حجم عينة التدريب.
المستشعر 1 | المستشعر 2 | المستشعر 3 | المستشعر 4 | دوران في اتجاه عقارب الساعة | دوران عكس اتجاه عقارب الساعة | الكبح |
---|
0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 |
0.01 | 0.01 | 0.01 | 0.5 | 0.01 | 0.01 | 0.01 |
0.01 | 0.01 | 0.01 | 0،999 | 0.01 | 0.01 | 0.01 |
0.01 | 0.01 | 0.5 | 0.01 | 0،999 | 0.01 | 0.01 |
0.01 | 0.01 | 0.5 | 0.5 | 0،999 | 0.01 | 0.01 |
0.01 | 0.01 | 0.5 | 0،999 | 0،999 | 0.01 | 0.5 |
0.01 | 0.01 | 0،999 | 0.01 | 0،999 | 0.01 | 0.5 |
0.01 | 0.01 | 0،999 | 0.5 | 0،999 | 0.01 | 0،999 |
0.01 | 0.01 | 0،999 | 0،999 | 0،999 | 0.01 | 0،999 |
يوضح الجدول جزءًا صغيرًا من عينة التدريب (المجموع في الجدول 81 على التوالي). وكانت النتيجة النهائية للبرنامج التدريبي هي جدول الترجيح الذي تم حفظه في ملف منفصل.
النتائج
تحسبًا لفرك يدي ، نظمت تحميل الاحتمالات في لعبة تجريبية وبدأت العملية. لكن ، كما اتضح ، لم أكن كافية للقضية. منذ البداية ، اصطدم النموذج المختبَر بكل العقبات على التوالي ، مثل الهريرة العمياء. بشكل عام ، كانت النتيجة شديدة جدا. اضطررت إلى الخوض في دراسة المشكلة. تم اكتشاف مصدر للسلوك العاجز إلى حد ما بسرعة. مع الاستجابات الصحيحة بشكل عام للشبكة العصبية لقراءات أجهزة الاستشعار ، تبين أن إجراءات التحكم المرسلة قوية للغاية.
بعد حل هذه المشكلة ، واجهت صعوبة جديدة - مسافة reykast الاستشعار. مع مسافة طويلة من الكشف عن التداخل ، أجرى النموذج مناورات سابقة لأوانه ، مما أدى إلى تشويه كبير للمسار (وحتى في تصادمات غير متوقعة في عقبات مرت بالفعل على ما يبدو). أدت مسافة صغيرة إلى شيء واحد - "التمسك" العاجز للنموذج في جميع العقبات مع ضيق الوقت للرد.
كلما تلاعبت بنموذج اللعبة التجريبية ، وحاولت تعليمه لتجنب العوائق ، بدا لي أنني لا أبرمج ، لكن أحاول تعليم طفلي المشي. وكان إحساس غير عادي! كان من دواعي سروري أن أرى أن جهودي حققت نتائج ملموسة. في النهاية ، بدأ قارب التحويم المؤسف يحوم فوق السطح بثقة حول الهياكل الناشئة على الطريق. بدأت الاختبارات الحقيقية للخوارزمية عندما حاولت بوعي دفع النموذج إلى طريق مسدود. هنا كان مطلوبًا تغيير منطق العمل مع تسريع الكبح ، لإجراء بعض التصحيحات على عينة التدريب. دعونا نلقي نظرة على أمثلة عملية لما حدث نتيجة لذلك.
1. تجاوز بسيط من عقبة واحدة
كما ترون ، لم يتسبب الالتفاف في أي صعوبات.
2. عائقان (الخيار 1)
عثر النموذج بسهولة على ممر بين المبنيين. مهمة سهلة.
3. عائقان (الخيار 2)
المباني أقرب ، لكن النموذج يجد ممرًا.
4. عائقان (الخيار 3)
الخيار أكثر تعقيدًا ، ولكن لا يزال يتم حله.
5. ثلاث عقبات
تم حل المشكلة بسرعة كبيرة.
6. طريق مسدود
هنا واجه النموذج مشاكل. تظهر الثواني الـ 30 الأولى من الفيديو أن النموذج يتدفق بلا حول ولا قوة في تكوين مبنى بسيط. لا تكمن المشكلة هنا على الأرجح في نموذج الشبكة العصبية بقدر ما تكمن في الخوارزمية الرئيسية للتحرك على طول الطريق - فهو يحاول باستمرار إعادة السفينة إلى مسارها ، على الرغم من المحاولات اليائسة لتجنب الاصطدام.
بعد عدة عمليات غير ناجحة لهذا الموقف بمعلمات مختلفة ، تمكنت من الحصول على نتيجة إيجابية. من الثانية الثلاثين من الفيديو ، يمكنك ملاحظة كيفية تحديد نموذج بمسافة متزايدة من أجهزة الاستشعار وقوة كبح أكثر قوة من الطريق المسدود. لهذا كانت بحاجة إلى ما يقرب من خمس دقائق من الوقت (قطعت عذابها وتركت الثلاثين ثانية الأخيرة فقط من الفيديو). من غير المحتمل أن يتم اعتبار هذا في لعبة حقيقية نتيجة جيدة ، لذلك من الواضح أن هناك مجالًا لإدخال تحسينات على الخوارزمية.
الخلاصة
بشكل عام ، تم حل المشكلة. مدى فعالية هذا الحل هو سؤال مفتوح ، والمزيد من البحث مطلوب. على سبيل المثال ، من غير المعروف كيف سيتصرف النموذج عند ظهور عوائق ديناميكية (كائنات متحركة أخرى). مشكلة أخرى هي عدم وجود أجهزة استشعار الاصطدام تشير للخلف ، مما يؤدي إلى صعوبات في تجنب العقبات المعقدة.
إن التطور الإضافي الواضح لفكرة خوارزمية تجنب عقبة الشبكة العصبية يظهر في مقدمة التدريب. للقيام بذلك ، يجب إدخال تقييم لنتيجة القرار المتخذ ، ومع التصحيحات اللاحقة بدون تغييرات كبيرة في موضع الكائن ، يجب أن يتدهور التقييم. عند الوصول إلى قيمة معينة ، يجب أن يذهب النموذج إلى وضع التدريب ، ولنقل عشوائيًا القرارات التي تم اتخاذها من أجل إيجاد مخرج.
تبدو لي ميزة أخرى في النموذج تقلب التدريب الأولي. هذا يجعل من الممكن ، على سبيل المثال ، أن يكون لديك العديد من السلوكيات لنماذج مختلفة دون الحاجة إلى برمجة كل منها على حدة. وبعبارة أخرى ، إذا كان لدينا ، على سبيل المثال ، دبابة ثقيلة واستطلاع خفيف ، فقد تختلف طريقتهم في تجنب العقبات بشكل كبير. لتحقيق هذا التأثير ، نستخدم نفس الإدراك ، ولكن تم تدريبهم على عينات مختلفة.