कैलेंडर / योजना एल्गोरिदम


24

मैं एक समस्या का सामना कर रहा हूँ मुझे यकीन नहीं है कि कैसे दृष्टिकोण करना है। मुझे कर्मचारियों के लिए एक कैलेंडर तैयार करना है, उनमें से प्रत्येक के पास विशिष्ट कार्य बाधाएं हैं (कुछ व्यक्तिगत, कुछ सामान्य)

मैं किसके साथ काम कर रहा हूं:

  • मेरे पास डॉक्टर्स हैं
  • प्रत्येक डॉक्टर को 5 दिन / सप्ताह काम करना पड़ता है।
  • प्रत्येक डॉक्टर को 1 रात / सप्ताह काम करना है
  • प्रत्येक डॉक्टर को अन्य डॉक्टरों की तुलना में रातों की समान मात्रा में काम करना पड़ता है (या जितना संभव हो उतना करीब)
  • प्रत्येक डॉक्टर को अन्य डॉक्टरों की तुलना में मंगलवार की रात और रविवार की रात के बराबर काम करना पड़ता है (या जितना संभव हो उतना करीब)
  • कुछ डॉक्टर कुछ दिन / रात काम नहीं कर सकते (उपयोगकर्ता द्वारा इनपुट)
  • कुछ डॉक्टर कुछ दिन / रात (उपयोगकर्ता द्वारा इनपुट) काम करना चाहेंगे
  • कुछ डॉक्टर कुछ दिन / रात (उपयोगकर्ता द्वारा इनपुट) काम नहीं करना चाहेंगे

प्रश्न में उपयोगकर्ता कैलेंडर से निपटने वाला व्यक्ति है, मैं एक समाधान बनाने की कोशिश कर रहा हूं जो स्वचालित रूप से सभी बाधाओं का पालन करने वाला कैलेंडर उत्पन्न करेगा। समाधान केवल एक बड़ी सेटिंग इनपुट है "डॉक्टरों को जोड़ें" और प्रत्येक चिकित्सक के लिए "बाधाओं को जोड़ें", फिर "कैलेंडर उत्पन्न करें" बटन। यह वास्तव में उपयोगकर्ता के लिए बुनियादी है।

मेरी समस्या :

मुझे यकीन नहीं है कि वास्तविक योजना कैसे बनाई जाए, मैं न्यूरल नेटवर्क्स, जेनेटिक अल्गोरिदम, और इसी तरह के बारे में पढ़ रहा हूं, और वे सभी सही समाधान की तरह लगते हैं लेकिन वास्तव में यह भी नहीं है।

जब मैं GA को देखता हूं, तो वे दिए गए जनसंख्या (मेरी समस्या) के साथ एक समाधान खोजने के लिए बने हैं, लेकिन शुरुआती आबादी को पहले से ही बाधाओं के दिए गए सेट का पालन करना होगा, जिसे तब अनुकूलित किया जाएगा। उस मामले में, मेरी शुरुआती आबादी पहले से ही समाधान है। मुझे "अनुकूलित" होने की आवश्यकता नहीं है। इससे कोई फर्क नहीं पड़ता कि एक अकेला व्यक्ति एक पंक्ति में 3 सोमवार की रात काम करता है, जब तक कि यह वास्तव में सही है और अन्य लोग समान मात्रा में काम करते हैं, इसका मतलब है कि अन्य किसी बिंदु पर 3 सोमवार की रात भी काम करेंगे और यह ठीक है। जो मुझे लगता है कि जीए मेरे लिए "उन्नत" हैं, क्योंकि मेरी समस्या पहले से ही जीए के शुरुआती बिंदु से हल हो गई है।

लेकिन फिर, जीए का वास्तव में ऐसा लगता है कि वे इसके लिए बने हैं, इसलिए मैं इसे सही तरीके से नहीं समझ पा रहा हूं?

वैसे भी, जैसा कि मैंने कभी भी GA (या तंत्रिका नेटवर्क, या किसी भी प्रकार का) का उपयोग नहीं किया है, मैं यह सुनिश्चित करना चाहूंगा कि मैं एक सीखने की अवस्था में उलझने से पहले सही दृष्टिकोण के लिए जा रहा हूं।

