अनफ़िल्टर्ड ग्राफ़ में सबसे छोटे रास्तों को खोजने के लिए DFS का उपयोग क्यों नहीं किया जा सकता है?


16

मैं समझता हूँ कि "जैसा है" डीएफएस का उपयोग करने से किसी अनवेटेड ग्राफ़ में सबसे छोटा रास्ता नहीं मिलेगा।

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

क्या आप किसी भी संशोधन को जानते हैं जो डीएफएस को अनवैल्टेड ग्राफ़ में सबसे छोटे रास्तों को खोजने की अनुमति देगा? यदि नहीं, तो यह एल्गोरिथ्म के बारे में क्या है जो इसे इतना मुश्किल बनाता है?


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

1
कुछ (अच्छी तरह से चुने हुए) ग्राफ़ पर डीएफएस का उपयोग करने का प्रयास करें; अगर यह वास्तव में काम नहीं करता है, तो आपको समस्याओं का सामना करना चाहिए। Btw, आपका प्रश्न पढ़ता है जैसे कि यह भारित रेखांकन पर काम करता है।
राफेल

हां तुम यह कर सकते हो। यहाँ समाधान है
अनमोल मिड्ढा

जवाबों:


12

आपके द्वारा खोजे जाने वाले गहराई-प्रथम खोज का एकमात्र तत्व वह क्रम है जिसमें बच्चों की जांच की जाती है। सामान्य संस्करण मनमानी क्रम में आगे बढ़ता है, अर्थात बच्चों को संग्रहीत करने के क्रम में।

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

लालची शासन के लिए काउंटर उदाहरण
[ स्रोत ]

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

हालाँकि, कोई फर्क नहीं पड़ता कि नियम ¹ आप ग्राफ का निर्माण कर सकते हैं जो डीएफएस के लिए बहुत पहले नोड पर लंबे समय तक चक्कर लगाने के लिए प्रतिबद्ध है, जैसा कि मैंने लालची नियम के लिए किया था। असाइन किनारों और वजन ऐसी है कि शासन चुनता यात्रा करने के लिए पहले, और असाइन में से एक से एक वजन अधिक से अधिक । इसलिए, यह प्रशंसनीय है कि डीएफएस कभी भी सबसे छोटे रास्ते (सामान्य ग्राफ़ में) नहीं पा सकता है।( रों , एक ) एक ( एक , ) ( रों , टी )(s,t)(s,a)a(a,b)(s,t)

ध्यान दें कि जब से तुम हर (सकारात्मक-integer-) अनिर्धारित ग्राफ के रूप में भारित ग्राफ व्यक्त कर सकते हैं - बस लागत के साथ किनारों की जगह के साथ एक श्रृंखला के साथ एक ही उदाहरण अनिर्धारित रेखांकन पर डीएफएस के साथ सौदा - नोड्स। यहां, स्थिति वास्तव में और भी अधिक कमजोर है: भार के बिना, डीएफएस अगले बच्चे को यात्रा करने के लिए निर्धारित करने के लिए क्या उपयोग कर सकता है?- cc1


  1. जब तक नियम निर्धारक है। यदि यह नहीं है, तो यह स्पष्ट रूप से हमेशा सबसे छोटे रास्ते नहीं मिल सकता है।

अगर मैं गलत हूं तो मुझे सुधारें, लेकिन क्या इसका मतलब यह है कि डीएफएस किसी भी ग्राफ में सबसे छोटा रास्ता खोज सकता है, लेकिन ऐसा करते समय घातीय समय लगेगा?
अनमोल सिंह जग्गी

@AnmolSinghJaggi नंबर डीएफएस केवल कभी एक पथ पाता है।
राफेल

10

चौड़ाई -खोज-एक एल्गोरिथ्म है जो एक अनवेटेड ग्राफ़ में सबसे छोटे रास्ते ढूंढेगा।

डीएफएस से एक एल्गोरिथ्म में प्राप्त करने के लिए एक सरल ट्वीक है जो एक अनवेटेड ग्राफ पर सबसे छोटा रास्ता ढूंढेगा। अनिवार्य रूप से, आप DFS द्वारा उपयोग किए गए स्टैक को एक कतार से प्रतिस्थापित करते हैं। हालाँकि, परिणामी एल्गोरिथ्म को अब DFS नहीं कहा जाता है। इसके बजाय, आपने चौड़ाई-प्रथम-खोज लागू की होगी।

