نموذج المفترس الفريسة على Node.js

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

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

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

هذا هو ضحية المفترس ، وهو نموذج خطير للغاية من الرياضيات التطبيقية (المفترس الفريسة في العالم الناطق باللغة الإنجليزية).

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

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

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

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

هنا الرسم البياني (تم سحبه من ويكيبيديا):



تم وصف النموذج الرياضي لهذه العملية في بداية القرن العشرين بواسطة Lotka و Volterra وتم تسميته تكريماً لهما.

لماذا كان هذا النموذج موجودًا منذ مائة عام وما زال مناسبًا؟

هناك سببان رئيسيان: إنه بسيط للغاية ويصف العملية بشكل واقعي تمامًا.

يحتوي النموذج على أربع معلمات فقط:

  • ألفا) معدل تربية الغزلان
  • بيتا) الغزلان سرعة الأكل من الذئاب
  • جاما) معدل انقراض الذئاب الجائعة
  • دلتا) معدل تكاثر الذئاب ذات التغذية الجيدة

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

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

هناك طريقة أخرى - فقط برمج هذه العملية كلعبة.

في الواقع ، يسمى هذا النهج النمذجة متعددة العوامل وهو مناسب تمامًا لاجتياز الدورة.

اختيار التكنولوجيا


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

حسنًا ، حتى لا ننتج حديقة حيوانات للتكنولوجيا ، سنكتب أيضًا خادمًا عليها.

يتم وصف الخطوات القياسية لتثبيت node.js وكل ما تحتاجه على github .

نموذج نمو الغزلان


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

من الممكن تحديد المعاملات الاحتمالية لكل الغزلان وكل شيء يجب أن يعمل.
لكن نمذجة وكيل الوكيل جيدة - يمكنك تحديد السلوك دون قصر نفسك على عدة عوامل.

بشكل عام ، يبدو نموذج الحياة الغزلان كما يلي:

  • الغزلان بحاجة للتحرك. يموت الغزلان الذي لا يمكن أن يتزحزح لكل وحدة زمنية (ولا يمكنه أن يتزحزح لمجرد أن جميع الأقفاص المجاورة مشغولة من قبل أصدقائه).
  • , , .

  breed(u) {
    var spots = MapUtil.get_adj(u.point, this.W, this.H)
    if (!spots || spots.length < 1)
      return false
    var free = spots.filter(p => !this.GM.get(p))
    if (free.length < spots.length)
      return false
    var spot = _.sample(spots)
    if (!spot)
      return false
    var born = new Wild(u.kind)
    born.move(spot)
    this.add_wild(born)
    this.born.push(born)
  }

بعد ذلك ، سنجعل تطبيق اختبار سهلًا يخلق عالمًا للغابات 20x20 ، ويمتد إلى مركز الغزلان ، ويدير 100 دورة ، في كل مرة يطبع الحالة في ملف csv.

سننقل ملف csv الناتج إلى جدول بيانات Google وننشئ رسمًا بيانيًا:



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

الحد الأقصى للنمو يحدث مبكرًا جدًا - عند الانتقال من 14 إلى 15 ، وآخر 20 حركة لا يزال يقف مع تقلبات طفيفة.

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

لكننا جئنا إلى هنا ليس كثيرًا للأرقام ، ولكن للصور التي يمكنك النظر إليها والاسترخاء.

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

نضع صريحة و socket.io ، وسوف نرسم مباشرة على قماش html5 (لست على دراية بمحركات js ، والمهمة ليست صعبة للغاية).

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



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

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

ماذا يفعل مالك الغابة في هذه الحالة؟

يشتري الذئاب ، ويعلق مستشعر GPS على كل منها ويصلي أنها لن تختفي.

الذئاب


حان الوقت لتقديم الذئب في نموذجنا.

يجب تحديد شيئين - كيف يأكل الذئب ويتكاثر.

من السهل الصيد عندما يكون هناك شخص - إذا كان هناك غزال في أي قفص مجاور - فقط تناوله.

إذا لم يكن هناك غزال ، يمكنك البقاء على قيد الحياة لفترة من الزمن.

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

مع تكاثر المزيد من الخيارات.

بادئ ذي بدء - نقوم بإزالة الشهي ، دع الذئاب تتكاثر دائمًا عندما يكون هناك مساحة خالية.

وإضافة تقييد - الذئاب الجائعة لا تتكاثر.

أول فطيرة


دع الغزلان يتكاثر قليلاً ويرمي الذئب في الحشد:



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

إحباط واحد ، لا زن.

محاولة ثانية


يجب تغيير شيء ما.

يؤلم العين كيف تتكاثر الذئاب المتفجرة.

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

    var preys = spots.map(p => this.GM.get(p)).filter(u => u && u.kind == Wilds.DEER)
    var preds = spots.map(p => this.GM.get(p)).filter(u => u && u.kind == Wilds.WOLF)
    if (preys.length <= preds.length)
      return false

وتتخلى عن الذئاب عندما يصل عدد الغزلان إلى ذروته.

نجحت هذه المحاولة بشكل أفضل.

توازن الحيوانات المفترسة والضحايا يتنقل باستمرار ، وقد انخفض عدد الغزلان بشكل كبير والآن لا يقترب من الحد الأقصى.



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

في هذا المدى ، استمرت الذئاب لفترة طويلة:



الدائرة الثالثة


سيتعين علينا تشديد الصواميل أكثر صعوبة.

نقول الآن الشرط: يجب أن يكون هناك غزال قريب ، ولكن يجب ألا يكون هناك ذئاب.
هذه الذئاب اللطيفة لا تتسامح مع المنافسة.

النظام أكثر استقرارا.

مقارنة بالرسم البياني السابق ، يتم تنعيم القمم بواسطة كل من الغزلان والذئاب.



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



تعيين


خاتمة ، تعليمات النشر.

إنه قصير جدًا:

1. نكتب ملف إرساء بسيط:

FROM node:14
ADD https://github.com/tprlab/predator-prey/archive/master.zip /
RUN unzip /master.zip
WORKDIR /predator-prey-master
RUN npm install
EXPOSE 8081
CMD ["node", "server.js"]

2. بناء عامل الميناء. -t predator-prey

3. docker run -p 8081: 8081 predator-prey

بالنسبة للكسول ، قمت بجمع الصورة وتحميلها على Docker Hub.

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

المراجع



All Articles