إنشاء روبوت للمشاركة في AI mini cup 2018 على أساس شبكة عصبية متكررة


في البداية ، لم يكن لدي أي خطط لمقال ، خاصة حول التحدث في مؤتمر. لكن كان هناك مؤتمر. وبعد التحدث فيه ، كان لدى المشاهدين أسئلة تتعلق بتنفيذ بعض القضايا الفنية. وهكذا اتضح كلمة كلمة - مقال.


تسجيل مباشر تحت الرابط .


تنويه: هذه المقالة محاولة للإجابة على بعض هذه الأسئلة. سأكون سعيدًا إذا ظهرت أسئلة جديدة ، وأجيب عن أي فرصة ستكون متاحة لأتعلم شيئًا جديدًا بنفسي. ونعم ، هذه المقالة ليست بأي حال محاولة للشعور بصلابة الأنابيب النحاسية.


لذلك دعونا نبدأ من بداية هذه القصة. أعلن ربيع 2018 ، mail.ru عن مسابقة برمجة تعتمد على لعبة Agairo . جوهر المنافسة هو إنشاء روبوت لعبة.


قواعد المنافسة على هذا الرابط . ولكن لكي تكون موجزًا ​​وموجزًا ​​للقواعد بكلماتك الخاصة ، تحتاج إلى إنشاء روبوت للعب في القاهرة. في وقت من الأوقات ، لعبة إنترنت شعبية (بمعنى أنها تطلق من المتصفح) ، وجوهرها هو أكل إخوتك الأصغر سنًا والهروب من أكبرهم. يمكنك التحكم في عجلة الألوان في مساحة محدودة ثنائية الأبعاد. لإنشاء طريقة اللعب في هذه المساحة ، بالإضافة إلى دائرتك ، هناك دوائر أخرى يتم التحكم فيها وفقًا لذلك بواسطة لاعبين آخرين. هناك غذاء (نقاط ملونة) للنمو ، يتم إدخال عوائق إضافية في شكل "فيروسات" ، وهو تصادم يؤدي إلى تقسيم دائرتك إلى أخرى أصغر ، مما يعقد جزئيًا عملية اللعبة ، حيث أن الصغار يأكلون أكبر منها وأكبر منها أكثر أمانًا.


سأعطي صورة من مجموعة متنوعة من اللعبة للمسابقات


علاوة على ذلك ، نعني باللاعب ليس مطور البوت ، بل البوت نفسه.


احتفظ منظمو المسابقة ككل بالمفهوم الأصلي للعبة ، لكنهم أضافوا عددًا من الابتكارات. وأهمها تقييد مراجعة البوت وإدخال قانون فيزيائي بسيط يسمى الجمود. كانت الفيزياء تمر بالفيزياء لفترة طويلة ، لذا فإن الجمود لا يرتبط بنا فحسب ، بل أيضًا بكميات مثل الكتلة والسرعة والتسارع. لسنا بحاجة إلى أي شيء آخر من عالم الفيزياء.


آمل أن يكون الجزء الأدبي قد أولى اهتماما كافيا وحان الوقت للانتقال إلى المكون الفني للمسابقة والمشاركة فيها.


إخلاء المسؤولية 2: أنا متأكد تمامًا من أن ما تم وصفه أدناه يمكن أن يكون أكثر نحافة وأنيقًا وأكثر ذكاءً ، ولكن كيف حدث ذلك.


لذا اكتب الوصفة والمكونات الرئيسية ، فهي ليست كلها جديدة ، ولكن يمكنك إضافة خاصتك إلى ذوقك.


المهمة: قم بإنشاء روبوت يمكنه لعب Agairo بمفرده.
الفكرة الرئيسية: استخدام الشبكات العصبية (المشار إليها فيما يلي باسم الشبكة العصبية ، والشبكة العصبية (NN)) كعنصر تحكم في البوت.
أدوات الإنتاج الرئيسية: Microsoft Visual Studio و c # مع انتقال سلس إلى c ++.


أهم شيء بالنسبة للمؤلف هو اختيار أو فهم القارئ ، الذي أكتب له ، هل يعرف ما هي الشبكات العصبية والخوارزميات الجينية وكيفية وصف كل هذا بالتفصيل.


هذا كل شيء ، اخترت القارئ ، القارئ يعرف كل هذا ، ولكن ليس جيدًا لاستخدامه عمليًا.


لذلك ، عندما أكتب هذه المقالة ، سأتذكر أشكالًا بسيطة مثل الخلايا العصبية ووظيفة التنشيط.


بالنسبة للتصور ، سأستخدم الصور المرسومة يدويًا ، والتي يجب قراءتها على النحو التالي: إذا رأيت أي أخطاء هناك ، اكتب ، أعد الرسم إلى الأخطاء الصحيحة.