मेरा प्रश्न :

आपको क्या लगता है कि मेरी जैसी समस्या के लिए एक अच्छा तरीका / एल्गोरिथ्म / तकनीक है? जीए के? तंत्रिका जाल? कुछ और पूरी तरह से अलग?

मैं सभी कान हूँ और यदि आवश्यक हो तो अधिक जानकारी के लिए खुला, लेकिन मुझे लगता है कि मैंने खुद को बहुत स्पष्ट कर लिया है :)


22
शायद नर्स rostering समस्या को हल साहित्य को देख लायक en.wikipedia.org/wiki/Nurse_scheduling_problem
रेनॉड एम

इतना सुविधाजनक शब्द! हेह, आपके लिंक के लिए धन्यवाद;)
गिल सैंड

8
मैं इस क्षेत्र का विशेषज्ञ नहीं हूं, हालांकि अगर आप जो खोज रहे हैं वह एक ऐसा दृष्टिकोण है जो आपको विकास पर कुछ समय बचा सकता है, तो यह समस्या को एक मिश्रित पूर्णांक प्रोग्रामिंग समस्या ( en.wikipedia) के रूप में मॉडल करने की कोशिश करने लायक हो सकता है । org / wiki / Linear_programming # Integer_unknowns ) और फिर इस तरह के या उपकरण (के रूप में एक MIP solver को यह इनपुट, या एक बाधा प्रोग्रामिंग समस्या के रूप में और फिर इसे इनपुट एक सी.पी. solver करने के लिए, developers.google.com/optimization )। इस तरह आपको अपनी समस्या को व्यक्त करना होगा।
रेनॉड एम।

3
रैखिक प्रोग्रामिंग इष्टतम समाधानप्राप्त करने की गारंटी है!
recursion.ninja

2
@RenaudM। यह शर्म की बात है कि कुछ पेशेवर प्रोग्रामर गणित के इस अद्भुत उपयोगी क्षेत्र को कैसे समझते हैं। जब भी कोई एआई क्षेत्र के बाहर नकली या आनुवांशिक एल्गोरिदम का अनुकरण करने का सुझाव देता है, तो मेरी प्रतिक्रिया होती है: संभवतः एक रैखिक कार्यक्रम अनुकूलन के रूप में बेहतर मॉडलिंग की जा सकती है
पुनरावर्तन.निन्जा

जवाबों:


14

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

यह एक महत्वपूर्ण विचार है: दो कार्यक्रम दिए गए हैं, हमें यह तय करने का एक तरीका चाहिए कि क्या अनुसूची A या अनुसूची B "बेहतर" है। आपने विभिन्न मापदंड सूचीबद्ध किए हैं, लेकिन यह स्पष्ट नहीं है कि वे कैसे संबंधित हैं। क्या एक कसौटी पर खरा उतरने से पूरा समाधान विफल हो जाता है? या एक बाधा को आंशिक रूप से विफल करने से क्या यह दूसरों की तुलना में बदतर समाधान है?

सबसे बुनियादी स्तर पर, आप सप्ताह को असतत समय स्लॉट में विभाजित कर सकते हैं, और सभी स्लॉट डॉक्टर संयोजन को बल दे सकते हैं। हालाँकि, आप इस खोज स्थान को अधिक प्रबंधनीय आकार में कम करने के लिए कठिन-असफल बाधाओं का उपयोग कर सकते हैं। काम के समय और रात की पाली पर प्रतिबंध इस तरह के खोज स्थान को सीमित करने के लिए अनुकूल है। फिर आप सैकड़ों उम्मीदवार समाधान के साथ छोड़ दिए जाते हैं।

