เหตุใด pgRouting จึงไม่กลับเส้นทางที่ดีที่สุด


9

ปล่อยให้ส่วนต่อไปของกราฟ:

ป้อนคำอธิบายรูปภาพที่นี่ เมื่อฉันใช้ฟังก์ชั่น shortest_path ระหว่างจุด A และ B ฉันได้เส้นทางสีน้ำเงิน ทำไมสิ่งนี้ถึงเกิดขึ้น


ในคำอธิบายฉันทำผิดพลาดคือสีแดงสีน้ำเงินไม่ใช่สีแดงขอโทษ!
José Alejandro

คำตอบ:


7

นั่นเป็นวิธีที่ shortest_path (อัลกอริทึมของ Dijkstra) ทำงานใน pgRouting หากมีสองขอบที่มีแหล่งที่มาและเป้าหมายเดียวกันระบบจะใช้การสุ่มแบบสุ่ม (เพื่อความแม่นยำ: อันแรกที่มาจากฐานข้อมูล) ฉันไม่ทราบวิธีแก้ไขใด ๆ แต่มีวิธีแก้ไขปัญหาบางอย่าง

ถ้าเป็นไปได้คุณควรแบ่งขอบหนึ่งในนั้นออกเป็นสอง ฉันยังไม่ได้ทดสอบ แต่ควรแก้ไขพฤติกรรมนั้น

โซลูชันอื่น ๆ สำหรับกรณีที่เมื่อคุณไม่สามารถแก้ไขชุดข้อมูลของคุณ เพิ่มฟิลด์ 'short_alternative' ลงในตารางของคุณ แบบสอบถามตัวอย่างปรับเปลี่ยนตามความต้องการของคุณ ฉันหวังว่ามันจะอธิบายความคิด:

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)

ตอนนี้ edge '0.098' จะมี id ของ edge '0.011' ขอบอื่น ๆ ทั้งหมดจะมีค่า Null ในเขตข้อมูล short_alternative หลังจากที่คุณสร้างแบบสอบถาม shortest_path ให้ตรวจสอบชุดข้อมูลที่ส่งคืน - ถ้าแถวใด ๆ มีชุดเขตข้อมูล short_alternative ให้เปลี่ยน


2

ปัญหาได้ถูกอธิบายไว้แล้วในคำตอบก่อนหน้า มันเป็นปัญหาของอัลกอริธึมพา ธ ที่สั้นที่สุด "อิงกับจุดสุดยอด" ซึ่งสนใจเฉพาะที่มาและเป้าหมาย

มีตั๋วในตัวติดตามปัญหาและวิธีแก้ไขที่เป็นไปได้ในการเปลี่ยนการใช้อัลกอริทึม: https://github.com/pgRouting/pgrouting/issues/34 (น่าจะดีถ้ามีคนลองดูแล้วส่งคำขอดึง; - )

ความเป็นไปได้อีกอย่างหนึ่งคือการแยก "การเชื่อมโยงถนนคู่ขนาน" ดังที่กล่าวไว้ก่อน หรือคุณสามารถใช้อัลกอริธึม Shooting Star ซึ่งกำหนดเส้นทางจากขอบหนึ่งไปอีกด้านหนึ่งเพื่อให้ "รู้" เกี่ยวกับลิงก์ทั้งสองถนน

หรือคุณสามารถลองสั่งซื้อเครือข่ายถนนตามค่าใช้จ่ายแล้วเลือกชุดค่าผสมของแหล่งที่มาและเป้าหมายที่แตกต่างกันเท่านั้น:

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 และดูเหมือนไม่มีปัญหานี้ อย่างไรก็ตามขอบคุณสำหรับคำอธิบาย !!!
José Alejandro

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.