سؤال

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

المواقف:المسمى الوظيفي ، مع القواعد مثل أيام الاثنين والأربعاء أسبوعيا.
فئات:مجموعة من المواقف
المجموعات:مجموعة أخرى من المناصب.وظائف في نفس المجموعة لا يمكن تعيين في نفس اليوم
الأعضاء:للمستخدمين تعيين المناصب في تاريخ معين.

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

الأعضاء:M1, M2, M3, M4
وظائف في الفئة C1:P1, P2, P3
أعضاء في موقف P1:M1, M2, M3, M4
أعضاء في موقف P2:M1, M2, M3
أعضاء في موقف P2:M1, M3, M4

إذا M1 يتم تعيين P1 إذا P2 يأتي المقبل ، M2 سيتم تعيين.طبقة إضافية من التعقيد هو عرض حيث إذا P3 يأتي بعد بدلا من ذلك ، M3 يحصل على تعيينه.النظام يجب أن تتبع من حقيقة أنه كان M2 'تخطي' وتعيين M2 القادمة إذا كانت متوفرة ، ثم تعيين M4 المقبل أو الانتظار حتى يحصل على الموقف حيث م2 متوفر (يصبح هذا بالإضافة إلى مجمع عندما يكون هناك العديد من 'تخطي' أعضاء).

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

لدي بالفعل المؤقتة [والفوضى] الحل الذي لم أعد أفهم على الرغم من أن لدي الكثير من التعليقات في شرح كل خطوة.نقاط الضعف هي في التعامل مع تخطي أعضاء.

إذا كانوا في طريقهم إلى رمز هذا كيف يمكنك أن تذهب نحو ذلك ؟ انا تنفيذ هذا في PHP ولكن شبة الكود سوف تعمل بشكل جيد.

هل كانت مفيدة؟

المحلول

الحل:كنت في حاجة الى PriorityQueue (والذي يتوفر في PHP تحت SplPriorityQueue).على PriorityQueue يعطيك العناصر مع تنازلي الأولوية (مرتبة حسب قيم أصغر قيمة له الأولوية).

كل عضو يحصل على تعيين القيمة.هذه القيمة هي ASCII رقم n أرقام (يمكن استخدام 8 أرقام للراحة) ، تمتلئ أصفار إلى n المواقف.بعد أن قمت بإلحاق الاسم.يمكنك أيضا إضافة إلى كل عضو الوظائف المتاحة

حتى (n=5):

  • M1 القيمة:99999Albert P1,P2,P3
  • M2 القيمة:99999Susi P1,P2
  • M3 القيمة:99999Bob P1,P3

هذا يجعل من السهل فرز أعضاء حسب الأولوية و اسم.

التحضير:

يوم مشمس.أنت استرجاع تعيين المناصب فئة معينة من اليوم.كل عضو يتم تحميلها على قائمة طويلة.كل الأعضاء الذين لم تظهر على عمل لم يتم تحميل, لكن يحصل له قيمة بنسبة ناقص اثنين.بوب هو ليس هنا, لذلك لها قيمة جديدة يحصل 99997Bob.وهذا يعني أن بوب سيتم اختيار تلقائيا في المرة القادمة.جميع الأعضاء الآخرين في الحصول على قيمتها بنسبة ناقص واحد.

المواقف المخصصة ليوم محدد يتم تعيين (استخدام SplObjectStorage):

P1->M1,M2,M3,M4.... الخP2 ->.... الخ

الخريطة يحتوي فقط على المواقف التي يجب أن يتم تعيين هذا اليوم.بعد

عامل التصفية:يجب أن ننظر المجموعات حذف أي مواقع على الخريطة التي لا يمكن تعيين هذا اليوم.المجموعة الوصف غير واضح.

تعيين:

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

المحاذير:

  • يجب أن تكون حذرا من أن هناك دائما ما يكفي من الناس عن موقف.

نصائح أخرى

ومضات. أنا لا تتبع لكم الوصف، ولكن في حالات مماثلة ولقد استخدمت مزود حل هذا النوع من المشاكل. إذا كنت تستخدم فب اعتقد المتاحة لديك SQL.

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

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

ما أفهمه هو أن هناك 'm' الأعضاء 'n' المواقف.

الفئة:مجموعة من المواقف -- العضو الذي تم تعيينه موقف واحد في الفئة لا يمكن أن يكون آخر ؟

المجموعة:مجموعة من المواقف -- المواقف في نفس المجموعة يجب تعيين في أيام مختلفة.

آخر شيء ، وهو موقف لديه قائمة من الأعضاء الذين يمكن أن تملأ.

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

التخصيص الفعلي:يكون يوم counter = 0 و من خلال تكرار المواقف.لكل موقف P, من خلال تكرار الأعضاء التي يمكن أن تملأ ذلك.عضو M يمكن أن شغل المنصب إذا:

  • أي موقف كان قد شغل P2 لا حصة هذه الفئة مع P.
  • أي موقف كان قد شغل P2 مع يوم = daycounter لا حصة مجموعة مع P.

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

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

Tip:عند نقل الأعضاء إلى نهاية قائمة الأعضاء, للحيلولة دون الحاجة إلى اجتياز قائمة ، نضع إشارة إلى النهاية-على الموضع التالي ، تحتاج إلى البدء من البداية على أي حال, إذا لا فائدة من الذهاب من خلال كل شيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top