सबसे अच्छा उम्मीदवार समाधान का चयन करने के लिए, आपको उन्हें रैंक करना होगा। यह काफी आसान है अगर एक नरम बाधा अन्य सभी नरम बाधाओं पर स्पष्ट पूर्वता है, उदाहरण के लिए, यदि कोई डॉक्टर एक निश्चित शिफ्ट में काम नहीं कर सकता है, तो उस शिफ्ट में काम करने की इच्छा न रखने वाले डॉक्टर की तुलना में अधिक महत्व दिया जाता है। लेकिन मैं आपके लिए ये नियम तय नहीं कर सकता - यह एक प्रबंधकीय निर्णय है। यह अधिक कठिन है अगर दो नरम बाधाओं की स्पष्ट पूर्वता नहीं है, तो इस मामले में आपको कुछ प्रकार के लागत फ़ंक्शन के साथ आना होगा जो एक ही मीट्रिक में दो बाधाओं के महत्व को एकीकृत करता है।


मैं शायद एक लालची एल्गोरिथ्म का निर्माण करूंगा जो कुछ प्राथमिकता वाले मानदंडों के अनुसार खाली समय सारणी में भरता है। यह सबसे इष्टतम समाधान नहीं हो सकता है, लेकिन यह वास्तव में क्या "इष्टतम" के बारे में दार्शनिकता की तुलना में आसान है।

पहले कदम के रूप में, आप सप्ताहांत में रात की पाली में भर सकते हैं, और उन डॉक्टरों का चयन करने की कोशिश कर रहे हैं जिन्होंने सबसे लंबे समय तक सप्ताहांत की रात की पारी नहीं की है, यह भी ध्यान में रखते हुए "मैं वहां काम नहीं कर सकता" उपयोगकर्ता की इच्छाएं । यह मानते हुए कि ये इच्छाएं प्रति सप्ताह हैं और निरंतर नहीं हैं, इसका मतलब है कि एक डॉक्टर जो एक सप्ताह के लिए सप्ताहांत की रातों पर काम नहीं कर सकता है उसे अगले सप्ताह चुना जाएगा।

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

दुर्भाग्य से, मैं इस प्रणाली को चलाने के लिए कुछ तरीके देख सकता हूं: उदाहरण के लिए, यदि एक डॉक्टर को सप्ताहांत की रात की शिफ्ट में काम करने के लिए चुना जाएगा, लेकिन "वहाँ काम नहीं कर सकता" अनुरोध में रखा गया है, तो उन्हें लेने में एक सप्ताह की देरी होगी - उन्हें कम करना सप्ताहांत की रात की आवृत्ति उनके सहयोगियों की कीमत पर बदल जाती है। यदि एक इच्छा समाधान प्रक्रिया लागू की जाती है जो ठुकराए गए अनुरोधों की संख्या को देखती है, तो उपयोगकर्ता एक अनुरोध को बढ़ावा देने के लिए असंभव अनुरोधों के एक जोड़े में डाल सकता है। हालांकि, अच्छा विश्वास (और डॉक्टरों के लिए एक दूसरे के बीच बदलावों को बदलने के लिए लचीलापन) को मानते हुए, इस तरह के एक एल्गोरिथ्म का परिणाम एक अच्छा-पर्याप्त समाधान होना चाहिए।


आपके उत्तर के लिए धन्यवाद, मैं अपने सहयोगी के साथ इसमें थोड़ा और खुदाई करूँगा :) आपको अधिक जानकारी देने के लिए: हाँ, हम अधिकांश समाधान / मापदंड को रैंक कर सकते हैं, और हम यह तय कर सकते हैं कि कुछ दूसरों पर पूर्वता रखते हैं। इसके अलावा, वे वास्तव में अब अच्छे विश्वास पर काम कर रहे हैं, और यह अच्छी तरह से काम कर रहा है। वे इसे हाथ से डोंग करते हैं और न ही "मैं taht दिन काम नहीं कर सकता" का उपयोग करें। यह काफी अच्छा है कि उन्हें यह काम अब कैसे मिला क्योंकि वे वास्तव में इसे हाथ से करते हैं । तो एक "व्यवहार्य" समाधान पहले से ही उनके लिए दुनिया का मतलब होगा, और उन्हें बहुत समय का एक बहुत कुछ बचा सकता है जब कौन काम कर सकता है
गिल सैंड

