حول هذا التغيير: تاريخ المركز التاسع في كأس روسيا لعام 2019

اسمي Andrey Rybalka ، أشارك في كأس AI الروسية تحت لقب lama وسأخبرك مرة أخرى كيف لا أفوز في macbook. لحسن الحظ ، أنا شخص متمرس في هذا - مع هذه الأيدي لم أفز ما يصل إلى 7 قطع.


لذلك ، كانت مهمة هذا العام هي لعبة platformer / 2D shooter ، والتي كان عليك أن تكتب روبوتًا لها. اللعبة تبدو مثل هذا:



بدا الروبوت مثل هذا:



إذا كنت مهتمًا بكيفية لعب الصورة رقم 2 في الصورة رقم 1 ، من فضلك ، أسفل القط.


إذا لم تشارك ولم تقرأ مقالات أخرى ، فنوصيك أولاً أن ترى كيف يبدو كل شيء في الديناميات على الموقع أو على الأنبوب:



نظام البطولة


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


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


تاريخ المشاركة


أين بدونها؟ يمكنك تخطي غير المهتمين. الجزء الفني سيكون أقل.


اختبار بيتا الأسبوع والجولة الأولى


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


الجولة الثانية


في هذه المرحلة ، قمت بالفعل ببرمجة على أكمل وجه ، في المتوسط ​​4-6 ساعات في اليوم. قبل يومين من بدء الجولة الثانية ، قمت بتحميل الإصدار الأول من الروبوت. ذهبت على الفور بخفة وسرعان ما دخلت في أفضل 10 صناديق رمل. ثم بدأت الجولة ، حيث احتلت المركز الخامس.


خاتمة


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


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


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


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


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


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


رمل خاتمة


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


الجزء الفني


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


محاكاة


من خلال عيون الروبوت ، بدا العالم هكذا:



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


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



في علامة التجزئة 1 ، الرمز النقطي في الموضع 1 ، في علامة 2 - في الموضع 2 ، على التوالي. بدون Mikrotik - بوريس الفجل - تحصل ، مع Mikrotik - طلقة الأذن. لذلك ، لكي يحدث هذا ، يجب أن يكون موضع الرمز النقطي في القراد 1 و 2 على جوانب مختلفة من واحد على الأقل من وجوه الشخصية أو التجانب (مستطيل النعناع). وبالتالي ، من الممكن محاكاة رمز نقطي بدون استخدام microtics حتى ، كما هو مطبق في الصورة أعلاه ، الحالة old_bullet.x > character_left_side.x != new_bullet.x > character_left_side.x ، وإذا حدث ذلك ، يجب عليك تحليل هذه العلامة بعناية أكبر .


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


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


أيضًا ، كل علامة تملأ مجموعة dodge_trajectories - محاكاة حركة كل حرف ، بما في ذلك الأعداء ، في 8 اتجاهات لـ 25 علامة (صورة ظلية صفراء في الفيديو من المتخيل ، بعد تشغيل مربع الاختيار traj المحتمل. على سبيل المثال ، الساعة 2:30). وكما هو الحال مع الرصاص ، احتفظ بكل المواقع الممكنة في كل علامة. ثم تم استخدامه في العديد من الأماكن ، وبعضها سوف أذكر.


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


البحث عن وسيلة


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


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


على جهاز الكمبيوتر المنزلي الخاص بي في لعبة تحتوي على 1000 علامة ، استغرق البحث في المسار بأكمله حوالي 100 مللي ثانية.


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


تصور مسار البحث:



المربعات البنفسجية الشفافة هي نقاط طريق ، كما أنها قمم الرسم البياني. السهام الخضراء الجير - حواف 1 العمود 2
1 يجب عدم الخلط بينه وبين الأضلاع ؛ 2 أي مصادفات ذات طبيعة ملكية تكون عشوائية [تقريبًا]


حركة


مشى حرفين بدوره. إذا فكرت للتو - "والآن حصلت على المراكز العشرة الأولى؟!" ، فكرت بشكل صحيح. :) لم تكن هناك موارد كافية للسير مع كليهما. كان استثناء حالة ظهور رصاصة طيران جديدة.


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


ما زلت استخدم علم الوراثة لسببين:


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


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


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


