स्कूल समय सारिणी बनाने के लिए एल्गोरिदम


95

मैं सोच रहा था कि स्कूल टाइमटेबल बनाने के एल्गोरिथ्म के लिए ज्ञात समाधान हैं या नहीं। मूल रूप से, यह दिए गए वर्ग-विषय-शिक्षक संघों के लिए "शिक्षकों और कक्षाओं के मामले में" (घंटे-फैलाव) को अनुकूलित करने के बारे में है। हम यह मान सकते हैं कि हमारे पास इनपुट पर कक्षाएं, पाठ विषय और एक दूसरे से जुड़े शिक्षक हैं और यह समय सारिणी सुबह 8 बजे से शाम 4 बजे के बीच होनी चाहिए।

मुझे लगता है कि शायद इसके लिए कोई सटीक एल्गोरिदम नहीं है, लेकिन शायद कोई इसे विकसित करने के लिए एक अच्छा अनुमान या संकेत जानता है।


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

10
जैसा कि स्टैकऑवरफ्लो के इयान रिंगरोज ने एक अन्य सवाल पर कहा, "शेड्यूल सॉफ्टवेयर में अभी भी कई पीएचडी होने हैं।"
रीड डिबेट्स

जवाबों:


86

यह समस्या है NP-Complete !
संक्षेप में स्वीकार्य समाधानों की सूची खोजने के लिए सभी संभावित संयोजनों का पता लगाने की आवश्यकता है। जिन परिस्थितियों में विभिन्न स्कूलों में समस्या दिखाई देती है, उनमें विविधता के कारण (उदाहरण के लिए: क्या कक्षाओं के संबंध में अड़चनें हैं ?, क्या कुछ कक्षाएं कुछ समय में उप-समूहों में विभाजित होती हैं ?, क्या यह एक साप्ताहिक कार्यक्रम है? आदि) एक अच्छी तरह से ज्ञात समस्या वर्ग नहीं है जो सभी समयबद्धन समस्याओं से मेल खाती है। हो सकता है, बड़े स्तर पर इन समस्याओं के साथ नैकपैक समस्या में समानता के कई तत्व हों।

एक पुष्टिकरण कि यह दोनों एक कठिन समस्या है और एक जिसके लिए लोग बारहमासी समाधान चाहते हैं, इस (लंबी) सूची की सूची (ज्यादातर वाणिज्यिक) सॉफ्टवेयर शेड्यूलिंग टूल की जांच करना है

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

