أحد المشاريع التي كنت أحلم بتنفيذها منذ فترة طويلة هو روبوتات المهام المعيارية مع الذاكرة. كان الهدف النهائي للمشروع هو خلق عالم له مخلوقات قادرة على العمل بشكل مستقل وجماعي.
اعتدت على برمجة مولدات العالم ، لذلك أردت أن نشر العالم ببوتات بسيطة تستخدم الذكاء الاصطناعي لتحديد سلوكهم وتفاعلاتهم. وبالتالي ، بفضل تأثير الجهات الفاعلة على العالم ، كان من الممكن زيادة التفاصيل.
لقد قمت بالفعل بتنفيذ نظام خط أنابيب Javascript الأساسي (لأنه أبسط حياتي) ، لكنني أردت شيئًا أكثر موثوقية وقابلية للتطوير ، لذلك كتبت هذا المشروع في C ++. المنافسة على تنفيذ الحديقة الإجرائية في subreddit / r / الإجراءات الإجرائية قادتني إلى هذا (ومن هنا جاء الموضوع المقابل).
في نظامي ، تتكون المحاكاة من ثلاثة مكونات: العالم والسكان ومجموعة من الإجراءات التي تربطهم. لذلك ، كنت بحاجة لإنشاء ثلاثة نماذج ، والتي سأناقشها في هذه المقالة.
لزيادة الصعوبة ، أردت أن يحتفظ الممثلون بمعلومات حول التجارب السابقة مع العالم واستخدام المعرفة حول هذه التفاعلات في الإجراءات المستقبلية.
عند إنشاء نموذج من العالم ، اخترت مسارًا بسيطًا واستخدمت ضوضاء بيرلين لوضعها على سطح الماء. جميع الكائنات الأخرى في العالم كانت موجودة بشكل عشوائي تمامًا.
بالنسبة لنموذج السكان (و "ذاكرته") ، قمت ببساطة بإنشاء فصل له العديد من الخصائص والإحداثيات. كان من المفترض أن تكون هذه المحاكاة منخفضة الدقة. الذاكرة عبارة عن قائمة انتظار ، يتم البحث عن الروبوتات حولها ، وحفظ المعلومات حول بيئتها ، والكتابة إلى قائمة الانتظار وإدارة قائمة الانتظار هذه كتفسير لذاكرتهم.
لربط هذين النظامين من الإجراءات ، أردت إنشاء إطار للمهام البدائية داخل نظام هرمي لقوائم المهام حتى تتمكن الكيانات الفردية من تنفيذ سلوك معقد في العالم.
خريطة العينة. أخذت المياه شكل نهر عن غير قصد تماما. توجد جميع العناصر الأخرى بشكل عشوائي ، بما في ذلك عش النمل ، والذي ينتقل في هذه البذرة بعيدًا عن الحافة (لكن النهر يبدو جميلًا).قررت أن حفنة من النمل في أوراق جمع العشب ستكون نموذجًا جيدًا للاختبار يضمن موثوقية تنفيذ الوظائف الأساسية (ونظام قائمة انتظار المهام ككل) ويمنع تسرب الذاكرة (كان هناك الكثير).
أريد أن أصف بمزيد من التفصيل بنية أنظمة المهام والذاكرة ، وأظهر أيضًا كيف تم إنشاء التعقيد من الوظائف الأساسية البدائية (غالبًا). أريد أيضًا عرض بعض "تسريبات ذاكرة النمل" المضحكة التي قد تصادفها عندما تبدأ النمل في الجنون في دوائر بحثًا عن العشب أو الوقوف صامدة وإبطاء البرنامج.
الهيكل العام
كتبت هذه المحاكاة في C ++ ، واستخدمت SDL2 للتقديم (كتبت بالفعل فصلاً تقديميًا صغيرًا لـ SLD2 من قبل). استخدمت أيضًا تطبيق A * (تم تعديله قليلاً) الذي وجدته على github لأن
عملي كان بطيئًا بشكل ميؤوس منه ولم أستطع فهم السبب.
الخريطة هي مجرد شبكة 100 × 100 مع طبقتين - طبقة التربة (تستخدم للبحث عن مسارات) وطبقة تعبئة (لإكمال مسارات التفاعل والبحث). تتعامل الفئة العالمية أيضًا مع العديد من وظائف مستحضرات التجميل ، مثل نمو العشب والغطاء النباتي. أنا أتحدث عن هذا الآن لأن هذه هي الأجزاء الوحيدة التي لن يتم وصفها في المقال.
السكان
روبوتات كانت في فصل مع خصائص تصف مخلوق واحد. كان بعضها تجميليًا ، وكان للبعض الآخر تأثير على تنفيذ الأعمال (على سبيل المثال ، القدرة على الطيران ، ومجموعة الرؤية ، وماذا يأكل وما يمكن أن يرتديه المخلوق).
الأهم هنا كانت القيم المساعدة التي تحدد السلوك. وهي: متجه يحتوي على المسار الحالي A * ، بحيث لا يحتاج إلى حساب في كل دورة على مدار الساعة (هذا يوفر وقت الحساب ويسمح لك بمحاكاة المزيد من برامج الروبوت) ، وقائمة انتظار الذاكرة التي تحدد تفسير المخلوقات لبيئتها.
طابور الذاكرة
قائمة انتظار الذاكرة هي قائمة انتظار بسيطة تحتوي على مجموعة من كائنات الذاكرة محدودة في حجمها بواسطة خاصية bot. في كل مرة تضاف فيها ذكريات جديدة ، يتم دفعها للأمام ، ويتم قطع كل شيء يتجاوز الحدود. بفضل هذا ، قد تكون بعض الذكريات "جديدة" أكثر من غيرها.
إذا أراد الروبوت أن يتذكر المعلومات من الذاكرة ، فأنشأ كائن ذاكرة (طلب) وقارنها بما كان في الذاكرة. ثم قامت دالة الاسترجاع بإرجاع متجه من الذكريات يطابق أي أو كل المعايير المحددة في الاستعلام.
class Memory{ public:
تتكون الذكريات من كائن بسيط يحتوي على عدة خصائص. تعتبر خصائص الذاكرة هذه "مرتبطة" مع بعضها البعض. يتم إعطاء كل ذاكرة أيضًا قيمة "التذكير" ، والتي يتم تكرارها في كل مرة يتم فيها تذكر الذاكرة من خلال وظيفة التذكير. في كل مرة يتذكر فيها الروبوت ذكرياته ، فإنه ينفذ عملية الفرز مرة واحدة بدوره ، من الخلف ، وتغيير ترتيب الذكريات إذا كان التذكير في ذاكرة قديمة أعلى من ذاكرة جديدة. بفضل هذا ، قد تكون بعض الذكريات "أكثر أهمية" (مع أحجام ذاكرة كبيرة) وتخزينها لفترة أطول في قائمة الانتظار. مع مرور الوقت ، سيتم استبدالها بأخرى جديدة.
طوابير الذاكرة
لقد أضفت أيضًا العديد من عوامل التشغيل المثقلة إلى هذه الفئة بحيث يمكن إجراء مقارنات مباشرة بين قائمة انتظار الذاكرة والاستعلام ، مقارنة خصائص "أي" أو "الكل" ، بحيث يتم الكتابة فوق الخصائص المحددة فقط عند الكتابة فوق الذاكرة. بفضل هذا ، يمكننا الحصول على ذاكرة الكائن المرتبطة بمكان ما ، ولكن إذا نظرنا إلى هذا المكان مرة أخرى ولم يكن الكائن موجودًا ، فيمكننا تحديث الذاكرة عن طريق الكتابة فوقها بالذاكرة التي تحتوي على تجانب تعبئة جديد ، باستخدام الاستعلام المقابل لهذا المكان .
void Bot::updateMemory(Memory &query, bool all, Memory &memory){
في عملية إنشاء رمز لهذا النظام ، تعلمت الكثير.
نظام المهمة
طبيعة حلقة اللعبة أو التقديم هي أن نفس الوظائف تتكرر في كل قياس ، لكنني أردت تنفيذ سلوك غير دوري في روبوتاتي.
في هذا القسم ، سأشرح رأيين حول بنية نظام المهام المصممة لمواجهة هذا التأثير.
هيكل من أسفل إلى أعلى
قررت الانتقال من أسفل إلى أعلى وإنشاء مجموعة من "الإجراءات البدائية" التي يجب على الروبوتات القيام بها. كل من هذه الإجراءات تستمر فوز واحد فقط. مع مكتبة جيدة من الوظائف البدائية ، يمكننا دمجها في أعمال معقدة تتكون من عدة بدائية.
أمثلة على هذه الأعمال البدائية:
لاحظ أن هذه الإجراءات تحتوي على إشارات إلى كل من العالم والسكان ، مما يسمح لك بتغييرها.
- يؤدي الانتظار إلى عدم قيام المخلوق بأي شيء في هذه الحلقة.
- نظرة يوزع البيئة وقوائم الانتظار ذكريات جديدة.
- يأخذ المقايض كائنًا في يد المخلوق ويستبدله بكائن مستلقٍ على الأرض.
- تستهلك يدمر العنصر في يد المخلوق.
- الخطوة تأخذ المسار المحسوب الحالي إلى الوجهة وتنفذ خطوة واحدة (مع مجموعة من اختبارات الأخطاء).
- ... وهلم جرا.
جميع وظائف المهمة هي أعضاء في فئة المهمة الخاصة بي ؛ بعد إجراء اختبارات صارمة ، أثبتوا موثوقيتهم وقدرتهم على الاندماج في مهام أكثر تعقيدًا.
في هذه الوظائف الثانوية ، نقوم ببناء الوظائف ببساطة عن طريق سلاسل المهام الأخرى:
- مهمة المشي هي مجرد خطوات قليلة (مع معالجة الأخطاء)
- مهمة take هي مهمة الشكل والمبادلة (وهي ضرورية بسبب معالجة ذاكرة النملة ، والتي سأشرحها لاحقًا)
- مهمة الخمول هي اختيار مكان عشوائي والانتقال إلى هناك (باستخدام المشي) ، والانتظار لعدة دورات (باستخدام الانتظار) ، وتكرار هذه الدورة لعدد معين من المرات
- ... وهلم جرا
المهام الأخرى أكثر تعقيدًا. تنفذ مهمة البحث استعلام ذاكرة للبحث عن أي ذكريات للأماكن التي تحتوي على كائن "food" (صالح للأكل من هذا النوع من الروبوت). تقوم بتنزيل هذه الذكريات وتتجول حولها جميعًا "بحثًا عن" الطعام (في حالة النمل ، هذا عشب). إذا لم تكن هناك ذكريات طعام ، فإن المهمة تجعل المخلوق يجول العالم بشكل عشوائي وينظر حوله. من خلال المشاهدة والدراسة (من خلال "إلقاء نظرة" باستخدام viewRadius = 1 ؛ أي النظر فقط إلى المربى الموجود أسفله) ، يمكن للمخلوق تحديث ذاكرته بمعلومات حول محيطه ، والبحث بذكاء وهدف عن الطعام.
تتمثل مهمة العلف الأكثر عمومية في العثور على الطعام ، والتقاط الطعام ، والتفتيش (لتحديث الذاكرة والعثور على الطعام في الحي) ، والعودة إلى المنزل وتخزين الطعام.
قد تلاحظ أن النمل يخرج من النمل ويبحث عن الطعام عن قصد. بسبب التهيئة ، يتم توجيه المسار الأولي للنمل إلى نقطة عشوائية ، لأن ذاكرتهم في t = 0 فارغة. بعد ذلك ، يتم إعطاؤهم الأمر للحصول على الطعام في مهمة العلف ، وهم أيضًا ينظرون حولي ، مع التأكد من عدم وجود المزيد من الطعام. من وقت لآخر يبدأون بالتجول ، لأنهم ينفدون من الأماكن التي رأوا فيها الطعام (قصر النظر المشؤوم).وأخيرًا ، لدى الروبوت "رأي" يحدد نوع الذكاء الاصطناعي المعين له. يرتبط كل طريقة عرض بمهمة تحكم واحدة تحدد كل سلوكها: وتتكون من سلسلة من المهام الأصغر حجمًا ، يتم تحديدها بسهولة من خلال مجموعة من قوائم انتظار الذاكرة والمهام البدائية. هذه هي المهام مثل النمل والنحل.
هيكل من أعلى إلى أسفل
إذا نظرت من أعلى إلى أسفل ، فإن النظام يتكون من فئة مهمة رئيسية تنسق مهام التحكم وتنفيذها لكل روبوت فردي على الخريطة.
يحتوي Taskmaster على متجه من مهام التحكم ، يرتبط كل منها بروبوت. لكل مهمة تحكم ، بدورها ، قائمة انتظار من المهام الفرعية التي يتم تحميلها أثناء التهيئة الأولى لكائن المهمة مع وظيفة المهمة المرتبطة.
class Task{ public:
يخزن كل كائن مهمة في قائمة الانتظار مجموعة من الوسائط ، والتي يتم تمريرها إلى معالج الوظيفة المقترن. تحدد هذه الحجج سلوك هذه المهام البدائية التي تم إنشاؤها بشكل عام قدر الإمكان. يتم تمرير الوسائط حسب المرجع ، لذلك يمكن لكائن المهمة في قائمة الانتظار تخزين الوسائط الخاصة به والسماح بتغيير وظائفه الفرعية ، بحيث يمكنك تنفيذ أشياء مثل التكرار في انتظار عدد معين من علامات التجزئة أو طلبات لجمع عدد معين من العناصر ، إلخ. تغير الوظائف الفرعية قيمة التكرار (الوسيطة [n]) للدالة الأصل حسب المرجع وتجعل شرط نجاحها يعتمد على قيمتها.
في كل قياس ، يمر taskmaster من خلال قائمة مهام التحكم وينفذها من خلال استدعاء طريقة الأداء الخاصة بهم. طريقة الأداء ، بدورها ، تنظر إلى العنصر العلوي لقائمة الانتظار داخل المهمة وتنفذها باستخدام الوسائط من المهمة. وبالتالي ، يمكنك التسلسل إلى قائمة انتظار المهام ، مع القيام دائمًا بأعلى مهمة. ثم تحدد قيمة الإرجاع للمهمة إكمال المهمة.
عندما تعود المهمة البدائية إلى حقيقة ، فإنها قد وصلت إلى نقطتها المستقرة ، أو على الأقل يجب ألا تتكرر (على سبيل المثال ، تُرجع الخطوة صواب عندما يصل المخلوق إلى نقطة النهاية). بمعنى أن حالة الإرجاع الخاصة بها قد تمت إزالتها وتتم إزالتها من قائمة الانتظار حتى يمكن إكمال المهمة التالية في التدبير التالي.
إرجاع مهمة تحتوي على قائمة انتظار مهمة صحيح بعد فارغ قائمة الانتظار. بفضل هذا ، من الممكن إنشاء مهام معقدة بهيكل قوائم الانتظار وقوائم الانتظار الفرعية التي يتم استدعاء نفس الوظائف فيها باستمرار ، ولكن كل مكالمة تكرر حالة اللعبة وحالة المهمة خطوة واحدة.
أخيرًا ، تستخدم مهام التحكم بنية بسيطة - يتم استدعاؤها في كل دورة ، وتحميل المهمة فقط إذا كانت فارغة ، وتنفيذ المهام المحملة في قائمة الانتظار الخاصة بهم.
بمساعدة حلقة قائمة الانتظار الخاصة بي (انظر الكود) ، يمكنني تنفيذ وظيفة واحدة بشكل متكرر وفي كل مرة تنفيذ العنصر العلوي في قائمة الانتظار ، مع إخراج العناصر منه إذا استدعت استدعاء طريقة الأداء الخاصة بهم إلى true.
النتائج
يتم تغليف كل هذا في libconfig ، لذلك من السهل جدًا تغيير معلمات المحاكاة. يمكنك ترميز العديد من مهام التحكم دون مشاكل (قمت بإنشاء النمل والنحل) ، وتحديد الأنواع الجديدة وتحميلها باستخدام libconfig أمر بسيط للغاية.
تم تحميلها بأناقة في المحاكاة. بفضل عملية بحث جديدة ومحسّنة عن المسارات ، يمكنني محاكاة عدد كبير من برامج الروبوت النشطة الفردية التي تجمع الطعام على متن طائرة ثنائية الأبعاد.
محاكاة 40 النمل جمع العشب في نفس الوقت. ترجع المسارات التي ينشئونها في الرمال إلى زيادة الوزن المخصص للأرض "غير البكر". وهذا يؤدي إلى إنشاء "الطرق السريعة النملة" المميزة. يمكن أيضًا تفسيرها على أنها الفيرومونات ، لكن الأمر سيكون أشبه بالحقيقة إذا قام النمل بتبادل الذكريات بالفعل.تضمن نمطية هذا النظام الإنشاء السريع لأنواع جديدة يتحدد سلوكها من خلال مهمة تحكم بسيطة. في الكود أعلاه ، يمكنك أن ترى أنني خلقت ديدان ونحل الذكاء الاصطناعي من خلال تغيير لونها وقيود البحث عن المسار (لا يمكنها الطيران) ونطاق الرؤية وحجم الذاكرة. في الوقت نفسه ، قمت بتغيير سلوكهم العام ، لأن كل هذه المعلمات تستخدمها وظائف المهام البدائية.
تصحيح ذكريات النمل
أدى هيكل المهام المعقدة والذاكرة إلى صعوبات غير متوقعة والحاجة إلى معالجة الاستثناءات.
فيما يلي ثلاثة أخطاء ذاكرة معقدة بشكل خاص جعلتني أعيد تشغيل الأنظمة الفرعية:
النمل يعمل في دائرة
واحدة من الأخطاء الأولى التي واجهتني: ركض النمل بجنون على النمط المحاط في المربع بحثًا عن العشب على الأرض المجردة. نشأت هذه المشكلة لأنني في ذلك الوقت لم أقم بتنفيذ تحديث للذاكرة. كان لدى النمل ذكريات عن موقع الطعام ، وبمجرد أن التقطوا العشب ونظروا حولهم مرة أخرى ، تشكلت ذكريات جديدة.
كانت المشكلة أن الذاكرة الجديدة كانت في نفس النقطة ، لكن الذاكرة القديمة كانت محفوظة. هذا يعني أنه في عملية البحث عن الطعام ، تذكر النمل وأبقى موقع الطعام الذي لم يعد صالحا ، لكن هذه الذكريات القديمة كانت محفوظة وتحل محل أخرى جديدة (تذكروا هذه العشبة اللذيذة).
لقد قمت بإصلاحه كما يلي: يتم ببساطة استبدال بيانات الكائن في الذكريات القديمة ، إذا رأينا نفس المكان وتغير الكائن (على سبيل المثال ، يرى المخلوق أنه لم يعد هناك عشب ، لكن لا يتذكر أنه كان هناك عشب). ربما في المستقبل ، سأضيف فقط الخاصية "غير الصالحة" إلى ذكرياتي حتى يتمكن الروبوتات من تذكر المعلومات القديمة التي قد تكون مهمة ، ولكن المعلومات التي لم تعد صالحة "ظهرت" ("رأيت دبًا هنا ، لكن الآن ليست هناك").
النمل التقاط الأشياء تحت النمل الأخرى
من وقت لآخر (خاصةً مع وجود عدد كبير من النمل وكثافة عالية من العشب) ، يمكن للنملين الحصول على بلاط واحد من العشب في مقياس واحد ومحاولة التقاطه. هذا يعني أن النملة الأولى دخلت البلاط ، ونظرت حولي وأخذت العنصر في 3 خطوات. في المقابل ، فعلت النملة الثانية الشيء نفسه ، فقط قبل رفع الجسم مباشرة ، وخطفها نملة أخرى من تحت أنفه. واصل مهامه بهدوء ، ودرس نفس بيئة النملة الأخرى في التدبير السابق ، وقام بمعالجة خط ذاكرته بالطريقة نفسها (لأنه في هذه المرحلة تكون ذاكرتهم متماثلة). وأدى ذلك إلى قيام النملة الثانية بنسخ الأول ، وعدم التقاط الأشياء واتباع الأول ، وهو ما أدى بالفعل كل العمل. لقد لاحظت هذا لأنه في محاكاة النمل الخمسة ، كان ثلاثة منهم فقط مرئيين. استغرق الأمر وقتًا طويلاً للعثور على السبب.
لقد قمت بحل هذه المشكلة عن طريق جعل مهمة المبادلة بدائية وإنشاء مهمة أخذ ، والتي تنظر أولاً إلى الأرض لمعرفة ما إذا كان هناك كائن هناك. إذا كان الأمر كذلك ، فهو "مقايضات" ، وإذا لم يكن كذلك ، فإنه "ينتظر" لحركتين حتى تغادر النملة الأخرى بالتأكيد. في حالة واحدة ، يكون هذا الإجراء لتدبيرين ، في الحالة الأخرى - لإجراء واحد.
مواقع غير قابلة للوصول
كان هناك خطأ آخر غير سارة أجبرني على إعادة معالجة الذاكرة وهو أن بعض الأماكن التي كان بإمكان النملة رؤيتها كانت بعيدة المنال بالنسبة له. لقد نشأوا بسبب وضعي البطيء لـ "تقاطعات العشب" على الأرض ، والتي كانت معلقة في بعض الأحيان فوق الماء. هذا جعلني أعمم مهمة الخطوة.
عند إرسال طلب البحث عن الطعام ، غالبًا ما كان لدى النمل ذكريات عن الأماكن التي لم يتمكنوا من الوصول إليها بالفعل (لقد رأوا العشب فوق الماء وأرادوا جمعه
بجنون ). إذا لم يتم تمييزها في ذاكرتهم (على سبيل المثال ، المتغير المنطقي "يمكن الوصول إليها") ، فإنهم استمروا في تذكر هذا والكتابة إلى قائمة الانتظار حتى يكون هذا الإجراء الوحيد. تسبب هذا في تثبيط شديد ، لأنهم أجروا
باستمرار عمليات العثور على المسار في كل قياس ، ومحاولة الوصول إلى هناك ، وفشلوا .
كان الحل هو تحديث الذاكرة في مهمة الخطوة إذا لم تتمكن من العثور على المسار إلى المكان ، ووضع علامة عليها في الذاكرة على أنها غير قابلة للتحقيق. بالإضافة إلى ذلك ، فإن مهمة البحث تستعلم فقط الأماكن التي تحتوي على طعام للذاكرة التي يمكن الوصول إليها.
النظام بشكل عام
بشكل عام ، أود أن أقول - نعم ، يؤسفني أنني قضيت أسبوعًا من حياتي في سباق الماراثون في البرمجة لأنني كنت مستوحاة من إنشاء روبوتات تفعل ما أقول لهم (وأيضًا ما يريدون القيام به!). كان علي أن أفعل بعض الحيل وتعلمت الكثير.
النظام الذي أنشأته ليس موثوقًا به بنسبة 100٪ ، وما زلت ألاحظ بعض التحف. على سبيل المثال ، نظرًا لأن اتجاه تحليل المظهر ، يتم استخدام الإجراء لأعلى ولأسفل لليمين ، أي أن الذاكرة الأخيرة في الزاوية اليمنى السفلى. عند استدعاء المعلومات للبحث عن العناصر ، فهذا يعني أن الكائنات سوف تميل إلى التحرك جنوب شرق البلاد. هذا ملحوظ بشكل خاص في عمليات المحاكاة الكبيرة ، عندما ينمو العشب بسرعة وينحني قليلاً نحو الجنوب الشرقي ، بغض النظر عن البذور.
التحسينات
أعتقد أن هناك حاجة إلى تحسينات كبيرة لمحاكاة ذكريات أكثر تعقيدًا لكائنات أكثر تعقيدًا.
ويشمل ذلك زيادة موثوقية وظائف معالجة الذاكرة ، بالإضافة إلى إضافة بدائل جديدة ، مثل "التفكير" ، ومشتقات المهام عالية المستوى ، مثل "قرر" أو "حلم". قد يكون "فكر" إجراءً بدائيًا لطلب الذاكرة. يمكن أن يتكون "الحلم" ، بدوره ، من عدة مكالمات "فكرية": اختيار ذاكرة عشوائية ، والحصول على خاصية عشوائية ، وتكرارها مرارًا وتكرارًا لتعزيز سمات مشتركة أو ارتباطات مهمة.
بالنسبة للمستقبل ، أخطط لثلاثة إضافات محددة:
- إضافة معالجة المقاطعة وتحديد أولويات المهمة
- إضافة التواصل بين الكيانات
- أضف بنية مجموعة حتى تتمكن الكيانات من تحديد بعضها البعض رسميًا
قد تكون معالجة انقطاع المهام وتحديد أولوياتها ضرورية للتفاعل بين الكيانات ، لأن الروبوت لا يمكن أن يواصل أنشطته بصورة عمياء عندما يتواصل معها (يجب أن "يستمع" بطريقة أو بأخرى) أو يتعرض للهجوم ("الهرب" أو "القتال" )
يتكون التواصل بين الكيانات على الأرجح من مهمة أو مهمتين بدائيتين لتبادل الذكريات أو تقديم طلبات إلى ذكريات برامج الروبوت الأخرى (على سبيل المثال ، "قل" أو "اسأل"). بهذه الطريقة ، يمكن نقل المعلومات مثل موقع الطعام أو الموارد الأخرى.
آمل في تنفيذ هذه المهام ووضع رسم بياني لمعدل تراكم الموارد من قبل مجموعة كبيرة مع أو بدون اتصال. يتعقب السكان بالفعل كمية الطعام الذي يتم جمعه في كل قياس. سيكون من المثير للاهتمام إظهار أن مشاركة الذكريات يمكن أن تؤثر على الكفاءة.
المستقبل
تتمثل الوظيفة الأكثر أهمية لمحاكاة المجتمعات في إضافة هياكل المجموعة وتزويد هذه المجموعات بخصائص المستوى الكلي ، على سبيل المثال ، "أهدافها ومسؤولياتها" المشتركة. هذا يعطينا نوعًا من "البذرة" التي يمكننا من خلالها الحصول على مهام رفيعة المستوى يتم تفويضها أسفل التسلسل الهرمي لهياكل المجموعة إلى مهام "منخفضة" عالية المستوى تؤثر مباشرة على العالم. كما يسمح لك بإنشاء شكل من أشكال الهيكل السياسي.
هذا النظام مكتفٍ ذاتيًا تمامًا ، ويتم وضع التصور ببساطة فوقه. سيكون من السهل للغاية استبدال الحشرات بالإنسان ، وجمع الموارد وتخزينها في مكان ما ، بحيث تنمو في الحجم.
يمكن لطبيعة نمو منزلهم ، على سبيل المثال ، أن تعتمد اعتمادا كبيرا أو مستقلة تماما عن تصرفات الروبوتات. الأنواع المختلفة قد يكون لها قبائل مختلفة ذات خصائص واتجاهات مختلفة.بالإضافة إلى ذلك ، يمكنني الجمع بين هذا النظام ومولدات الخرائط التي تم إنشاؤها مسبقًا (توسيع المستوى العالمي) لجعل العالم أكثر واقعية.في الختام
في المستقبل القريب ، أخطط لاستبدال المخلوقات بأشخاص وتنفيذ بعض الوظائف الأخيرة. ربما سأنشر شفرة المصدر الكاملة عندما أقوم بتحسين جودة النظام (في بعض الأماكن تكون الكود فوضوية إلى حد ما).انتظر المقال التالي. في هذه الأثناء ، إليك مقطع فيديو به نحل يبحث عن حبوب اللقاح في الأزهار ؛ يتم تشفيرها باستخدام نفس الإطار.اخترت هذه البذرة لأن نقطة البداية تقع في جزيرة صغيرة. ومع ذلك ، ليست مبرمجة النحل للعودة إلى الخلية ، ولكن ببساطة جمع حبوب اللقاح باستمرار. قد تلاحظ أن مدى رؤيتها أعلى وأحيانًا تنتقل عن عمد إلى الزهرة التي رأوها للتو.... وهنا هي وظيفة عضو Bee Task: bool Task::Bee(Garden &garden, Population &population, int (&arguments)[10]){