เส้นทางที่สั้นที่สุดบนกราฟที่ไม่ได้บอกทิศทาง


19

ดังนั้นฉันคิดว่าคำถามนี้ (แต่ค่อนข้างพื้นฐาน) อยู่ที่นี่:

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

เมื่อกำหนดโหนดเริ่มต้นที่แน่นอนแล้วเราจะหาเส้นทางที่สั้นที่สุดไปยังโหนดอื่น ๆ บนกระดานได้อย่างไร

ฉันจินตนาการว่าจะมีเพียงขอบระหว่างโหนดที่เคลื่อนที่ได้ ดังนั้นจากข้อมูลนี้ฉันต้องการหาเส้นทางที่สั้นที่สุดจากโหนดเริ่มต้นไปยังโหนดสุดท้าย

ความคิดเริ่มต้นของฉันคือขอบแต่ละข้างนั้นมีน้ำหนัก 1 น้ำหนักอย่างไรก็ตามกราฟไม่ได้ถูกบอกทิศทางดังนั้น Djikstras จึงไม่เหมาะอย่างยิ่ง ดังนั้นฉันตัดสินใจที่จะทำโดยใช้รูปแบบที่เปลี่ยนแปลงของการค้นหาความลึกครั้งแรก

อย่างไรก็ตามฉันไม่สามารถทำให้ชีวิตของฉันนึกภาพได้ว่าจะหาเส้นทางที่สั้นที่สุดโดยใช้การค้นหาได้อย่างไร

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

ไม่มีใครมีความคิดใด ๆ ที่อาจชี้ให้ฉันไปในทิศทางที่ถูกต้องในเรื่องนี้?

ขอบคุณมาก.

(ฉันพยายามใส่ภาพกราฟ แต่ไม่สามารถทำได้เนื่องจากชื่อเสียงที่ต่ำของฉัน)

คำตอบ:


19

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


ผู้ชาย ohhhhhh ฉันไม่ได้คิดถึง BFS! ขอบคุณตัน!
gfppaste

มันเกินความเป็นไปได้ยังไง? อาจจะมีการใช้งานยากขึ้นเล็กน้อยไม่มีอะไรอื่น

ฉันต้องการเพิ่มว่า BFS นั้นมีประสิทธิภาพมากกว่า BFS มีO(|E|)ในขณะ Dijkstra O(|E| + |V|log(|V|)มี
Doug Ramsey

@ user742 BFS เร็วกว่า Djikstras Djikstra O(mn)ขณะที่ BFS คือO(V + E)
CodyBugstein

13

Nicholas ได้ให้คำตอบที่สมบูรณ์แบบแล้ว อย่างไรก็ตามให้ฉันพูดถึงความพยายามเริ่มแรกของคุณในการใช้การค้นหาเชิงลึกก่อน

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

dmaxkidmax+i×kdmax=k=1 คุณรับประกันได้ว่าจะหาทางออกที่ดีที่สุดในขณะที่ใช้หน่วยความจำเชิงเส้นในเชิงลึกของการแก้ปัญหา

bb1b

ไชโย

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