नैकपैक समस्या का वेरिएंट


11

यदि आप अब निरंतर द्वारा नॅप्सैक में आइटम की संख्या को सीमित करना चाहते हैं, तो आप एक गतिशील प्रोग्रामिंग स्थिति में नैकपैक समस्या से कैसे संपर्क करेंगे ? यह एक ही समस्या है ( का अधिकतम वजन , प्रत्येक आइटम का मूल्य और वजन ) लेकिन आप केवल आइटम (नों) को जोड़- जोड़ सकते हैं और जाहिर है कि इसे knapsack के मूल्य को अनुकूलित करने की आवश्यकता है।pWvwp

क्या हमें तीसरे आयाम की आवश्यकता है या हम इसके बिना एक अन्य दृष्टिकोण पा सकते हैं। मैंने सेल में नॅप्सैक में केवल आइटम की संख्या को जोड़ने की कोशिश की और आइटम की संख्या के साथ अंत में अधिकतम मूल्य ले रहा है <= लेकिन यह सबसे अच्छा समाधान नहीं है।p


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

जवाबों:


9

बहुत अच्छा सवाल!

आप दो बार सही हैं:

  1. Knapsack में वस्तुओं की संख्या को प्रचारित करने से इष्टतम समाधान नहीं होता है।
  2. एक समाधान में तीसरे आयाम को जोड़ना शामिल है। यह सरल है लेकिन ऐसा करते समय कुछ तथ्यों को ध्यान में रखना आवश्यक है। ध्यान दें कि यह एकमात्र विकल्प नहीं है

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

आइए हम पहले विशिष्ट मामले पर ध्यान दें: वस्तुओं की संख्या अप्रतिबंधित है । इस स्थिति में, आप केवल एक तालिका बनाते हैं, जहाँ में इष्टतम मान होता है, जब नैकपैक की समग्र क्षमता और केवल पहले आइटम के बराबर होती है । यहां से:टी आई , जे आई जेTTi,jij

Ti,j=max{Ti,j1,Tiwj,j1+vj}

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

हालाँकि, यह पर्याप्त नहीं है जब आप अपनी बाधा जोड़ते हैं: अधिकतम आइटम । कारण यह है कि पिछले पुनरावृत्ति फार्मूला में वस्तुओं के विभिन्न संयोजनों को ध्यान में नहीं रखा गया है:p

  1. सबसे पहले, अगर तो ताकि वें वस्तु माना आइटम, की अधिकतम संख्या के बावजूद नैपसैक में जोड़ा जाता है --- ताकि आप अपने बाधा उल्लंघन कर रही है। ठीक है, आप प्रत्येक चरण में डाली गई वस्तुओं की संख्या पर नज़र रखते हुए पूर्ववर्ती फॉर्मूला लागू करने के लिए यहां परीक्षा दे सकते हैं और यदि नोकपैक में वर्तमान में आइटम की संख्या से अधिक है , तो दूसरों को न जोड़ें , लेकिन,Ti,j1<(Tiwj,j1+vj)Ti,j=(Tiwj,j1+vj)jpp
  2. दूसरा, यदि तो ताकि यह आइटम जोड़ा न जाए लेकिन इष्टतम समाधान मामले में एक बड़ी गलती हो सकती है जिसमें पहले से ही आइटम की अधिकतम संख्या शामिल है जो कि नैकपैक में सम्मिलित हो। कारण यह है कि हम ठीक से तुलना नहीं कर रहे हैं: एक तरफ, पिछले बीच चयनित वस्तुओं से मिलकर इष्टतम समाधान को संरक्षित करने के लिए ; दूसरी ओर, -th आइटम सम्मिलित करने के लिए और, इसके अलावा पिछले बीच आइटम के साथ सबसे अच्छा सबसेट पर विचार करें ।Ti,j1>(Tiwj,j1+vj)Ti,j=Ti,j1Ti,j1p(j1)j(p1)(j1)

ताकि पहले समाधान में तीसरा आयाम शामिल हो। आपके मामले के लिए, इष्टतम समाधान हो जब नैकपैक की क्षमता , केवल पहले आइटमों पर विचार किया जाता है और इसे knapsack में आइटम से अधिक रखने की अनुमति नहीं है । अभी,Ti,j,kijk

  • यदि आप को कई वस्तुओं के लिए सख्ती से कम या बराबर कर रहे हैं, जो सम्मिलित किए जा सकने वाले आइटमों की संख्या ( ) से अधिक है तो सामान्य रूप से आगे बढ़ें, लेकिन : के समान मान का उपयोग करकेTi,j,kjkkTi,j,k=max{Ti,j1,k,Tiwj,j1,k+vj}
  • अब, यदि आपको कई आइटमों की संख्या की तुलना में सख्ती से बड़ी संख्या में को सम्मिलित करना है, जो तब डाले जा सकते हैं ( ) तो:Ti,j,kj>kTi,j,k=max{Ti,j1,k,Tiwj,j1,k1+vj}

