คำถามติดแท็ก shortest-path

คำถามเกี่ยวกับปัญหาอัลกอริทึมในการค้นหาเส้นทางที่สั้นที่สุดระหว่างโหนดในกราฟ

7
ต้นไม้ทอดต่ำสุดเทียบกับเส้นทางที่สั้นที่สุด
ความแตกต่างระหว่างอัลกอริทึม Spanning Tree ขั้นต่ำและอัลกอริธึมพา ธ ที่สั้นที่สุดคืออะไร ในคลาสโครงสร้างข้อมูลของฉันเราครอบคลุมอัลกอริธึมแผนผังต้นไม้ขั้นต่ำสองอัน (Prim's และ Kruskal's) และอัลกอริธึมพา ธ สั้นที่สุด (Dijkstra's) Spanning Tree ขั้นต่ำเป็นแผนผังในกราฟที่ครอบคลุมทุกจุดยอดและน้ำหนักรวมของต้นไม้น้อยที่สุด เส้นทางที่สั้นที่สุดนั้นค่อนข้างชัดเจนมันเป็นเส้นทางที่สั้นที่สุดจากจุดสุดยอดหนึ่งไปอีกจุดหนึ่ง สิ่งที่ฉันไม่เข้าใจคือเนื่องจากต้นไม้ที่สแปนนิ่งขั้นต่ำมีน้ำหนักรวมเพียงเล็กน้อยเส้นทางในต้นไม้จะเป็นเส้นทางที่สั้นที่สุดหรือไม่ ใครช่วยอธิบายสิ่งที่ฉันหายไปได้บ้าง ความช่วยเหลือใด ๆ ที่ชื่นชม

3
อัลกอริธึมที่เร็วที่สุดสำหรับการค้นหาเส้นทางที่สั้นที่สุดทั้งหมดในกราฟคืออะไร?
ในกราฟที่ไม่มีการถ่วงน้ำหนักและไม่มีทิศทางด้วย vertices และ edge เช่นวิธีใดที่เร็วที่สุดในการค้นหาเส้นทางที่สั้นที่สุดทั้งหมดในกราฟ สามารถทำได้เร็วกว่า Floyd-Warshall ซึ่งเป็นแต่เร็วมากต่อการทำซ้ำหรือไม่?VVVEEE2V>E2V>E2V \gt EO(V3)O(V3)O(V^3) ถ้ากราฟนั้นถูกถ่วงน้ำหนักล่ะ?

3
การดึงเส้นทางที่สั้นที่สุดของกราฟแบบไดนามิก
ฉันกำลังศึกษาเส้นทางที่สั้นที่สุดในกราฟกำกับ มีอัลกอริธึมที่มีประสิทธิภาพมากมายสำหรับการค้นหาเส้นทางที่สั้นที่สุดในเครือข่ายเช่น dijkstra's หรือ bellman-ford's แต่ถ้ากราฟเป็นไดนามิก? โดยการพูดแบบไดนามิกฉันหมายความว่าเราสามารถแทรกหรือลบจุดยอดในระหว่างการดำเนินการของโปรแกรม ฉันพยายามที่จะหาขั้นตอนวิธีการที่มีประสิทธิภาพสำหรับการปรับปรุงเส้นทางที่สั้นที่สุดจากจุดสุดยอดทุกจุดสุดยอดอื่น ๆUหลังจากการใส่ขอบอีโดยไม่จำเป็นต้องเรียกใช้อัลกอริทึมเส้นทางที่สั้นที่สุดในกราฟใหม่อีกครั้ง ฉันจะทำสิ่งนี้ได้อย่างไร ขอบคุณล่วงหน้า.vvvuuueee หมายเหตุ:การเปลี่ยนแปลงสามารถทำได้หลังจากการวนซ้ำครั้งแรกของอัลกอริทึม หมายเหตุ [2]: ให้สองโหนดคือต้นทางและtเป้าหมาย ฉันต้องการค้นหาเส้นทางที่สั้นที่สุดระหว่างโหนดเหล่านี้ เมื่อกราฟมีการปรับปรุงฉันมีเพียงแค่การปรับปรุงπ ( s , T )ซึ่งเป็นเส้นทางที่สั้นที่สุดระหว่างsและเสื้อssstttπ(s,t)π(s,t)\pi(s,t)sssttt หมายเหตุ [3]:ฉันสนใจเฉพาะเคสใส่ขอบเท่านั้น ความหมายอย่างเป็นทางการ : ให้กราฟ ) กำหนดดำเนินการปรับปรุงเป็น 1) แทรกของขอบอีเพื่อEหรือ 2) การลบขอบ AA อีจากE วัตถุประสงค์คือการหาค่าใช้จ่ายของเส้นทางที่สั้นที่สุดของคู่ทั้งหมดอย่างมีประสิทธิภาพหลังจากการดำเนินการอัพเดท อย่างมีประสิทธิภาพเราหมายถึงอย่างน้อยก็ดีกว่าดำเนินการอัลกอริทึม All-Pairs-Shortest-Path เช่นอัลกอรึทึมของ Bellman-Ford หลังจากการดำเนินการอัพเดทแต่ละครั้งG=(V,E)G=(V,E)G = (V,E)eeeEEEeeeEEE แก้ไข:ด้านล่างมีปัญหาในเวอร์ชันที่ง่ายขึ้น: กราฟถ่วงน้ำหนักจะได้รับประกอบด้วยขอบทิศทางเดียวและสองจุดสำคัญsและเสื้อ ชุดของขอบสองทิศทางของผู้สมัครจะได้รับเช่นกัน ฉันจะต้องสร้างขอบเพื่อลดระยะทางจากไปทีG(V,E)G(V,E)G(V,E)ssstttCCC(u,v)∈C(u,v)∈C(u,v) \in Csssttt

