نظرة عامة على تقنيات تنفيذ لعبة الذكاء الاصطناعي

الصورة

مقدمة


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

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

ما هو الذكاء الاصطناعي للألعاب؟


تتعامل لعبة AI بشكل أساسي مع اختيار إجراءات كيان اعتمادًا على الظروف الحالية. في أدب الذكاء الاصطناعي التقليدي ، يطلق عليه إدارة " العملاء الأذكياء ". عادة ما يكون الوكيل شخصية في اللعبة ، ولكن يمكن أن يكون آلة أو روبوتًا أو حتى شيء أكثر تجريدًا - مجموعة كاملة من الكيانات أو دولة أو حضارة. على أي حال ، هو كائن يراقب محيطه ، ويتخذ قرارات بناءً عليه ، ويتصرف وفقًا لهذه القرارات. وهذا ما يُطلق عليه أحيانًا دورة الإدراك والتفكير والعمل (Sense / Think / Act):

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

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

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

لعبة قيود تطوير الذكاء الاصطناعي


عادة ما تأخذ ألعاب الذكاء الاصطناعي في الاعتبار القيود التالية:

  • على عكس خوارزمية التعلم الآلي ، لا يتم تدريبها مقدمًا في العادة ؛ عند تطوير لعبة ، من غير العملي كتابة شبكة عصبية لمراقبة عشرات الآلاف من اللاعبين من أجل العثور على أفضل طريقة للعب ضدهم ، لأن اللعبة لم يتم إصدارها بعد ولا يوجد بها لاعبون!
  • عادة ما يفترض أن اللعبة يجب أن تسلي وتحدي اللاعب ، وأن لا تكون "مثالية" - لذلك ، حتى إذا كان بإمكانك تدريب الوكلاء لمقاومة اللاعبين بأفضل طريقة ، فغالبًا ما يحتاج المصممون إلى شيء مختلف عنهم.
  • غالبًا ما يُطلب من العملاء أن يكون لديهم سلوك "واقعي" حتى يشعر اللاعبون أنهم يتنافسون مع خصوم يشبهون البشر. تبين أن برنامج AlphaGo أفضل بكثير من الأشخاص ، لكن التحركات التي يختارها بعيدة جدًا عن الفهم التقليدي للعبة التي تحدث عنها المعارضون المتمرسون عنها على أنها لعبة ضد أجنبي. إذا كانت اللعبة تتظاهر بأنها خصم بشري ، فعادة ما يكون هذا غير مرغوب فيه ، لذا يجب إعداد الخوارزمية بحيث تتخذ قرارات معقولة ، وليست قرارات مثالية .
  • يجب تشغيل الذكاء الاصطناعي في الوقت الحقيقي. في هذا السياق ، هذا يعني أن الخوارزمية لا يمكنها احتكار موارد المعالج لفترة طويلة لاتخاذ قرار. حتى 10 مللي ثانية لاتخاذ قرار أكثر من اللازم ، لأن معظم الألعاب لديها 16-33 مللي ثانية فقط لإكمال جميع العمليات للإطار التالي للرسم.
  • من الناحية المثالية ، يجب أن يعتمد جزء على الأقل من النظام على البيانات ، وليس أن يكون مشفرًا بشكل ثابت بحيث يمكن لغير المبرمجين إجراء التغييرات بشكل أسرع.

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

سهولة اتخاذ القرار


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

إنشاءات شرطية مشفرة


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

يمكن أن تكون خوارزمية بسيطة لذلك ، يتم التعبير عنها في كود زائف:

  في كل إطار / تحديث أثناء تشغيل اللعبة:

 إذا كانت الكرة على يسار المضرب:

	 حرك المضرب إلى اليسار

 وإلا إذا كانت الكرة على يمين المضرب:

	 حرك المضرب إلى اليمين 

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

هذا النهج بسيط للغاية لدرجة أنه بالكاد يظهر الدورة الكاملة لـ "الإدراك والتفكير والعمل". لكنه كذلك.

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

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

أشجار القرار


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


