कैसे Brute बल से अलग गतिशील प्रोग्रामिंग है


19

जब मैं निम्नलिखित उद्धरण में आया तो मैं डायनामिक प्रोग्रामिंग पर पढ़ रहा था

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

निम्नलिखित उदाहरण दिया गया था

उदाहरण के लिए, मान लीजिए कि आपको भीड़-भाड़ वाले समय के दौरान, बिंदु A से बिंदु B तक, किसी दिए गए शहर में, जितना जल्दी हो सके, प्राप्त करना होगा। एक गतिशील प्रोग्रामिंग एल्गोरिथ्म पूरी ट्रैफ़िक रिपोर्ट पर ध्यान देगा, जो आपके द्वारा ली जाने वाली सड़कों के सभी संभावित संयोजनों को देख रही है, और उसके बाद ही आपको बताएगी कि कौन सा रास्ता सबसे तेज़ है। बेशक, आपको एल्गोरिथ्म खत्म होने तक कुछ समय तक इंतजार करना पड़ सकता है, और उसके बाद ही आप ड्राइविंग शुरू कर सकते हैं। आपके द्वारा लिया गया पथ सबसे तेज़ होगा (यह मानते हुए कि बाहरी वातावरण में कुछ भी नहीं बदला है)

ब्रूट फोर्स सर्वश्रेष्ठ समाधान पर निर्णय लेने से पहले हर संभव समाधान का प्रयास कर रहा है।

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

क्या मुझे यह कहना सही है कि डायनामिक प्रोग्रामिंग ब्रूट फोर्स मेथड का सबसेट है ??


1
ट्रैफ़िक की स्थिति एक लाल हेरिंग है। आप उन्हें किसी भी एल्गोरिथ्म में विचार कर सकते हैं।
युवल फिल्मस 16


आपका पहला उद्धरण गतिशील प्रोग्रामिंग को परिभाषित नहीं करता है।
रीइन्टीरियरपोस्ट

@reinierpost खैर, यह वहाँ के साथ पाने की कोशिश करता है intelligent, brute force, लेकिन फिर "बुद्धिमान" भाग का वर्णन करने के लिए भूल जाता है
इज़काता

@ इज़काटा उस तर्क से, हर एल्गोरिथ्म "बुद्धिमान जानवर बल" है (जो एक ऑक्सीमोरोन है, वैसे भी)।
राफेल

जवाबों:


17

एक गतिशील प्रोग्रामिंग एल्गोरिथ्म समस्या को हल करने के लिए सभी संभावित तरीकों की जांच करेगा और सबसे अच्छा समाधान उठाएगा।

यह बयान सिर्फ सादा गलत है।

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

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

एक ठोस उदाहरण के रूप में, पर विचार Bellman- फोर्ड एल्गोरिथ्म पर एक पूर्ण ग्राफ इकाई वजन के साथ: यह केवल कभी लंबाई एक और दो के रास्ते (यानी समझता है Θ ( n 2 ) कई), क्योंकि एक किनारे का उपयोग कर उन सभी इष्टतम हैं । यदि आप अनुमत किनारों की अधिकतम संख्या को बाध्य नहीं करते हैं, और फिर भी inf ( एन - 1 ) नहीं हैं, तो असीम रूप से कई समाधान हैं ! यदि आप प्रत्येक नोड को केवल एक बार उपयोग करने की अनुमति देते हैं। तो स्पष्ट रूप से, बेलमैन-फोर्ड - एक गतिशील प्रोग्रामिंग एल्गोरिदम - एक क्रूर-बल खोज नहीं करता है ।KnΘ(n2)(n1)!


"यह कथन सिर्फ सादा गलत है" - इसे ठीक करें
nmclean

4
@nmclean विकिपीडिया पर संपादन एल्गोरिथ्म से संबंधित लेखों के साथ मेरा अनुभव सुखद से कम रहा है, इसलिए नहीं। मैं यहां अपना समय निवेश करना चाहता हूं।
राफेल

मैंने अपनी किस्मत आजमाई और लेख को संपादित किया। उम्मीद है कि अब यह थोड़ा कम गलत है।
C4stor

9

