आइए शाखा और बाउंड टू नॅप्सैक लागू करें , उम्मीद है कि यह आपके लिए अवधारणा को स्पष्ट कर देगा।
हमारे पास है n आइटम, लेबल 1 के माध्यम से n। vमैं का मान है मैंवें आइटम, और wमैंउसका वजन। हम उन्हें एक ऐसे अंतराल में फिट करने की कोशिश करते हैं जिसमें शामिल हो सकते हैंटी कुल में वजन, और हम उस आइटम के मूल्यों को अधिकतम करने की कोशिश करते हैं जो हमने थप्पड़ में डाल दिया था।
साधारण बैकट्रैक अप्रोच हमारा आधार है। हमने पहले डालाv1 पैक में, और फिर शेष के लिए समस्या का समाधान करें एन - 1पुनरावर्ती के साथ आइटम। हम तो हटा देते हैंv1 पैक से और शेष के लिए समस्या हल करें एन - 1 आइटम फिर से, और हम सबसे अच्छा विन्यास लौटाते हैं जो हमने पाया है।
यह बैकट्रैकिंग ब्रांच और बाउंड का 'ब्रांच' हिस्सा है। आप (नैकपैक के मामले में) दो मामलों पर शाखा करते हैं: 'आइटममैं समाधान का हिस्सा है 'और' आइटम मैंसमाधान का हिस्सा नहीं है '। आप इसे एक द्विआधारी वृक्ष के रूप में देख सकते हैं, जहां बायां बच्चा एक मामला है और दायां बच्चा दूसरा मामला है। यह वृक्ष खोज वृक्ष (या खोज स्थान ) है: इसकी गहराई हैn, और इसलिए यह है ओ (2n)नोड्स। इसलिए एल्गोरिथ्म में आइटमों की संख्या में चल रहा समय घातांक है।
अब हम 'बाउंड' भाग में आते हैं: हम मानदंड खोजने की कोशिश करते हैं, जैसे कि हम कह सकते हैं कि 'यह कॉन्फ़िगरेशन कभी भी काम नहीं करता है, इसलिए हम इसे कंप्यूटिंग के लिए परेशान नहीं कर सकते'। इस तरह की कसौटी का एक उदाहरण है 'उन वस्तुओं का वजन जो हमने पहले ही नैकपैक में डाल दिया हैटी': अगर हमने जोड़ा है, तो पहले कहो एन / २ नैकपैक के लिए आइटम और इसलिए यह पहले से ही भरा हुआ है, आइटम डालने की कोशिश करने का कोई मतलब नहीं है n / 2 + 1 के माध्यम से n के रूप में अच्छी तरह से में, लेकिन वहाँ भी कोई सबसेट फिट करने की कोशिश में कोई मतलब नहीं है n / 2 + 1 के माध्यम से n थैला में, जैसा कि यह पहले से ही भरा हुआ है, इसलिए हम इसके बारे में बचाते हैं 2एन / २मामलों। एक अन्य उदाहरण है ' यहां तक कि अगर मैं सभी शेष मदों में डाल देता हूं, तो मैंने जिन वस्तुओं को रखा है उनका मूल्य उस सर्वोत्तम कॉन्फ़िगरेशन से अधिक नहीं होगा जो मैंने अब तक पाया है ।'
ये मानदंड अनिवार्य रूप से खोज ट्री के कुछ हिस्सों को काट देते हैं: कुछ नोड पर, आप उदाहरण के लिए कहते हैं 'बाईं सबट्री मुझे बेहतर कॉन्फ़िगरेशन नहीं देगी, क्योंकि X', इसलिए आप उस सबट्री के बारे में भूल जाते हैं और आप इसे एक्सप्लोर नहीं करते हैं। गहराई का एक उपप्रकारघ आप इस तरह से काटते हैं कि आपको बचाता है ओ (2घ) यदि आप भाग्यशाली हैं, तो नोड्स, जो गति में काफी वृद्धि कर सकते हैं।
ध्यान दें कि इसे ' बाउंडिंग ' कहा जाता है क्योंकि इसमें आमतौर पर किसी प्रकार की निचली या ऊपरी सीमा शामिल होती है: 'कसौटी के लिए' यहां तक कि अगर मैं सभी शेष मदों में डाल देता हूं, तो मैंने जिन वस्तुओं को रखा है उनका मूल्य सर्वश्रेष्ठ कॉन्फ़िगरेशन से अधिक नहीं होगा मैंने अब तक पाया है ', आपके अब तक के सबसे अच्छे कॉन्फ़िगरेशन का मूल्य सबसे अच्छे कॉन्फ़िगरेशन पर एक कम बाध्य है, इसलिए ऐसा कुछ भी जो इसे कभी नहीं बनाएगा, यह निम्न सीमा विफल होने के लिए बर्बाद है।
आप can बाउंडिंग ’भाग को जितना चाहें उतना जटिल बना सकते हैं। उदाहरण के लिए, पूर्णांक प्रोग्रामिंग समस्याओं को अक्सर आराम का उपयोग करके हल किया जाता है: आप अपने कार्यक्रम को एक रैखिक कार्यक्रम में आराम देते हैं, जिसे आप बहुपद में हल कर सकते हैं, और फिर आप अपने बाइनरी चर के लिए बहुत सारे मामले फेंक सकते हैं जो कभी भी बाहर काम नहीं करेंगे। आप फिर शेष विकल्पों पर शाखा।
ध्यान दें कि शाखा और बाउंड आमतौर पर आपको केवल अभ्यास में गति में वृद्धि प्रदान करते हैं, लेकिन सिद्धांत रूप में नहीं: यह कहना मुश्किल है कि खोज के पेड़ को आपके उत्तराधिकारियों का उपयोग करके कितना काट दिया जाता है। यह इस तरह की समस्याओं पर अभ्यास में उपयोग किए जाने वाले विभिन्न आंकड़ों की संख्या से प्रमाणित होता है। यदि आप अशुभ हैं, तो बचे हुए खोज ट्री बहुत अधिक बाउंडिंग के साथ भी विशाल बने हुए हैं।