नौकरी शेड्यूलिंग समस्या

वोट
8

मैं एक आवेदन जहां मैं अपने आप एक घूर्णन समय पर सदस्यों के लिए कार्य शेड्यूल करने की जरूरत पर काम कर रहा हूँ। मैं नियमों को समझाने में बहुत अच्छा नहीं हूँ, इसलिए यहाँ कुछ डेटा मदद करने के लिए है:

पद: एक पद नाम, इस तरह के सोमवार और बुधवार को साप्ताहिक के रूप में नियमों के साथ।
श्रेणियाँ: पदों का एक सेट
समूह: पदों की एक और सेट। एक ही समूह में स्थितियां एक ही दिन में नहीं सौंपा जा सकता है
कि किसी निश्चित तिथि पर पदों के लिए सौंपा उपयोगकर्ता: सदस्य।

महीने में प्रत्येक तिथि के लिए, सदस्यों के पदों (दोनों आरोही क्रम में) को सौंपा है। एक सदस्य एक वर्ग में एक पद के लिए असाइन किया गया है, तो अगली बार एक ही श्रेणी में एक स्थान ऊपर आता है, अगले सदस्य वर्णानुक्रम (या सूची की शुरुआत) सौंप दिया जाता है जैसे।

सदस्य: एम 1, M2, एम 3, एम 4
श्रेणी सी 1 में पद: P1, P2, पी 3
स्थिति P1 में सदस्य: एम 1, M2, एम 3, एम 4
एम 1, M2, एम 3: सदस्य स्थिति P2 में
स्थिति P2 में सदस्य: एम 1, एम 3, एम 4

एम 1 पी 1 के लिए असाइन किया गया है, तो अगर P2 अगले आता है, M2 आवंटित किया जाएगा। जहां अगर पी 3 अगले बजाय आता है, एम 3 सौंप दिया जाता है जटिलता का एक अतिरिक्त परत शुरू की है। प्रणाली तथ्य था कि एम 2 'को छोड़ दिया' और M2 आवंटित अगले यदि उपलब्ध हो, तो एम 4 अगले असाइन करें, या इंतजार जब तक यह एक स्थिति में जहाँ M2 उपलब्ध है के लिए हो जाता है का ट्रैक रखने के (इस जब वहाँ कई हैं इसके साथ ही जटिल हो जाता है 'को छोड़ दिया 'सदस्य)।

अगर वह संकेत दिया है कि वह उस तारीख को उपलब्ध नहीं होगा एक सदस्य भी छोड़ दिया जाएगा। प्रणाली को छोड़ दिया सदस्यों पर प्राथमिकता जगह, किसी भी तरह उन्हें पहचान जब वे आते हैं और फिर सूची में अगले तार्किक व्यक्ति के लिए कूद करने की जरूरत है। लंघन भी तारीख संघर्ष की वजह से समूहों के लिए लागू होता है।

मैं पहले से ही जो मैं अब भी समझ में हालांकि मैं यह टिप्पणी हर कदम समझाने का एक बहुत कुछ है एक अस्थायी [और गंदा] समाधान है। इसकी कमजोरियों को छोड़ दिया सदस्यों से निपटने में हैं।

आप कोड करने के लिए जा रहे थे, तो यह आप इसके बारे में कैसे जाना होगा? मैं PHP में इस लागू करने रहा हूँ, लेकिन स्यूडोकोड रूप में अच्छी तरह काम करेगा।

19/12/2009 को 11:20
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
1

uff। मैं तुम्हें विवरण का पालन नहीं करते हैं, लेकिन इसी तरह की परिस्थितियों में मैं इस तरह की समस्या हल करने के लिए एसक्यूएल इस्तेमाल किया है। यदि आप php का उपयोग कर रहे मैं आप एसक्यूएल उपलब्ध लगता है।