एक स्वचालित अनुसूची जनरेटर कार्यक्रम के विशेष कार्यान्वयन पर ध्यान केंद्रित करने के बजाय, मैं कुछ रणनीतियों का सुझाव देना चाहता हूं जो समस्या की परिभाषा के स्तर पर लागू किए जा सकते हैं
सामान्य तर्क यह है कि अधिकांश वास्तविक विश्व समय-निर्धारण समस्याओं में, कुछ समझौते की आवश्यकता होगी, सभी बाधाओं को व्यक्त और व्यक्त नहीं किया जाएगा: पूरी तरह से संतुष्ट हो जाएगा। इसलिए हम अपने आप से मदद करते हैं:

  • सभी ज्ञात बाधाओं को परिभाषित करना और रैंकिंग करना
  • समस्या की जगह को कम करना, मैन्युअल रूप से, अतिरिक्त बाधाओं का एक सेट प्रदान करना ।
    यह एक सहज, आंशिक रूप से भरी अनुसूची (समय-स्लॉट्स का लगभग 30% कहते हैं) प्रदान करके काउंटर-सहज ज्ञान युक्त लग सकता है, एक तरह से जो सभी बाधाओं को पूरी तरह से संतुष्ट करता है, और इस आंशिक अनुसूची को अपरिवर्तनीय मानकर, हम महत्वपूर्ण रूप से कम करते हैं उम्मीदवार समाधान का उत्पादन करने के लिए समय / स्थान की आवश्यकता होती है।
    एक और तरीका है कि अतिरिक्त बाधाओं की मदद "कृत्रिम रूप से" एक बाधा को जोड़ना है जो सप्ताह के कुछ दिनों में कुछ विषयों को पढ़ाने से रोकता है (यदि यह साप्ताहिक अनुसूची है ...); इस प्रकार की बाधाओं के परिणामस्वरूप, समस्या / समाधान के रिक्त स्थान को कम करने में मदद मिलती है, आम तौर पर, अच्छे उम्मीदवारों की एक महत्वपूर्ण संख्या को छोड़कर।
  • यह सुनिश्चित करना कि समस्या की कुछ बाधाओं को जल्दी से गणना की जा सकती है। यह अक्सर समस्या का प्रतिनिधित्व करने के लिए उपयोग किए जाने वाले डेटा मॉडल की पसंद से जुड़ा होता है; यह विचार कुछ विकल्पों में से शीघ्रता से ऑप्ट-इन (या प्रून-आउट) करने में सक्षम है।
  • समस्या को फिर से परिभाषित करना और कुछ बाधाओं को तोड़ने की अनुमति देना, कुछ बार, (आमतौर पर ग्राफ़ के अंत नोड्स की ओर)। यह विचार या तो शेड्यूल में पिछले कुछ स्लॉट्स भरने के लिए या तो कुछ बाधाओं को दूर करने के लिए है, या स्वचालित शेड्यूल जनरेटर प्रोग्राम को पूरे शेड्यूल को पूरा करने से कतराते हैं, इसके बजाय हमें एक दर्जन या अधिक प्रशंसनीय की सूची प्रदान करते हैं। उम्मीदवार। एक इंसान अक्सर पहेली को पूरा करने के लिए एक बेहतर स्थिति में होता है, जैसा कि संकेत दिया गया है, संभवतः कुछ विरोधाभासों को तोड़ना, जानकारी का उपयोग करना जो आमतौर पर स्वचालित तर्क के साथ साझा नहीं किया जाता है (उदाहरण के लिए "दोपहर में कोई गणित नहीं" नियम को मौके पर तोड़ा जा सकता है। "उन्नत गणित और भौतिकी" वर्ग के लिए; या "सुश्री स्मिथ की तुलना में श्री जोन्स की आवश्यकताओं में से एक को तोड़ना बेहतर है ... ;-))

इस उत्तर को प्रूफ-रीडिंग में, मुझे एहसास है कि यह एक निश्चित प्रतिक्रिया प्रदान करने में काफी शर्म की बात है, लेकिन यह व्यावहारिक सुझावों से कम नहीं है। मुझे उम्मीद है कि यह सहायता, आखिरकार, एक "कठिन समस्या" क्या है।


1
शानदार, सटीक और विस्तृत जवाब, संकेत के लिए धन्यवाद और एनपी-पूर्णता के बारे में उल्लेख (यह मेरा अनुमान भी था)।
मोमबत्ती

3
क्या आपके पास कोई उद्धरण है जो इस समस्या की एनपी-पूर्णता की व्याख्या करता है?
डॉन

49

यह एक गड़बड़ है। एक शाही गड़बड़। उत्तरों में जोड़ने के लिए, पहले से ही बहुत पूर्ण, मैं अपने पारिवारिक अनुभव को इंगित करना चाहता हूं। मेरी माँ एक शिक्षक थीं और इस प्रक्रिया में शामिल होती थीं।

यह बताता है कि ऐसा करने के लिए एक कंप्यूटर होना न केवल प्रति-से कोड करना मुश्किल है, यह मुश्किल भी है क्योंकि ऐसी परिस्थितियां हैं जो पूर्व-बेक्ड कंप्यूटर प्रोग्राम को निर्दिष्ट करना मुश्किल है। उदाहरण:

  • एक शिक्षक आपके विद्यालय में और दूसरे संस्थान में पढ़ाता है। स्पष्ट रूप से, यदि वह 10.30 बजे वहां पाठ समाप्त करता है, तो वह 10.30 बजे आपके परिसर में शुरू नहीं कर सकता है, क्योंकि उसे संस्थानों के बीच आवागमन के लिए कुछ समय चाहिए।
  • दो शिक्षक विवाहित हैं। सामान्य तौर पर, एक ही कक्षा में दो विवाहित शिक्षकों का न होना अच्छा व्यवहार माना जाता है। इसलिए इन दो शिक्षकों की दो अलग-अलग कक्षाएं होनी चाहिए
  • दो शिक्षक विवाहित हैं, और उनका बच्चा एक ही स्कूल में जाता है। फिर, आपको दो शिक्षकों को उस विशिष्ट कक्षा में पढ़ाने से रोकना होगा जहाँ उनका बच्चा है।
  • स्कूल में अलग-अलग सुविधाएं हैं, जैसे एक दिन कक्षा एक संस्थान में होती है, और दूसरे दिन कक्षा दूसरे में होती है।
  • स्कूल ने प्रयोगशालाओं को साझा किया है, लेकिन ये प्रयोगशालाएँ केवल कुछ कार्यदिवसों (सुरक्षा कारणों से, उदाहरण के लिए, जहाँ अतिरिक्त कर्मियों की आवश्यकता होती है) पर उपलब्ध हैं।
  • कुछ शिक्षकों की मुफ्त दिन के लिए प्राथमिकताएँ हैं: कुछ सोमवार को पसंद करते हैं, कुछ शुक्रवार को, कुछ बुधवार को। कुछ सुबह जल्दी आना पसंद करते हैं, कुछ बाद में आना पसंद करते हैं।
  • आपके पास ऐसी स्थिति नहीं होनी चाहिए जहां आपके पास कहने का सबक हो, पहले घंटे में इतिहास, फिर तीन घंटे का गणित, फिर एक और घंटे का इतिहास। इसका छात्रों के लिए कोई मतलब नहीं है, न ही शिक्षक के लिए।
  • आपको तर्क समान रूप से फैलाने चाहिए। यह समझ में नहीं आता है कि सप्ताह में पहले दिन केवल गणित, और फिर बाकी सप्ताह केवल साहित्य।
  • आपको मूल्यांकन परीक्षण करने के लिए कुछ शिक्षकों को लगातार दो घंटे देने चाहिए।

जैसा कि आप देख सकते हैं, समस्या एनपी-पूर्ण नहीं है, यह एनपी-पागल है।

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


12
"एनपी-पागल" - महान नाम;) मैं मानता हूं कि यह वास्तव में जटिल समस्या है, इस समस्या के "वास्तविक दुनिया" उपचार पर टिप्पणियों के लिए धन्यवाद। मेरे पिता और मेरी प्रेमिका शिक्षक भी हैं और मुझे पता है कि अधिकांश स्कूलों में प्लास्टिक के इनसेट के साथ टेबल हैं - यह मुझे इस समस्या के लिए संभव एल्गोरिथ्म की ओर ले जाता है - क्योंकि, अगर कोई व्यक्ति इसे हल कर सकता है, तो शायद यह लिखना संभव होगा यह एक एल्गोरिथ्म के रूप में नीचे है।
मोमबत्ती 23