يمكن أن نرى أنه يشبه شجرة ، مقلوبة فقط!

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

  1. عُقد الحلول: اختيار بديلين بناءً على التحقق من حالة ما. يتم تقديم كل بديل كعقدة خاصة به ؛
  2. عقد النهاية: إجراء يتم تنفيذه يمثل القرار النهائي للشجرة.

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

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

رقم العقدةالقرار (أو "النهاية")عملعمل
1الكرة على يسار المضرب؟هاه؟ تحقق من العقدة 2لا؟ تحقق من العقدة 3
2النهايةحرك المضرب إلى اليسار
3الكرة على يمين المضرب؟هاه؟ انتقل إلى العقدة 4لا؟ انتقل إلى العقدة 5
4النهايةانقل المضرب إلى اليمين
5النهايةلا تفعل شيئًا

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

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

البرمجة النصية


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

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

رقم العقدةالقرار (أو "النهاية")الحلعمل
1ball.position.x <paddle.position.xهاه؟ تحقق من العقدة 2لا؟ تحقق من العقدة 3
2النهايةحرك المضرب إلى اليسار
3ball.position.x> paddle.position.xهاه؟ تحقق من العقدة 4لا؟ تحقق من العقدة 5
4النهايةانقل المضرب إلى اليمين
5النهايةلا تفعل شيئًا

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

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

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

رد فعل على الأحداث


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

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

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

تحسين صنع القرار


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

آلات الدولة


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

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

  • دورية
  • اعتداء
  • رحلة

ويمكننا التوصل إلى القواعد التالية للانتقال بين الدول:

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

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

  • الانتظار (بين الدوريات)
  • البحث (عندما اختبأ العدو الذي شوهد سابقًا)
  • الهروب للمساعدة (عندما يتم رصد العدو ، لكنه أقوى من أن يقاتل معه وحده)

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

عاجلاً أم آجلاً ، تصبح القائمة الطويلة لـ "if <x ​​and y but not z> ثم <p>" محرجة للغاية ، ويمكن أن يساعد نهج رسمي لتنفيذ الحالات والانتقالات بينها هنا. للقيام بذلك ، نحن نعتبر جميع الدول وضمن كل دولة نسرد جميع التحولات إلى دول أخرى مع الشروط اللازمة لها. نحتاج أيضًا إلى الإشارة إلى الحالة الأولية حتى نعرف من أين نبدأ قبل تطبيق شروط أخرى.

الشرطشرط الانتقالحالة جديدة
الانتظارمن المتوقع لمدة 10 ثواندورية
العدو مرئي والعدو قوي جدامساعدة البحث
العدو مرئي وكثير من الصحةاعتداء
العدو واضح وقليل الصحةرحلة
دوريةاكتمل طريق الدوريةالانتظار
العدو مرئي والعدو قوي جدامساعدة البحث
العدو مرئي وكثير من الصحةاعتداء
العدو واضح وقليل الصحةرحلة
اعتداءالعدو غير مرئيالانتظار
القليل من الصحةرحلة
رحلةالعدو غير مرئيالانتظار
بحثتم البحث لمدة 10 ثوانٍالانتظار
العدو مرئي والعدو قوي جدامساعدة البحث
العدو مرئي وكثير من الصحةاعتداء
العدو واضح وقليل الصحةرحلة
مساعدة البحثانظر صديقاعتداء
الحالة الأولية: الانتظار

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


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

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

هذه هي الطريقة التي يتم بها التعامل مع انتقالات الدولة - ولكن ماذا عن السلوكيات المرتبطة بالدول نفسها؟ من وجهة نظر تنفيذ الإجراءات نفسها لدولة ، هناك عادة نوعان من إرفاق الإجراءات لمركبة فضائية:

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


مثال على النوع الأول: تستمر حالة "الدورية" في كل إطار أو دورة في تحريك العامل على طول مسار الدورية. تحاول حالة "الهجوم" في كل إطار أو دورة شن هجوم أو تحريكه إلى موقع حيث يكون ذلك ممكنًا. وهكذا دواليك.

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

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

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

