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

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

الشكل 2 - تمت إضافة مركزي توزيع إلى الخريطة بالنقر عليها.
لكن انتظر! إذا سمحت للمستخدم بإضافة مراكز توزيع، من منظور قابلية الاستخدام، ستحتاج أيضاً إلى تضمين ميزة لإزالتها. لكن إذا كانت المحاكاة متوقفة مؤقتاً ومركز التوزيع معرف كوكيل، فلن يقوم AnyLogic بإزالة الوكلاء عندما ينقر المستخدم على زر “إيقاف المحاكاة”، لذا إذا أراد المستخدم العودة إلى صفحة تكوين تجربة المحاكاة، سيظهر الخطأ في الشكل 3.

الشكل 3 - خطأ في تدمير الوكلاء
وهذا ليس كل شيء. لن يتم تحديث الخريطة عندما تكون المحاكاة متوقفة مؤقتاً، لذا إذا كنت تريد الانتقال إلى مواقع أخرى على الخريطة لإضافة مراكز توزيع جديدة، سيكون الأمر كما لو لم يكن لديك إنترنت متاح.
الحل
لذا الآن اكتشفنا أن إيقاف المحاكاة مؤقتاً لجعل وكيل Main يعمل كصفحة التكوين ليس مثالياً في معظم الحالات. أتمنى لو كان بإمكاني فقط إيقاف المحاكاة مؤقتاً، لكنني دائماً أحتاج في النهاية إلى محو وكيل، لذا بدلاً من إيقاف المحاكاة مؤقتاً أجعلها تعمل ببطء شديد. بطيئة جداً لدرجة أنها تكاد تكون متوقفة. الكود التالي يقوم بالمهمة:
getEngine().setRealTimeMode(true);
getEngine().setRealTimeScale(0.000001);
الآن المشكلة محلولة في الغالب. لكن بما أن المحاكاة تعمل، عليك فقط أن تأخذ في الاعتبار ما إذا كانت هذه الميلي ثانية التي ستمر بينما يقوم المستخدم بتكوين النموذج ستؤثر على نموذجك أم لا. أنا متأكد تقريباً أنه في 99.99% من الحالات لن تؤثر وإذا أثرت، يمكنك تقليل مقياس الوقت إلى شيء أصغر حتى (لا أعرف ما هو أصغر حد لمقياس الوقت).
الخطوة الأخيرة هي إضافة زر لتشغيل المحاكاة عند اكتمال التكوين. ستحتاج إلى تغيير مقياس الوقت إلى 1
getEngine().setRealTimeScale(1);
أو ربما تشغيلها في الوقت الافتراضي
getEngine().setRealTimeMode(false);
يعتمد ذلك على احتياجاتك. من الجيد عند هذه النقطة حفظ تكوين مراكز التوزيع فوراً في قاعدة بيانات لتكرار نفس المحاكاة في المستقبل.
الخلاصة
لقد كنت في هذا الموقف عدة مرات لا حصر لها. عملائي يريدون دائماً نموذجاً مرناً جداً مع خيارات تكوين محددة جداً أحياناً. AnyLogic كإطار عمل لديه قيود (أو أخطاء برمجية أحياناً) يجب أن نتعامل معها. أحياناً يريد المستخدم بناء مسارات وإنشاء أشكال وتصميم تخطيطات وتكوين أشياء أخرى عديدة لا تسمح لك شاشة تكوين تجربة المحاكاة بفعلها، وفي كثير من الأحيان يكون من الضروري القيام بذلك أثناء التشغيل لأن معظم ميزات AnyLogic تعمل هناك.