10
आप जो लिखना चाहते हैं वह एक विशेषज्ञ प्रणाली है: एक प्रणाली जो कि न्यायिक नियमों के एक समूह से बनी है। विशेषज्ञ प्रणाली एक तरफ, यह एक ऐसा क्षेत्र है जहां आनुवंशिक एल्गोरिदम सबसे अच्छे दांवों में से हैं। समस्या को हल करने में कठिनाई झूठ नहीं है, न केवल। कठिनाई भी समस्या और उसकी बाधाओं को बताते हुए है।
स्टेफानो बोरीनी

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

1
आप इन बाधाओं और लक्ष्यों का MAXSAT में सीधे अनुवाद कर सकते हैं। MAXSAT एल्गोरिदम आम तौर पर आनुवंशिक एल्गोरिदम की तुलना में अधिक विश्वसनीय होते हैं, लेकिन हो सकता है कि आप क्लॉज विस्फोट हो, जैसे कि गणित की कक्षाओं को सप्ताह में फैलाना चाहिए।
जूल्स

26

अंतर्राष्ट्रीय समयसारणी की प्रतियोगिता 2007 के लिए एक सबक शेड्यूलिंग ट्रैक और परीक्षा समय-निर्धारण ट्रैक था। उस प्रतियोगिता में कई शोधकर्ताओं ने भाग लिया था। बहुत सारे आंकड़ें और भविष्यवाणियां करने की कोशिश की गई, लेकिन अंत में स्थानीय खोज metaheuristics (जैसे कि तब्बू खोज और नकली एनालिंग) ने अन्य एल्गोरिदम (जैसे आनुवंशिक एल्गोरिदम) को स्पष्ट रूप से हराया।

कुछ फाइनलिस्ट द्वारा उपयोग किए गए 2 ओपन सोर्स फ्रेमवर्क पर एक नज़र डालें:

  • JBoss OptaPlanner (जावा, खुला स्रोत)
  • यूनिटाइम (जावा, ओपन सोर्स) - विश्वविद्यालयों के लिए अधिक

17

मेरी आधी अवधि के कार्यों में से एक आनुवंशिक-एल्गोरिथ्म स्कूल तालिका पीढ़ी थी।