5
@Zil वर्तमान में शेड्यूल बनाने वाले लोग शायद पहले से ही एक अनौपचारिक एल्गोरिथ्म का उपयोग कर रहे हैं। आप बस उनसे बात कर सकते हैं और उनकी निर्णय प्रक्रिया को समझने की कोशिश कर सकते हैं, फिर उसे औपचारिक रूप से लागू कर सकते हैं। यह एक तंत्रिका नेटवर्क की स्थापना और प्रशिक्षण से आसान होगा।
आमोन

यह हमारा पहला कदम है: p हमारी उनके साथ बैठक पहले ही सेट हो चुकी है! आपकी सभी मदद के लिए धन्यवाद :)
गिल सैंड

3
इस उपयोग के मामले के लिए, जेनेटिक्स एल्गोरिदम लगातार तब्बू खोज और नकली एनीलिंग से नीच हैं, जैसा कि अनुसंधान प्रतियोगिताओं इंटरनेशनल नर्स रोसेरिंग प्रतियोगिताओं द्वारा सिद्ध किया गया है। (लेकिन निश्चित रूप से, वे अभी भी सिर्फ एक लालची अहंकार से बेहतर हैं।)
जेओफ्री डी स्मेट

12

आप नकली annealing का उपयोग कर सकते हैं ।

मैंने ऐसा कुछ किया, इससे पहले कि मैं अपना पहला काम करूँ - https://vimeo.com/20610875 (डेमो 2:50 से शुरू होने वाला, एल्गोरिथम 6:15 से समझाया गया) देखें।

सिमुलेटेड एनीलिंग एक जेनेटिक एल्गोरिथ्म का एक प्रकार है, और शायद यह सिद्धांत में उपयुक्त नहीं था (जैसा कि @amon अपने उत्तर में रखता है ), लेकिन यह अभ्यास में बहुत अच्छी तरह से काम करता था, और यह आपके जैसे ही उपयोग के मामले में था।

