เหตุใดจึงไม่สามารถใช้ DFS เพื่อค้นหาเส้นทางที่สั้นที่สุดในกราฟที่ไม่ถ่วง


16

ฉันเข้าใจว่าการใช้ DFS "ตามที่เป็นอยู่" จะไม่พบเส้นทางที่สั้นที่สุดในกราฟที่ไม่ถ่วง

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

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


1
อัลกอริธึมการค้นหาเส้นทางที่พบบ่อยที่สุดในกราฟที่ไม่ถ่วงคือ A * ด้วยการปรับเปลี่ยนเล็กน้อยที่ความสัมพันธ์จะใกล้เข้ามาจนจบ สิ่งนี้จะให้อัลกอริทึมที่คล้ายกับ DFS โดยที่มันจะลองเส้นทางที่ตรงที่สุดก่อนและจะมีฟองออกไปด้านนอกถ้าจำเป็นเท่านั้น
BlueRaja - Danny Pflughoeft

1
ลองใช้ DFS บนกราฟบางตัว (เลือกอย่างดี); ถ้ามันใช้งานไม่ได้จริงคุณควรพบปัญหา Btw คำถามของคุณอ่านราวกับว่ามันทำงานบนกราฟถ่วงน้ำหนัก
กราฟิลส์

ใช่คุณสามารถทำได้ นี่คือวิธีแก้ปัญหา
Anmol Middha

คำตอบ:


12

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

ทางเลือกเดียวที่เป็นไปได้ (ไปยังเส้นทางที่สั้นที่สุด) ที่ฉันสามารถทำได้คือวิธีโลภที่มองเด็กตามลำดับระยะทางจากโหนดปัจจุบัน (จากเล็กไปใหญ่) มันง่ายที่จะสร้างตัวอย่างของกฎสำหรับกฎนี้:

ตัวอย่างเคาน์เตอร์สำหรับกฎโลภ
[ แหล่งที่มา ]

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

อย่างไรก็ตามไม่ว่ากฎจะเป็นอย่างไรคุณสามารถสร้างกราฟที่มี DFS ส่งไปยังทางอ้อมที่โหนดแรกนานเหมือนที่ฉันทำกับกฎโลภ ขอบกำหนดและน้ำหนักเช่นว่า Chooses กฎในการเยี่ยมชมแรกและกำหนดมากขึ้นน้ำหนักมากกว่าหนึ่งของt) ดังนั้นจึงเป็นไปได้ที่ DFS ไม่สามารถหาเส้นทางที่สั้นที่สุด (ในกราฟทั่วไป)( s , a ) a ( a , b ) ( s , t )(s,t)(s,a)a(a,b)(s,t)

โปรดทราบว่าเนื่องจากคุณสามารถแสดงกราฟถ่วงน้ำหนักทุกจำนวน (บวก - จำนวนเต็ม) เป็นกราฟที่ไม่ถ่วงน้ำหนัก - เพียงแค่แทนที่ขอบด้วยค่าใช้จ่ายด้วยสายโซ่ที่มีโหนด - ตัวอย่างเดียวกันจัดการกับ DFS บนกราฟที่ไม่ถ่วง ที่นี่สถานการณ์เป็นจริงยิ่งเยือกเย็น: ไม่มีน้ำหนัก DFS สามารถใช้อะไรในการพิจารณาเด็กคนต่อไปที่จะเยี่ยมชมc - 1cc1


  1. ตราบเท่าที่กฎนั้นถูกกำหนดไว้แล้ว ถ้ามันไม่ได้ก็สามารถไม่ชัดเจนเสมอหาเส้นทางที่สั้นที่สุด

แก้ไขให้ถูกต้องถ้าฉันทำผิด แต่นี่หมายความว่า DFS สามารถหาเส้นทางที่สั้นที่สุดในกราฟใด ๆ แต่จะใช้เวลาชี้แจงในขณะที่ทำเช่นนั้น?
Anmol Singh Jaggi

@AnmolSinghJaggi ไม่ DFS พบเส้นทางเดียวเท่านั้น
Raphael

10

Breadth -first-search เป็นอัลกอริทึมที่จะค้นหาเส้นทางที่สั้นที่สุดในกราฟที่ไม่ถ่วง

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

