การหาเส้นทางของขอบทั้งหมดบนกราฟ

ฉันกำลังพยายามหาเส้นทางบนกราฟที่ครอบคลุมขอบทั้งหมด และสำรวจมันเพียงครั้งเดียว ซึ่งหมายความว่าจะมีจุด "สิ้นสุด" เพียงสองจุดเท่านั้น ซึ่งจะมีจำนวนโหนดที่ต่ออยู่เป็นจำนวนคี่ จุดสิ้นสุดเหล่านี้อาจมีขอบเชื่อมต่อหนึ่งอัน หรือเป็นส่วนหนึ่งของลูปและมีการเชื่อมต่อ 3 จุด

ดังนั้นในกรณีง่ายๆ ด้านล่าง ฉันต้องสำรวจโหนดตามลำดับ 1-2-3-4-5 (หรือ 5-4-3-2-1):

ง่าย

ในกรณีที่ซับซ้อนกว่าด้านล่างเส้นทางจะเป็น 1-2-3-4-2 (หรือ 1-2-4-3-2):

--กราฟ

ด้านล่างนี้เป็นกราฟที่ถูกต้องด้วย โดยมีจุดสิ้นสุด 2 จุด: 1-2-4-3-2-5

ซับซ้อน

ฉันพยายามค้นหาชื่อของอัลกอริทึมเพื่อแก้ไขปัญหานี้ และคิดว่ามันคือ "ปัญหาบุรุษไปรษณีย์จีน" แต่การนำสิ่งนี้ไปใช้ตามโค้ดที่ https://github.com/rkistner/chinese-postman/blob/master/postman.py ไม่ได้ให้ผลลัพธ์ที่ฉันคาดหวัง .

เส้นทาง Eulerian ดูเกือบจะเป็นสิ่งที่จำเป็น แต่ การใช้งานเครือข่ายx จะใช้ได้กับเครือข่ายแบบปิด (แบบวนซ้ำ) เท่านั้น

ฉันยังได้ดู Hamiltonian Path - และลองใช้ อัลกอริทึม networkx - แต่ประเภทกราฟ ไม่ได้รับการสนับสนุน

ตามหลักการแล้ว ฉันต้องการใช้ Python และ networkx เพื่อดำเนินการนี้ และอาจมีวิธีแก้ไขปัญหาง่ายๆ ที่เป็นส่วนหนึ่งของไลบรารีอยู่แล้ว แต่ดูเหมือนจะหาไม่พบ


person geographika    schedule 10.03.2017    source แหล่งที่มา
comment
เส้นทางแฮมิลตันครอบคลุมจุดยอดทั้งหมด คุณอาจต้องการตรวจสอบ เส้นทาง Eulerian ซึ่งครอบคลุมขอบแทน ดูเหมือนว่า GeeksForGeeks จะมีตัวอย่างการใช้งานสำหรับ Python   -  person niemmi    schedule 10.03.2017
comment
@niemmi - ขอบคุณ! ดูเหมือนว่า Eulerian trai (แทนที่จะเป็นวงจร) เป็นคำที่ฉันกำลังมองหา ฉันจะดูอัลกอริทึมและดูว่าสามารถทำให้ง่ายขึ้นโดยใช้วิธี networkx ที่มีอยู่หรือไม่   -  person geographika    schedule 10.03.2017
comment
@niemmi สิทธิ์ของคุณคุณสามารถทำให้เป็นคำตอบได้เช่นกันโดยการเพิ่มลิงก์ที่เหมาะสม ..   -  person Abhishek Jebaraj    schedule 10.03.2017
comment
ซึ่งเรียกว่า เส้นทาง Eulerian ของกราฟ ขณะนี้ได้เพิ่มลงใน networkx เป็น eulerian_path()< /ก>.   -  person iacob    schedule 08.04.2021


คำตอบ (2)


คุณกำลังมองหา Eulerian Path ที่เข้าชมทุกขอบเพียงครั้งเดียว คุณสามารถใช้อัลกอริทึมของ Fleury เพื่อสร้างเส้นทางได้ อัลกอริทึมของ Fleury มีความซับซ้อนของเวลา O(E^2) หากคุณต้องการอัลกอริทึมที่มีประสิทธิภาพมากขึ้น ให้ตรวจสอบ อัลกอริทึมของ Hierholzer ซึ่งก็คือ O(E) แทน

นอกจากนี้ยังมีคำขอดึงที่ไม่ถูกรวมสำหรับไลบรารี networkx ที่ใช้สิ่งนี้ แหล่งที่มาใช้งานง่าย

(สำหรับเครือข่ายx 1.11 จะต้องแทนที่ .edge ด้วย .edge_iter)

person niemmi    schedule 10.03.2017
comment
เมื่อฉันแน่ใจในชื่อประเภทเส้นทางที่ฉันต้องการแล้ว ฉันสามารถค้นหาการใช้งานใน networkx ได้ - person geographika; 10.03.2017
comment
หมายเหตุ: คำขอดึงดังกล่าวถูกปิดแล้วเนื่องจากมีปัญหาพื้นฐาน ด้วยการใช้อัลกอริธึมการค้นหาเส้นทางในนั้น - person iacob; 21.04.2019

ซึ่งเรียกว่า เส้นทาง Eulerian ของกราฟ ขณะนี้ได้ถูกเพิ่มลงใน NetworkX เป็น eulerian_path()< /ก>.

person iacob    schedule 26.03.2021