لذا ، كل شيء جاهز ليتم إرساله إلى مسار بناء برنامج الروبوت. لنبدأ:


نحن نأخذ الدورة ، أو بالأحرى ، قام منظمو المسابقة بإعدادها لنا كمثال على روبوت بسيط. دعنا نتعمق أكثر ، قم بتنزيل أرشيف مشارك المسابقة من المستودع باستخدام هذا الرابط . وعد المنظمون أن خادم المسابقة سيعيش ، وبعد اكتماله ، سنتمكن من التحقق من هذه الكلمات. نفتح الأرشيف ونختار لغة برمجة مفهومة لنا.


يصف توثيق المسابقة أيضًا تقنية الاتصال الخاصة بالعميل (اقرأ برنامج الروبوت الخاص بنا) وخادم مركز البيانات الذي يعيش في مكان ما في الأعماق. باختصار ، يمر الاتصال عبر خط وحدة التحكم ، عن طريق كتابة الأوامر وقراءتها منها.


يجب ذكر كلمة Serialization السحرية هنا: فهي تحزم بياناتك بتنسيق يفهمه المُسلسل والقدرة على قراءة هذه البيانات مرة أخرى في البرنامج باستخدام المُسلسل. هناك العديد من المتسللين ، أبسط تنسيق متسلسل للكتابة إلى ملف txt هو أيضًا مُسلسل ، ولكنه بسيط. ما نحتاج إلى معرفته عن المُسلسل هو أنه موجود ويكاد يكون شفافًا فيما يتعلق بواجهة برمجة التطبيقات. على الأرجح فهم المنظمون هذا ، وبالتالي يحتوي مثال الروبوت الخاص بهم على جميع التعليمات اللازمة للعمل مع التسلسل. في حالتنا ، كان JSON .


بالنسبة للبوت بعد المسلسل ، يبدو عالم اللعبة مثل مجموعة من البيانات التي تم تلقيها في بداية الدورة المذكورة. يقتصر الخادم على البيانات المتعلقة بعالم اللعبة وفقًا لنصف قطر العرض الذي يساوي 4 أقطار نصف البوت ، وتذكر أن البوت عبارة عن دائرة. والدائرة حول الدائرة هذه هي الحدود الخارجية للمراجعة ، على الرغم من أن الدائرة الخارجية منحازة قليلاً تجاه حركة البوت بالنسبة لمركز البوت ، ولكن يمكن تجاهل هذا في حالتنا.



وبالتالي لدينا دورة ، مقياس الدورة هو القراد ، كم عدد الدورات التي مرت ، لذلك تم تشغيل العديد من القراد. على الأرجح ، لن نتذكر هذه القسيمة بعد الآن ، ولكنها ستقدم عددًا من القيود والتبسيطات المهمة: يقتصر وقت الحساب ليس فقط على قراد واحد ، ووقت تكرار دورة واحدة ، ولكن أيضًا من خلال إجمالي وقت الحساب ، عند تجاوز ما سيفصله خادم اللعبة من برنامج الروبوت الخاص بك. حددها ووقتها لإعطاء أوامر للبوت. سنعتبرها كمًا من وقت اللعبة ، Tick هي جزء لا يتجزأ من الوقت في عالم اللعبة. تتبع الإيجابيات من هذا. نظرًا لأن القراد يساوي 1 افتراضيًا ، فمن الأسهل حساب السرعات والتسارع والقيم الأخرى. في جميع الصيغ ، نضرب في 1 ، بدلاً من استخدام نوع من وقت المنحنى t = 0.0015 ثانية فيها. الأخطاء في هذه العمليات هي أيضا الحد الأدنى.


كل ما سبق مشابه إلى حد ما لفيلم ، يبدو أن الصورة على الشاشة حية ومتحركة ، ولكن في الواقع نحن نعرض 25 إطارًا مختلفًا في الثانية ، ويعتبر دماغنا هذا ترددًا كافيًا لإدراك كامل لديناميكيات الفيديو. لذلك يرى البوت العالم في فترات زمنية. القراد هو إطار عالم اللعبة.


ستعمل الشبكة العصبية أيضًا وفقًا للقراد.


تبدأ الصورة بالظهور من جانب البوت:


يرسل الخادم البيانات المعالجة حول العالم إلى bot-> Tick Start-> يتلقى الروبوت البيانات -> يعالجها-> يرسل أوامر إدارة الروبوت إلى الخادم-> الخادم يقرأ البيانات-> نهاية التذكرة ثم في دائرة أو حلقة لا نهائية تقريبًا ، 45000 نقطة في النهاية اللعبة شخصية كبيرة.


