العودة إلى المدونة
نصائح AnyLogic

مثال على استخدام الفئات مقابل الوكلاء في AnyLogic

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

لنقم بإنشاء مثال للحصول على إلهام حول كيفية بناء فئة واستخدامها.

نموذج باستخدام وكيل

الشكل 1 - نموذج المرور

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

الشكل 2 - وكيل السيارة

بناء فئة

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

الشكل 3 - متغير من نوع RouteSegment

الكود التالي يمثل فئة RouteSegment.

public class RouteSegment implements Serializable {
    private int numCars=0;
    ArrayList <Car> cars=new ArrayList();

    /** Default constructor */
    public RouteSegment() {
    }

    @Override
    public String toString() {
        return super.toString();
    }

    public int getCars() {
        return this.numCars;
    }

    public void incrementCars(Car car) {
        this.numCars++;
        cars.add(car);
    }

    public void decreaseCars(Car car) {
        this.numCars--;
        cars.remove(car);
    }
}

إذن ما تفعله هذه الفئة هو:

  • تخزين السيارات الموجودة في القطاع في مصفوفة

  • عد السيارات الموجودة في القطاع

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

لنرَ الكود الذي أضفته في إجراءات “عند مرور السيارة” في خطوط التوقف. يُستخدم هذا الكود لإضافة وإزالة السيارات في كل مرة تمر فيها سيارة عبر خط توقف.

  • خط التوقف الأول: routeSegment.incrementCars((Car)car);

  • خط التوقف الثاني: routeSegment.decreaseCars((Car)car);

الآن يمكننا بسهولة طباعة ما نحتاجه على الشاشة (عدد السيارات وعدد السيارات الكهربائية في القطاع):

String.format("there are %d cars from which %d are electric",routeSegment.getCars(),count(routeSegment.cars,c->c.isElectric))

الشكل 4 - عرض النتائج

الاستنتاجات

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

  • عندما تستخدم AnyLogic PLE وتريد إضافة أكثر من 10 وكلاء

  • عندما تريد توفير الذاكرة

  • عندما تريد كتابة كود أنيق ونظيف، بتجميع جميع وظائف كائن معين أو كيان مجرد في مكان واحد

  • عندما تريد استخدام وكيل لكن الفئة أكثر من كافية لتحقيق أهدافك (يمكنك دائماً تحويل الفئة إلى وكيل إذا غيرت رأيك لاحقاً)

  • عندما تريد إنشاء متغير JAVA خاص غير موجود (مثل MAP بمفاتيح متعددة)

حمّل النموذج بالنقر هنا!!

#Class