ग्राफ़ के अगले भाग को दें:
जब मैं A और B के बीच के फंक्शन को shortest_path का उपयोग करता हूं, तो मुझे नीला रास्ता मिला है। ऐसा क्यों होता है?
ग्राफ़ के अगले भाग को दें:
जब मैं A और B के बीच के फंक्शन को shortest_path का उपयोग करता हूं, तो मुझे नीला रास्ता मिला है। ऐसा क्यों होता है?
जवाबों:
यह सबसे छोटा_पथ (डेज्स्ट्रा का एल्गोरिथ्म) 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' होगी। अन्य सभी किनारों के पास छोटी_वैलेंटरी फ़ील्ड में शून्य होगा। आपके द्वारा छोटी से छोटी क्वेरी बनाने के बाद, लौटे डेटासेट की जाँच करें - यदि किसी पंक्तियों में छोटा_समूह फ़ील्ड सेट है, तो उसे बदल दें।
पिछले उत्तर में समस्या का पहले ही वर्णन किया जा चुका है। यह "वर्टेक्स-आधारित" सबसे छोटी पथ एल्गोरिदम की समस्या है, जो केवल स्रोत और लक्ष्य की परवाह करती है।
इश्यू ट्रैकर में एक टिकट है और एल्गोरिथ्म कार्यान्वयन को बदलने के लिए एक संभावित समाधान है: 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
।
यदि यह प्रदर्शन को प्रभावित करता है, तो आपको प्रयास करने की आवश्यकता है।
मैंने वास्तव में pgRout के लिए एक पैच बनाया है, जो समस्या को हल करता है: https://github.com/pgRout/pgrout//ues/78