آلات الحالة الهرمية


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

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

الشروط الرئيسية:

الشرطشرط الانتقالحالة جديدة
غير قتاليالعدو مرئي والعدو قوي جدامساعدة البحث
العدو مرئي وكثير من الصحةاعتداء
العدو واضح وقليل الصحةرحلة
اعتداءالعدو غير مرئيغير قتالي
القليل من الصحةرحلة
رحلةالعدو غير مرئيغير قتالي
بحثتم البحث لمدة 10 ثوانٍغير قتالي
العدو مرئي والعدو قوي جدامساعدة البحث
العدو مرئي وكثير من الصحةاعتداء
العدو واضح وقليل الصحةرحلة
مساعدة البحثانظر صديقاعتداء
الحالة الأولية: غير قتالية

الحالة غير القتالية:

الشرطشرط الانتقال

حالة جديدة

الانتظارمن المتوقع لمدة 10 ثواندورية
دوريةأكمل طريق الدوريةالانتظار
الحالة الأولية: الانتظار

وفي شكل مخطط:


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

أشجار السلوك


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

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

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

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

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


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

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


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

الأنظمة القائمة على المنفعة


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

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

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

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

عمل

حساب المنفعة

مساعدة البحث

إذا كان العدو مرئيًا والعدو قويًا ، وكانت صحته منخفضة ، فارجع 100 ، وإلا عاد 0

رحلة

إذا كان العدو مرئيًا وكان هناك القليل من الصحة ، فعندئذٍ إرجاع 90 ، وإلا إرجاع 0
اعتداء

إذا كان العدو مرئيًا ، فارجع 80

الانتظار

إذا كنا في حالة انتظار وانتظرنا بالفعل 10 ثوانٍ ، ارجع 0 ، وإلا 50

دورية

إذا كنا في نهاية طريق الدورية ، ارجع 0 ، وإلا 50

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

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

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

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

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

الحركة والملاحة


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

التوجيه


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

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

 المطلوب_السفر = destination_position - agent_position 

تخيل عالماً ثنائي الأبعاد يقع فيه الوكيل عند الإحداثيات (-2 ، -2) ، ونقطة الهدف تقع تقريبًا في الشمال الشرقي ، عند الإحداثيات (30 ، 20) ، أي للوصول إلى هناك تحتاج إلى الانتقال (32 ، 22). لنفترض أن هذه المواضع مذكورة بالأمتار. إذا قررنا أن العامل يمكنه التحرك بسرعة 5 م / ث ، فقم بتخفيض مقياس متجه الإزاحة إلى هذه القيمة ونرى أننا بحاجة إلى ضبط السرعة تقريبًا (4.12 ، 2.83). بالانتقال بناءً على هذه القيمة ، سيصل الوكيل إلى نقطة النهاية في أقل من 8 ثوانٍ ، كما هو متوقع.

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

ومع ذلك ، غالبًا ما نحتاج إلى المزيد من التحكم على سبيل المثال ، قد نحتاج إلى زيادة السرعة ببطء ، كما لو أن الشخصية توقفت أولاً ، ثم انتقلت إلى خطوة ، ثم ركضت لاحقًا. من ناحية أخرى ، قد نحتاج إلى إبطائه مع اقترابه من الهدف. غالبًا ما يتم حل هذه المهام باستخدام ما يسمى " سلوكيات التوجيه""الحصول على أسماء خاصة بهم مثل Seek و Flee و Arrival وما إلى ذلك. (في Habré هناك سلسلة من المقالات حولهم: https://habr.com/post/358366/ .) فكرتهم هي أنه يمكنك تطبيق سرعة الوكيل قوى التسارع استنادًا إلى مقارنة موقع الوكيل وسرعة الحركة الحالية نحو الهدف ، مما يخلق طرقًا مختلفة للتحرك نحو الهدف.

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

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

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

العثور على المسار


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

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

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


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

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

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


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

حركة بدون شبكة


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

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


