Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Game Development
  2. Unity 3D
Gamedevelopment

تخطيط العمل الموجه بهدف لذكاء اصطناعي أكثر دهاءً-ذكاءً-.

by
Difficulty:IntermediateLength:LongLanguages:

Arabic (العربية/عربي) translation by osamagaradh (you can also view the original English article)

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

استعراض العرض التوضيحي

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

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

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

ما هو تخطيط العمل الموجه بهدف ؟

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

لدينا اداة، قاطعة خشب، تأخذ قطع خشب الاشجار وتقطعهم إلى حطب. القاطعة يمكن تزويدها بالهدف MakeFirewood، والإجراءات  ChopLog و GetAxe و CollectBranches

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

عندما نعطي الاداة هدف MakeFirewood، نحصل على  تسلسلين من الاجراءات المختلفة هذه :

  • تحتاج حطب-> GetAxe -> ChopLog = يصنع الحطب
  • تحتاج حطب-> CollectBranches = يصنع الحطب

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

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

لمن -GOAP- تخطيط العمل الموجه بهدف

أنت، الآن، تعرف الآلات المحدودة الحالات (FSM) جيدا، لكن إذا لا، اذا القي نظرة على هذا البرنامج التعليمي الرائع.

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

GOAP تحول هذا:

 آلالات المحدودة الحالات: متصلة في كل مكان.

الى هذا

GOAP: رائعة ويمكن التحكم فيها.


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

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

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

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

الإجراءات

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

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

هيا نعيين بعض التكاليف للإجراءات:

  • تكلفة GetAxe هي 2
  • تكلفة ChopLog هي4
  • تكلفة CollectBranches هي8

 ننظر على تسلسل الإجراءات مرة أخرى ونضيف إجمالي التكاليف، سوف نرى ما هو أرخص تسلسل:

  • يحتاج حطب-> (GetAxe (2 >ثم ChopLog (4 = اصنع حطب (المجموع: 6)
  • يحتاج الحطب->  (8)CollectBranches = يصنع حطب (المجموع: 8)

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

ولكن لن يعمل هذا التسلسل طوال الوقت؟ الا اذا وضعنا شروط مسبقة تمكنه...

شروط مسبقة واثارها

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

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

مخطط 

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

لإعداد هذا، هيا نضيف شروط مسبقة والآثار الناتجة عنها لاجراءات قاطعة الخشب  خاصتنا:

  • تكلفةGetAxe:هي 2 شروط مسبقة: " الفاس متوفرة"، "لا تملك بفاس". النتيجة : "تملك فاس".
  • تكلفة ChopLog : هي4- شروط مسبقة: "تمتلك فاس". النتيجة: "تصنع حطب"
  • تكلفة CollectBranches: هي 8- شروط مسبقة: (بلا). النتيجة: "صنع حطب".

 مخطط GOAP الآن تمتلك المعلومات اللازمة لترتيب تسلسل الإجراءات الرامية لصنع الحطب (هدفنا).

نبدأ بتوفير "مخطط GOAP " مع الحالة الراهنة العالمية وحالة الاداة. هذه الحالة العالمية المُركّبة هي:

  • "لا تملك فاس"
  •  "فاس متوفرة"
  • "الشمس مشرقة"

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

حسنا، لدينا حالتنا العالمية الحالية واجراءتنا (مع شروطها المسبقة ونتائجها)، والهدف. دعونا نخطط!

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

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

الشجرة التي يبنيها المخطط تبدو مثل هذا:

يمكننا أن نرى أنها ستجد فعلا ثلاثة مسارات للهدف مع تكاليفها الإجمالية:

  • GetAxe  ->-ChopLog(المجموع :6)
  • GetAxe -> CollectBranches (المجموع :10)
  • CollectBranches (المجموع: 8)

بالرغم من ان GetAxe -> CollectBranches  تعمل,ارخص مسار هو GetAxe  -> ChopLog. اذن هاذا المسار تعود اليه

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

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

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

الشروط  المسبقة الإجرائية

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

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

يمكن أن يكون لديك آثار إجرائية أيضا، إذا كنت ترغب في ذلك. وإذا كنت ترغب في عرض نتائج أكثر ديناميكية، يمكنك تغيير تكلفة الإجراءات على الطاير!

GOAP والحالة

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

  • عاطلة عن العمل
  • الانتقالية
  • تنفيذ اجراء

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

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

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

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

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

مثال لكود برمجي حقيقي

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

إذا كنت ترغب في معرفة المزيد،توجه هنا إلى التعليمة البرمجية: http://github.com/sploreg/goap

لدينا أربعة عمال:

  • حداد: يحول خام الحديد إلى أدوات.
  • قاطع الاشجار: يستخدم أداة لتقطيع الأشجار لإنتاج قطع من الاشجار.
  • المنقّب: ينقّّب الصخوربأداة لإنتاج خام الحديد.
  • قاطع الخشب: يستخدم أداة تقطع قطع الاشجار لإنتاج الحطب.

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

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

الكود له ستة فصول ل جوب رئيسية:

  • GoapAgent: تدرك حالة وتستخدم الآلات محدودة الحالات و GoapPlanner  للعمل.
  • GoapAction: الإجراءات التي يمكن أن تؤديها الادوات.
  • GoapPlanner: تخطط الإجراءات ل GoapAgent.
  • FSM: الآلة محدودة الحالات.
  • FSMState: حالة في الآلات محدودة الحالات.
  • IGoap: الواجهة التي يستخدمها ممثلي عمالنا الحقيقيين .ترتبط باحداث ل -جوب-ول الآلات محدودة الحالات.

دعنا ننظر إلى فئة GoapAction، نظرا لأنه هو الذي سوف تُفرّعه:

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

هنا واحد من الإجراءات:

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

هذه هي كافة المكونات التي تم إضافتها إلى نطاق هدف Minerفي الوحدة:


من أجل ان تعمل اداتك، يجب إضافة المكونات التالية إليها:

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

هنا العرض التجريبي عمليا مرة أخرى:

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

يمكنك امتلاك التعليمة البرمجية والتطبيق الكامل هنا: http://github.com/sploreg/goap.

الخلاصة

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.