क्यों नहीं pgRout सर्वोत्तम पथ लौटाता है?


9

ग्राफ़ के अगले भाग को दें:

यहां छवि विवरण दर्ज करें जब मैं A और B के बीच के फंक्शन को shortest_path का उपयोग करता हूं, तो मुझे नीला रास्ता मिला है। ऐसा क्यों होता है?


स्पष्टीकरण में, मैंने एक गलती की, क्या लाल नीला लाल नहीं है, क्षमा करें!
जोस एलेजांद्रो

जवाबों:


7

यह सबसे छोटा_पथ (डेज्स्ट्रा का एल्गोरिथ्म) pgRout में व्यवहार करता है। यदि एक ही स्रोत और लक्ष्य के साथ दो किनारे हैं, तो यादृच्छिक एक (सटीक होना: पहला एक, जो डेटाबेस से बाहर आता है) का उपयोग किया जाता है। मैं उस के लिए कोई तय पता नहीं है, लेकिन कुछ workarounds हैं।

यदि संभव हो, तो आपको उन किनारों में से एक को दो में विभाजित करना चाहिए। मैंने इसका परीक्षण नहीं किया है, लेकिन इसे उस व्यवहार को ठीक करना चाहिए।

मामले के लिए अन्य समाधान, जब आप अपने डेटासेट को संशोधित नहीं कर सकते। अपनी तालिका में फ़ील्ड 'छोटा_सामग्री' जोड़ें। नमूना क्वेरी, इसे अपनी आवश्यकताओं के लिए संशोधित करें। मुझे आशा है कि यह विचार की व्याख्या करता है:

UPDATE roads t1
SET shorter_alternative = t2.id
FROM roads t2
WHERE 
((t2.source = t1.source AND t2.target = t1.target) OR
(t2.source = t1.target AND t2.target = t1.source)) AND
(t2.length < t1.length)

अब, धार '0.098' में किनारे की आईडी '0.011' होगी। अन्य सभी किनारों के पास छोटी_वैलेंटरी फ़ील्ड में शून्य होगा। आपके द्वारा छोटी से छोटी क्वेरी बनाने के बाद, लौटे डेटासेट की जाँच करें - यदि किसी पंक्तियों में छोटा_समूह फ़ील्ड सेट है, तो उसे बदल दें।


2

पिछले उत्तर में समस्या का पहले ही वर्णन किया जा चुका है। यह "वर्टेक्स-आधारित" सबसे छोटी पथ एल्गोरिदम की समस्या है, जो केवल स्रोत और लक्ष्य की परवाह करती है।

इश्यू ट्रैकर में एक टिकट है और एल्गोरिथ्म कार्यान्वयन को बदलने के लिए एक संभावित समाधान है: https://github.com/pgRout/pgrout/issues/34 (अच्छा होगा यदि कोई इसे आज़मा सकता है और पुल अनुरोध भेज सकता है; -; )

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

या आप लागत द्वारा सड़क नेटवर्क को ऑर्डर करने की कोशिश कर सकते हैं और फिर स्रोत और लक्ष्य के केवल विशिष्ट संयोजनों का चयन कर सकते हैं:

SELECT * FROM shortest_path(
  'SELECT DISTINCT ON (source, target)
      gid as id,
      source::integer,
      target::integer,
      cost::double precision
    FROM ways ORDER BY source, target, cost',
  true,false
);

यह मानता है कि आप सबसे कम खर्चीले मार्ग की खोज करते हैं। अन्यथा आपको करने की आवश्यकता है ORDER BY ... DESC

यदि यह प्रदर्शन को प्रभावित करता है, तो आपको प्रयास करने की आवश्यकता है।


कल मैं trsp फ़ंक्शन का निर्माण करता हूं और यह देखता हूं कि यह समस्या नहीं है। वैसे भी, स्पष्टीकरण के लिए धन्यवाद !!!।
जोस एलेजांद्रो

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