مثال 1: عقدة في كل خلية في الشبكة. يبدأ البحث بالعقدة التي يوجد فيها الوكيل وينتهي بالخلية النهائية.


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

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

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

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



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

يعد العثور على المسارات موضوعًا واسعًا ، حيث توجد العديد من الأساليب ، خاصة إذا كنت بحاجة إلى برمجة تفاصيل منخفضة المستوى بنفسك. أحد أفضل مصادر المعلومات الإضافية هو موقع أميت باتل (ترجمة المقال على حبري: https://habr.com/post/331192/ ).

التخطيط


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

دعونا نلقي نظرة على لعبة Magic: The Gathering. لديك الخطوة الأولى ، وهناك العديد من البطاقات بين يديك ، بما في ذلك "Swamp" ، والتي تعطي نقطة واحدة من المانا السوداء ، و "Forest" ، والتي تعطي نقطة واحدة من مانا الخضراء ، و "التعويذي" ، والتي تتطلب نقطة مانا زرقاء للاتصال ، و " Elven Mystic "، للاتصال الذي تحتاج إليه نقطة واحدة من مانا الخضراء. (من أجل البساطة ، نحذف البطاقات الثلاث المتبقية.) تنص القواعد على أنه يمكن للاعب لعب بطاقة أرض واحدة لكل دور ، ويمكنه "لمس" بطاقات الأرض الخاصة به للحصول على مانا ، ويمكنه إلقاء العديد من التعويذات (بما في ذلك استدعاء المخلوقات) كم لديه مانا. في هذه الحالة ، من المحتمل أن يلعب اللاعب "غابة" ، ولمسه للحصول على نقطة مانا خضراء واحدة ، ثم اتصل بـ "Elven Mystic". ولكن كيف تعرف الذكاء الاصطناعي للألعاب أن مثل هذا القرار يحتاج إلى اتخاذ؟

"جدولة" بسيطة


قد يكون النهج الساذج هو التكرار ببساطة على كل إجراء بالترتيب ، حتى تكون هناك إجراءات مناسبة. بالنظر إلى اليد ، ترى منظمة العفو الدولية أنها يمكن أن تلعب "Swamp" ، وبالتالي تفعل ذلك. هل هناك المزيد من الإجراءات المتبقية بعد هذا المنعطف؟ لا يمكنه استدعاء Elven Mystic أو Exile Wizard ، لأن هذا يتطلب مانا خضراء أو زرقاء ، والمستنقعات التي يتم لعبها تعطي فقط مانا سوداء. ولا يمكننا لعب "الغابة" لأننا لعبنا بالفعل "المستنقع". أي أن لاعب الذكاء الاصطناعي سيتخذ الخطوة وفقًا للقواعد ، ولكنه لن يكون مثاليًا للغاية. لحسن الحظ ، هناك حل أفضل.

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

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

 1. العب "Swamp" (النتيجة: "Swamp" يترك اليد ويدخل اللعبة)
2. لعب "غابة" (النتيجة: "غابة" يترك اليد ويدخل اللعبة) 


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

 1. العب "Swamp" (النتيجة: "Swamp" يترك اليد ويدخل اللعبة)
            1.1 المس "Swamp" (النتيجة: لمسنا "Swamp" ، يتوفر +1 مانا سوداء)
                        لم يبق أي إجراء - END
2. لعب "غابة" (النتيجة: "غابة" يترك اليد ويدخل اللعبة) 


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

 1. العب "Swamp" (النتيجة: "Swamp" يترك اليد ويدخل اللعبة)
            1.1 المس "Swamp" (النتيجة: لمسنا "Swamp" ، يتوفر +1 مانا سوداء)
                        لم يبق أي إجراء - END
2. لعب "غابة" (النتيجة: "غابة" يترك اليد ويدخل اللعبة)
            2.1 المس "غابة" (النتيجة: لمسنا "مستنقع" ، يتوفر +1 مانا خضراء)
                        2.1.1 استدعاء "Elven Mystic" (النتيجة: "Elven Mystic" في اللعبة ، -1 مانا خضراء متاحة)
                                    لم يبق أي إجراء - END 


لقد حققنا الآن في جميع الإجراءات والإجراءات الممكنة الناتجة عن هذه الإجراءات ، وإيجاد خطة تسمح لنا باستدعاء المخلوق: "العب الغابة" ، "المس الغابة" ، "اتصل بـ" Elven Mystic "".

من الواضح أن هذا مثال مبسط للغاية ، وعادة ما تحتاج إلى اختيار الأفضلخطة ، وليس مجرد خطة تفي ببعض المعايير (على سبيل المثال ، "استدعاء مخلوق"). يمكنك عادةً تقييم الخطط المحتملة بناءً على النتيجة النهائية أو الفوائد التراكمية لاستخدام الخطة. على سبيل المثال ، يمكنك أن تمنح نفسك نقطة واحدة لخريطة الأرض الموضوعة و 3 نقاط لاستدعاء مخلوق. سيكون "لعب" المستنقع "خطة قصيرة تعطي نقطة واحدة ، وخطة" لعب "غابة" → المس "غابة" → اتصل "Elven Mystic" تعطي 4 نقاط ، 1 للأرض و 3 للمخلوق. ستكون هذه هي الخطة الأكثر ربحية المتاحة ، لذلك يجب عليك اختيارها إذا قمنا بتعيين مثل هذه النقاط.

أعلاه ، أظهرنا كيف يعمل التخطيط في نفس السحر: تحرك التجمع ، ولكن يمكن أيضًا تطبيقه على الإجراءات في سلسلة من التحركات (على سبيل المثال ، "تحريك بيدق لإتاحة مساحة لتطوير الأسقف" في الشطرنج أو "الوقوع في غطاء لوحدة يمكن إطلاق النار على المنعطف التالي ، كونك آمنًا "في XCOM) أو في الاستراتيجية العامة للعبة بأكملها (على سبيل المثال ،" إنشاء أبراج لجميع المباني الأخرى "في Starcraft ، أو" شرب جرعة Fortify Health قبل مهاجمة العدو "في Skyrim).

تحسين التخطيط


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

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

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

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

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

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

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

التدريب والتكيف


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

الإحصائيات والاحتمالات


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

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

يمكن استخدام نهج مماثل لتقييم احتمالية بعض الإجراءات ، بافتراض أن تفضيلات اللاعب السابقة ستستمر في المستقبل. على سبيل المثال ، إذا هاجم لاعب خمس مرات بكرة نارية ، ومرتين بالبرق واليد باليد مرة واحدة فقط ، فمن المرجح أنه يفضل كرة نارية 5 من أصل 8 مرات. واستناداً إلى هذه البيانات ، يمكننا أن نرى أن احتمال استخدام السلاح هو: Fireball = 62.5٪ ، Lightning = 25٪ Melee = 12.5٪. ستدرك شخصيات الذكاء الاصطناعي لدينا أنها أفضل حالًا في العثور على دروع مقاومة للحريق!

طريقة أخرى مثيرة للاهتمام هي استخدام Naive Bayes Classifier لدراسة كميات كبيرة من بيانات الإدخال من أجل تصنيف الوضع الحالي حتى يتمكن وكيل الذكاء الاصطناعي من الاستجابة وفقًا لذلك. من المحتمل أن تكون مصنّفات Bayesian معروفة باستخدامها في فلاتر البريد الإلكتروني العشوائي ، حيث يقيمون الكلمات في البريد الإلكتروني ، ويقارنونها بتلك الكلمات التي كانت غالبًا موجودة في البريد العشوائي والرسائل العادية في الماضي. بناءً على هذه الحسابات ، يقررون احتمال أن آخر رسالة تم تلقيها هي رسائل غير مرغوب فيها. يمكننا القيام بشيء مماثل ، فقط بإدخال أقل. بتسجيل جميع المعلومات المفيدة التي يمكن ملاحظتها (على سبيل المثال ، وحدات العدو التي تم إنشاؤها ،التعويذات المستخدمة أو تقنيات البحث) وتتبع الحالة الناتجة (الحرب / السلام ، استراتيجية الاندفاع / استراتيجية الدفاع ، إلخ) ، يمكننا تحديد السلوك المناسب بناءً على ذلك.

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

التكيف السهل على أساس الوزن


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

  • ( );
  • «» ;
  • .

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

نماذج ماركوف


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

تخيل أن هناك ثلاث غرف - الأحمر والأخضر والأزرق ، وقد تلقينا مثل هذه الملاحظات خلال جلسة اللعبة:

الغرفة الأولى التي يظهر فيها اللاعبإجمالي المشاهداتالغرفة المجاورةكم مرة شوهدت

النسبة المئوية

أحمر

10

أحمر

2

20٪

أخضر

7

70٪

أزرق

1

10٪

أخضر

10

أحمر

3

30٪

أخضر

5

50٪

أزرق

2

20٪

أزرق

8

أحمر

6

75٪

أخضر
2

25٪

أزرق

0


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

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

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

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


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

إذا تم رصد لاعب في الغرفة الخضراء ، فسوف نستخدم البيانات التي تخبرنا أن هناك فرصة بنسبة 50 في المائة أنه سيظل في الغرفة الخضراء في الملاحظة التالية. ولكن ما احتمالية بقائه فيه للمرة الثالثة؟ هذا ليس فقط احتمال أنه سيبقى في الغرفة الخضراء لملاحظتين (50 ٪ * 50 ٪ = 25 ٪) ، ولكن أيضا احتمال تركه والعودة. فيما يلي جدول جديد بقيم سابقة تم تطبيقه على ثلاث ملاحظات: واحدة الحالية واثنتين افتراضيتين في المستقبل.

الملاحظة 1

ملاحظة افتراضية 2



3








30%



20%

6%



70%

21%



10%

3%


50%



30%

15%



50%

25%



20%

10%



20%



75%

15%



25%

5%



0%

0%

:

100%

نرى هنا أن احتمال رؤية لاعب في الغرفة الخضراء بعد ملاحظتين هو 51٪ - 21٪ مما سيأتي من الغرفة الحمراء ، و 5٪ مما نراه اللاعب يزور الغرفة الزرقاء ، و 25٪ مما هو عليه طوال الوقت سيبقى في الغرفة الخضراء.

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

N غرام


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

طريقة واحدة للقيام بذلك - للحفاظ على إدخال كل لاعب (على سبيل المثال، ركلة ، لكمة أو كتلة ) في المخزن المؤقت والكتابة المخزن المؤقت بأكمله كما حدث. تخيل أن اللاعب يضغط باستمرار على ركلة ، ركلة ، ركلة لاستخدام هجوم " سرطان الموت " "، ويحفظ نظام AI جميع إدخالات اللاعب في المخزن المؤقت ويتذكر آخر 3 إدخالات مستخدمة في كل خطوة.

أدخل

تسلسل إدخال موجود

ذاكرة إدخال جديدة

ركلة

ركلة

لا

ضربة يدوية

ركلة ، ركلة

لا

ركلة

ركلة ، ركلة ، ركلة

ركلة ، ركلة ، ركلة
ركلة

ركلة ، ركلة ، ركلة ، ركلة

ركلة ، ركلة ، ركلة

ضربة يدوية

ركلة ، ركلة ، ركلة ، ركلة ، ركلة

ركلة ، ركلة ، ركلة

كتلة

ركلة ، ركلة ، ركلة ، ركلة ، ركلة ، كتلة

ركلة ، ركلة ، كتلة

ركلة

ركلة ، ركلة ، ركلة ، ركلة ، كتلة ، ركلة

ركلة ، كتلة ، ركلة

ركلة

ركلة ، ركلة ، ركلة ، ركلة ، كتلة ، ركلة ، ركلة

كتلة ، ركلة ، ركلة

ضربة يدوية

, , , , , , , ,

, ,

(في الخطوط الغامقة ، يقوم اللاعب بهجوم "Superbuck of Death".)

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

تسمى تسلسلات الأحداث هذه N-grams.حيث N هو عدد العناصر المخزنة. في المثال السابق ، كان 3 جرامًا ، يُطلق عليه أيضًا الزناد الثلاثي ، أي أنه يتم استخدام أول عنصرين للتنبؤ بالثالث. في الـ 5 جرام ، يُتوقع الخامس للعناصر الأربعة الأولى ، وهكذا.

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

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

نموذج بيغرام هو في الأساس سلسلة تافهة ماركوف - كل زوج "الحالة المستقبلية / الحالة الحالية" هو بيغرام ويمكننا التنبؤ بالحالة الثانية على أساس الأول. يمكن أيضًا اعتبار Trigrams و N-grams الكبيرة على أنها سلاسل ماركوف ، حيث تشكل جميع عناصر N-gram ، باستثناء الأخيرة ، الحالة الأولى ، والعنصر الأخير هو الحالة الثانية. في مثال لعبة القتال لدينا ، يتم تقديم احتمال الانتقال من حالة الركل والركل إلى حالة الركل ، ثم يتم تقديم الركل. من خلال إدراك العديد من عناصر تاريخ الإدخال كعنصر واحد ، فإننا نحول تسلسل الإدخال إلى جزء واحد من الحالة ، مما يمنحنا خاصية ماركوف ، مما يسمح لنا باستخدام سلاسل ماركوف للتنبؤ بالإدخال التالي ، أي تخمين أي حركة كومبو سوف تتبعها.

تمثيل المعرفة


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

العلامات / العلامات


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

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

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

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

كائنات ذكية


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

تخيل محاكاة لمدينة من العصور الوسطى حيث يتجول المغامرون حيث يريدون ، إذا لزم الأمر ، التدريب والقتال والاسترخاء. يمكننا ترتيب مواقع التدريب في أجزاء مختلفة من المدينة وتعيين العلامة "تدريب" حتى تتمكن الشخصيات من العثور بسهولة على مكان للتدريب. ولكن دعونا نتخيل أن أحدهما هو ميدان للرماية للرماة ، والآخر هو مدرسة المعالجات. في كل حالة من هذه الحالات ، نحتاج إلى إظهار الرسوم المتحركة الخاصة بنا ، لأنهم تحت الاسم العام "تدريب" يمثلون إجراءات مختلفة ، وليس كل مغامر مهتمًا بكلا النوعين من التدريب. يمكنك التعمق أكثر وإنشاء علامات ARCHERY-TRAINING و MAGIC-TRAINING ، وإجراءات تدريب منفصلة عن بعضها البعض وتضمينها في كل رسم متحرك مختلف. هذا سوف يساعد على حل المشكلة. لكن تخيلأن المصممين سيعلنون لاحقًا "دعونا نمتلك مدرسة روبن هود حيث يمكنك تعلم الرماية والقتال بالسيف"! وبعد ذلك ، عندما نضيف معركة السيف ، يطلبون إنشاء أكاديمية Gandalf of Spells and Sword Fight. ونتيجة لذلك ، سيتعين علينا تخزين العديد من العلامات لكل مكان والبحث عن الرسوم المتحركة المختلفة بناءً على جانب التدريب الذي تحتاجه الشخصية ، وما إلى ذلك.

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



تشغيل الرسوم المتحركة

نتيجة المستخدم

مدى الرماية

سهم التصويب

+10 مهارة الرماية

مدرسة السحر

مبارزة بالسيف

+10 مهارة السيوف

مدرسة روبن هود

سهم التصويب

+15 مهارة الرماية

مبارزة بالسيف

+8 مهارة السيوف

أكاديمية جاندالف

مبارزة بالسيف

+5 مهارة السيوف

تعويذة

+10 مهارة سحرية

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

اسم الكائن

تشغيل الرسوم المتحركة

النتيجة النهائية

فندق
اشتر

-10 للجوع

فندق

نم

-50 للتعب

المكتبة

اقرأ الكتاب

+10 مهارة البث الإذاعي

المكتبة

اقرأ الكتاب

+5 مهارة الرماية

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

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

منحنيات رد الفعل


غالبًا ما يكون هناك موقف حيث يمكن قياس جزء من حالة العالم كقيمة مستمرة. أمثلة:

  • تتراوح "النسبة المئوية للصحة" عادة من 0 (ميت) إلى 100 (صحي تمامًا)
  • تختلف "المسافة إلى أقرب عدو" من 0 إلى بعض القيمة الإيجابية التعسفية

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

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

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

أسهل طريقة لشرح منحنى التفاعل هي رسم بياني مع إدخال على طول المحور X ، والقيم التعسفية ، على سبيل المثال ، "المسافة إلى أقرب عدو" والإخراج على طول المحور Y (عادةً ما تكون القيمة المقيسة في النطاق من 0.0 إلى 1.0). يحدد الخط أو المنحنى على الرسم البياني ربط المدخلات بالإخراج المعياري ، ويقوم المصممون بتعديل هذه الخطوط للحصول على السلوك الذي يحتاجونه.

لحساب مستوى "الأمان" ، يمكنك الحفاظ على خطية القيم الصحية المئوية - على سبيل المثال ، زيادة الصحة بنسبة 10٪ - وهذا جيد عادة عندما تكون الشخصية مصابة بشكل خطير وعندما يصاب بسهولة. لذلك ، نقوم بتعيين هذه القيم للفاصل الزمني من 0 إلى 1 بطريقة مباشرة:


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

نرى هنا أن ناتج "الأمن" للأعداء عند 40 و 50 مترًا هو نفسه تقريبًا: 0.96 و 1.0.


ومع ذلك ، هناك فرق أكبر بكثير بين العدو عند 15 مترًا (حوالي 0.5) والعدو عند 5 أمتار (حوالي 0.2). يعكس هذا الجدول بشكل أفضل أهمية الاقتراب من العدو.

من خلال تطبيع كل من هذه القيم في النطاق من 0 إلى 1 ، يمكننا حساب قيمة السلامة الإجمالية كمتوسط ​​لقيم الإدخال هذه. الشخصية ذات الصحة 20٪ والعدو على ارتفاع 50 مترًا ستحصل على درجة أمان 0.6. الشخصية ذات الصحة 75٪ والعدو على بعد 5 أمتار فقط ستحصل على درجة أمان تبلغ 0.47. سيكون للشخص المصاب بجروح خطيرة مع صحة 10 ٪ وعدو 5 أمتار مؤشر أمان 0.145 فقط.

يجب مراعاة ما يلي هنا:


Blackboards


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

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

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

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

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

  • يقوم نظام "الإدراك" بمسح المنطقة بانتظام ويكتب الإدخالات التالية إلى السبورة:
    • أقرب أعداء: Goblin 412
    • "المسافة إلى أقرب عدو": 35.0
    • "صديق مقرب": "محارب 43"
    • "المسافة إلى أقرب صديق": 55.4
    • "وقت آخر ضجيج لوحظ": 12:45 مساءً
  • يمكن لأنظمة مثل نظام القتال تسجيل الأحداث الرئيسية على السبورة ، على سبيل المثال:
    • آخر ضرر تم الحصول عليه: 12:34 مساءً

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

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

خرائط التأثير


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

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

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

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

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


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

الآن نضيف تأثير المنجنيق الثاني:


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


[الرموز: CC-BY: https://game-icons.net/heavenly-dog/originals/defensive-wall.html ]

الآن لدينا تسمية كاملة للمنطقة التي تغطيها المقاليع. في منطقة الهجوم المحتملة ، توجد خلية واحدة مع +2 تأثيرات المنجنيق ، و 11 خلية ذات تأثير +1 ، وخلايا مع 0 تأثيرات المنجنيق - هذه هي المرشحات الرئيسية لموقف الهجوم ، حيث يمكننا مهاجمة الجدار دون خوف من حريق المنجنيق.

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

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

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

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


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

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

الخلاصة


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

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

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



يمكن العثور على العديد من المواد عالية الجودة في الكتب ، بما في ذلك ما يلي:


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

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


All Articles