ย่อหน้าข้างต้นให้สัญชาตญาณถูกต้อง แต่ทำให้สถานการณ์ง่ายขึ้นเล็กน้อย เป็นเรื่องง่ายที่จะเขียนโค้ดที่การสลับอย่างง่ายนั้นทำให้การค้นหาแบบกว้างเป็นเรื่องง่าย แต่ก็เป็นเรื่องง่ายที่จะเขียนโค้ดที่ตอนแรกดูเหมือนว่าจะมีการใช้งานที่ถูกต้อง แต่จริงๆแล้วไม่ใช่ คุณสามารถค้นหาคำถาม cs.SE ที่เกี่ยวข้องในBFS VS DFS ที่นี่ คุณสามารถหารหัสหลอกที่ดีได้ที่นี่


3

คุณสามารถ!!!

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

ประหยัดค่าใช้จ่าย / เส้นทางสำหรับการค้นหาที่เป็นไปได้ทั้งหมดที่คุณพบโหนดเป้าหมายเปรียบเทียบราคา / เส้นทางดังกล่าวทั้งหมดและเลือกอันที่สั้นที่สุด

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


1
คุณอาจต้องการที่จะทราบว่าการเปลี่ยนแปลงนี้ความซับซ้อนอย่างมาก นี่อาจสำรวจเส้นทางที่เป็นไปได้ทุกเส้นทางจากถึงหากฉันเข้าใจถูกต้อง Tst
ryan

1
@ user2407394 คุณใช้รูปแบบของ DFS นี้ครั้งเดียวจริง ๆ แล้วเรียกใช้อย่างถูกต้องสำหรับกราฟขนาดใหญ่พอสมควรหรือไม่? ฉันลังเลที่จะเรียกรูปแบบนี้ว่า DFS ฉันจะเรียกมันว่าการค้นหาเส้นทางที่น่าเหนื่อย
John L.

ฉันใช้วิธีการนี้มาแล้วมันทำงานช้ามาก ฉันกำลังคิดเกี่ยวกับการเพิ่มคำย่อเพื่อปรับปรุงประสิทธิภาพ
ไมค์

@ user2407394 ดูเหมือนว่าจะใช้งานได้ แต่คุณจะตรวจสอบเวลาที่จะหยุดได้อย่างไรเนื่องจากไม่มีรายการ 'เยี่ยมชม' หากคุณยกเลิกการทำเครื่องหมายทั้งหมด
Joe Black

0

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


-3

มันเป็นไปได้ที่จะหาเส้นทางระหว่างสองยอดด้วยจำนวนขั้นต่ำโดยใช้ DFS เราสามารถใช้วิธีการระดับ


2
โปรดให้รายละเอียดเพิ่มเติม ฉันไม่สามารถบอกได้ว่าอัลกอริทึมที่คุณพยายามอธิบายในประโยคเดียวนี้
David Richerby

-3

คุณสามารถ

เพียงสำรวจกราฟในลักษณะ dfs และตรวจสอบ

if(distance[dest] > distance[source]+cost[source_to_destination]){
    distance[dest] = distance[source] + cost[source_to_destination]);
}

นี่คือลิงค์สำหรับการแก้ปัญหาอย่างเต็มรูปแบบ


1
คำตอบที่ยอมรับนั้นอ้างว่าเป็นไปไม่ได้ซึ่งขัดแย้งกับการอ้างสิทธิ์ของคุณ คุณช่วยอธิบายได้ไหมว่าทำไมคุณถึงคิดว่าวิธีนี้ใช้ได้ผล (หรืออธิบายว่าทำไมวิธีนี้จึงใช้งานได้โดยทั่วไป)
จิ้งจกไม่ต่อเนื่อง

นี้ไม่ได้เป็นเพียงแค่การทำซ้ำคำตอบ user2407394 ของเท่านั้นที่มีที่ยากต่อการเข้าใจรหัส (คุณไม่ได้กำหนดสิ่งใด ๆของตัวแปรเหล่านั้นหมายถึงและก็ไม่ชัดเจนให้ฉัน) แทนคำอธิบายอยู่แล้ว?
David Richerby

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