ฉันควรพิจารณาอัลกอริธึมทางลัดที่สั้นที่สุดของ k ใด


13

ฉันกำลังแก้ไขปัญหาการเพิ่มประสิทธิภาพการค้นหากราฟ ฉันต้องการค้นหาเส้นทางลัดที่สั้นที่สุดที่ k ที่สุดผ่านกราฟถ่วงน้ำหนักกำกับ

ฉันรู้ว่ามีจำนวนอัลกอริธึมที่แน่นอนและใกล้เคียงที่สุดสำหรับ k แต่งานวิจัยเมื่อไม่นานมานี้ส่วนใหญ่ดูเหมือนจะมุ่งเน้นไปที่กราฟขนาดใหญ่มากที่เชื่อมโยงกันอย่างกระจัดกระจาย (เช่นการกำหนดเส้นทางและทิศทาง) และกราฟของฉัน

ลักษณะที่แตกต่างของปัญหาของฉัน:

  • กราฟประกอบด้วยจุดยอดประมาณ 160 จุด

  • กราฟเชื่อมต่อเกือบเต็มแล้ว (แบบสองทิศทางดังนั้น ~ 160 ^ 2 ~ = 25k ขอบ)

  • k จะค่อนข้างเล็ก (อาจน้อยกว่า 10)

  • ความยาวเส้นทางสูงสุดอาจถูกล้อมรอบและมีขนาดเล็กมากเช่น 3-5 ขอบ

  • ฉันพูดว่า 'acyclic' ด้านบน แต่เพียงเพื่อย้ำ - การแก้ปัญหาต้องไม่รวมรอบ นี่ไม่ใช่ปัญหาสำหรับเส้นทางที่สั้นที่สุดที่ดีที่สุด แต่จะกลายเป็นปัญหาสำหรับ k-best ตัวอย่างเช่นพิจารณาการกำหนดเส้นทางถนนเส้นทางที่สั้นที่สุดอันดับที่ 2 จาก A ถึง B อาจเหมือนกับเส้นทางที่ดีที่สุด การเดินทางรอบ ๆ บล็อกอย่างรวดเร็ว นั่นอาจจะเป็นทางคณิตศาสตร์ที่ดีที่สุด แต่ไม่ใช่ทางออกที่มีประโยชน์มาก ;-)

  • เราอาจจำเป็นต้องทำการเพิ่มน้ำหนักอีกครั้งสำหรับการคำนวณแต่ละครั้ง ต้นทุนขอบประกอบด้วยผลรวมถ่วงน้ำหนักของปัจจัยหลายประการและข้อกำหนดขั้นสุดท้าย (เมื่อใดก็ตามที่เราได้รับ) อาจอนุญาตให้ผู้ใช้ระบุลำดับความสำคัญของตนเองของปัจจัยน้ำหนักเหล่านั้นการเปลี่ยนแปลงน้ำหนักขอบ นี่เป็นกราฟที่ค่อนข้างเล็ก (เราน่าจะสามารถนำเสนอในไม่กี่ร้อย KB) ดังนั้นจึงอาจสมเหตุสมผลในการโคลนกราฟในหน่วยความจำใช้การถ่วงน้ำหนักอีกครั้งจากนั้นทำการค้นหาบนกราฟที่โคลน แต่ถ้ามีวิธีที่มีประสิทธิภาพมากกว่าในการค้นหาขณะคำนวณน้ำหนักแบบทันทีฉันสนใจ

ฉันกำลังดูอัลกอริทึมที่อธิบายไว้ใน Santos (อัลกอริทึมเส้นทางที่สั้นที่สุด K), Eppstein 1997 (การค้นหาเส้นทางที่สั้นที่สุด k) และอื่น ๆ อัลกอริทึมของเงินเยนเป็นที่น่าสนใจส่วนใหญ่เพราะของ Java ที่มีอยู่ดำเนินการ ฉันไม่กลัวที่จะอ่านบทความวิจัย แต่ฉันคิดว่ามันคุ้มค่าที่จะทิ้งรายละเอียดของปัญหาของฉันและขอให้พอยน์เตอร์ประหยัดเวลาในการอ่าน

และถ้าคุณมีพอยน์เตอร์สำหรับการใช้งานจาวายิ่งดี


+1 เนื่องจากฉันสนใจข้อเสนอแนะที่ผู้คนมีและนี่ดูเหมือนว่าเป็นประเภทคำถามที่แน่นอนที่เว็บไซต์นี้สร้างขึ้น
KChaloux

เงื่อนไขแบบวนรอบของคุณไม่ได้หมายความว่าเส้นทางอื่น ๆ ตั้งแต่เริ่มต้นจนถึงเป้าหมายจะสร้างวงจรด้วยเส้นทางแรกหรือไม่ และถ้าทั้งสองเริ่มต้นและเป้าหมายอยู่ในตรอกตันทุกเส้นทางต้องใช้สองขอบนี้
user470365

บางทีฉันอาจจะไม่ชัดเจน ข้อ จำกัด ของวงจรจะใช้กับเส้นทางเดียวเท่านั้น - โดยทั่วไปเส้นทางที่แตกต่างกัน 2 เส้นทางจาก A ถึง B จะกลายเป็นวงจร
AaronD

