विशाल रेखांकन पर दीजकस्ट्रा का एल्गोरिदम


15

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

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

दौरा किए गए प्रत्येक शीर्ष की निकटता सूची प्राप्त करने के लिए मेरे सांख्यिकीय आंकड़ों के अनुसार 10,000 नोड्स के बारे में 1,500 डेटाबेस प्रश्नों की आवश्यकता होगी, ताकि स्पष्ट रूप से यह नहीं हो कि वे ऐसा कैसे करते हैं। यह बहुत धीमी गति से होगा।

वह यह कैसे करते हैं? मैं खुद इसे लागू करने की कोशिश कर रहा हूं।


2
क्या आप सुनिश्चित हैं कि वे दीक्जस्त्र का उपयोग करते हैं? बहुत सारे अन्य छोटे पथ एल्गोरिदम हैं जो आपके द्वारा वर्णित स्थिति के लिए बेहतर अनुकूल हो सकते हैं।
डेविड रिचेर्बी

1
क्या आपने कोड में देखा है? हमें कैसे पता होना चाहिए? "डेटाबेस क्वेश्चन" - मुझे आशा है कि आप ग्राफ़ के भंडारण के लिए DBMS का उपयोग नहीं करेंगे?
राफेल

@DavidRicherby हां मुझे यकीन है, इस लिंक को देखें
dimitris93

2
"[I] शुद्ध सी कोड में देखने के लिए t एक अत्यंत थकाऊ प्रक्रिया होगी।" लेकिन यह जानने का एकमात्र तरीका है कि कोड क्या करता है। तो आप हमें केवल आपके लिए अपना थकाऊ काम करने के लिए कह रहे हैं, जो आपके प्रश्न के लिए सबसे बड़ा विज्ञापन नहीं है ...
डेविड रिचरबी

1
@ सिरो आप स्पष्ट रूप से पूछते हैं, "वे ऐसा कैसे करते हैं?" यदि वास्तव में वह प्रश्न नहीं है जिसे आप पूछना चाहते हैं, तो आपको फिर से समझने की आवश्यकता है।
राफेल

जवाबों:


6

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

आप डिस्क और इन-मेमोरी सेटिंग से पढ़ने के लिए एक डीबी, एक कस्टम फ़ाइल प्रारूप का उपयोग कर सकते हैं।

लेकिन मेरे अनुभव से DB का उपयोग करना लगभग 5 से 10 गुना धीमा है और 'सरल' लिंक किए गए सूची प्रारूप के आधार पर अपनी फ़ाइल प्रारूप लिखने की तुलना में बहुत अधिक स्मृति गहन है।

अच्छी बात यह है कि OSM का उपयोग करने वाले कई सॉफ्टवेयर फ्रेमवर्क हैं जो खुले स्रोत हैं ताकि आप सही कोड में देख सकें जैसे कि यहां देखें । में GraphHopper खुला स्रोत रूटिंग इंजन यह एक स्मृति से स्विच करना बहुत आसान है में स्मृति की स्थापना के लिए सेटिंग (आधारित डिस्क) मैप किया - दोनों एक ही प्रारूप का उपयोग कर। "एमएमएपी" सेटिंग यहां तक ​​कि मेमोरी प्रतिबंधित मोबाइल उपकरणों पर उपयोग की अनुमति देती है और यदि आप एक सर्वर पर आवश्यक रैम जैसे हैं, तो बाद वाला बहुत तेजी से प्रदर्शन करता है। उदाहरण के लिए एक वर्ल्ड वाइड ग्राफ (> 100mio नोड्स) के लिए आपको लगभग 8-10gb RAM की आवश्यकता होती है, साथ ही अधिक RAM की भी आवश्यकता होती है यदि आप आगे सब कुछ गति करना चाहते हैं जैसे संकुचन पदानुक्रमों के साथ - जो आप चाहते हैं हर वाहन के लिए 5-8gb अधिक।

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

अन्य उत्तरों के बारे में:

लागू होते समय डीजकस्ट्रस एल्गोरिथ्म को इस समस्या के लिए इष्टतम नहीं माना जाता है

'सामान्य' दिक्जस्त्र बहुत ही उचित प्रदर्शन कर सकता है (<आपके 3mio नोड्स उदाहरण जैसे देशव्यापी प्रश्नों के लिए 1s) और 'सिद्धांत अर्थ' में इष्टतम है, लेकिन उत्पादन परिदृश्यों में तेजी लाने के लिए थोड़ा ट्यूनिंग की आवश्यकता है। और कॉन्ट्रैक्ट हायरचीज़ जैसी तकनीक इसका एक द्विदिश संशोधन करती है और बहुत अच्छा प्रदर्शन करती है।

सड़क नेटवर्क पदानुक्रमित और प्लानर हैं।

सड़क नेटवर्क केवल कार के लिए पदानुक्रमिक है न कि प्लानर (पुलों, सुरंगों, ...)


मेरे पास एक और प्रश्न है। आप NodeIDनिकटतम नोड को किस प्रकार से खोज सकते हैं latitude/longitude? सबसे कम पथ A-> B की गणना करना आवश्यक है। और हमें यह भी ध्यान रखना होगा कि ए और बी नोड के रूप में मौजूद नहीं हो सकते हैं, क्योंकि प्रत्येक वर्ग मीटर में एक नोड नहीं होता है। इसलिए हम ए और बी के 2 करीबी NodeIDs खोजने की जरूरत है
dimitris93

यह LocationIndexTree में किया जाता है, जो कि एक क्वाडट्री की तरह कुशलतापूर्वक एक सेल में NodeIDs का भंडारण करता है, जिसमें ग्राफहॉपर के लिए ~ 500m का त्रिज्या होता है। अगर कुछ नहीं मिला तो यह एक निश्चित डिग्री तक त्रिज्या का विस्तार करता है। यह सिद्धांत में सरल लगता है, लेकिन बहुत जटिल है क्योंकि आपके पास किनारों को क्षेत्र को पार करना हो सकता है, इसे बनाते और क्वेरी करते समय आपको कुशल होने की आवश्यकता होती है और बहुत कुछ।
Karussell

निकटतम पड़ोसी की खोज करते समय केडी-पेड़ अधिक कुशल नहीं हैं? आपने केडी-पेड़ों पर QuadTrees को क्यों चुना? मैं अभी अपने रूटिंग इंजन के लिए केडी-ट्री को लागू कर रहा हूं। मैंने QuadTrees को लागू करना शुरू कर दिया लेकिन मैंने रोक दिया क्योंकि मुझे लगा कि KD-Trees एक ही चीज़ है, लेकिन कोड को आसान बनाने और निकटतम पड़ोसी को क्वेरी करने के लिए तेज़ी से। क्या मै गलत हु ?
dimitris93

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

यदि आप stanford से इस pdf के पेज 9 को देखते हैं, तो केडी-ट्रीज़ में निकटतम पड़ोसी की खोज करने के लिए आपको बाउंडिंग बॉक्स को जानने की आवश्यकता नहीं है। और एक और बात यह है कि क्योंकि हम सभी बिंदुओं को पहले से जानते हैं, इसलिए हम लोगन की ऊंचाई का एक संतुलित पेड़ बना सकते हैं। क्या आप अभी भी सकारात्मक हैं कि kd- पेड़ों पर quadtrees का कोई लाभ है?
२१:२५

2

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


