अप्रत्यक्ष ग्राफ़ पर सबसे छोटा पथ?


19

तो मैंने सोचा कि यह (हालांकि कुछ बुनियादी) सवाल यहाँ था:

मान लें कि मेरे पास 10x10 पैटर्न (थिंक चेसबोर्ड) में आकार के 100 नोड्स का ग्राफ है। ग्राफ़ अप्रत्यक्ष है, और अनवीटेड है। ग्राफ के माध्यम से आगे बढ़ने में तीन स्थान आगे बढ़ना और एक स्थान दाएं या बाएं चलना (एक बोर्ड में शतरंज की चाल कैसे चलती है) के समान है।

एक निश्चित शुरुआत नोड को देखते हुए, बोर्ड पर किसी अन्य नोड के लिए सबसे छोटा रास्ता कैसे मिलेगा?

मैंने कल्पना की कि केवल नोड्स के बीच एक बढ़त होगी जो व्यवहार्य चाल है। इसलिए, यह जानकारी देते हुए, मैं एक शुरुआती नोड से लेकर समाप्ति नोड तक का सबसे छोटा रास्ता खोजना चाहता हूं।

मेरा प्रारंभिक विचार यह था कि प्रत्येक बढ़त को वजन 1 के साथ रखा गया है। हालांकि, ग्राफ अप्रत्यक्ष है, इसलिए Djikstras एक आदर्श फिट नहीं होगा। इसलिए, मैंने इसे गहराई से पहले खोज के परिवर्तित रूप का उपयोग करने का निर्णय लिया।

हालांकि, मैं अपने जीवन के बारे में कल्पना नहीं कर सका कि खोज का उपयोग करके सबसे छोटा रास्ता कैसे प्राप्त किया जाए।

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

क्या किसी के पास कोई विचार है जो मुझे इस एक पर सही दिशा में इंगित कर सकता है?

आपका बहुत बहुत धन्यवाद।

(मैंने ग्राफ के एक दृश्य में डालने की कोशिश की, लेकिन मेरी कम प्रतिष्ठा के कारण असमर्थ था)

जवाबों:


19

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


ओह्ह्ह्ह यार मैंने एक बीएफएस के बारे में भी नहीं सोचा था! अनेक अनेक धन्यवाद!
gfppaste

यह कैसे ओवरकिल है? कार्यान्वयन थोड़ा कठिन है और कुछ नहीं हो सकता है।

मैं यह भी जोड़ना चाहूंगा कि बीएफएस अधिक कुशल है। बीएफएस के पास है O(|E|), जबकि दीजकस्ट्रा के पास O(|E| + |V|log(|V|)
डग रामसे

@ user742 बीएफएस जिक्स्ट्रास से तेज है। O(mn)O(V + E)
Djikstra

13

निकोलस ने पहले से ही एक सही जवाब दिया। हालाँकि, मुझे गहराई-पहले खोज का उपयोग करने के अपने मूल प्रयास को संबोधित करने दें।

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

एक्समैंएक्स+मैं×एक्स==1 तब आपको समाधान की गहराई में मेमोरी लीनियर का उपयोग करते हुए इष्टतम समाधान खोजने की गारंटी दी जाती है।

ठीक है, आप सोच रहे होंगे कि नोड्स का फिर से विस्तार करना एक बुरा विचार है। हर्गिज नहीं! यह वह है जो स्मृति के रैखिक उपभोग की गारंटी देता है, जबकि पुनरावृत्ति समग्र चलने के समय पर हावी होती है, ताकि यह साबित हो सके कि यह एल्गोरिथ्म ओवरहेड में है-1

चीयर्स,

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.