संपूर्ण तालिका एक "जीव" है। जेनेटिक जेनेटिक एल्गोरिदम के दृष्टिकोण में कुछ बदलाव और बदलाव थे:

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

  • "एक्सचेंज" म्यूटेशन "संशोधित" म्यूटेशन की तुलना में बहुत अधिक सामान्य थे। परिवर्तन केवल जीन के कुछ हिस्सों के बीच था, जो समझ में आता था - कक्षा के साथ शिक्षक का प्रतिस्थापन नहीं।

  • शिक्षक के काम के घंटे और कक्षा के भार को निरंतर बनाए रखने के लिए, एक ही समूह के अनुक्रम में समान सामान्य कक्षा निर्दिष्ट करने के लिए, कुछ बोनस को एक साथ 2 घंटे के लिए बंडल करने के लिए छोटे बोनस दिए गए थे। बॉन्ड (सुबह या दोपहर) के भीतर कक्षा के समय को रखने और दिए गए विषय के लिए सही क्लासरूम देने के लिए मॉडरेट बोनस सौंपा गया था। बड़े बोनस दिए गए विषय की सही संख्या निर्दिष्ट करने के लिए थे, एक शिक्षक के लिए दिए गए कार्यभार आदि।

  • शिक्षक उचित भार के साथ "तब काम करना चाहते हैं", "फिर काम करने के लिए ठीक है", "फिर काम करना पसंद नहीं करता", "काम नहीं कर सकते हैं" के अपने कार्यभार कार्यक्रम बना सकते हैं। पूरे 24 घंटे कानूनी काम के घंटे थे, रात के समय को छोड़कर बहुत अवांछित था।

  • वजन समारोह ... ओह, हाँ। वजन समारोह, विशाल और राक्षसी उत्पाद (गुणा में) चयनित सुविधाओं और गुणों के लिए वजन का था। यह बेहद खड़ी थी, एक संपत्ति आसानी से ऊपर या नीचे के क्रम से इसे बदलने में सक्षम थी - और एक जीव में सैकड़ों या हजारों गुण थे। यह बिल्कुल भारी संख्या में वजन के रूप में हुआ, और प्रत्यक्ष परिणाम के रूप में, गणना करने के लिए एक bignum पुस्तकालय (gmp) का उपयोग करने की आवश्यकता है। कुछ 10 समूहों, 10 शिक्षकों और 10 कक्षाओं के एक छोटे से परीक्षण के लिए, प्रारंभिक सेट 10 ^ -200something के नोट के साथ शुरू हुआ और 10 ^ + 300something के साथ समाप्त हुआ। अधिक सपाट होने पर यह पूरी तरह अक्षम था। इसके अलावा, मूल्यों ने बड़े "स्कूलों" के साथ एक बहुत व्यापक दूरी बढ़ाई।

  • अभिकलन समय के अनुसार, कम समय के लिए एक छोटी आबादी (100) के बीच बहुत कम अंतर था और कम पीढ़ियों के लिए एक बड़ी आबादी (10k +)। एक ही समय में एक ही गुणवत्ता के बारे में उत्पादित गणना।

  • गणना (कुछ 1GHz सीपीयू पर) 10x10 + के पास स्थिर करने के लिए कुछ 1h लेगी, शेड्यूल उत्पन्न करना जो कि बहुत अच्छा लग रहा था, 10x10x10 टेस्ट केस के लिए।

  • समस्या आसानी से नेटवर्किंग सुविधा प्रदान करने से होती है जो कम्प्यूटेशन चलाने वाले कंप्यूटरों के बीच सबसे अच्छे नमूनों का आदान-प्रदान करती है।

परिणामी कार्यक्रम ने कभी भी दिन के उजाले को नहीं देखा मुझे सेमेस्टर के लिए एक अच्छा ग्रेड मिला। इसने कुछ वादे दिखाए लेकिन मुझे कभी भी कोई GUI जोड़ने और इसे आम जनता के लिए उपयोग करने के लिए पर्याप्त प्रेरणा नहीं मिली।


5
तो इसे खोलें और इसे विज्ञापित करें और कोशिश करें और इसमें कुछ शिक्षाविदों को प्राप्त करें? आगे की परियोजनाओं के लिए इसका फिर से उपयोग करें? तकनीकी रूप से इस तरह का एक कार्यक्रम 300 कर्मचारियों के लिए अकेले स्कूलों के लिए इष्टतम कार्यक्रम बनाने के लिए पैसे के लायक होगा, और वे आनुवांशिक रूप से इष्टतम कार्यक्रम की गणना करने के लिए कुछ दिन बिताने का मन नहीं करते हैं। बैच प्रोसेसिंग सोचो। हैलो हार्डवेयर और सॉफ्टवेयर अनुबंध;)
jcolebrand