0

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

  • एक ग्राफ संरचना को आसन्न सूची डेटा से "संकलित" किया जा सकता है। यह आप का हवाला देते हुए पुस्तकालय में दृष्टिकोण है , स्पैटियालाइट। इन ग्राफ संरचनाओं को एक संपीड़ित बाइनरी प्रारूप में संग्रहीत किया जाता है जहां ग्राफ़ स्थानों को द्विआधारी-एन्कोडेड पूर्णांक आदि द्वारा दर्शाया जाता है, इसलिए ग्राफ़ का प्रतिनिधित्व और हेरफेर सभी सड़क नामों आदि को संग्रहीत करने की तुलना में बहुत कम जगह लेता है; ऐसा प्रतीत होता है कि SpatiaLite एल्गोरिथ्म "ऑनलाइन" नहीं है और पूरी तरह से स्मृति में चलता है।

  • समानांतर / वितरित एल्गोरिदम हैं। उदाहरण के लिए स्केलेबल GPU ग्राफ ट्रैवर्सल / मेरिल, गारलैंड, ग्रिम्शॉ देखें।

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

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

  • यह (235 पी!) पीएचडी थीसिस विशेष रूप से लागू है। सड़क नेटवर्क / शुल्कों में रूट प्लानिंग

  • कुछ एल्गोरिदम इनमें से कई विचारों और अन्य का उपयोग करते हैं, अत्यधिक ट्यून किए जाते हैं और मालिकाना और प्रतिस्पर्धी व्यापार रहस्यों पर कटाक्ष करते हैं। जैसे Google का। इस विषय पर कुछ भ्रामक मीडिया हो सकते हैं। उदाहरण के लिए Google मैप्स को सरल, सुरुचिपूर्ण एल्गोरिदम संभव बनाता है जो दावा करता है / जिसका अर्थ है कि Google बिना किसी उत्तेजना के Dijkstras एल्गोरिथ्म का उपयोग करता है।


1
Google मैप्स निश्चित रूप से डिज्स्कस्ट्रा की तुलना में कुछ बेहतर से उन्नत हुआ है। हर आधा सक्षम डेवलपर सड़क के नक्शे के लिए A * का उपयोग करेगा, लेकिन मेरी पिछली नौकरी में हमें पता चला कि Google का इंजन <100 ms में एक तरह से बिंदु के माध्यम से 2500 किमी मार्गों का जवाब दे सकता है। यह A * के लिए बहुत तेज़ है, इसलिए यह संभव है कि वे ArcFlags की तरह कुछ का उपयोग करें।
MSalters

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

-2

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

उदाहरण के लिए, निम्नलिखित उदाहरण पर विचार करें। आइए कहते हैं कि मैं किसी भी 2 अभिनेताओं (बेकन नंबर) के बीच अलगाव की डिग्री खोजने की कोशिश कर रहा हूं और मैं कम से कम भारित पथ (संभव नई फिल्मों का उपयोग करके पथ) खोजना चाहता हूं। अब, मान लीजिए कि मेरे पास एक फंक्शन है shortestPath(actor A, actor B);। निम्नलिखित परिदृश्य पर विचार करें।

यदि अभिनेता A 1970 से अभिनय कर रहा है और अभिनेता B 2000 से अभिनय कर रहा है, तो उस जानकारी को देखते हुए, यह बहुत अधिक तार्किक होगा कि अभिनेता B की पहली फिल्म से शुरू होने वाले मार्ग को खोजें और फिर अभिनेता A को अपना रास्ता दिखाए। हर फिल्म के माध्यम से इसका विरोध करने पर अभिनेता ए ने अभिनय किया है।

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

EDIT: मान लीजिए कि आप एक ही देश में 2 शहरों के बीच सबसे छोटा रास्ता खोजने की कोशिश कर रहे हैं और अगर यह देश व्यापक है, उदाहरण के लिए, अर्जेंटीना, तो आप अपने प्रश्नों को देश के देशांतर और अक्षांश के आधार पर कर सकते हैं सीमाओं। फिर आप क्षैतिज रूप से विरोध के रूप में लंबवत (देशांतर का उपयोग करके) शुरू कर सकते हैं। बेशक, अपवाद से निपटने की आवश्यकता होगी, लेकिन आपको सामान्य विचार मिलेगा।


1
आप दिज्कस्ट्रा में यूनियन-फाइंड का उपयोग कैसे करते हैं?
राफेल

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