गतिविधि चयन समस्या: Difference between revisions

From Vigyanwiki
Line 57: Line 57:


===भारित गतिविधि चयन समस्या===
===भारित गतिविधि चयन समस्या===
गतिविधि चयन समस्या के सामान्यीकृत संस्करण में गैर-अतिव्यापी गतिविधियों का एक इष्टतम सेट चुनना शामिल है ताकि कुल वजन अधिकतम हो। भार रहित संस्करण के विपरीत, भारित गतिविधि चयन समस्या का कोई ग्रीडी समाधान नहीं है। हालाँकि, निम्नलिखित दृष्टिकोण का उपयोग करके एक [[गतिशील प्रोग्रामिंग]] समाधान आसानी से बनाया जा सकता है:<ref>[http://www.cs.princeton.edu/~wayne/cs423/lectures/dynamic-programming-4up.pdf Dynamic Programming with introduction to Weighted Activity Selection]</ref>
गतिविधि चयन समस्या के सामान्यीकृत संस्करण में गैर-अतिव्यापी गतिविधियों के एक इष्टतम सेट का चयन करना शामिल है ताकि कुल वजन अधिकतम हो। बिना भारित संस्करण के विपरीत, भारित गतिविधि चयन समस्या का कोई लालची समाधान नहीं है। हालाँकि, एक डायनामिक प्रोग्रामिंग समाधान निम्नलिखित दृष्टिकोण का उपयोग करके आसानी से बनाया जा सकता है:<ref>[http://www.cs.princeton.edu/~wayne/cs423/lectures/dynamic-programming-4up.pdf Dynamic Programming with introduction to Weighted Activity Selection]</ref>
गतिविधि युक्त एक इष्टतम समाधान पर विचार करें {{mvar|k}}. अब हमारे पास बायीं और दायीं ओर गैर-अतिव्यापी गतिविधियाँ हैं {{mvar|k}}. इष्टतम उप-संरचना के कारण हम इन दो सेटों के लिए पुनरावर्ती समाधान ढूंढ सकते हैं। जैसा कि हम नहीं जानते {{mvar|k}}, हम प्रत्येक गतिविधि को आज़मा सकते हैं। यह दृष्टिकोण एक की ओर ले जाता है <math>O(n^3)</math> समाधान। गतिविधियों के प्रत्येक सेट के लिए इसे ध्यान में रखते हुए इसे और अधिक अनुकूलित किया जा सकता है <math>(i, j)</math>यदि हमें इसका समाधान पता होता तो हम इष्टतम समाधान पा सकते हैं <math>(i, t)</math>, कहाँ {{mvar|t}} अंतिम गैर-अतिव्यापी अंतराल है {{mvar|j}} में <math>(i, j)</math>. इससे एक प्राप्त होता है <math>O(n^2)</math> समाधान। इस तथ्य को ध्यान में रखते हुए इसे और अधिक अनुकूलित किया जा सकता है कि हमें सभी श्रेणियों पर विचार करने की आवश्यकता नहीं है <math>(i, j)</math> लेकिन इसके बजाय बस <math>(1, j)</math>. इस प्रकार निम्नलिखित एल्गोरिदम एक परिणाम देता है <math>O(n \log n)</math> समाधान:


<सिंटैक्सहाइलाइट लैंग= सी लाइन= 1 >
गतिविधि {{mvar|k}} वाले इष्टतम समाधान पर विचार करें। अब हमारे पास {{mvar|k}} के बायीं और दायीं ओर गैर-अतिव्यापी गतिविधियां हैं। इष्टतम उप-संरचना के कारण हम इन दोनों सेटों के लिए पुनरावर्ती रूप से समाधान ढूंढ सकते हैं। चूँकि हमें {{mvar|k}} पता नहीं है, हम प्रत्येक गतिविधि को आज़मा सकते हैं। यह दृष्टिकोण <math>O(n^3)</math> समाधान की ओर ले जाता है। इसे इस बात पर विचार करते हुए और अधिक अनुकूलित किया जा सकता है कि <math>(i, j)</math> में गतिविधियों के प्रत्येक सेट के लिए, हम इष्टतम समाधान पा सकते हैं यदि हमें <math>(i, t)</math> का समाधान पता था, जहां {{mvar|t}}, {{mvar|j}} के साथ अंतिम गैर-अतिव्यापी अंतराल है <math>(i, j)</math> इससे एक <math>O(n^2)</math> समाधान प्राप्त होता है. इस तथ्य को ध्यान में रखते हुए इसे और अधिक अनुकूलित किया जा सकता है कि हमें सभी श्रेणियों <math>(i, j)</math> पर विचार करने की आवश्यकता नहीं है, बल्कि इसके बजाय केवल <math>(1, j)</math> पर विचार करना है। इस प्रकार निम्नलिखित एल्गोरिथ्म एक l<math>O(n \log n)</math> समाधान उत्पन्न करता है:<syntaxhighlight lang="c++">
भारित-गतिविधि-चयन(एस): // एस = गतिविधियों की सूची
Weighted-Activity-Selection(S): // S = list of activities


     समाप्ति समय के अनुसार S को क्रमबद्ध करें
     sort S by finish time
     opt[0] = 0 // opt[j] S[1,2..,j] के लिए इष्टतम समाधान (चयनित गतिविधियों के भार का योग) का प्रतिनिधित्व करता है
     opt[0] = 0 // opt[j] represents optimal solution (sum of weights of selected activities) for S[1,2..,j]
    
    
     i = 1 से n के लिए:
     for i = 1 to n:
         t = समाप्ति समय के साथ गतिविधि खोजने के लिए बाइनरी खोज <= i के लिए प्रारंभ समय
         t = binary search to find activity with finish time <= start time for i
             // यदि ऐसी एक से अधिक गतिविधियाँ हैं, तो अंतिम समाप्ति समय वाली एक को चुनें
             // if there are more than one such activities, choose the one with last finish time
         ऑप्ट[i] = MAX(ऑप्ट[i-1], ऑप्ट[t] + w(i))
         opt[i] = MAX(opt[i-1], opt[t] + w(i))
          
          
     वापसी विकल्प[n]
     return opt[n]
</सिंटैक्सहाइलाइट>
</syntaxhighlight>


==संदर्भ==
==संदर्भ==

Revision as of 00:17, 6 August 2023

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

इस समस्या का एक उत्कृष्ट अनुप्रयोग कई प्रतिस्पर्धी घटनाओं के लिए एक कमरे को शेड्यूल करना है, जिनमें से प्रत्येक की अपनी समय की आवश्यकताएं (प्रारंभ और समाप्ति समय) होती हैं, और संचालन अनुसंधान के ढांचे के भीतर कई अन्य चीजें उत्पन्न होती हैं।

औपचारिक परिभाषा

मान लीजिए कि वहाँ n गतिविधियाँ मौजूद हैं, जिनमें से प्रत्येक को प्रारंभ समय si और समाप्ति समय fi द्वारा दर्शाया गया है। यदि sifj या sjfi हो तो दो गतिविधियाँ i और j गैर-विरोधाभासी कहलाती हैं। गतिविधि चयन समस्या में गैर-परस्पर विरोधी गतिविधियों के अधिकतम समाधान सेट (S) को खोजना शामिल है, या अधिक सटीक रूप से कोई समाधान सेट S' मौजूद नहीं होना चाहिए जैसे कि |S'| > |S| उस स्थिति में जब एकाधिक अधिकतम समाधानों का आकार समान होता है।

इष्टतम समाधान

गतिविधि चयन समस्या इस मायने में उल्लेखनीय है कि समाधान खोजने के लिए ग्रीडी एल्गोरिथ्म का उपयोग करने से हमेशा एक इष्टतम समाधान मिलेगा। एल्गोरिदम के पुनरावृत्त संस्करण का एक छद्मकोड स्केच और इसके परिणाम की इष्टतमता का प्रमाण नीचे शामिल है।

एल्गोरिदम

Greedy-Iterative-Activity-Selector(A, s, f): 

    Sort A by finish times stored in f
    S = {A[1]} 
    k = 1
    
    n = A.length
    
    for i = 2 to n:
        if s[i]  f[k]: 
            S = S U {A[i]}
            k = i
    
    return S

स्पष्टीकरण

लाइन 1: इस एल्गोरिदम को ग्रीडी-पुनरावृत्ति-गतिविधि-चयनकर्ता कहा जाता है, क्योंकि यह सबसे पहले एक ग्रीडी एल्गोरिथ्म है, और फिर यह पुनरावृत्त है। इस ग्रीडी एल्गोरिदम का एक पुनरावर्ती संस्करण भी है।

  • गतिविधियों से युक्त एक ऐरे है।
  • एक ऐरे है जिसमें गतिविधियों के प्रारंभ समय शामिल हैं।
  • एक ऐरे है जिसमें गतिविधियों के समापन समय शामिल हैं।

ध्यान दें कि इन ऐरे को 1 से शुरू करके संबंधित ऐरे की लंबाई तक अनुक्रमित किया जाता है।

लाइन 3: ऐरे में संग्रहीत समाप्ति समय का उपयोग करके गतिविधियों की ऐरे को समापन समय के बढ़ते क्रम में क्रमबद्ध करें। उदाहरण के लिए मर्ज सॉर्ट, हीप सॉर्ट, या क्विक सॉर्ट एल्गोरिदम का उपयोग करके यह ऑपरेशन समय में किया जा सकता है।

लाइन 4: एक सेट बनाएं चयनित गतिविधियों को संग्रहीत करने के लिए, और इसे गतिविधि के साथ प्रारंभ करने के लिए जिसका जल्द से जल्द खत्म होने का समय है।

लाइन 5: एक वेरिएबल बनाता है जो अंतिम चयनित गतिविधि के सूचकांक का ट्रैक रखता है।

लाइन 9: उस सरणी के दूसरे एलिमेंट से उसके अंतिम एलिमेंट तक पुनरावृति शुरू करता है।

लाइन 10,11: यदि गतिविधि का प्रारंभ समय अंतिम चयनित गतिविधि के समापन समय से अधिक या बराबर है, तब सेट में चयनित गतिविधियों के अनुकूल है, और इस प्रकार इसे में जोड़ा जा सकता है।

लाइन 12: अंतिम चयनित गतिविधि का सूचकांक अभी जोड़ी गई गतिविधि में अद्यतन किया जाता है।

इष्टतमता का प्रमाण

मान लीजिए समाप्ति समय के अनुसार गतिविधियों का समूह है। मान लें कि एक इष्टतम समाधान है, जिसे समापन समय के अनुसार भी क्रमबद्ध किया गया है; और A में पहली गतिविधि का सूचकांक है, यानी, यह इष्टतम समाधान ग्रीडी विकल्प से शुरू नहीं होता है। हम दिखाएंगे कि , जो ग्रीडी विकल्प (गतिविधि 1) से शुरू होता है, एक और इष्टतम समाधान है। चूँकि , और A में गतिविधियाँ परिभाषा के अनुसार असंयुक्त हैं, B में गतिविधियाँ भी असंयुक्त हैं। चूँकि B में A के समान ही गतिविधियाँ हैं, अर्थात , B भी इष्टतम है।

एक बार जब ग्रीडी विकल्प चुन लिया जाता है, तो समस्या उप-समस्या के लिए एक इष्टतम समाधान खोजने तक सिमट कर रह जाती है। यदि A, ग्रीडी विकल्प वाली मूल समस्या S का इष्टतम समाधान है, तो गतिविधि-चयन समस्या का इष्टतम समाधान है।

क्यों? यदि ऐसा नहीं होता, तो A' से अधिक गतिविधियों वाला एक समाधान B' से S' चुनें जिसमें S' के लिए ग्रीडी विकल्प हो। फिर, B′ में 1 जोड़ने से इष्टतमता के विपरीत, A की तुलना में अधिक गतिविधियों के साथ S से S का एक व्यवहार्य समाधान प्राप्त होगा।

भारित गतिविधि चयन समस्या

गतिविधि चयन समस्या के सामान्यीकृत संस्करण में गैर-अतिव्यापी गतिविधियों के एक इष्टतम सेट का चयन करना शामिल है ताकि कुल वजन अधिकतम हो। बिना भारित संस्करण के विपरीत, भारित गतिविधि चयन समस्या का कोई लालची समाधान नहीं है। हालाँकि, एक डायनामिक प्रोग्रामिंग समाधान निम्नलिखित दृष्टिकोण का उपयोग करके आसानी से बनाया जा सकता है:[1]

गतिविधि k वाले इष्टतम समाधान पर विचार करें। अब हमारे पास k के बायीं और दायीं ओर गैर-अतिव्यापी गतिविधियां हैं। इष्टतम उप-संरचना के कारण हम इन दोनों सेटों के लिए पुनरावर्ती रूप से समाधान ढूंढ सकते हैं। चूँकि हमें k पता नहीं है, हम प्रत्येक गतिविधि को आज़मा सकते हैं। यह दृष्टिकोण समाधान की ओर ले जाता है। इसे इस बात पर विचार करते हुए और अधिक अनुकूलित किया जा सकता है कि में गतिविधियों के प्रत्येक सेट के लिए, हम इष्टतम समाधान पा सकते हैं यदि हमें का समाधान पता था, जहां t, j के साथ अंतिम गैर-अतिव्यापी अंतराल है इससे एक समाधान प्राप्त होता है. इस तथ्य को ध्यान में रखते हुए इसे और अधिक अनुकूलित किया जा सकता है कि हमें सभी श्रेणियों पर विचार करने की आवश्यकता नहीं है, बल्कि इसके बजाय केवल पर विचार करना है। इस प्रकार निम्नलिखित एल्गोरिथ्म एक l समाधान उत्पन्न करता है:

Weighted-Activity-Selection(S):  // S = list of activities

    sort S by finish time
    opt[0] = 0  // opt[j] represents optimal solution (sum of weights of selected activities) for S[1,2..,j]
   
    for i = 1 to n:
        t = binary search to find activity with finish time <= start time for i
            // if there are more than one such activities, choose the one with last finish time
        opt[i] = MAX(opt[i-1], opt[t] + w(i))
        
    return opt[n]

संदर्भ


बाहरी संबंध