मैं क्या कर रही सुझाव है कि टेबल के एक सेट में इस सूचना के संचय और फिर बाहर काम कर क्या एसक्यूएल क्वेरी आप इस सवाल का जवाब आप चाहते हैं देता है का एक तरीका खोजने है। अक्सर यह तुलना में यह एक प्रक्रियात्मक भाषा में है एसक्यूएल में करने के लिए एक बहुत आसान है।

छोड़ भाग के लिए, उदाहरण के लिए, यदि आप एक कॉलम जो जब कोई पिछले सौंपा गया था रिकॉर्ड, और फिर उस से आदेश हो सकता है (ताकि आप व्यक्ति जो एक लंबे समय के लिए सौंपा नहीं किया गया है चुनें)। वैकल्पिक रूप से, आप संख्या के समय एक स्तंभ और उस से आदेश के रूप में छोड़ दिया हो सकता था।

19/12/2009 को 13:09
का स्रोत उपयोगकर्ता

वोट
6

मेरे समाधान: आप एक PriorityQueue (जो SplPriorityQueue तहत PHP में उपलब्ध है) की जरूरत है। PriorityQueue आप उतरते प्राथमिकता के साथ तत्व देता है (मान के अनुसार क्रमबद्ध, छोटा मान सर्वोच्च प्राथमिकता है)।

प्रत्येक सदस्य को एक निर्दिष्ट मान हो जाता है। यह मान n अंक (आप सुविधा के लिए 8 अंक इस्तेमाल कर सकते हैं), एन पदों के लिए शून्य से भर साथ एक ASCII संख्या है। उसके बाद आप नाम जोड़ देते हैं। तुम भी उपलब्ध पदों प्रत्येक सदस्य के लिए जोड़

तो (n = 5):

  • एम 1 मूल्य: 99999Albert P1, P2, पी 3
  • M2 मूल्य: 99999Susi P1, P2
  • एम 3 मूल्य: 99999Bob P1, पी 3

इससे प्राथमिकता है और नाम से सदस्यों को सॉर्ट करने में आता है।

तैयारी:

एक धूपदार दिन। आप किसी विशेष दिन का सौंपा पदों और एक वर्ग को पुन: प्राप्त कर रहे हैं। प्रत्येक सदस्य को एक लंबी सूची पर भरी हुई है। प्रत्येक सदस्य जो काम पर नहीं दिखा रहा है भरी हुई नहीं है, लेकिन उसके मूल्य शून्य से दो की कमी हुई हो जाता है। बॉब यहाँ नहीं है, तो अपनी नई मूल्य 99997Bob हो जाता है। इसका मतलब यह है कि बॉब आपके द्वारा अगली बार चयन किया जाएगा। अन्य सभी सदस्यों को उनके मूल्य शून्य से एक की कमी हुई मिलता है।

एक विशिष्ट दिवस के लिए सौंपा पदों मैप की जाती हैं (उपयोग SplObjectStorage):

P1-> एम 1, M2, एम 3, एम 4 आदि P2-> आदि

मानचित्र केवल पदों जो आज सौंपा जाना चाहिए होता है। के बाद

फिल्टर: आप समूहों को देखने और नक्शा जो इस दिन को नहीं सौंपा जा सकता है पर किसी भी पदों को हटाना होगा। अपने समूह का विवरण थोड़ा स्पष्ट नहीं है।

असाइन करें:

  • आप आवंटित करने के लिए स्थिति का चयन
  • सदस्यों की सूची जो स्थान को भरने कर सकते हैं जाओ
  • सूची से उपलब्ध सदस्यों को निकालें और उन्हें PriorityQueue में डाल दिया
  • PriorityQueue से निकालने () द्वारा स्थिति (सही काम automaticially किया जाता है) असाइन करें। प्रत्येक सदस्य जो इच्छा असाइन किया गया है अपने मूल्य एक की वृद्धि हुई (तो बाहर कमी और स्तर को बढ़ाता है, तो तुम यहाँ और काम कर रहे हैं) हो जाता है। आप यहाँ और नहीं कर रहे हैं जो भी कारण के लिए एक स्थान के लिए सौंपा गया, आप एक का एक छोटा सा दंड मिलता है। आप तो यहाँ नहीं, आपके पास दो का जुर्माना मिलता है।
  • पूरा होने के बाद, फिर से सूची पर बाकी सदस्यों डाल PQueue स्पष्ट और अगले काम के साथ जारी है।