Igogo ، خوارزمية الحركة التقريبية:


  1. نحن نولد الأنماط الوراثية العشوائية. كل يتكون من جينات M عشوائية. كل جين عبارة عن أرقام مشفرة بالحركة: رقم واحد مسؤول عن اتجاه الحركة ، والثاني هو القفز / المشي / القفز لأسفل ، والثالث هو إطلاق النار الأساسي (بحتة لوظيفة التقييم ، سيتم وصف خوارزمية الرماية الأساسية أدناه) ، والرقم الرابع لعدد التكرارات لهذا الإجراءات. إجمالي عدد الإجراءات في التركيب الوراثي ، بالإضافة إلى التكرار ، لا يتجاوز عمق المحاكاة - 40 علامة.
  2. نضيف إليها عددًا من التراكيب الوراثية الثابت: الحركة المباشرة في 9 اتجاهات (8 جوانب + الوقوف ثابتًا) واثنين من الإعدادات المسبقة البسيطة ، والتي ساعدت في الواقع على الخروج من بعض المواقف المعتادة في المتاهة بشكل أسرع قليلاً. على سبيل المثال ، هذه هي المسارات: ⮤ ⮥
  3. أضف أفضل نوع جيني من الخطوة السابقة.
  4. تقييم كل شيء ، وترك الأفضل M.
  5. نحن بصدد إنشاء الجيل التالي الذي تحور فيه جينات واحدة أو أكثر في كل نمط جيني.
  6. نضيفهم إلى المجموعة العامة ، التي تحتوي بالفعل على أفضل ما في الجيل الأخير.
  7. نكرر ، بدءًا من النقطة 4 ، عدة مرات.

وظيفة التقييم


في الواقع ، المكان الذي تعيش فيه الاستراتيجية.


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


سأقدم بعض الأمثلة على المقاييس المهمة ، بترتيب عشوائي:


  1. عقوبة انفجار رصاصة / بازوكا فيّ.
  2. مكافأة لدرجات الحرية. أي لمعرفة عدد الاتجاهات (أعلى / أسفل / يسار / يمين) حيث يمكنني الانتقال من التجانب الحالي. كما قد تتخيل ، كلما زادت درجات الحرية - زادت فرص تفادي الرصاصة. أجبرت هذه المكافأة الروبوت على التمسك بالمنصات والسلالم. المكافأة أعلى ثلاث مرات إذا كان لدى الخصم بازوكا.
  3. عقوبة للمسافة (من خلال البحث عن الطريق) إلى أقرب مجموعة أدوات الإسعافات الأولية ؛ للحصول على متوسط ​​المسافة (من خلال البحث عن المسار) لجميع مجموعات الإسعافات الأولية ؛ لأن المسار منه إلى مجموعة الإسعافات الأولية الأقرب إليه هو أقل من المسار مني إلى مجموعة الإسعافات الأولية (!).
  4. عقوبة لحقيقة أن العدو يرى رأسي.
  5. عقوبة لحقيقة أن العدو يرى ساقي (النقطتان 4 و 5 أجبرت الروبوت على الاختباء وراء الملاجئ الجزئية).
  6. مكافأة الهجوم أثناء إعادة شحن أسلحة العدو.
  7. مكافأة طلقات مصنوعة.
  8. عقوبة لمسافة كبيرة جدًا أو كبيرة جدًا من العدو. كان يعتمد على عدة عوامل: صحة كلاهما ، سواء كانت أسلحة كلاهما قد أعيد شحنها ، إلخ.
  9. مكافأة لظروف العمل الخطرة.
  10. العقوبات المفروضة على حالة السقوط ولحالة الطيران على الحشيش (لأن هاتين الولايتين لا يمكن مقاطعتهما ، وبالتالي فهي أقل عرضة للتهرب من الرصاصة).
  11. المكافأة لعدد من مجموعات الإسعافات الأولية الموجودة على الجانب الآخر مني ، مقارنة مع العدو (على سبيل المثال ، إذا كان العدو على يميني ، فسوف أحصل على مكافأة لعدد من مجموعات الإسعافات الأولية الموجودة على يساري ، وهذا منطقي في الأساس الجولتان 1 و 2 ، حيث كان السبيل الوحيد من العدو إلى مجموعات الإسعافات الأولية هو من خلالي).
  12. مكافأة لاتباع الطريق إلى العدو ، إلى مجموعة الإسعافات الأولية (إذا جُرحت) ، إلى لغم (إذا كان لدي أقل من اثنين) ، إلى أسلحة (إذا لم يكن هناك أحد).
  13. عقوبة لقربها من الجدران في حال كان لدى العدو بازوكا. وبصورة أكثر تحديداً ، فكرت في عدد القراد التي سيطلقها صاروخ العدو ، إذا أطلقه ، فستطير إلى الجدار القريب مني ، وبناءً على ذلك ، فإن تلك المنطقة القريبة من الجدار التي يستحيل الهروب من الانفجار تعتبر خطيرة وتلقيت غرامة بسبب وجودها فيه.
  14. مكافأة السنة الجديدة.