ملاحظة مهمة: يمكنك تخطي القراد ولن تحصل على أي شيء مقابل ذلك. هناك حالات من الخوادم حيث تحتاج كل علامة إلى إخبار الخادم بشيء ما ، حتى لا يشك الخادم في البوت في تعليق برنامج التحكم.


قرر المؤلف عدم لمس الخادم كثيرًا ، لكنني بحاجة إلى قول بضع كلمات عنه. يوجد نموذج لعالم اللعبة على الخادم ، ووفقًا له ، فإنه يقوم بإجراء العمليات الحسابية والإجراءات. يتضمن برنامج الخادم الكتل التالية:


  • حساب تصادمات البوت (معالجة التصادمات مع حدود عالم اللعبة ، الذين أكلوا من ، بوت بوت أو طعام بوت ، أو تصادم مع فيروس ، إلخ.)
  • حساب فيزياء البوت (حركة البوت ، تتغير سرعة البوت وفقًا لأوامر البوت أو التصادمات التي حدثت)
  • الحسابات المتعلقة بتقسيم البوتات أو دمجها ، إن أمكن ، بإضافة الطعام ووظائف أخرى للحفاظ على عالم اللعبة.
  • وبالطبع إرسال واستقبال البيانات إلى الروبوتات على القراد الألعاب.

يسمى هذا الخادم "أمر". أي أن جميع الإجراءات تحدث على جانب الخادم ، مما يزيل مشاكل مزامنة البيانات. العميل (اقرأ البوت) يتلقى فقط صورة جاهزة للعالم ، مثل منافسيه الآخرين ، هنا يتم تحقيق المساواة في مواقف الروبوتات ، ولا توجد أولويات وقوائم انتظار. مرة أخرى ، يحدث تغيير في إحداثيات البوت على الخادم ، على سبيل المثال ، يعطي البوت أمرًا للتحول وفقط في المرة التالية تتعرف القراد على إحداثياتها الجديدة ، والتي لا تتزامن دائمًا مع الفريق ، كخيار عقبة في شكل جدار لعالم اللعبة.


صورة من موقع المنظمين



اكتشفنا قراءة البيانات باستخدام برنامج التتبُّع وخادم الإدارة ، فلنلقِ نظرة الآن على أعماق جهاز التتبُّع.


كما فهم القارئ على الأرجح ، سيكون هناك عدد قليل من الكلمات والكثير من العمل ، أو العكس.
يتم التحكم في البوت بواسطة شبكة عصبية. كيف قصيرة وقوية ، ولكن ليس من الواضح تماما.


اختيار الشبكة العصبية وتقنية تنفيذها.


في الوقت الحالي ، نقرر أن الشبكة العصبية بالنسبة لنا هي صندوق أسود يحتوي على مدخلات ومخرجات.


المدخلات والمخرجات بالنسبة لنا ستكون صفائف أحادية البعد مع أبعاد N = 16 للمدخلات وأبعاد M = 4 للإخراج.



نظرًا لأن طبيعة الشبكة العصبية الاصطناعية يتم نسخها تقريبًا من الشبكة العصبية الطبيعية ، فسيكون من الجيد بالنسبة لنا تقريب بنية بيانات الإدخال من البيانات الطبيعية. في الطبيعة ، هناك أجهزة استشعار مختلفة مسؤولة عن ذلك. لذا التزم بمستشعرات البوت.


تم تحديد الخيار التالي تجريبيًا (تم تبسيط الصورة إلى 8 أجهزة استشعار ، وشبكة عصبية 4 × 3 ، ولكن هذا فقط لإرباك القارئ):



ينقسم مجال رؤية الروبوت إلى قطاعات متساوية (وربما غير متساوية). يقدم كل قطاع إشارة إلى أحد مدخلات الشبكة العصبية. وفقًا لذلك ، إذا قسمنا المنطقة حول البوت إلى 16 قطاعًا (360/12 = 22.5 درجة نظرة عامة على القطاع) ، نحصل على 16 مدخلات للشبكة العصبية. عادة ، يتم تطبيق إشارة تتراوح من -1 إلى 1 على إدخال الشبكة العصبية ، لذلك سيكون من الضروري تطبيع إشارات الإدخال.


التقسيم ، مبسط ، يقسم إجمالي الإشارة على أقصى قيمة ممكنة. من الممكن بالطبع إجراء التطبيع الديناميكي ، أي البحث عن الحد الأقصى في كل مرة وإحضار قيمة الإشارة إلى معيارها ، لكننا سنحدد القيمة القصوى في شكل ثابت يساوي الحد الأقصى لعدد الكائنات في قطاع واحد ولن نغيرها في عملية العمل على الروبوت.


يمكن أن تكون الإشارات إما إيجابية أو سلبية ، نتفق على أن قيمة الإشارة من 0 إلى 1 هي دافع إيجابي لروبوتنا (الطعام ، الطعام في شكل روبوت أصغر) ، قيمة الإشارة السلبية من -1 إلى 0 هي دافع سلبي للبوت (الجدار عالم اللعبة ، بوت آخر أكبر).