1
बहुत अच्छा लगता है! मुझे आश्चर्य है कि अगर वजन फ़ंक्शन 0..1 रेंज में फ्लोट्स के साथ किया जा सकता है।
क्रेग मैकक्यून

1
@ क्रेग: कुछ ऐसा है जो फ्लैट समय के साथ गुणवत्ता में गिरावट या यहां तक ​​कि आबादी में कमी लाएगा, क्योंकि यादृच्छिक उत्परिवर्तन ने प्रजनन / चयन की तुलना में अधिक नकारात्मक परिवर्तनों का योगदान दिया। केवल अत्यधिक स्थिर गुणवत्ता समारोह स्थिर विकास देगा। निश्चित रूप से कार्य को सामान्य किया जा सकता है, लेकिन फिर भी, "बेहतर" जीन जीन को जीवित रहने के लिए एक उच्चतर अवसर प्राप्त करना होता है।
एसएफ।

9

यह समस्या जितनी मुश्किल है, उससे कहीं ज्यादा कठिन है।

जैसा कि अन्य लोगों ने कहा है, यह एक एनपी-पूर्ण समस्या है, लेकिन आइए इसका विश्लेषण करें कि इसका क्या मतलब है।

मूल रूप से, इसका मतलब है कि आपको सभी संभावित संयोजनों को देखना होगा।

लेकिन "देखो" आपको बहुत कुछ नहीं बताता है कि आपको क्या करने की आवश्यकता है।

सभी संभव संयोजनों को बनाना आसान है। यह डेटा की एक बड़ी मात्रा का उत्पादन कर सकता है, लेकिन आपको समस्या के इस हिस्से की अवधारणाओं को समझने में बहुत समस्या नहीं होनी चाहिए।

दूसरी समस्या जजिंग की एक है कि क्या एक दिया गया संयोजन अच्छा, बुरा या पिछले "अच्छे" समाधान से बेहतर है।

इसके लिए आपको केवल "यह एक संभावित समाधान है" से अधिक की आवश्यकता है।

उदाहरण के लिए, क्या एक ही शिक्षक सप्ताह के 5 दिन काम कर रहा है जो एक्स सप्ताह के लिए सीधा है? यहां तक ​​कि अगर यह एक काम कर रहे समाधान है, तो यह दो लोगों के बीच बारी-बारी से बेहतर समाधान नहीं हो सकता है, ताकि प्रत्येक शिक्षक एक सप्ताह में एक बार करें। ओह, आपने उस बारे में नहीं सोचा? याद रखें, यह वे लोग हैं जिनसे आप निपट रहे हैं, न कि केवल संसाधन आवंटन की समस्या।

यहां तक ​​कि अगर एक शिक्षक 16 सप्ताह के लिए पूर्णकालिक काम कर सकता है, तो यह एक समाधान की तुलना में एक उप-इष्टतम समाधान हो सकता है, जहां आप शिक्षकों के बीच वैकल्पिक करने की कोशिश करते हैं, और इस तरह का संतुलन सॉफ्टवेयर में बनाना बहुत कठिन है।

संक्षेप में, इस समस्या का एक अच्छा समाधान तैयार करना बहुत से लोगों के लिए, बहुत लायक होगा। इसलिए, इसे तोड़ना और हल करना आसान समस्या नहीं है। कुछ लक्ष्यों को पूरा करने के लिए तैयार रहें जो 100% नहीं हैं और उन्हें "अच्छा पर्याप्त" कह रहे हैं।


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

8

मेरा समय सारिणी एल्गोरिथ्म, एफईटी (फ्री टाइमटेबल सॉफ्टवेयर, http://lalescu.ro/liviu/fet/ , एक सफल एप्लिकेशन) में लागू किया गया:

एल्गोरिथ्म विधर्मी है। मैंने इसे "पुनरावर्ती स्वैपिंग" नाम दिया।

इनपुट: गतिविधियों का एक सेट A_1 ... A_n और बाधाएं।

आउटपुट: TA_1 का एक सेट ... TA_n (प्रत्येक गतिविधि का समय स्लॉट। कमरों को यहां रखा गया है, सरलता के लिए)। एल्गोरिदम को प्रत्येक गतिविधि को एक समय स्लॉट में, बाधाओं का सम्मान करना चाहिए। प्रत्येक TA_i 0 (T_1) और max_time_slots-1 (T_m) के बीच है।

प्रतिबंध:

C1) मूल: गतिविधियों की जोड़ी की एक सूची जो एक साथ नहीं हो सकती (उदाहरण के लिए, A_1 और A_2, क्योंकि उनके पास एक ही शिक्षक या एक ही छात्र हैं);

