نكتب AI لـ Vindinium على أجهزة كمبيوتر أحادية اللوحة. الجزء الثاني: منطق القرار

سلسلة من المقالات حول كتابة الذكاء الاصطناعي للعبة متعددة اللاعبين عبر الإنترنت من النوع roguelike.


الجزء الأول
الجزء 3


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


الصورة


Vindinium لعبة العالم


من أجل إنشاء الذكاء الاصطناعي ، تحتاج إلى فهم هيكل عالم اللعبة.


ترجمة مجانية لوثائق اللعبة

الوصف


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


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


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


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


الخريطة


يتم إنشاء الخرائط بشكل عشوائي. يتم تشفير كل كائن لعبة على الخريطة باستخدام حرفين. مثال على الخريطة:


+----------------------------------------+ |######$- $-############$- $-######| |###### ## ## ######| |####[] #### #### []####| |## #### ## ## #### ##| |#### $- $- ####| |########## @1 @4 ##########| |############ #### #### ############| |$-##$- ############ $-##$-| | $- $-################$- $- | | ######################## | | ######################## | | $- $-################$- $- | |$-##$- ############ $-##$-| |############ #### #### ############| |########## @2 @3 ##########| |#### $- $- ####| |## #### ## ## #### ##| |####[] #### #### []####| |###### ## ## ######| |######$- $-############$- $-######| +----------------------------------------+ 

أسطورة


## - غابة لا تقاوم
@1 - البطل الأول
[] - الحانات
$- - منجم ذهب (مسحوب)
$1 - منجم الذهب (مملوك للبطل الأول)


الخرائط التي تم إنشاؤها متماثلة وتحتوي دائمًا على 4 حانات و 4 أبطال.


البطل


يمكن للأبطال تحريك خلية واحدة لكل دور ولديهم المؤشرات التالية:


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

اتجاه السفر


يجب أن يصدر البوت طلبًا واحدًا لكل دور. الأوامر المحتملة: ( Stay ) ، ( North ) ، ( South ) ، ( East ) أو ( West ). بمجرد تنفيذ الأمر ، يبقى البطل في مكانه أو يتحرك خلية واحدة في اتجاه معين.


تحرك البطل

إذا كان البطل:


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

نهاية الدور


بعد أن يتحرك البطل (أو يقرر البقاء ساكنًا) ، ستحدث الأشياء التالية:


المعارك

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


 ######## ##@1@2## ## @3## ######## 

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


تعدين الذهب

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


العطش

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


موت البطل


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


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


نهاية اللعبة


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


التقييم


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


استخدام برامج روبوت متعددة في وقت واحد


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


رابط إلى الأصل


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


  • إذا كان لدينا أقل من 21 وحدة صحية ، لكنك تهاجم لغمًا لا يخصك ، فعندئذ تموت. نعم ، نعم ، لا توجد حماية من الأحمق ، كل شيء خطير هنا ، كما هو الحال في المعارك الحقيقية. إذا هاجمت لغمًا يحرمه أحد ، فستصبح كل ألغامك أرضًا خالية من البشر ، وإذا هاجمت أحد أعدائك ، فإن ألغامك تمر في أيدي اللاعب الذي يمتلك هذا المنجم.
  • تصف اللعبة الإجراء التالي: - - 1 . وماذا يحدث إذا ماتنا أثناء تنفيذ الأمر (في اللعبة يمكنك فعل ذلك فقط عن طريق الموت في المعركة مع عفريت)؟ لقد ولدنا من جديد (ونقتل على الفور اللاعب الذي هو الآن في مركزنا) ، لكننا نفقد القدرة على ضرب الأعداء القريبين ، ولا نفقد أيضًا صحة واحدة بسبب العطش.
  • بعد أن قتل العدو واقفًا في مركزنا أثناء ولادتنا ، نأسر ألغامه.
  • تحتوي الخريطة على شكل مربع ، ويبلغ طول الخريطة قيمًا زوجية على المقطع [28 ، 28].

"تعلم من أعدائك وستفهم نقاط قوتهم"


Vindinium هي لعبة عامة ، جانبها المفيد هو أنه يمكننا النظر إلى ملف تعريف أي لاعب ورؤية آخر مائة معركة بمشاركته. "ممتاز! حان الوقت لاستخدام الشبكات العصبية ، لأن لدينا 50 لاعبًا بارزًا ، سنأخذ أقوى 10 منهم ، كل واحدة من آخر 100 معركة تحتوي على 300 دقيقة تقريبًا عندما اضطر اللاعب إلى اتخاذ قرار ، بإجمالي حوالي 200-300 ألف وحدة مواد للتدريب! ويمكنك تدوير كل حالة في اتجاه عقارب الساعة ، والمرآة ، وما إلى ذلك ، للحصول على المزيد من المواد للتدريب وتعزيز النتيجة ، وهذا سيوفر لنا ما يصل إلى 4.8-7.2 مليون وحدة من المواد "- خرج صوت العقل. نعم ، بالفعل ، مثل هذه الفكرة لها الحق في الوجود. بالإضافة إلى ذلك ، تتمتع الشبكات العصبية بالعديد من المزايا.


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

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


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


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