स्रोत कोड उपलब्ध है (C #), लेकिन जब यह काम करता है, तो यह भयानक है मुझे डर है, यह कुछ साल पहले था और एक ऑटोडिडैक्ट होने के नाते, मैं स्थिरता के बारे में एक चीज नहीं जानता था। यह हालांकि बहुत अच्छे परिणाम निकले।

यह वैसे भी संक्षेप में कैसे काम करता है:

  • 1 संभव उत्पन्न करें (यह बहुत अच्छा नहीं हो सकता है, लेकिन शारीरिक रूप से संभव है) समय बिंदु एक प्रारंभिक बिंदु के रूप में। इस बिंदु पर जेनेटिक एल्गोरिथ्म आवश्यक नहीं है - आप अपने पहले समाधान के लिए अपना रास्ता पा सकते हैं। मैंने बैकट्रैकिंग का इस्तेमाल किया । प्रत्येक दिन के लिए अलग से रोटी को हल करके कम्प्यूटेशनल जटिलता को दूर किया जा सकता है। यदि कोई समाधान नहीं है (जैसा कि मामला हो सकता है), यह इस बिंदु पर है कि आप इसका पता लगाते हैं।

  • समाधान का एक पूल बनाएं - कहते हैं, एक शुरुआत के लिए इस प्रवेश-स्तर के समाधान की 100 प्रतियां।

  • यादृच्छिक रूप से हर समाधान को म्यूट करें: डॉक्टरों को प्रत्येक अभिभावक के बीच बदलावों की अदला-बदली करनी है, एक यादृच्छिक चिकित्सक को उनकी शिफ्ट से बाहर ले जाना चाहिए और एक यादृच्छिक चिकित्सक को उस स्थान पर उपलब्ध कराना चाहिए आदि।

  • एक फिटनेस फ़ंक्शन के साथ प्रत्येक समाधान का मूल्यांकन करें जो यह निर्धारित करता है कि यह कितना अच्छा है। एक आदमी दूसरे की तुलना में अधिक रात काम करता है? जुर्माना अंक घटाएं। किसी को सोमवार करना चाहता था, लेकिन वे नहीं है? जुर्माना बिंदुओं को फिर से घटाएं।

  • ले - कहो - 20 सर्वश्रेष्ठ समाधान और उनमें से प्रत्येक को 5 बार कॉपी करें, शेष 80 को उनके साथ अधिलेखित करें, जिससे उन्हें अगली पीढ़ी तक ले जाया जा सके। योग्यतम की उत्तरजीविता।

  • कुल्ला और दोहराएँ।

संख्या स्पष्ट रूप से मनमानी है, आपको अपने परिदृश्य के लिए इष्टतम सेटिंग्स का पता लगाने के लिए मापदंडों के साथ बेला करने की आवश्यकता हो सकती है।

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


4
मैं एक कॉलेज समय सारिणी के लिए नकली एनाल्ग के साथ OptaPlanner (nee Drools Planner) का उपयोग किया है। मॉडल घोषित करें - एक शिफ्ट में एक समय और एक डॉक्टर होता है। फिटनेस फ़ंक्शन के लिए घोषणात्मक नियम लिखें - कठोर बाधाएं (एक डॉक्टर ओवरलैपिंग शिफ्ट नहीं ले सकता है) और दंड (एन हैन्ड डॉन्स)। घोषणाओं को लिखें (बदलाव की बात!) OptaPlanner बेतरतीब (प्रारंभिक हो सकता है) पर प्रारंभिक स्थिति बनाएगा, नियमों से फिटनेस फ़ंक्शन की गणना करेगा और यहां तक ​​कि अनुकूलन एल्गोरिथ्म के अनुसार स्वैप भी संचालित करेगा। आप शेड्यूल को शेड्यूल करने की तरह चुन सकते हैं और ट्यून कर सकते हैं।
जेसविन जोस

6

आनुवंशिकी एल्गोरिदम यहाँ लागू होते हैं। मेरे स्नातक कार्यक्रम के दौरान, मेरे एक सहकर्मी ने आपकी इसी तरह की समस्या के लिए एक पत्र लिखा था।

आप जॉब शॉप शेड्यूलिंग की तलाश कर सकते हैं और ओपन शॉप शेड्यूलिंग या फ्लो शॉप शेड्यूलिंग भी शुरुआती बिंदु हो सकते हैं

एक आनुवंशिक एल्गोरिथ्म का उपयोग करने के लिए आपको एक पूर्ण समाधान की आवश्यकता नहीं है, आप एन यादृच्छिक उम्मीदवारों के साथ शुरू कर सकते हैं, और उनमें से प्रत्येक के लिए एक फिटनेस फ़ंक्शन लागू कर सकते हैं, उदाहरण के लिए:

  • सबसे व्यस्त चिकित्सक और कम व्यस्त काम के बीच सौंपी गई रातों का अंतर लागत फ़ंक्शन में एक दंड है
  • जब भी कोई चिकित्सक सप्ताह में 5 दिन या प्रति सप्ताह 1 रात से अधिक काम करता है, तो आप जुर्माना लगाते हैं
  • आपकी प्रत्येक बाधा, आदि ...

उन N अभ्यर्थियों को सृजित करना जो आप उनमें से सबसे अच्छे से एक्स को चुनेंगे , वे वही होंगे जो बाधाओं को कम करेंगे। उनके साथ काम करना, कई पीढ़ियों से पार करना और उत्परिवर्तन करना एक अच्छे समाधान के साथ समाप्त हो सकता है।

उस सब के बारे में बात करने के बाद, हर बार मैंने एक जेनेटिक अल्गोरिथम का उपयोग किया, जो इस म्यूटेशन पर अधिक निर्भर करता था कि क्रॉसिंग पर, मैं एक सरल एनालाइजिंग विकसित कर सकता हूं जो एक आसान कार्यान्वयन के साथ बेहतर प्रदर्शन करेगा। आनुवंशिक एल्गोरिथ्म के लिए लागत / फिटनेस और म्यूटेशन फ़ंक्शन संभवतः एक सिम्युलेटेड एनीलिंग में उपयोग किए जाने वाले एक के समान होगा। मैं वहां शुरू करूंगा, @Konrad Morawski उत्तर को देखें

Google खोज जॉब शॉप और GA के लिए अच्छे परिणाम खोजती है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.