C2) अन्य बाधाओं के बहुत सारे (यहाँ सरलता को छोड़कर)।

समय-सारिणी एल्गोरिथ्म (जिसे मैंने "पुनरावर्ती स्वैपिंग" नाम दिया है):

  1. गतिविधियों को क्रमबद्ध करें, सबसे पहले कठिन। महत्वपूर्ण कदम नहीं, लेकिन एल्गोरिथ्म को शायद 10 गुना या उससे अधिक गति दें।
  2. उपरोक्त समय के बाद, प्रत्येक गतिविधि (A_i) को एक अनुमत समय स्लॉट में रखने की कोशिश करें। A_i के लिए उपलब्ध स्लॉट (T_j) खोजें, जिसमें इस गतिविधि को बाधाओं का सम्मान करते हुए रखा जा सकता है। यदि अधिक स्लॉट उपलब्ध हैं, तो एक यादृच्छिक चुनें। यदि कोई उपलब्ध नहीं है, तो पुनरावर्ती स्वैपिंग करें:

    a । हर बार स्लॉट T_j के लिए, विचार करें कि क्या होता है यदि आप A_i को T_j में डालते हैं। अन्य गतिविधियों की एक सूची होगी जो इस कदम से सहमत नहीं हैं (उदाहरण के लिए, गतिविधि A_k एक ही स्लॉट T_j पर है और एक ही शिक्षक या A_i के समान छात्र हैं)। प्रत्येक टाइम स्लॉट T_j के लिए परस्पर विरोधी गतिविधियों की सूची रखें।

    बी । सबसे कम परस्पर विरोधी गतिविधियों के साथ एक स्लॉट (T_j) चुनें। इस स्लॉट में गतिविधियों की सूची में 3 गतिविधियाँ कहें: A_p, A_q, A_r।

    सी । T_j पर A_i रखें और A_p, A_q, A_r को असंबद्ध करें।

    d । A_p पर A_p, A_q, A_r (यदि पुनरावृत्ति का स्तर बहुत बड़ा नहीं है, तो 14 कहने का प्रयास करें, और यदि A_i पर चरण 2 से गिने गए पुनरावर्ती कॉल की कुल संख्या बड़ी नहीं है, तो 2 * n कहें,) जैसा कि चरण 2 में है)।

    । यदि सफलतापूर्वक A_p, A_q, A_r रखा गया है, तो सफलता के साथ लौटें, अन्यथा अन्य समय स्लॉट्स की कोशिश करें (चरण 2 बी पर जाएं) और अगला सर्वश्रेष्ठ समय स्लॉट चुनें।

    । यदि सभी (या उचित संख्या में) समय स्लॉट्स को असफल करने की कोशिश की गई थी, तो सफलता के बिना वापस लौटें।

    जी । यदि हम स्तर 0 पर हैं, और हमें A_i रखने में कोई सफलता नहीं मिली है, तो इसे चरण 2 b) और 2 c) में रखें, लेकिन पुनरावृत्ति के बिना। अब हमारे पास 3 - 1 = 2 और गतिविधियाँ होंगी। चरण 2 पर जाएं) (साइकिल चलाने से बचने के कुछ तरीके यहां उपयोग किए जाते हैं)।


1
एफईटी मेरे लिए बहुत उपयोगी रहा है। धन्यवाद @Liviu Lalescu!
नोएल लेवलेरेस

6

अद्यतन: टिप्पणियों से ... उसके आंकड़े भी होने चाहिए!

मैं प्रोलॉग के साथ जाऊँगा ... फिर रूबी या पर्ल या कुछ का उपयोग करके अपने घोल को प्रिटियर रूप में साफ़ करूँगा।

teaches(Jill,math).
teaches(Joe,history).

involves(MA101,math).
involves(SS104,history).