"نكهات خاصة جدا"


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


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

سؤال وجواب:


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


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


  • معتقداتك سخيفة ، إيمانك ضعيف للغاية! يمكنني إنشاء ذكاء اصطناعي على method_name وسوف يمزقك!
  • سيكون من الرائع الاستماع إلى أفكار الآخرين حول هذا الموضوع. علاوة على ذلك ، بالنسبة لك ، لقد جمعت بالفعل جميع معارك أفضل 10 لاعبين ، فقط 1000 معارك وحوالي 1،000،000 حركة - رابط (.zip - 33 ميجابايت ، RAW - 1.68 جيجابايت). أقدم شروط اللعبة:
    • تسجيل برامج الروبوت تحت ألقابك في geektimes.
    • إلى اللاعبين الخمسة الذين سجلوا أكبر عدد من النقاط قبل 30 سبتمبر أكثر من أي شخص أو أي شخص آخر أشار إلى اللعب ، سأرسل بطاقة بريدية من موسكو).

لذا ، الآن لغة البرمجة ... أنا شخصيًا أتنقل بين Python3 (التطور السريع ، سهل القراءة ، على دراية بها لفترة طويلة ، هناك pypy3 (مترجم محسن سريع) ، jupyter ("دفاتر ملاحظات" يمكنك فيها كتابة أجزاء من الكود بأمان وتحسينها من أجل اللانهاية) ؛ لكن pypy / pypy3 لا يعمل تحت ARM 64 بت ، وفي الواقع لم يعد ARM مدعومًا ، واللغة نفسها أقل شأنا من تلك المترجمة بطبيعتها) و Golang (التطور السريع أيضًا ، يسهل فهمها ، انحياز كبير نحو الواجهة الخلفية ، ومعالجة متعددة ومعالجة متعددة ، يعمل أسرع من الثعبان ، ولكن مع etsya لتعتاد على عدم وجود بيئة تفاعلية لكتابة ثابتة).


يمكن تمثيل الوظيفة الرئيسية التي تتواصل مع الخادم على النحو التالي:


كود
 #     train_url, arena_url, userkey,   config.py from config import train_url, arena_url, userkey import requests, random, json, time def start(is_train = True, debug = True, show_decision = True): #   if is_train: r = requests.post(train_url, data={"key":userkey}) else: r = requests.post(arena_url, data={"key":userkey}) timer = time.time() data = json.loads(r.text) if debug or show_decision: print('viewUrl:', data['viewUrl']) print(' :', data['game']['board']['size']) # while True: if debug: print('Turn', data['game']['turn']) #     direction = random.choice(['North', 'South', 'East', 'West', 'Stay']) if show_decision or debug: print(' ',str(data['game']['turn'])+':', direction) #    ,   ,  . if debug: print(':',time.time()-timer) r = requests.post(data['playUrl'], data={'key': userkey, 'dir': direction}) timer = time.time() if r.status_code != 200: print('Request code :', r.status_code) print('Reason:', r.reason) break data = json.loads(r.text) if data['game']['finished']: print('Game finished.') break 

ولكن من المستحسن استخدام التطورات الجاهزة ، والتي يمكن العثور على روابط لها على موقع Vindinium الرسمي.


إضافي 1: أريد حقًا أن أقرأ عن تطور الذكاء الاصطناعي القائم على Vindinium من أشخاص آخرين ، لأنه بهذه الطريقة يمكنك فهم الطبيعة المتعددة الأوجه لحل هذه المشكلة. من أجل الحصول على ملخص المعركة بتنسيق json (يمكن أن يكون هذا مفيدًا في تصحيح المعارك) ، تحتاج إلى تحويل الرابط إلى معركة النموذج http://vindinium.org/fd96vc2z إلى رابط النموذج http://vindinium.org/events/fd96vc2z . لكني لا أنصح بتعذيب خادم اللعبة ، محاولًا الحصول على مئات المعارك من أفضل اللاعبين ، استخدم الرابط أعلاه.


إضافي 2: إذا أراد شخص ما محاولة تشغيل وقت تشغيله في Vindinium في حدود NanoPi Neo2 أو Orange Pi Zero ، فيمكنني توفير الفرصة للعمل مع أجهزة الكمبيوتر ذات اللوحة الفردية هذه.


رابط إلى Vindinium
الرابط إلى Vindinium subreddit هو شيء مفيد للغاية ، هناك يمكنك تتبع تحركاتي في Vindinium
ربط إلى بلدي github مع كمية صغيرة من العمل على Vindinium


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

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


All Articles