@AaronD: งั้นคุณใช้อันไหนในที่สุด?
dagnelies

@arnaud: ฉันไม่แน่ใจว่าฉันได้ตัดสินในอัลกอริทึมแล้ว; ฉันจะเพิ่มการอัปเดตสำหรับคำถามนี้เมื่อฉันมี ฉันกำจัด Eppstein เพราะไม่รับประกันโซลูชัน acyclic (หรือที่เรียกว่า 'ง่าย') ขณะนี้ฉันทำงานกับอัลกอริทึมของเยน แต่ฉันยังไม่ได้รับการทำโปรไฟล์หรือการปรับให้เหมาะสมอย่างละเอียดดังนั้นฉันอาจต้องแทนที่ด้วยโปรไฟล์อื่น ฉันจะอัปเดตในหนึ่งหรือสองสัปดาห์ถัดไป
AaronD

คำตอบ:


2

หากต้องการตอบคำถามของฉันเองบางส่วน:

ตั้งแต่การโพสต์คำถามนี้ฉันค้นพบว่าเราต้องจัดการกับน้ำหนักขอบลบและบวก (ข้อ จำกัด ของเส้นทางแบบ acyclic / simple / loopless หมายความว่ามีการกำหนดทางออกที่ดีที่สุดในขณะที่ไม่มีข้อ จำกัด เส้นทางที่สั้นที่สุดผ่านกราฟ รอบค่าใช้จ่ายไม่ได้ถูกกำหนด)

อัลกอริธึมของเยนและคนอื่น ๆ ที่ฉันตรวจสอบส่วนใหญ่ขึ้นอยู่กับชุดการค้นหาที่ดีที่สุด 1 รายการ ส่วนใหญ่ใช้ Dijkstra สำหรับการค้นหาระดับกลางเหล่านั้น Dijkstra ไม่สนับสนุนน้ำหนักขอบลบ แต่เราสามารถทดแทน Bellman-Ford แทนได้ (อย่างน้อยก็ใน Yen อาจสันนิษฐานได้ว่าเป็น Lawler หรือ Eppstein เช่นกัน) ฉันได้พัฒนาการดัดแปลงของ Bellman-Ford ด้วยข้อ จำกัด ความยาวเส้นทาง (เป็นขอบ) และการตรวจสอบวงจรอย่างชัดเจนในระหว่างการค้นหา ความซับซ้อนในการคำนวณแย่กว่านี้ แต่ก็ยังสามารถรองรับได้ตามความต้องการของฉัน ฉันจะแก้ไขคำตอบนี้และลิงก์ไปยังรายงานเทคโนโลยีหากฉันได้รับอนุญาตให้โพสต์


1

ฉันจะบอกว่าคำถามนี้สามารถ googled ได้ง่ายและซ้ำซ้อน:

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

http://pdf.aminer.org/001/059/121/finding_the_k_shortest_paths.pdf


ก่อนอื่นขอบคุณสำหรับคำแนะนำของ Eppstein ฉันจะดูเพิ่มเติมที่นั่น ฉันขอยืนยันว่านี่ไม่ใช่สิ่งที่ซ้ำกันแน่นอนและไม่ง่ายต่อการ google; มันง่ายที่จะหาอัลกอริทึม k-best แต่ไม่ใช่เรื่องง่ายที่จะเลือกอย่างสมเหตุสมผลระหว่างพวกเขา ฉันคาดหวังว่าฉันต้องการอัลกอริทึมที่แตกต่างกันอย่างมากสำหรับกราฟที่เชื่อมต่อกันอย่างกระจัดกระจายของยอดเขานับล้านกว่าที่ฉันจะทำสำหรับปัญหานี้ ฉันจะสนใจเกี่ยวกับความซับซ้อนใน k มากขึ้นถ้าฉันต้องการ 1000- ดีที่สุดแทน 10 ดีที่สุด และในขณะที่ปัจจัยคงที่ไม่ได้มีความสำคัญเมื่อทำการเผยแพร่เอกสาร แต่แน่นอนว่าเมื่อส่งรหัสการผลิต
AaronD

@ AaronD: สำหรับข้อมูลของคุณฉันคิดว่าอัลกอริทึมมีประสิทธิภาพมากไม่ว่าในกรณีใด บางทีอาจมีบางกรณีที่การค้นหาแบบขับเคลื่อนด้วยการค้นหาแบบฮิวริสติกชนะ แต่สำหรับกรณีทั่วไปฉันคิดว่ามันทำได้ดีมาก ประสิทธิภาพที่แน่นอนอาจขึ้นอยู่กับว่าคุณใช้งานอย่างไรประสิทธิภาพของโครงสร้างข้อมูลของคุณและการปรับแต่งให้เข้ากับปัญหาของคุณ
dagnelies

@arnaud สวัสดีคุณสามารถแชร์การใช้ eppstein ของคุณได้หรือไม่ ฉันมีคำถามที่คล้ายกันโพสต์ที่นี่: math.stackexchange.com/questions/1661737/ …
Tina J
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.