बस इस समस्या पर मेरा अंतिम दृष्टिकोण साझा करना चाहता था। यह एक विश्वविद्यालय परियोजना का हिस्सा था, इसलिए यह वास्तविक दुनिया के उपयोग के लिए पूरी तरह से उपयुक्त नहीं हो सकता है। विंडोज मोबाइल डिवाइस पर चलाने के लिए इसे काफी तेज होना था।
मैं 4 टेबल (SQLite) का उपयोग कर समाप्त हुआ। एक टेबल बसों की सूची रखती है, दूसरा स्टेशनों की एक सूची रखता है। एक और टेबल संयोजन रखती है - एक विशिष्ट स्टेशन पर कौन सी बस रुकती है और यह इस स्टेशन से कहां जाती है और यह कितनी देर तक (मिनट) लेती है। सभी संयोजनों को संग्रहीत किया जाना है। और अंतिम तालिका एक साधारण समय सारणी है।प्रत्येक स्टेशन के लिए यह हर बस को सूचीबद्ध करता है जो उस समय और समय को रोकता है (मैंने समय को पूर्णांक मान के रूप में संग्रहीत किया - 14:34 1434 है, इसे तुलना करने के लिए तेज़ी से बनाने के लिए)।
मैंने एक द्वि-दिशात्मक चौड़ाई पहली खोज एल्गोरिदम का उपयोग किया। पड़ोसी स्टेशन (सीधे सुलभ) स्टार्ट स्टेशन और गंतव्य स्टेशन के लिए पुनर्प्राप्त किए जाते हैं। स्टेशन ए से स्टेशन एक्स तक एक रास्ता है यदि इन दो "ग्राफ" स्टेशन पर ओवरलैप हो। उदाहरण के लिए, स्टेशन ए से आप स्टेशन बी, सी, डी, ई (विशिष्ट बसों का उपयोग करके) तक पहुंच सकते हैं। और गंतव्य स्टेशन एक्स से आप सीधे एन, सी, जेड पर जा सकते हैं। ये दो ग्राफ स्टेशन सी पर ओवरलैप करते हैं तो एक पथ ए -> सी -> एक्स मौजूद है। यदि इस पहले पुनरावृत्ति में कोई पथ नहीं मिलता है, तो एल्गोरिदम जारी रहता है और फिर ग्राफ (बीएफएस) फैलता है।
समय पहले चरण में नहीं लिया जाता है - इससे यह पर्याप्त तेज़ हो जाता है। आपको केवल उन पथों की सूची के साथ संभावित पथों की एक सूची मिलती है जिन्हें आप इन पथों को लेने के लिए उपयोग करना चाहते हैं। अंतिम चरण में समय का मूल्यांकन किया जाता है, आप संभावित पथों की सूची में जाते हैं और जांच करते हैं कि बस विशिष्ट समय के भीतर यात्रा करती है (प्रत्येक स्टॉप को समय बढ़ाती है)।
250 स्टेशनों और 100+ बसों/रेलवे के साथ, एक छोटे से शहर पर, ये दृष्टिकोण 3 परिवर्तनों तक काम करता है (जहां आपको यात्रा पर बसें बदलनी होंगी)। गणना करने में केवल सेकंड लगते हैं। लेकिन मुझे पूरे डेटाबेस को मेमोरी (डिक्शनरी) में क्वेरी को तेज करने के लिए लोड करना पड़ा, जो बहुत अधिक समय ले रहा था।
मुझे नहीं लगता कि यह एक बड़े नेटवर्क के लिए काम करेगा हालांकि। लेकिन यह एक छोटे से मध्यम आकार के शहर के सार्वजनिक परिवहन के लिए काम करता है।
स्रोत
2011-06-01 13:15:39
[ओएसआरएम] (http://project-osrm.org/) सी ++ में स्थित सबसे कम पथों के लिए एक ओपन सोर्स रूटिंग इंजन है। आपको यह उपयोगी लगेगा। –