رسم



إشارة من قطاع هي كمية طبيعية تتكون من مجموع الإشارات الفردية. كل إشارة فردية ، كما قيل ، لها علامة وحجم. يُحدد حجم الإشارة على أنه دالة تناسبية للمسافة. الحد الأدنى للمسافة هو حدود دائرة البوت المحدد ، والمسافة القصوى هي حدود رؤية البوت. وفقًا لذلك ، إذا تلقينا إشارة إيجابية من ، على سبيل المثال ، دخول الطعام فقط إلى القطاع على مسافة قصوى ، فستكون الإشارة ضعيفة وستزداد إذا اقترب الروبوت من الطعام.


كانت المستشعرات على شكل قطاعات هي الأكثر ملاءمة لهذه الحالة ، ولكن قد يكون هناك ببساطة هوائيات مسبار ، وهنا الخيال يكون بجانبك. بالطبع ، جرب المؤلف خيارات مختلفة للتقسيم إلى قطاعات من 4 قطاعات إلى 72 ، لكن الممارسة أظهرت أن الشبكة العصبية تم تدريبها بنجاح كبير في 16 قطاعًا وجاهزة للتحكم في الروبوت حتى مع أربعة قطاعات. هنا تتجلى مرونة طبيعة الشبكة العصبية.


أخيرًا ، تم نطق كلمة تدريب الشبكة العصبية . لكن في الوقت الحالي ، قررنا أن الشبكة العصبية هي صندوق أسود مع إدخال وإخراج ، وبما أننا قمنا بفرز بيانات الإدخال ، يبقى أن نقول بضع كلمات حول بيانات أو إشارات الإخراج من هذا المربع ، وماذا تفعل به وكيفية معالجته.


قمنا بتعيين بُعد إشارة الخرج إلى 4. هذا الرقم هو مظهر من مظاهر ازدواجية الإحداثيات الديكارتية والقطبية. لم ينس المؤلف طبيعة معرفة القارئ ، ولذلك يذكره برسمه للمعرفة المكتسبة جيدًا.



لذلك ، استخدم مطورو الخوادم منطقيًا الإحداثيات القطبية لمحاكاة عالم اللعبة ، وبالنسبة إلى البوتات ومطوريها قدموا إحداثيات ديكارت بأدب. لذلك ، كان على المؤلف اختيار جانب في نظام الإحداثيات هذا. بالنسبة للشبكة العصبية ، فإن نظام الإحداثيات القطبية الذي يحتوي فقط على حجم (طول القراءة) للمتجه وزاوية انحرافه أكثر قابلية للفهم. بعد كل شيء ، أنت تفهم أيضًا الكلمات "انعطف يمينًا" بدلاً من تحريك خطوتين على طول الإحداثي وثلاث خطوات على طول الإحداثي.


لذلك ، 4 إشارات خرج ، هذه إشارات 2 حول زيادة أو تقليل زاوية ناقل سرعة الروبوت ، و 2 إشارات أخرى تزيد أو تقلل من حجم ناقل السرعة.
ولكن نظرًا لأن خادم اللعبة طلب إعطاء أوامر للتحكم في البوت في الإحداثيات الديكارتية ، فإن هناك صيغتين للترجمة من الإحداثيات القطبية إلى الإحداثيات الديكارتية وكل هذا الخزي ظهر في أماكنهم (هذا رمز زائف مشابه لـ c #).


float rotate1 = outputs[0]; float rotate2 = outputs[1]; float speed1 = outputs[2]; float speed2 = outputs[3]; if (rotate1 > 0.65 && rotate2 < 0.65) angle = angle + 35 * PI / 180; if (rotate1 < 0.65f && rotate2 > 0.65) angle = angle - 35 * PI / 180; if (speed1 > 0.65 && speed2 < 0.65) speed = speed + 2; if (speed1 < 0.65 && speed2 > 0.65) speed = speed - 2; dx = speed * Cos(angle); dy = speed * Sin(angle); 

الإشارات في مكانها ، تمامًا مثل الروبوت. يبدو أنهم أعطوه إشارات إدخال ، ولكن عند الإخراج ، لا يوجد شيء جدير بالاهتمام: إما يقف أو يتحرك بشكل عشوائي.


لذلك جاء فتح الصندوق الأسود والنظر إلى الداخل.


يتبع.


لكن قبل المسلسل التشويقي الجديد:


يلعب البوت الأرجواني على الشبكة العصبية في Local Runner ضد الروبوتات القياسية التي قام المنظمون بخياطتها فيها بشكل افتراضي.


Source: https://habr.com/ru/post/ar417311/


All Articles