myHeuristic(D,A,B) :- [test_case]->D='<';D='>'.
createSchedule :- findall(Class,involves(Class,Subject),Classes),
                  predsort(myHeuristic,Classes,ClassesNew),
                  createSchedule(ClassesNew,[]).
createSchedule(Classes,Scheduled) :- [the actual recursive algorithm].

मैं (अभी भी) इस समस्या के समान कुछ करने की प्रक्रिया में हूं लेकिन उसी रास्ते का उपयोग कर रहा हूं जैसा मैंने अभी उल्लेख किया है। प्रोलॉग (एक कार्यात्मक भाषा के रूप में) वास्तव में एनपी-हार्ड समस्याओं को हल करना आसान बनाता है।


1
प्रोलॉग निश्चित रूप से आवश्यक समस्याओं को व्यक्त करने के लिए एक शानदार भाषा है, हालांकि जैसा कि आप बताते हैं: समस्या एनपी-पूर्ण है, अगर एनपी-हार्ड नहीं है। इसका अर्थ है कि व्यावहारिक कार्यान्वयन के लिए प्रोलॉग पर्याप्त तेज़ नहीं हो सकता है।
पॉइडेक्सटर

3
अगर यह एनपी के साथ कुछ भी करना है और हम सन्निकटन से संतुष्ट नहीं होंगे, तो कोई भी नियतात्मक एल्गोरिथ्म तेजी से चूस लेगा :)
गेब्रियल Gabričerbák

1
फिर लक्ष्य, प्रभावी उत्तराधिकार को लागू करना है ... उदाहरण के लिए एक सरल 9 कार्य शेड्यूलिंग एल्गोरिथ्म को पूरा करने के लिए 3.078s लगते हैं, लेकिन एक छोटी से छोटी विन्दु के साथ अनुमानी ने केवल एक ही समस्या को लागू किया: 0.123s
रीड डेबाइस्ट

2
HAHA, प्रोलॉग (अकेला) कभी भी कभी नहीं होगा। बड़े अक्षरों के लिए क्षमा करें, लेकिन मेरे पास 10 या 15 साल पहले एक ही विचार था और पूरी तरह से विफल रहा। यह नहीं कि यह धीमा था, नहीं। यह सरल किसी भी वास्तविक दुनिया के मामलों को हल नहीं कर सकता;)
करुसेल

5

जेनेटिक एल्गोरिदम का उपयोग अक्सर ऐसे शेड्यूलिंग के लिए किया जाता है।

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


5

1
शेड्यूलिंग यूटिलिटीज और टूल्स लिंक मर चुका है
बारन

@Bran Wayback मशीन का उपयोग करें और आपको सूची मिल जाएगी
srijanshukla

3

इस पत्र में स्कूल की समय सारिणी की समस्या और एल्गोरिथ्म के बारे में उनके दृष्टिकोण का अच्छी तरह से वर्णन किया गया है: " स्कूल और कॉलेजों के लिए SYLLABUS- एक इंटरएक्टिव, कांस्ट्रेन्ड-आधारित शेड्यूलर का विकास। " [PDF]

लेखक ने मुझे सूचित किया कि SYLLABUS सॉफ्टवेयर अभी भी यहाँ उपयोग / विकसित किया जा रहा है: http://www.scientia.com/uk/


3

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

सबसे महत्वपूर्ण सबसे महत्वपूर्ण प्रश्न जिसे आपको जल्दी हल करने की आवश्यकता है, वह है जो इस प्रणाली को दूसरे से बेहतर बनाने का एक तरीका है ? यही कारण है कि, यदि मेरा श्रीमती जोंस के साथ 8 और मैथ को 9 साल की उम्र में गणित पढ़ाने का शेड्यूल है, तो क्या यह बेहतर है या दोनों में से एक के साथ 10 में गणित पढ़ाना बेहतर है? क्या यह श्रीमती जोंस के साथ 8 से बेहतर है और श्री जोंस 2 पर पढ़ा रहे हैं? क्यों?

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

एक स्थानीय-खोज अनुकूलन पास का उपयोग अक्सर बेहतर परिणामों के लिए अंतिम उत्तर "पॉलिश" करने के लिए किया जाता है।

ध्यान दें कि आमतौर पर हम स्कूल शेड्यूलिंग में अत्यधिक संसाधन-विवश प्रणालियों से निपट रहे हैं। स्कूल वर्ष के 75% लाउंज में बैठे बहुत सारे खाली कमरे या शिक्षकों के साथ वर्ष के माध्यम से नहीं जाते हैं। वे दृष्टिकोण जो समाधान-समृद्ध वातावरण में सबसे अच्छा काम करते हैं, वे स्कूल निर्धारण में आवश्यक रूप से लागू नहीं होते हैं।