1
ระยะทางที่สั้นที่สุดเปลี่ยนไปมากแค่ไหนเมื่อเพิ่มขอบเข้ากับกราฟ
ให้เป็นกราฟที่สมบูรณ์, มีน้ำหนัก, ไม่ระบุทิศทาง เราสร้างกราฟสองG ' = ( V , E ' )โดยการเพิ่มขอบหนึ่งโดยหนึ่งจากEไปE ' เราเพิ่มขอบΘ ( | V | )ลงในG ′ทั้งหมดG=(V,E)G=(V,E)G=(V,E)G′=(V,E′)G′=(V,E′)G'=(V, E')EEEE′E′E'Θ(|V|)Θ(|V|)\Theta(|V|)G′G′G' ทุกครั้งที่เราเพิ่มอีกหนึ่งขอบเพื่อE 'เราจะพิจารณาในระยะทางที่สั้นที่สุดระหว่างคู่ทั้งหมดใน( V , E ' )และ( V , E ' ∪ { ( U , V ) } ) เรานับจำนวนของระยะทางที่สั้นที่สุดเหล่านี้มีการเปลี่ยนแปลงเป็นผลมาจากการเพิ่ม( U , V ) ให้C iเป็นระยะทางที่สั้นที่สุดที่เปลี่ยนไปเมื่อเราเพิ่มi(u,v)(u,v)(u,v)E′E′E'(V,E′)(V,E′)(V, E')(V,E′∪{(u,v)})(V,E′∪{(u,v)})(V, E' …


2
เริ่มวงจรเชิงลบโดยใช้ Bellman Ford
ฉันต้องหาวัฏจักรเชิงลบในกราฟถ่วงน้ำหนักกำกับ ฉันรู้ว่าอัลกอรึทึมของ Bellman Ford ทำงานอย่างไรและมันบอกฉันว่ามีรอบลบหรือไม่ แต่มันไม่ได้ตั้งชื่ออย่างชัดเจน ฉันจะได้รับเส้นทางจริงของวัฏจักรอย่างไรv 1 , v 2 , … v k , v 1v1,v2,…vk,v1v1, v2, \ldots vk, v1 หลังจากใช้อัลกอริทึมมาตรฐานเราได้ทำการวนซ้ำแล้วและไม่ควรทำการปรับปรุงเพิ่มเติม หากเรายังคงสามารถลดระยะห่างไปยังโหนดได้จะมีวัฏจักรเชิงลบเกิดขึ้นn - 1n-1n-1 ความคิดของฉันคือ: เนื่องจากเรารู้ว่าขอบที่ยังสามารถปรับปรุงเส้นทางและเรารู้ว่าบรรพบุรุษของแต่ละโหนดเราสามารถติดตามวิธีการของเรากลับจากขอบนั้นจนกว่าเราจะได้พบกันอีกครั้ง ตอนนี้เราควรมีวัฏจักรของเรา น่าเศร้าที่ฉันไม่พบบทความใด ๆ ที่บอกฉันว่าสิ่งนี้ถูกต้องหรือไม่ ดังนั้นมันใช้งานได้จริงเช่นนั้น? แก้ไข:ตัวอย่างนี้พิสูจน์ว่าความคิดของฉันไม่ถูกต้อง ได้รับรูปแบบของกราฟต่อไปนี้เราทำงานยามฟอร์ดจากโหนด1111 เราจะดำเนินการขอบในลำดับD หลังจากทำซ้ำเราจะได้รับระยะทางโหนด:n - 1 1 : - 5 2 : - 30 3 : - …

2
เส้นทางที่สั้นที่สุดบนกราฟที่ไม่ได้บอกทิศทาง
ดังนั้นฉันคิดว่าคำถามนี้ (แต่ค่อนข้างพื้นฐาน) อยู่ที่นี่: สมมติว่าฉันมีกราฟขนาด 100 โหนดในรูปแบบ 10x10 (คิดว่ากระดานหมากรุก) กราฟไม่ได้ถูกบอกทิศทางและไม่ได้ถ่วงน้ำหนัก การเคลื่อนที่ผ่านกราฟเกี่ยวข้องกับการเคลื่อนไปข้างหน้าสามช่องทางและข้างหนึ่งไปทางซ้ายหรือขวา (คล้ายกับว่าหมากรุกอัศวินเคลื่อนที่ผ่านกระดาน) เมื่อกำหนดโหนดเริ่มต้นที่แน่นอนแล้วเราจะหาเส้นทางที่สั้นที่สุดไปยังโหนดอื่น ๆ บนกระดานได้อย่างไร ฉันจินตนาการว่าจะมีเพียงขอบระหว่างโหนดที่เคลื่อนที่ได้ ดังนั้นจากข้อมูลนี้ฉันต้องการหาเส้นทางที่สั้นที่สุดจากโหนดเริ่มต้นไปยังโหนดสุดท้าย ความคิดเริ่มต้นของฉันคือขอบแต่ละข้างนั้นมีน้ำหนัก 1 น้ำหนักอย่างไรก็ตามกราฟไม่ได้ถูกบอกทิศทางดังนั้น Djikstras จึงไม่เหมาะอย่างยิ่ง ดังนั้นฉันตัดสินใจที่จะทำโดยใช้รูปแบบที่เปลี่ยนแปลงของการค้นหาความลึกครั้งแรก อย่างไรก็ตามฉันไม่สามารถทำให้ชีวิตของฉันนึกภาพได้ว่าจะหาเส้นทางที่สั้นที่สุดโดยใช้การค้นหาได้อย่างไร อีกสิ่งหนึ่งที่ฉันพยายามคือการใส่กราฟในรูปแบบต้นไม้โดยมีจุดเริ่มต้นเป็นรูทจากนั้นเลือกผลลัพธ์ที่ตื้นที่สุด (หมายเลขแถวต่ำสุด) ที่ให้โหนดปลายทางที่ต้องการแก่ฉัน ... สิ่งนี้ใช้ได้ แต่ก็ไม่มีประสิทธิภาพอย่างเหลือเชื่อ จะไม่ทำงานสำหรับกราฟขนาดใหญ่ ไม่มีใครมีความคิดใด ๆ ที่อาจชี้ให้ฉันไปในทิศทางที่ถูกต้องในเรื่องนี้? ขอบคุณมาก. (ฉันพยายามใส่ภาพกราฟ แต่ไม่สามารถทำได้เนื่องจากชื่อเสียงที่ต่ำของฉัน)

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

4
อัลกอริทึมของ Dijkstra บนกราฟขนาดใหญ่
ฉันคุ้นเคยกับ Dijkstra มากและมีคำถามเฉพาะเกี่ยวกับอัลกอริทึม หากฉันมีกราฟขนาดใหญ่เช่น 3.5 พันโหนด (ข้อมูล OpenStreetMap ทั้งหมด) จากนั้นฉันจะไม่สามารถมีกราฟในหน่วยความจำได้อย่างชัดเจนดังนั้นกราฟจะถูกเก็บไว้ในดิสก์ในฐานข้อมูล มีห้องสมุดสำหรับคำนวณเส้นทางที่สั้นที่สุดบนกราฟดังกล่าว พวกเขาทำเช่นนี้ได้อย่างไร โดยเฉพาะพวกเขาจะโหลดส่วนที่ต้องการของกราฟเพื่อเรียกใช้อัลกอริทึมของ Dijkstra ได้อย่างไร การดึงรายการ adjacency ของแต่ละจุดสุดยอดที่เข้าชมจะต้องใช้ฐานข้อมูล 1,500 แบบสอบถามต่อ 10,000 โหนดตามข้อมูลสถิติของฉันดังนั้นจึงไม่ใช่วิธีการที่ชัดเจน นั่นจะช้าเกินไป พวกเขาทำมันได้อย่างไร? ฉันพยายามที่จะใช้มันด้วยตัวเอง

2
ได้อย่างมีประสิทธิภาพการสุ่มตัวอย่างที่สั้นที่สุด
ให้เป็นกราฟและให้sและเสื้อมีสองจุดของG เราสามารถได้อย่างมีประสิทธิภาพตัวอย่างที่สั้นที่สุดs - เสื้อเส้นทางสม่ำเสมอและเป็นอิสระโดยการสุ่มจากชุดของเส้นทางที่สั้นที่สุดทั้งหมดระหว่างsและเสื้อ ? เพื่อความง่ายเราสามารถสรุปได้ว่าGนั้นง่ายไม่ได้บอกทิศทางและไม่มีน้ำหนักGGGssstttGGGssstttssstttGGG แม้ในกราฟที่ จำกัด จำนวนมากจำนวนเส้นทางที่สั้นที่สุดระหว่างและtสามารถเป็นเลขชี้กำลังเป็นขนาดGได้ ดังนั้นเราจึงจะเป็นธรรมชาติเหมือนจริงหลีกเลี่ยงการคำนวณทั้งหมดที่สั้นที่สุดs - เสื้อเส้นทาง ฉันไม่รู้เกี่ยวกับกรณีทั่วไป แต่สำหรับฉันแล้วเราสามารถทำสิ่งนี้เพื่อเรียนกราฟพิเศษได้ssstttGGGsssttt รู้สึกเหมือนมีบางสิ่งที่บางคนต้องพิจารณาก่อน มีการวิจัยที่มีอยู่ในเรื่องนี้หรืออันที่จริงแล้วมันง่ายที่จะทำแม้กระทั่งกราฟทั่วไป?

2
เส้นทางที่ไม่ตัดกันสั้นที่สุดสำหรับกราฟที่ฝังอยู่ในระนาบแบบยุคลิด (2D)
อัลกอริธึมอะไรที่คุณจะใช้เพื่อค้นหาเส้นทางที่สั้นที่สุดของกราฟซึ่งฝังอยู่ในระนาบแบบยุคลิดซึ่งเส้นทางนั้นไม่ควรมีจุดตัดด้วยตนเอง (ในการฝัง) ยกตัวอย่างเช่นในกราฟด้านล่างที่คุณต้องการจะไปจากที่ ) โดยปกติอัลกอริทึมอย่างอัลกอริทึมของ Dijkstra จะสร้างลำดับดังนี้:( 0 , 0 ) → ( - 3 , 2 )(0,0)→(-3,2)(0,0) \rightarrow (-3,2) [ ( 0 , 0 ) →3( 0 , 3 ) →2√( 1 , 2 ) →4( - 3 , 2 ) ] = 7 + 2-√.[(0,0)→3(0,3)→2(1,2)→4(-3,2)]=7+2.\left[ (0,0) \stackrel {3}{\rightarrow} …

2
อัลกอรึทึมของ Bellman-Ford - เหตุใดจึงสามารถปรับปรุงขอบให้ล้าสมัยได้?
อัลกอริทึม Bellman ฟอร์ดเป็นตัวกำหนดเส้นทางที่สั้นที่สุดจากแหล่งเพื่อจุดอื่น ๆ ทั้งหมด ในขั้นต้นระยะห่างระหว่างsและจุดอื่น ๆ ทั้งหมดถูกตั้งค่าให้∞ จากนั้นคำนวณเส้นทางที่สั้นที่สุดจากsถึงจุดสุดยอดแต่ละจุด สิ่งนี้ดำเนินต่อไปสำหรับ | V | - 1ซ้ำ คำถามของฉันคือ:ssssss∞∞\inftysss|V|−1|V|−1|V|-1 ทำไมต้องมีซ้ำ|V|−1|V|−1|V|-1 มันจะสำคัญไหมถ้าฉันตรวจสอบขอบตามลำดับอื่น พูดถ้าฉันตรวจสอบขอบ 1,2,3 เป็นครั้งแรก แต่จากนั้นในการทำซ้ำครั้งที่สองฉันตรวจสอบ 2,3,1 MIT Prof. Eric กล่าวว่าคำสั่งไม่สำคัญ แต่สิ่งนี้ทำให้ฉันสับสน: อัลกอริทึมจะอัปเดตโหนดบน edge ไม่ถูกต้องหรือไม่หากค่าของมันขึ้นอยู่กับ edge x 1แต่x 1นั้นได้รับการอัปเดตหลังจากx 2หรือไม่x2x2x_2x1x1x_1x1x1x_1x2x2x_2

2
การค้นหาเส้นทางที่สั้นและยาวที่สุดระหว่างจุดยอดสองจุดใน DAG
ให้ DAG ที่ไม่มีน้ำหนัก (กำกับด้วยกราฟ acyclic)และสองจุดยอดและเป็นไปได้ไหมที่จะหาเส้นทางที่สั้นและยาวที่สุดจากถึงในเวลาพหุนาม ความยาวเส้นทางวัดจากจำนวนขอบD=(V,A)D=(V,A)D = (V,A)ssstttsssttt ฉันสนใจที่จะหาช่วงของความยาวเส้นทางที่เป็นไปได้ในเวลาพหุนาม Ps. คำถามนี้เป็นซ้ำของ StackOverflow คำถามเส้นทางที่ยาวที่สุดใน DAG

1
ความสอดคล้องแสดงให้เห็นว่าฮิวริสติกนั้นยอมรับได้อย่างไร
ฟังก์ชันการแก้ปัญหาคือ ...h(n)h(n)h (n) สอดคล้องกันถ้าค่าใช้จ่ายโดยประมาณจากโหนดถึงเป้าหมายนั้นไม่สูงกว่าต้นทุนขั้นตอนจนถึงตัวตายตัวแทนบวกกับต้นทุนโดยประมาณจากตัวตายตัวแทนไปยังเป้าหมายnnnn′n′n' ยอมรับได้ถ้าไม่เคยประเมินค่าใช้จ่ายที่แท้จริงกับสถานะเป้าหมายh(n)h(n)h(n) ตำราเรียนสำหรับหลักสูตรปัญญาประดิษฐ์ของฉันระบุว่าความมั่นคงแข็งแกร่งกว่าการยอมรับได้ แต่ไม่ได้พิสูจน์และฉันมีปัญหาในการหาคำอธิบายทางคณิตศาสตร์

2
ทำไมเราไม่พบเส้นทางที่สั้นที่สุดที่มีน้ำหนักเชิงลบโดยเพียงแค่เพิ่มค่าคงที่เพื่อให้น้ำหนักทั้งหมดเป็นค่าบวก
ฉันกำลังอ่านคำแนะนำเกี่ยวกับอัลกอริทึมและมาจากอัลกอริทึมของจอห์นสันที่ขึ้นอยู่กับการทำให้แน่ใจว่าเส้นทางทั้งหมดเป็นไปในทางบวก อัลโกนั้นขึ้นอยู่กับการหาฟังก์ชั่นน้ำหนักใหม่ (w ') ที่เป็นบวกสำหรับทุกขอบและรักษาความถูกต้องของความสัมพันธ์เส้นทางที่สั้นที่สุด มันทำได้โดยการคำนวณ h (s), h (d) ค่าที่จะเพิ่มเข้าไปในค่าดั้งเดิม w คำถามของฉันคือทำไมไม่เพียงแค่หาค่า w ที่เล็กที่สุดในกราฟและเพิ่มลงในขอบทั้งหมด? สิ่งนี้จะเป็นไปตามเงื่อนไขทั้งสองและจะต้องใช้การคำนวณน้อยลง

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