एक उपयुक्त रूटिंग इंजन चुनने में मदद करें


16

मैं एक मार्ग नियोजन प्रणाली का निर्माण कर रहा हूं, लेकिन मुझे अभी भी तय करना है कि मैं किस रूटिंग इंजन का उपयोग करूंगा। अब तक मैंने pgrouting और neo4j पाया है।

मेरे पास पोस्टग्रेजिकल / पोस्टगिस डेटाबेस (एक आकृति से आयातित) में मेरा मार्ग नेटवर्क है। मैंने नोड्स निकालने के लिए प्रश्न किए हैं (उन तरीकों के समापन बिंदु जहां आपको निर्णय लेना है कि किस दिशा में जाना है या मृत समाप्त होता है) और किनारों को निकालने के लिए (अक्सर कई लगातार तरीकों से बनाया गया है)। मेरे सभी किनारे द्विदिश हैं।

मेरा मुख्य लक्ष्य एक ए-स्टार एल्गोरिथ्म का उपयोग करके इस नेटवर्क पर मार्गों की गणना करना है जहां दूरी = लागत।

मेरी भावना मुझे बताती है कि एक ग्राफ डेटाबेस जैसे कि neo4j जाने का रास्ता है (जैसा कि यह सिर्फ इस उद्देश्य के लिए बनाया गया है), लेकिन वे डिफ़ॉल्ट रूप से ए-स्टार का समर्थन नहीं करते हैं और यह भी कि ज्यामिति की कोई वास्तविक भावना नहीं है । यह नक्शे के बजाय सामाजिक नेटवर्क के लिए बेहतर अनुकूल लगता है।

  • क्या मेरी जरूरतों को पूरा करने में मदद मिलेगी?
  • क्या यह फ्लाई क्वेरीज़ (+ -2000 नोड्स, + -4000 किनारों) के लिए पर्याप्त तेज़ है? आम तौर पर यह ए-स्टार के लिए कुछ एमएस होगा, लेकिन मैं एसक्यूएल में इस कार्यान्वयन के बारे में अनिश्चित हूं।
  • क्या ए-स्टार पियर्सिंग मुझे नोड्स और किनारों की सूची देता है?
  • अधिकांश उदाहरणों में, मैं देख रहा हूँ कि मैं सूचना के लिए मार्ग की गणना के बाद आमतौर पर आदेशों की एक सूची देता हूं (जैसे "एट एक्स टर्न लेफ्ट, आदि")। क्या pgrout इसका उत्पादन करता है या यह किसी अन्य सिस्टम से है?

उम्मीद है कि कोई मुझे कुछ जानकारी दे सकता है कि किस सिस्टम को चुनना है। Neo4j, pgrout, या कुछ अन्य प्रणाली।


3
मुझे लगता है कि अधिकांश रूटिंग एल्गोरिदम "ज्यामिति की भावना" के साथ काम नहीं करते हैं, इसके बजाय एक ज्यामितीय विशेषता की गणना की जाती है और इसका उपयोग लागत (यानी एक पॉलीलाइन की दूरी माप) के रूप में किया जाता है। मैंने Neo4j का उपयोग कभी नहीं किया है, लेकिन यह वास्तव में सक्षम दिखता है और मैं जल्द ही इसका उपयोग कर सकता हूं। मैंने केवल प्रलेखन पर एक नज़र डाली और ए-स्टार का उपयोग करना संभव है: docs.neo4j.org/chunked/stable/graph-algo.html docs.neo4j.org/chunked/stable/stg/ pgRouting भी सक्षम है, और मैं इसका बहुत बड़ा प्रशंसक हूं। इन दो समाधानों के प्रदर्शन की तुलना करना दिलचस्प होगा।
एलन एडेयर

सबसे पहले, मैं urbansim को एक ओपनसोर्स भूमि उपयोग मॉडल को देखने का सुझाव दूंगा। आपके रूटिंग प्रश्न के रूप में, यदि यह एप्लिकेशन की योजना बना रहा है, तो मैं ट्रांसकैड, सीयूबीई, प्लानर, या ईएमएमई / 2 जैसे सॉफ्टवेयर को देखने का सुझाव दूंगा, जो पहले कार्यक्षमता और यूजर इंटरफेस के लिए होगा। वे आमतौर पर अपने सॉफ़्टवेयर का 1 घंटा या 2 घंटे का डेमो सीडी देते हैं (इसके लिए एक अनुभव प्राप्त करने के लिए सॉफ्टवेयर आप एक या दो घंटे तक चला सकते हैं)। यदि आप ऑनलाइन उपयोग या डेस्कटॉप उपयोग के लिए कुछ बनाना चाहते हैं, तो pgRout को देखें; हालांकि, अनुभव से, कभी-कभी, यह उतना आसान नहीं है जितना कार्यशाला / ट्यूटोरियल इसे चित्रित करता है।
dassouki