उपरोक्त पैराग्राफ सही अंतर्ज्ञान देता है, लेकिन स्थिति को थोड़ा सरल करता है। यह कोड लिखना आसान है, जिसके लिए साधारण स्वैप, चौड़ाई पहले खोज का कार्यान्वयन देता है, लेकिन यह कोड लिखना भी आसान है जो पहले एक सही कार्यान्वयन की तरह दिखता है लेकिन वास्तव में ऐसा नहीं है। आप BFS बनाम DFS पर संबंधित cs.SE प्रश्न यहाँ पा सकते हैं । आप यहाँ कुछ अच्छे छद्म कोड पा सकते हैं


3

आप ऐसा कर सकते हैं!!!

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

सभी संभावित खोज के लिए लागत / पथ सहेजें जहाँ आपको लक्ष्य नोड मिला, ऐसी सभी लागत / पथ की तुलना करें और सबसे छोटा चुना।

इस दृष्टिकोण के साथ बड़ा (और मेरा मतलब है BIG) मुद्दा यह है कि आप कई बार एक ही नोड पर जा रहे होंगे जो dfs को छोटी पथ एल्गोरिथम के लिए एक स्पष्ट बुरा विकल्प बनाता है।


1
आप ध्यान देना चाह सकते हैं कि यह जटिलता को काफी बदल देता है । यदि मैं इसे सही ढंग से समझ रहा हूँ तो यह संभावित रूप से से तक हर संभावित मार्ग का पता लगाएगा। tst
रयान

1
@ user2407394 क्या आपने वास्तव में एक बार डीएफएस के इस बदलाव को लागू किया है और इसे एक बड़े आकार के ग्राफ के लिए सही ढंग से चलाया है? मुझे इस भिन्नता को डीएफएस के रूप में कहने में संकोच होगा। मैं इसे गहराई-पहला पथ-थकाऊ खोज कहूंगा।
जॉन एल।

मैंने इस तरह का दृष्टिकोण लागू किया है, इसका काम वास्तव में धीमा है। प्रदर्शन में सुधार के लिए mnemonization को जोड़ने के बारे में सोच रहा हूँ।
माइक

@ user2407394 ऐसा लगता है कि यह काम करेगा, लेकिन जब आप रोकना चाहते हैं तो आप कैसे चेक करेंगे क्योंकि अगर आप उन सभी को चिन्हित नहीं करते हैं तो कोई 'विज़िट' सूची नहीं होगी?
जो ब्लैक

0

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


-3

आईटी में DFS का उपयोग करके किनारों की न्यूनतम संख्या के साथ दो कोने के बीच का रास्ता खोजना संभव है। हम स्तर के दृष्टिकोण को लागू कर सकते हैं


2
कृपया अधिक विस्तार दें। मैं नहीं बता सकता कि इस एकल वाक्य में आप किस एल्गोरिथ्म का वर्णन करने का प्रयास कर रहे हैं।
डेविड रिचरबी

-3

आप ऐसा कर सकते हैं

बस dfs तरीके से ग्राफ को पार करें और जांचें

if(distance[dest] > distance[source]+cost[source_to_destination]){
    distance[dest] = distance[source] + cost[source_to_destination]);
}

यहाँ पूर्ण समाधान के लिए लिंक है


1
स्वीकृत उत्तर दावा करता है कि यह संभव नहीं है, जो आपके दावे का खंडन करता है। क्या आप बता सकते हैं कि आपको क्यों लगता है कि फिर भी यह दृष्टिकोण काम करता है? (या स्पष्टीकरण दें कि इस दृष्टिकोण सामान्य रूप में काम करता है)
असतत छिपकली

क्या यह केवल उपयोगकर्ता -2407394 के जवाब को नहीं दोहरा रहा है , केवल कठिन-से-समझने वाले कोड के साथ (आपने परिभाषित नहीं किया है कि उनमें से कोई भी चर का क्या मतलब है, और यह स्पष्ट नहीं है, मेरे लिए) एक स्पष्टीकरण के बजाय?
डेविड रिचेर्बी

हां, यह user2407394 के उत्तर का कार्यान्वयन है। असुविधा के लिए खेद है। मैंने कोड में टिप्पणियाँ जोड़ दी हैं। आपके लिए अभी इसकी जांच करना संभव है।
अनमोल मिड्ढा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.