पहली अभिव्यक्ति स्पष्ट होनी चाहिए। तालिका की -th परत के बाद दूसरा काम करता है, ऊपर दिए गए पहले बीच वस्तुओं के सर्वोत्तम संयोजन का ट्रैक रखता है।(k1)T(k1)(j1)

इस एल्गोरिथ्म के एक कुशल कार्यान्वयन गणना की जरूरत नहीं है सभी के लिए । नोट पूर्ववर्ती पुनरावृत्ति संबंधों परत संबंधित है कि के साथ और इस प्रकार, यह दो क्रमिक परतों (जैसे, यदि आप के साथ इष्टतम समाधान में रुचि रखने वाले कर रहे हैं के बीच वैकल्पिक के लिए संभव है तुम सिर्फ लगातार दो परतों का उपयोग: 0 (1, 1 और 2, 2 और 3, 3 और 4 और आप कर रहे हैं)। दूसरे शब्दों में, यह एल्गोरिथ्म गतिशील प्रोग्रामिंग के आधार पर पारंपरिक दृष्टिकोण द्वारा आवश्यक मेमोरी को दोगुना लेता है और इस प्रकार, यह अभी भी छद्म-बहुपद समय में चलाया जा सकता है।Ti,j,kkk(k1)k=4

हालाँकि, अवगत रहें, कि यह एकमात्र समाधान नहीं है! और एक और है जो आपको अधिक सुरुचिपूर्ण मिल सकती है। पूर्ववर्ती सूत्रों में, हम इष्टतम समाधान जो कोई तुलना में अधिक शामिल पुनः प्राप्त पहले के बीच में आइटम के रूप में । हालाँकि, यह स्पष्ट होना चाहिए कि यह मूल तालिका का उपयोग करके ठीक बराबर है !! अर्थात्।, आइटम से अधिक नहीं के साथ इष्टतम समाधान को 1 आइटम, 2 आइटम, 3 आइटम, ... साथ इष्टतम समाधान पर विचार करके भी पुनर्प्राप्त किया जा सकता है।(k1)(j1)Ti,j1,k1maxp=0,j1{Ti,p}k(j1)आइटम ... इस सूत्रीकरण कार्य को करने के लिए आपको हर आंशिक समाधान में विचार की गई वस्तुओं की संख्या पर भी नज़र रखनी चाहिए ताकि आपको प्रत्येक सेल में दो पूर्णांकों की आवश्यकता पड़े। यह स्मृति कब्जे एल्गोरिथ्म ऊपर दिखाए गए (परतों के रूप में एक तीसरे आयाम का उपयोग करने का ठीक उसी स्मृति जरूरतों के मामले में परिणाम )k

उम्मीद है की यह मदद करेगा,


बहुत बढ़िया प्रतिक्रिया, धन्यवाद। मैं आपकी पोस्ट से पहले 3 आयाम लागू करके इसके माध्यम से प्राप्त करने में सक्षम रहा हूं।
user11536

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

बहुआयामी शूरवीरों की समस्या का अद्भुत विवरण। जब भी मैं सोच रहा था कि हमारे पास भी ऐसा ही मामला है, लेकिन वास्तव में के तत्वों के साथ, हम केवल तीसरे आयाम के kth कॉलम द्वारा लौटाए गए मूल्यों को देखेंगे। यदि वहाँ कोई मूल्य नहीं हैं, तो 0.I लौटाएं मुझे यकीन नहीं है कि मैं सही हूं क्योंकि मैं अभी भी गतिशील प्रोग्रामिंग के लिए नया हूं।
स्टीव इर्विन

@ कार्लोसलीनारेस लोपेज का शानदार जवाब। क्या आप अजगर की स्क्रिप्ट भी साझा कर सकते हैं? शायद इसे gist.github.com पर पोस्ट करें?
साद मलिक

1
हाय @Carlos! मैंने यहां आपके वैकल्पिक सूत्र का उपयोग करने के लिए एक अनुवर्ती प्रश्न पोस्ट किया है: 0 -1 नैकपैक में एन-बेस्ट आइटम ढूंढना । वैसे भी मुझे आशा है कि आप अपनी छुट्टी का आनंद ले रहे होंगे!
साद मलिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.