2

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


1

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

सौभाग्य !


1

आप इसे जेनेटिक एल्गोरिदम से हां कर सकते हैं। लेकिन आपको :) नहीं करना चाहिए। यह बहुत धीमा हो सकता है और पैरामीटर ट्यूनिंग बहुत समयबद्ध हो सकता है आदि।

अन्य सफल दृष्टिकोण हैं। सभी ओपन सोर्स प्रोजेक्ट्स में लागू:

  • बाधा आधारित दृष्टिकोण
    • यूनीटाइम में लागू (वास्तव में स्कूलों के लिए नहीं)
    • आप आगे भी जा सकते हैं और इंटेगर प्रोग्रामिंग का उपयोग कर सकते हैं। व्यावसायिक सॉफ्टवेयर (ILOG CPLEX) का उपयोग करके उडीन विश्वविद्यालय और विश्वविद्यालय बेयरुथ (मैं वहां शामिल था) में सफलतापूर्वक किया गया
    • हेयरिस्टिस्क के साथ नियम आधारित दृष्टिकोण - ड्रोल्स योजनाकार देखें
  • विभिन्न आंकड़े - FET और मेरे अपने

समय-सारिणी सॉफ़्टवेयर सूची के लिए यहां देखें


0

मुझे लगता है कि आपको आनुवंशिक एल्गोरिथ्म का उपयोग करना चाहिए क्योंकि:

इस पर भी एक नज़र डालें: एक समान प्रश्न और दूसरा एक


0

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

periodflag.each do | k2, v2 |

            if(TimetableDefinition.find(k2).period.to_i != 0)
                subjectflag.each do |k3,v3|
                    if (v3 == 0)
                        if(getflag_period(periodflag,k2))
                            @teachers=EmployeesSubject.where(subject_name: @subjects.find(k3).name, division_id: division.id).pluck(:employee_id)
                            @teacherlists=Employee.find(@teachers)
                            teacherflag=Hash[teacher_flag(@teacherlists,teacherflag,flag).to_a.shuffle] 
                            teacherflag.each do |k4,v4|
                                if(v4 == 0)
                                    if(getflag_subject(subjectflag,k3))
                                        subjectperiod=TimetableAssign.where("timetable_definition_id = ? AND subject_id = ?",k2,k3)
                                        if subjectperiod.blank?
                                            issubjectpresent=TimetableAssign.where("section_id = ? AND subject_id = ?",section.id,k3)
                                            if issubjectpresent.blank?
                                                isteacherpresent=TimetableAssign.where("section_id = ? AND employee_id = ?",section.id,k4)
                                                if isteacherpresent.blank?
                                                    @finaltt=TimetableAssign.new
                                                    @finaltt.timetable_struct_id=@timetable_struct.id
                                                    @finaltt.employee_id=k4
                                                    @finaltt.section_id=section.id
                                                    @finaltt.standard_id=standard.id
                                                    @finaltt.division_id=division.id
                                                    @finaltt.subject_id=k3
                                                    @finaltt.timetable_definition_id=k2
                                                    @finaltt.timetable_day_id=k1
                                                    set_school_id(@finaltt,current_user)
                                                    if(@finaltt.save)

                                                        setflag_sub(subjectflag,k3,1)
                                                        setflag_period(periodflag,k2,1)
                                                        setflag_teacher(teacherflag,k4,1)
                                                    end
                                                end
                                            else
                                                @subjectdetail=TimetableAssign.find_by_section_id_and_subject_id(@section.id,k3)
                                                @finaltt=TimetableAssign.new
                                                @finaltt.timetable_struct_id=@subjectdetail.timetable_struct_id
                                                @finaltt.employee_id=@subjectdetail.employee_id
                                                @finaltt.section_id=section.id
                                                @finaltt.standard_id=standard.id
                                                @finaltt.division_id=division.id
                                                @finaltt.subject_id=@subjectdetail.subject_id
                                                @finaltt.timetable_definition_id=k2
                                                @finaltt.timetable_day_id=k1
                                                set_school_id(@finaltt,current_user)
                                                if(@finaltt.save)

                                                    setflag_sub(subjectflag,k3,1)
                                                    setflag_period(periodflag,k2,1)
                                                    setflag_teacher(teacherflag,k4,1)
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.