ฉันกำลังแก้ไขปัญหาการเพิ่มประสิทธิภาพการค้นหากราฟ ฉันต้องการค้นหาเส้นทางลัดที่สั้นที่สุดที่ k ที่สุดผ่านกราฟถ่วงน้ำหนักกำกับ
ฉันรู้ว่ามีจำนวนอัลกอริธึมที่แน่นอนและใกล้เคียงที่สุดสำหรับ k แต่งานวิจัยเมื่อไม่นานมานี้ส่วนใหญ่ดูเหมือนจะมุ่งเน้นไปที่กราฟขนาดใหญ่มากที่เชื่อมโยงกันอย่างกระจัดกระจาย (เช่นการกำหนดเส้นทางและทิศทาง) และกราฟของฉัน
ลักษณะที่แตกต่างของปัญหาของฉัน:
กราฟประกอบด้วยจุดยอดประมาณ 160 จุด
กราฟเชื่อมต่อเกือบเต็มแล้ว (แบบสองทิศทางดังนั้น ~ 160 ^ 2 ~ = 25k ขอบ)
k จะค่อนข้างเล็ก (อาจน้อยกว่า 10)
ความยาวเส้นทางสูงสุดอาจถูกล้อมรอบและมีขนาดเล็กมากเช่น 3-5 ขอบ
ฉันพูดว่า 'acyclic' ด้านบน แต่เพียงเพื่อย้ำ - การแก้ปัญหาต้องไม่รวมรอบ นี่ไม่ใช่ปัญหาสำหรับเส้นทางที่สั้นที่สุดที่ดีที่สุด แต่จะกลายเป็นปัญหาสำหรับ k-best ตัวอย่างเช่นพิจารณาการกำหนดเส้นทางถนนเส้นทางที่สั้นที่สุดอันดับที่ 2 จาก A ถึง B อาจเหมือนกับเส้นทางที่ดีที่สุด การเดินทางรอบ ๆ บล็อกอย่างรวดเร็ว นั่นอาจจะเป็นทางคณิตศาสตร์ที่ดีที่สุด แต่ไม่ใช่ทางออกที่มีประโยชน์มาก ;-)
เราอาจจำเป็นต้องทำการเพิ่มน้ำหนักอีกครั้งสำหรับการคำนวณแต่ละครั้ง ต้นทุนขอบประกอบด้วยผลรวมถ่วงน้ำหนักของปัจจัยหลายประการและข้อกำหนดขั้นสุดท้าย (เมื่อใดก็ตามที่เราได้รับ) อาจอนุญาตให้ผู้ใช้ระบุลำดับความสำคัญของตนเองของปัจจัยน้ำหนักเหล่านั้นการเปลี่ยนแปลงน้ำหนักขอบ นี่เป็นกราฟที่ค่อนข้างเล็ก (เราน่าจะสามารถนำเสนอในไม่กี่ร้อย KB) ดังนั้นจึงอาจสมเหตุสมผลในการโคลนกราฟในหน่วยความจำใช้การถ่วงน้ำหนักอีกครั้งจากนั้นทำการค้นหาบนกราฟที่โคลน แต่ถ้ามีวิธีที่มีประสิทธิภาพมากกว่าในการค้นหาขณะคำนวณน้ำหนักแบบทันทีฉันสนใจ
ฉันกำลังดูอัลกอริทึมที่อธิบายไว้ใน Santos (อัลกอริทึมเส้นทางที่สั้นที่สุด K), Eppstein 1997 (การค้นหาเส้นทางที่สั้นที่สุด k) และอื่น ๆ อัลกอริทึมของเงินเยนเป็นที่น่าสนใจส่วนใหญ่เพราะของ Java ที่มีอยู่ดำเนินการ ฉันไม่กลัวที่จะอ่านบทความวิจัย แต่ฉันคิดว่ามันคุ้มค่าที่จะทิ้งรายละเอียดของปัญหาของฉันและขอให้พอยน์เตอร์ประหยัดเวลาในการอ่าน
และถ้าคุณมีพอยน์เตอร์สำหรับการใช้งานจาวายิ่งดี