ปล่อยให้ส่วนต่อไปของกราฟ:
เมื่อฉันใช้ฟังก์ชั่น shortest_path ระหว่างจุด A และ B ฉันได้เส้นทางสีน้ำเงิน ทำไมสิ่งนี้ถึงเกิดขึ้น
ปล่อยให้ส่วนต่อไปของกราฟ:
เมื่อฉันใช้ฟังก์ชั่น shortest_path ระหว่างจุด A และ B ฉันได้เส้นทางสีน้ำเงิน ทำไมสิ่งนี้ถึงเกิดขึ้น
คำตอบ:
นั่นเป็นวิธีที่ 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 ให้เปลี่ยน
ปัญหาได้ถูกอธิบายไว้แล้วในคำตอบก่อนหน้า มันเป็นปัญหาของอัลกอริธึมพา ธ ที่สั้นที่สุด "อิงกับจุดสุดยอด" ซึ่งสนใจเฉพาะที่มาและเป้าหมาย
มีตั๋วในตัวติดตามปัญหาและวิธีแก้ไขที่เป็นไปได้ในการเปลี่ยนการใช้อัลกอริทึม: 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
มิฉะนั้นคุณจะต้อง
คุณต้องลองดูว่าสิ่งนี้มีผลต่อประสิทธิภาพหรือไม่
ฉันได้สร้างโปรแกรมแก้ไขสำหรับ pgRouting แล้วซึ่งช่วยแก้ไขปัญหา: https://github.com/pgRouting/pgrouting/issues/78