2011-08-30 15 views
22

मेरे पास बस/ट्रेन/डेटाबेस का प्रत्येक डेटाबेस है ... प्रत्येक तारीख पर आगमन और प्रस्थान/प्रस्थान का समय। मैं दो स्थानों के बीच सबसे तेज़ (सबसे कम/सस्ती/कम से कम संक्रमण) यात्रा की खोज करने का एक तरीका ढूंढ रहा हूं। मैं भविष्य में मनमाने ढंग से स्थानों को देखना चाहता हूं, स्टॉप और स्टॉप से ​​स्टार्ट/स्टॉप के बीच चलने के लिए OpenStreetMap डेटा का उपयोग करके, हालांकि समय के लिए मैं डेटाबेस में दो स्टॉप के बीच पथ ढूंढना चाहता हूं।पथ प्रतिबंध (रूटिंग, यात्रा योजना, ...) समय प्रतिबंधों के साथ ग्राफ पर एल्गोरिदम

समस्या यह है कि मुझे इस विषय के बारे में अधिक जानकारी नहीं मिल रही है, उदाहरण के लिए this Wikipedia page में इसमें कोई उपयोगी जानकारी नहीं है।

जो मुझे मिला है वह GTFS प्रारूप है, जो Google Transit में उपयोग किया गया है। जबकि मेरा शहर सार्वजनिक डेटा फीड (यहां तक ​​कि एक निजी भी नहीं) प्रदान नहीं करता है, मेरे पास पहले से ही सभी महत्वपूर्ण जानकारी है कि जीटीएफएस में बदलाव और परिवर्तन करना तुच्छ होगा।

वहाँ

OpenTripPlanner वह भी पैदल यात्री/कार/बाइक OpenStreetMap का उपयोग कर मार्ग से कर सकते हैं की तरह की तरह, कुछ GTFS आधारित सॉफ्टवेयर है।

हालांकि, रूटिंग कोड अच्छी तरह से प्रलेखित नहीं है (कम से कम मुझे मिला है) और मुझे पूरी चीज़ की आवश्यकता नहीं है।

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

तो, प्रश्न है, स्टॉप, मार्ग और आगमन/प्रस्थान/यात्रा के समय की एक सूची दी गई है, मैं आसानी से रोकने के लिए स्टॉप ए से सबसे तेज़ पथ कैसे ढूंढ सकता हूं?

उत्तर

13
  1. graph के रूप में अपनी समस्या का मॉडल करें। प्रत्येक स्टेशन वर्टेक्स होगा, और प्रत्येक बस/ट्रेन एक एज होगी।
  2. एक फ़ंक्शन w:Edges->R बनाएं, जो प्रत्येक किनारे के लिए समय/धन/... इंगित करता है।
  3. अब, आपके पास एक सामान्य न्यूनतम पथ समस्या है, जिसे Dijkstra algorithm द्वारा हल किया जा सकता है, जो किसी दिए गए स्रोत से सभी शीर्षकों के लिए न्यूनतम पथ पाता है।

(*) 'कम से कम बदलाव' के लिए, अपने वजन प्रत्येक बढ़त के लिए वास्तव में 1 है, तो आप भी, डिज्कस्ट्रा के बजाय एक BFS या यहाँ तक कि bi-directional BFS चलाकर इस अनुकूलन कर सकते हैं के रूप में मैं इस post में विस्तार से बताया [यह सामाजिक दूरी के लिए समझाया गया है, लेकिन यह वास्तव में वही एल्गोरिदम है]।


संपादित
[समय के लिए] ग्राफ आप टिप्पणी [मूल्य और संक्रमण की संख्या के लिए पर उल्लेख किया है, क्या मैं अभी भी लागू होता है जैसा कि ऊपर उल्लेख किया है की गैर स्थिर प्रकृति के एक संपादन के रूप में, इन के बाद से ग्राफ स्थिर हैं], आप distance vector routing algorithm का उपयोग कर सकते हैं, जो वास्तव में गतिशील ग्राफ के लिए काम करने के लिए है, और Bellman Ford algorithm का एक वितरित विविधता है।
एल्गोरिथ्म विचार:

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

हाँ करने के लिए भेजा जाना चाहिए, आप डिज्कस्ट्रा एल्गोरिथ्म की तुलना में तेजी लाने के लिए नहीं जा रहे हैं इसके लिए इसके लिए तब तक बाधाएं हैं जब आप रोक रहे हैं जो आगे अनुकूलन की अनुमति देते हैं। समय के अलावा मीट्रिक के लिए, आपको 'वज़न' तैयार करना होगा जो समय, लागत और परेशानी का संयोजन है। आपको यह भी निर्धारित करने के लिए उपयोगकर्ता को छोड़ना होगा कि वे वजन क्या हैं और फ्लाई पर पुनः कंप्यूट्यूट हैं, या कुछ पूर्वनिर्धारित परिदृश्य हैं (100% समय, 100% सस्ता, 50/50/0, 40/40/20, और पसंद है) और डिजस्ट्रा लुकअप टेबल का कैश संस्करण रखें। – corsiKa

+3

जब तक मुझे कुछ याद नहीं आ रहा है, यह काम नहीं करेगा। डिज्कास्ट्रा केवल "स्थिर" ग्राफ़ के लिए स्पेस डोमेन के साथ बढ़िया है, लेकिन इसमें समय डोमेन है। उदाहरण के लिए, यदि आप एक बस द्वारा एक नोड तक पहुंचते हैं जो 1 मिनट लेता है, तो वहां पर किनारों से 5 मिनट लगने से अलग होंगे। आप बस को याद कर सकते हैं ताकि वजन बढ़ जाए क्योंकि आपको इंतजार करना है। इसके अलावा, कुछ किनारों को गायब हो सकता है यदि आप एक निश्चित तरीके से नोड (दिन की आखिरी बस याद करते हैं) पर जाते हैं, लेकिन अगर आप वहां किसी अन्य तरीके से वहां जाते हैं तो वहां रहें। AFAIK, Dijkstra इसके लिए अनुमति नहीं देता है, लेकिन अगर मैं गलत हूं तो कृपया मुझे सही करें। – lacop

+1

@albwq: डिजस्ट्रा का एल्गोरिदम अगली बस के लिए कोने में 'प्रतीक्षा' के साथ संभाल नहीं करता है, आप इसके बारे में सही हैं। हालांकि, यह आपके द्वारा पूछे जाने वाले अन्य दो मानदंडों के लिए मान्य है: लागत और संक्रमण की संख्या। [संक्रमण के नंबर को अनुकूलित करने के बारे में मेरा अंतिम खंड देखें]। – amit

संबंधित मुद्दे