มีอัลกอริธึมที่เหมาะสมที่สุดในการค้นหาเส้นทางที่สั้นที่สุดที่ยาวที่สุดในเครือข่ายหรือไม่?


13

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

มีวิธีที่ดีที่สุดในการคำนวณโดยไม่ใช้กำลังดุร้ายหรือไม่? ฉันสามารถยกเว้นบางจุดตามกฎที่ฉลาดได้หรือไม่

วิธีการค้นหาเส้นทางสีแดงอย่างมีประสิทธิภาพได้อย่างไร

แก้ไข: ฉันได้เพิ่มภาพประกอบของเส้นทางที่ยาวที่สุดที่ @Alex Tereshenkov พูดถึงเพื่อชี้แจงคำถามของฉัน พา ธ สีดำเป็นผลลัพธ์ของอัลกอริธึมพา ธ ที่ยาวที่สุด ในกรณีของฉันจินตนาการว่าคุณเข้าสู่เครือข่ายจากตัวอักษรใด ๆ และคุณต้องขับรถไปที่ตัวอักษรอื่นให้เร็วที่สุด ตัวอักษรสองตัวใดที่เข้าร่วมได้ยากที่สุด? ป้อนคำอธิบายรูปภาพที่นี่


skillz บ้าสี!
อดัม

คำตอบ:


6

ฉันคิดว่าคุณอาจกำลังมองหากราฟขนาดเส้นผ่าศูนย์กลางของเครือข่ายของคุณ มีคำถามสองสามข้อเกี่ยวกับ stackexchange ที่กล่าวถึงหัวข้อนี้เช่น:

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

เราสามารถคำนวณเส้นทางจากจุดยอด V1 ซึ่งเป็นเส้นทางที่สั้นที่สุดระหว่าง V1 และหนึ่งในจุดสุดยอดและยาวกว่าเส้นทางที่สั้นที่สุดระหว่างจุดสุดยอดอื่น ๆ ดูโพสต์นี้สำหรับอัลกอริทึม จากนั้นเราสามารถวนซ้ำทุก ๆ จุดสุดยอดและค้นหาเส้นทางที่ยาวที่สุดโดยที่จุดยอดทุกจุดเป็นราก เมื่อเรามีรายการเส้นทางที่สั้นที่สุดที่ยาวที่สุดทั้งหมดเราสามารถค้นหาเส้นทางที่มีค่าสูงสุดและส่งคืนได้


ขอบคุณเส้นผ่านศูนย์กลางกราฟเป็นสิ่งที่ฉันกำลังมองหาและฮิวริสติกหลอกของฉันทำงานในกรณีของฉัน ฉันเพิ่งเรียนรู้คำศัพท์ใหม่ที่นั่น!
radouxju

7

ตามที่หน้า Wikipedia ปัญหาเส้นทางที่ยาวที่สุดปัญหานี้

... คือ NP-hard ซึ่งหมายความว่ามันไม่สามารถแก้ไขได้ในเวลาพหุนาม สำหรับกราฟโดยพลการยกเว้นว่า P = NP ผลการทดสอบความแข็งที่แข็งแกร่งยิ่งขึ้นแสดงให้เห็นว่าเป็นการยากที่จะประมาณ อย่างไรก็ตามมันมีวิธีการแก้ปัญหาเวลาเชิงเส้นสำหรับกราฟเชิงเส้นกำกับซึ่งมีการใช้งานที่สำคัญในการหาเส้นทางที่สำคัญในการกำหนดเวลาปัญหา

หากคุณทำงานกับ (หรือสามารถแสดงกราฟของคุณเป็นDAG ) networkxแพคเกจ Python จะช่วยให้คุณคำนวณได้ dag_longest_pathมองหาฟังก์ชั่น

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


ขอบคุณสำหรับคำตอบแล้ว +1 เพราะข้อมูล อย่างไรก็ตามฉันกำลังมองหาเส้นทางที่สั้นที่สุดในเครือข่าย (ในตัวอย่างของฉันไม่มีทางอ้อมไปยัง B หรือ H) ดังนั้นทางออกของคุณไม่ใช่สิ่งที่ฉันกำลังมองหาแม้ว่ามันจะบอกเป็นนัยว่า "กำลังดุร้าย" น่าจะเป็นทางออกเดียว
radouxju

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