روبوتي لكأس الذكاء الاصطناعي الروسي 2019



حدث ذلك أن هذه البطولة كانت الأولى بالنسبة لي حيث تمكنت من أخذ مكان جدير ، لا أشعر بالخجل من أجله ، لذلك قررت كتابة المقالة الآن أيضًا. الطريق الذي ذهبت إليه في هذا المكان: المركز 1192 في بطولة العام 13 ، المركز 241 في بطولة العام 17 ، 91 في بطولة العام 18 ، وأخيرًا ، 16 (والخامس) ه في رمل) ضع على ذلك.

أفكار عامة


أعتقد أن أحد الأسباب الرئيسية للأداء الناجح نسبيًا في RAIC كان تغيير في نهج كتابة استراتيجيتك.

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

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

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

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

ومع ذلك ، حتى الآن تأخرت ثلاثة أو أربعة أيام ، قبل أن أتمكن من ملء النسخة الأولى من البوت ، في ذلك الوقت كانوا بالفعل في حالة حرب في وضع الحماية.

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

الإصدارات المبكرة


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

ظلت بقية وظائف الروبوت تمامًا مثل Quickstart. كان تحديد الهدف أيضًا بدائيًا قدر الإمكان - سلسلة من ifs تحدد الإجراء الأنسب للوحدة: إلى العدو ، من العدو ، إلى مجموعة الإسعافات الأولية ، إلى الأسلحة ، إلخ.

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

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

أدى نقص الأفكار إلى حقيقة أنه في الجولتين 1 و 2 احتلت 29 و 19 مكانًا على التوالي ، وعلى الرغم من أنني ذهبت إلى النهائيات ، أصبح من الواضح أنه يجب تغيير شيء ما جذريًا. تم إجراء أكبر عدد من التغييرات المهمة قبل النهاية (وبعد النهاية).

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

لذلك ، بالنسبة للخرائط النهائية متعددة المستويات ، تبين أن البوت غير جاهز تمامًا. أسفرت سلسلة ifs عن نتائج جيدة نسبيًا على الخرائط أحادية المستوى من الجولتين 1 و 2 ، ولكن تبين أنها غير مناسبة للخرائط متعددة المستويات من النهائيات ، كما لم يكن لدي نظام ملاحة للخرائط المعقدة ، لأنه على الخرائط البسيطة كان من الممكن القيام به مع الانتقال من رمز بدء التشغيل.


— .


جميع عناصر التحكم في الإطلاق تعمل في وظيفة AimHelper.

كل شيء موضح أدناه يعني أن الهدف هو وحدة العدو المرئية الأقرب إلى الروبوت.

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

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

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

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

تمت كتابة وظيفة HitChance ، والتي قسمت قطاع إطلاق الوحدة إلى أشعة N ، وفحصت كل شعاع بحثًا عن تصادم مع هدف. أيضا ، عندما ضرب ، تم فحص AOE للانفجار ، إذا كان قاذفة صواريخ. فرصة الضرب = عدد الضربات بالأشعة أو الانفجار / عدد الأشعة.

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

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

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

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

في الإصدار الأول ، أعادت الوظيفة فقط فرصة الضرب ، من 0-1 ، وبعد ذلك تمت إضافة حساب متوسط ​​قيمة HP للهدف ، بالإضافة إلى فرصة القتل بالضرب.

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

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

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

الآن الرقائق التي أضيفت بعد المباراة النهائية.

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

زاوية المعلومات للمسدس: الغريب ، الرقاقة بسيطة للغاية ، لكنها لم تتبادر إلى الذهن من قبل. يحظر إطلاق النار إذا كان عامل الانتشار (مبعثر / أقصى مبعثر) أكثر من 0.6 بشرط نسبة الانتصارات في وضع 1x1 في 3: 1 مقابل النسخة التي تم إطلاقها على قرص مضغوط للأسلحة. خفض العامل إلى 0.3 قدم نفس النسبة المئوية من الانتصارات على النسخة بالمعامل 0.6. وبالتالي ، تبين أن أحد أبسط التحسينات هو واحد من أكثر التحسينات فعالية.


تصور تشغيل وظيفة HitPredict ، يتم وضع علامة باللون الأحمر على المسارات حيث يتم ضمان النتيجة.

التنقل


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

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

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

مبدأ العمل: يبحث البوت عن الخلية الأبعد في الطريق داخل مربع 5x5 ، المرئي من مركز البوت ، ويتابع إلى هذه النقطة.

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


العثور على مسار ملحوظ أخضر diykstroy. يتبع البوت النقطة المحددة بمربع أبيض.

تحريك وتقدير الوظيفة


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

لذلك ، تم كتابة وظيفة التقييم مع ذلك.

المؤشرات الرئيسية
  1. الوحدة الصحية ، أكبر مكافأة.
  2. . — , — .
    — , . (1 — / . ), , . , , .
  3. . , , .
  4. , , , .
  5. .
  6. , .
  7. .
  8. مكافأة كبيرة إذا استطعنا لمس العدو من خلال التفجير الذاتي.


آخر معلمتين لم تكن في النهائي.

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

  1. مكافأة للتحرك نحو أقرب عدو.
  2. مكافأة للتحرك نحو أقرب مجموعة الإسعافات الأولية. كلما كانت صحتنا أقل ، كانت المكافأة أقوى.
  3. مكافأة للانتقال إلى أقرب سلاح إذا لم يكن لدينا سلاح ، أو للانتقال إلى سلاح له أولوية أعلى من الروبوت.
  4. مكافأة للانتقال إلى lootbox min إذا كان لدى البوت أقل من اثنين منهم.
  5. مكافأة للانتقال إلى مجموعة الإسعافات الأولية الأقرب إلى العدو ، إذا كنا أقرب إلى مجموعة الإسعافات الأولية من العدو.
    المكافأة الأكثر إثارة للاهتمام. تمت إضافته بعد المباراة النهائية. يسمح لك بمنع روبوت العدو من العلاج. وفقا للملاحظات ، تبين أنها فعالة للغاية.

ملاحظات

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

خيار النقل القديم موجود في MoveHelperOld ، الخيار الجديد في MoveHelper.


الروبوت الخاص بي (على اليمين) يحرس مجموعة الإسعافات الأولية

المناجم


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

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

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

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

في النهاية ، استخدمت الاستراتيجية الألغام ، لكنها لم تستخدم التفجير الذاتي المتعمد. بعد المباراة النهائية ، عندما كان هناك صراع من أجل الحصول على جوائز إضافية ، تمت إضافة وحدة TryPlantMine2 ، والتي تنفذ demoman. في البداية ، بسبب الأخطاء في الكود ، لم تكن الوحدة فعالة بشكل خاص ، ولكن في الإصدار الأخير كان من الممكن إصلاح كل شيء ، وبدأت الاستراتيجية على الفور في الصعود بشدة إلى التصنيف. وصل الأمر إلى درجة أنها طارت حتى في أعلى 3 ، على الرغم من أنها تراجعت بعد ذلك إلى حد ما.

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


الذات على التصنيف

الموجودات


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

استنتاج


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

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


من السلبيات ، بالطبع ، استغلال كبير للألغام.

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

يمكن عرض رمز الروبوت على github: github.com/silentnox/CodeSide

All Articles