رصاصة التهرب


يحدث ذلك تلقائيًا بسبب ما ورد أعلاه


تهدف


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


  1. نحن نعتبر الزاوية بين (last_angle - min_spread) و (last_angle + max_spread).
  2. نطلق النار من مركز شخصيتي على زاويتي العدو AABB الأقرب إلى العمودي. إذا كان أي منهم خارج النطاق (last_angle - min_spread) ... (last_angle + max_spread) ، فسنقطع هذا النطاق.
  3. نحن نعتبر الزاوية بين هذه الأشعة.
  4. قسّم الزاوية الثانية الأولى على الأولى ، وحصلنا على التغطية (التغطية). يمثل الاحتمال الحالي في المئة بأن مسار الرصاصة المتقاطعة سيتقاطع مع صندوق الخصم.
  5. نحن نحاكي إجراءًا يحدث فيه استهداف عدو ، إلى جانب تغيير في الانتثار.
  6. كرر الخطوات 1..4 للمجموعة الجديدة [last_angle ، min_spread ، max_spread]. وبالتالي ، فإننا نعتبر ما هي التغطية ستكون في حالة هدفنا.
  7. نتيجة لذلك ، لدينا التغطية الحالية ، وكذلك التغطية المتوقعة في حال كنا نوجه السلاح إلى العدو. إذا كانت التغطية المقدرة أكبر من الحالية ، فإننا نهدف.

عرض 2 نقطة:



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


لكنني عادة لا أستهدف بطن العدو ، ولكن في نقطة أكثر مثالية.


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


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


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


حتى في بعض الحالات ، للسقوط والطيران من منصة (أي الدول التي لا يمكن للعدو أن يقطعها) ، أنا ببساطة أعتبر نقطة اعتراض رصاصة العدو ، عن طريق حل نظام معادلات الحركة. تم نسخ الكود من روبوته للهوكي 2014 ، حيث تم استخدامه لاعتراض الصولجان. :)


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


إطلاق نار


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


  • إذا كان العدو غير مضمون لتفاديه ؛
  • إذا كانت التغطية أعلى من بعض القيمة الثابتة.

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


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


بشكل عام ، أخبرني المنطق أن إطلاق النار الأساسي يجب إيقافه ، لكن الاختبارات أظهرت عكس ذلك. لا أستطيع تخيل السبب.


الألغام


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


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


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


نتيجةً لذلك ، على الخرائط النهائية ، انتهت كل مباراة تقريبًا بأقل من 1000 علامة مع التفجير الذاتي لكلا شخصيتي.


السلامية


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


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


بشكل عام ، قمت بتحميل هذا الإصدار على الموقع ، حيث قمت بإنشاء 4 ألعاب مع كل من أفضل 3 ألعاب ثم ...



... فاز 3 من 4 مباريات ضد كل منهما. بشكل عام ، من الغريب أن الجيران لم يتذمروا من ضحك منزلي في منتصف الليل. :)


معجب بنفسك:



إيه ، إذا قضيت هذه 2-3 ساعات قبل النهائي ، وليس بعد ، ربما هذا المقال سيوضح كيفية الفوز MacBook ، وليس كيفية تجنبه بكل الوسائل ، من يدري. للأسف ، لا يعرف التاريخ الحالة المزاجية.


تجريب


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


في الختام


هذا بطريقة أو بأخرى كل شيء يعمل مع الحزن في النصف.


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



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


مرة أخرى ، أود أن أشكر مجموعة Mail.ru لهذه البطولة الرائعة القادمة. , , , ( 1100 ). — , . , . , , , !


, . , , . " 8 ".

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


All Articles