मैं एक स्टार के साथ काम कर रहा है और यह बहुत बढ़िया है! यह मेरे पहले 3 प्रश्नों पर हां में उत्तर देता है। फिर भी मुझे आश्चर्य है कि अगर कोई यहां क्रियात्मक नेविगेशन दिशाओं के निर्माण के बारे में कुछ जानता है। क्या कुछ टूलींग है जो गणना के साथ सहयोग करता है जो कि परिकलित मार्ग के आउटपुट से क्रिया निर्देश ("200 मी मोड़ बायीं ओर, आदि") उत्पन्न करता है?
14

जवाबों:


8

मैं वर्तमान में शोध पत्र के उद्देश्य से आपकी एक ही समस्या का पता लगा रहा हूं। इससे पहले कि मैं इन दो डेटाबेसों का परीक्षण करना शुरू करूँ, मेरे पास आपके समान ही अनुमान था। कि Neo4j ग्राफ डेटाबेस इस तरह की समस्या के लिए सही समाधान होगा। और आंशिक रूप से यह है, लेकिन बहुत सारी समस्याओं के साथ।

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

ये सभी समस्याएं pgRout में मौजूद नहीं हैं। मेमोरी ऐसा कोई मुद्दा नहीं है, लेकिन समवर्ती प्रश्नों में मेमोरी की आवश्यक मात्रा में वृद्धि होती है। उदाहरण के लिए, यदि आपके पास दो समवर्ती अनुरोध हैं, तो डबल मेमोरी की आवश्यकता है। यह जर्मनी OSM डेटासेट के लिए भी कोई समस्या नहीं थी, सभी समवर्ती अनुरोधों को बिना किसी समस्या के रूट किया गया।

प्रदर्शन: ज्यादातर मामलों में, Neo4j outperforms pgRout करता है। लेकिन केवल अगर दिए गए डेटासेट के लिए पर्याप्त मेमोरी है और यदि सभी नोड्स और रिश्ते मेमोरी में हैं (गर्म शुरुआत)। प्रदर्शन में वृद्धि / कमी बहुत सारे कारकों पर निर्भर करती है, लेकिन ज्यादातर स्रोत और लक्ष्य नोड के बीच नेटवर्क और दूरी (हॉप्स) के आकार पर।

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

आपको सवालों के जवाब देने के लिए:

  • PgRout में आपको sql में AStar के कार्यान्वयन के बारे में चिंता करने की आवश्यकता नहीं है, जो कि पहले से ही लागू है।
  • हाँ, pgRout आपको नोड्स और किनारों की सूची दे सकता है
  • मुझे नहीं लगता है कि प्रश्नों के आसपास कुछ कस्टम काम के साथ pgRout आपको ऐसी जानकारी दे सकता है। लेकिन शायद मैं गलत हूं, हो सकता है कि किसी ने ऐसा किया हो और इस सवाल के बारे में अधिक मदद कर सके।

मुझे नहीं पता कि यह आपको सीधे मदद करेगा, लेकिन सबसे तेज़ राउटिंग सर्वर में से एक है जो ओस्म 2 पीओ है । यह OSM डेटासेट के साथ काम करता है और काफी तेज है। वर्तमान में केवल dijkstra को लागू किया गया है, लेकिन डेवलपर ने AStar की भी घोषणा की। मुझे उम्मीद है कि इसमें से कुछ आपकी मदद करेंगे। :)


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

हां, ग्राफ जितना बड़ा होता है, उतना ही अंतर pgrout और neo4j के बीच होता है। शायद अगर आप पूरे ग्राफ को स्मृति में डालते हैं तो यह सबसे तेज समाधान होगा, इस बारे में कोई सवाल नहीं है। Neo4j काफी तेज है जब सभी ग्राफ को मेमोरी में लोड किया जाता है। Nx_spatial के बारे में नहीं जानते, मैंने इसका परीक्षण नहीं किया है, लेकिन शायद मैं करूँगा। मेरा मानना ​​है कि यह Neo4j को भी पछाड़ सकता है। लेकिन यह समाधान अच्छा है अगर यह आपके आवेदन के लिए स्वीकार्य है।
मारियो मिलर

1
@mrg सुनिश्चित नहीं है कि यह अभी भी आपके लिए एक समस्या है, लेकिन OSRM (C ++) और GraphHopper (Java) है। दोनों व्यापक पैमाने पर रेखांकन और उदाहरण के लिए जर्मनी के लिए ग्रूपहॉपर की आवश्यकता 1 जीबी (जहां मैं लेखक हूं)
करुसैल

Karussell, जानकारी के लिए धन्यवाद! मुझे OSRM पहले से ही मिल गया था, लेकिन ग्राफहॉपर मेरे लिए नया है।
MRG

0

आप हमारे आरडब्ल्यू नेट 4 पैकेज (www.routeware.dk) पर भी नज़र डाल सकते हैं। यह SHP फ़ाइल से A * सीधे का उपयोग करके इस तरह की सबसे छोटी पथ गणना कर सकता है। € 500 पर बेसिक पैकेज आपकी आवश्यकताओं के लिए पर्याप्त है।


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