चेतावनियां:

  • आप हमेशा एक पद के लिए पर्याप्त लोग हैं कि सावधान रहना चाहिए।
02/01/2010 को 16:10
का स्रोत उपयोगकर्ता

वोट
0

क्या मैं समझता हूँ कि 'एम' के सदस्यों और 'एन' पदों देखते हैं है।

श्रेणी: पदों के एक समूह - एक सदस्य को श्रेणी में एक स्थान असाइन किया गया है एक और नहीं हो सकता?

समूह: पदों के एक समूह - एक ही समूह में पदों अलग अलग दिनों पर सौंपा जाना चाहिए।

अंतिम बात, एक स्थिति के सदस्यों को जो इसे भर सकते हैं की एक सूची है।

देखने के एक डेटा संरचना बिंदु से इस को देखते हुए, एक लिंक्ड सूची में सदस्यों डाल - प्रत्येक सदस्य [स्थिति, दिन] कि वे अंत में आवंटित कर रहे हैं की एक अतिरिक्त सूची होनी चाहिए। फिर, प्रत्येक स्थिति के लिए, सदस्यों को बताया कि कि स्थान को भरने कर सकते हैं के लिए संदर्भ की एक सूची है। के रूप में एक स्थिति है जो श्रेणियों उस में है के लिए संदर्भ का एक और सूची के रूप में श्रेणियों को लागू करें।

वास्तविक काम: एक दिन काउंटर = 0 है, और पदों के माध्यम से पुनरावृति। प्रत्येक स्थिति पी के लिए, सदस्यों को बताया कि यह भरने कर सकते हैं के माध्यम से पुनरावृति। एक सदस्य एम स्थिति अगर भर सकते हैं:

  • किसी भी स्थिति में वह P2 भरी है पी के साथ एक वर्ग का हिस्सा नहीं है
  • किसी भी स्थिति में वह दिन के साथ P2 भरी है = daycounter पी के साथ एक समूह का हिस्सा नहीं है

सभी संदर्भों को अभी भी भले ही मान्य हैं - वह स्थिति, [स्थिति, दिन] जोड़ी सदस्य को जोड़ा जाता है, और सदस्य के नोड सूची के अंत में ले जाया जाता है (यही कारण है कि संदर्भ के लिए आवश्यक हैं भर सकते हैं नोड चले गए)। इससे यह सुनिश्चित होता है कि 'को छोड़ दिया' के सदस्यों को सर्वोच्च प्राथमिकता दी जाती है, और सदस्यों को जो पहुँच नहीं कर रहे थे अगले सर्वोच्च प्राथमिकता दी गई।

एक बार एक स्थिति भर जाता है, अगले स्थिति पर जाएं। स्थिति के शेयरों की स्थिति पहले से ही सौंपा के साथ एक समूह है, तो इसे छोड़, सभी पदों जब तक आप के रूप में कई पदों पर प्रदान कर सकते हैं के रूप में आप फिर दिन 1. पर, दिन काउंटर बढ़ाने के और 2 दिन के लिए दोहराने यह आपको देना चाहिए कर सकते हैं के माध्यम से पुनरावृत्ति एक अधिक से अधिक काम (अधिकतम बारे में निश्चित नहीं) सभी नौकरियों के लिए।

युक्ति: जब आपका सदस्य सूची के अंत में एक सदस्य चलती, सूची पार करने के लिए, अंत के लिए एक संदर्भ रखना होने को रोकने के लिए - अगले पद के लिए, आप से शुरू करने की आवश्यकता वैसे भी शुरुआत, इसलिए वहाँ कोई मतलब के माध्यम से चल रहा है पूरी बात।

02/01/2010 को 18:16
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more