डायनामिक प्रोग्रामिंग चतुर है क्योंकि यह गणना बल का पुन: उपयोग करता है, जबकि जानवर बल नहीं करता है। मान लीजिए, f (6) को हल करने के लिए, आपको 2 उप-समस्याओं को हल करने की आवश्यकता है, जिसे दोनों f (3) कहते हैं। ब्रूट फोर्स विधि दो बार f (3) की गणना करेगी, जिससे डायनेमिक प्रोग्रामिंग एक बार कॉल कर लेगी, परिणाम को सहेजने की स्थिति में भविष्य की संगणना का उपयोग करने की आवश्यकता होती है। कई समस्याओं में, गतिशील बल की बहुपद जटिलता से बहुपद जटिलता में सुधार होता है।


9
यह संस्मरण है , जो डीपी को रोजगार देने वाली कई चालों में से एक है।
Ben Voigt

4
स्मरण के साथ क्रूर बल अभी भी अक्षम है; केवल अतिरिक्त संरचना / डीपी पुनरावृत्ति द्वारा प्रदान की गई छंटनी, भुगतान को बंद कर देती है।
राफेल

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

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

या, इसे और भी सरल शब्दों में कहें: यदि आप जानते हैं कि पास्कल के त्रिकोण का उपयोग करके एक द्विपद गुणांक की गणना कैसे की जाती है, तो आप सभी जानते हैं कि आपको कभी भी गतिशील प्रोग्रामिंग के बारे में जानने की आवश्यकता है।
MRA

3

विकिपीडिया लेख के भेद को तीन प्रकार के एल्गोरिदम के बीच बनाने की कोशिश हो सकती है:

  1. एल्गोरिदम जो सभी संभव समाधानों पर जाते हैं, इष्टतम को चुनना।

  2. एल्गोरिदम जो सभी संभव समाधानों के सबसेट पर जाते हैं, इसलिए चुना जाता है कि इष्टतम समाधान सबसेट का है।

  3. एल्गोरिदम जो सभी संभावित समाधानों के सबसेट पर जाते हैं, इस गारंटी के बिना कि इष्टतम समाधान सबसेट का है।

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

मुझे सभी तीन प्रकार के एल्गोरिदम के लिए सरल उदाहरण देकर शुरू करना चाहिए, सबसे छोटा रास्ता (आपके द्वारा दिया गया उदाहरण)।

  1. सभी संभव पथ का प्रयास करें। यह पाशविक बल के रूप में जाना जाता है ।

  2. अब तक के न्यूनतम समाधान पर नज़र रखते हुए, सभी संभव रास्तों को आज़माएँ। जब भी आप जिस वर्तमान पथ का निर्माण कर रहे हैं, वह अब तक के न्यूनतम समाधान की तुलना में अधिक महंगा है, तो इसे छोड़ दें और दूसरा चुनें (हम कल्पना करते हैं कि दूरी एक खंड-दर-खंड आधार पर गणना की गई है)। इसे प्रूनिंग कहा जाता है ।

  3. नक्शे को देखें, कुछ रास्तों पर विचार करें, और उनमें से सबसे अच्छा चुनें। यह कंप्यूटर के बजाय मानव के लिए एक एल्गोरिथ्म है।

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

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

ttt+1t


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

0

गतिशील प्रोग्रामिंग जानवर बल की तुलना में बहुत तेज है। ब्रूट बल में तेजी से समय लग सकता है, जबकि डायनामिक प्रोग्रामिंग आमतौर पर बहुत तेज होती है।

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


5
यह एक परिणाम है, एक स्पष्टीकरण नहीं है।
राफेल

-2

यह सीधा है। डायनेमिक प्रोग्रामिंग एक "खोज रणनीति" है जो खोज को कम करने के लिए अतिरिक्त कारकों का उपयोग करती है। यदि खोज स्थान में कोई समाधान नहीं है, तो डायनामिक प्रोग्रामिंग (आमतौर पर) खोज स्थान के प्रत्येक तत्व के माध्यम से एक खोज करेंगे । लेकिन इसका मतलब यह नहीं है कि यह एक क्रूर बल खोज है।


"यदि खोज स्थान में कोई समाधान नहीं है, तो डायनामिक प्रोग्रामिंग (आमतौर पर) खोज स्थान के प्रत्येक तत्व के माध्यम से एक खोज करेंगे।" - गलत है, मेरा जवाब देखिए।
राफेल

-2

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


1
"आप प्रत्येक छोटे टुकड़े को हल करने के लिए जानवर बल का उपयोग कर रहे होंगे" - गलत। आप आमतौर पर एक ही दृष्टिकोण का पुनरावर्ती उपयोग कर रहे होंगे।
फ्रैंक 19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.