อัลกอรึทึมของ Bellman-Ford - เหตุใดจึงสามารถปรับปรุงขอบให้ล้าสมัยได้?


14

อัลกอริทึม Bellman ฟอร์ดเป็นตัวกำหนดเส้นทางที่สั้นที่สุดจากแหล่งเพื่อจุดอื่น ๆ ทั้งหมด ในขั้นต้นระยะห่างระหว่างsและจุดอื่น ๆ ทั้งหมดถูกตั้งค่าให้∞ จากนั้นคำนวณเส้นทางที่สั้นที่สุดจากsถึงจุดสุดยอดแต่ละจุด สิ่งนี้ดำเนินต่อไปสำหรับ | V | - 1ซ้ำ คำถามของฉันคือ:sss|V|1

  • ทำไมต้องมีซ้ำ|V|1
  • มันจะสำคัญไหมถ้าฉันตรวจสอบขอบตามลำดับอื่น
    พูดถ้าฉันตรวจสอบขอบ 1,2,3 เป็นครั้งแรก แต่จากนั้นในการทำซ้ำครั้งที่สองฉันตรวจสอบ 2,3,1

MIT Prof. Eric กล่าวว่าคำสั่งไม่สำคัญ แต่สิ่งนี้ทำให้ฉันสับสน: อัลกอริทึมจะอัปเดตโหนดบน edge ไม่ถูกต้องหรือไม่หากค่าของมันขึ้นอยู่กับ edge x 1แต่x 1นั้นได้รับการอัปเดตหลังจากx 2หรือไม่x2x1x1x2


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

คำตอบ:


15

พิจารณาเส้นทางที่สั้นที่สุดจากไปที , s , โวลต์1 , V 2 , ... , วีk , T เส้นทางนี้ประกอบด้วยมากที่สุด| V | - 1ขอบเนื่องจากการทำซ้ำจุดสุดยอดในเส้นทางที่สั้นที่สุดนั้นเป็นความคิดที่ไม่ดีเสมอ (หรืออย่างน้อยก็มีเส้นทางที่สั้นที่สุดซึ่งไม่ได้ทำจุดยอดซ้ำ) ถ้าเราไม่มีวงจรน้ำหนักเชิงลบsts,v1,v2,,vk,t|V|1

ในรอบที่หนึ่งเรารู้ว่าขอบจะผ่อนคลายดังนั้นการประมาณระยะทางสำหรับv 1จะถูกต้องหลังจากรอบนี้ โปรดทราบว่าเราไม่ทราบว่าv 1คืออะไร ณ จุดนี้ แต่เนื่องจากเราได้ผ่อนคลายทุกขอบเราต้องผ่อนคลายสิ่งนี้ด้วยเช่นกัน ในรอบที่สองเราผ่อนคลาย( ข้อ1 , ข้อ2 )ในบางจุด เรายังไม่รู้ว่าv 1หรือv 2คืออะไร แต่เรารู้ว่าการประมาณระยะทางนั้นถูกต้อง(s,v1)v1v1(v1,v2)v1v2

ทำซ้ำสิ่งนี้หลังจากรอบเราผ่อนคลาย( v k , t )หลังจากนั้นระยะทางประมาณสำหรับtนั้นถูกต้อง เราไม่รู้ว่าkคืออะไรจนกระทั่งอัลกอริทึมทั้งหมดจบลง แต่เรารู้ว่ามันจะเกิดขึ้นในบางจุดk+1(vk,t)tk

ดังนั้นการสังเกตที่สำคัญคือว่าหลังจากที่รอบที่ฉัน -th โหนดของเส้นทางที่สั้นที่สุดจะต้องมีการตั้งค่าระยะทางประมาณในการค่าที่ถูกต้อง เป็นเส้นทางที่มากที่สุด| V | - ความยาว1ขอบ| V | - 1รอบพอเพียงเพื่อค้นหาเส้นทางที่สั้นที่สุดนี้ ถ้า a | V | รอบที่ยังคงมีการเปลี่ยนแปลงบางสิ่งบางอย่างแล้วสิ่งที่แปลกที่เกิดขึ้น: เส้นทางทั้งหมดควรจะ 'ตัดสิน' เป็นค่าสุดท้ายของพวกเขาแล้วดังนั้นเราต้องมีสถานการณ์ที่มีรอบน้ำหนักเชิงลบอยู่ii|V|1|V|1|V|


ฉันมีข้อสงสัยเล็กน้อยที่นี่ฉันเชื่อว่า | v | -1 เป็นจำนวนกรณีที่เลวร้ายที่สุดของรอบหลังจากนั้นเส้นทางที่สั้นที่สุดจะถูกคำนวณจาก s ถึง t สมมติว่าเรามีจุดยอด s, v1, v2 .. vn, t ถ้า ขอบถูกเลือกตามลำดับนี้บอกว่า (s, v1), (v1, v2) .. (vn, t) จากนั้นในการวนซ้ำครั้งเดียวเราจะมีเส้นทางที่สั้นที่สุดจาก s ถึง t นี่เป็นเพียงเพื่อความเข้าใจและ คำศัพท์ที่เป็นประโยชน์เราไม่ทราบว่าคำสั่งของขอบถูกเลือกและด้วยเหตุนี้ | v | -1 rounds.Am ใช่ไหม?
ประกาศ

1
@ ผู้โชคดี: ใช่คุณอาจได้รับโชคดีและพบเส้นทางที่สั้นที่สุดในรอบแรก คุณไม่รู้แน่จนกระทั่งถึงรอบสุดท้ายว่าคุณค่าที่คุณพบนั้นเป็นเส้นทางที่สั้นที่สุด แต่อาจเป็นไปได้ อัลกอริทึมของ Dijkstra นั้นทำให้เกิดสิ่งนี้เกิดขึ้น: หากขอบทั้งหมดมีน้ำหนักไม่เป็นลบดังนั้นลำดับความสำคัญที่ใช้ในอัลกอริทึมของ Dijkstra 'คาดการณ์' ลำดับที่คุณควรผ่อนคลายขอบเพื่อหาเส้นทางที่สั้นที่สุดในรอบแรก
Alex สิบ Brink

ขอขอบคุณสำหรับการอัปเดตฉันได้รับมาหนึ่งในเนื้อหาที่กล่าวถึงใน <br> Slide 6: ตัวเลือกการสั่งผ่อนคลายที่ไม่ดีสามารถนำไปสู่การผ่อนคลายที่ชี้แจงมากมาย: <br> สไลด์ 8: คำสั่งผ่อนคลายขอบ <br>
whokares

โดยไม่คำนึงถึงลำดับของขอบในแต่ละการวนซ้ำเส้นทางที่สั้นที่สุดจะถูกคำนวณใน | v | -1 การทำซ้ำใช่ไหม? ทำไมเขาถึงบอกว่าเลขชี้กำลังเขาหมายความว่าถ้าเราเลือกคำสั่งเดียวกันสำหรับการทำซ้ำทั้งหมดที่เราทำปกติรหัสการผ่อนคลายจะถูกเรียก แต่การอัปเดตฉลากสำหรับจุดสุดยอดอาจเกิดขึ้นเพียงไม่กี่ครั้งเท่านั้น เวลา
whokares

1
@whokares: อัลกอริทึมแรกที่พวกเขานำเสนอ (ที่มีเวลาทำงานแบบเอ็กซ์โปเนนเชียล) ไม่ได้ผ่อนคลายขอบทั้งหมดในรอบ แต่แทนที่จะพบขอบบางอย่างที่การดำเนินการผ่อนคลายจะเปลี่ยนอะไรบางอย่างและผ่อนคลายขอบนี้ หากคุณทำเช่นนี้และไม่มีวงจรน้ำหนักติดลบในที่สุดก็ไม่มีขอบที่จะช่วยคุณได้อีกแล้วหยุด อย่างไรก็ตามเนื่องจากคุณไม่มีรอบและไม่มีการสั่งซื้อที่ขอบที่จะผ่อนคลายต่อไปคุณอาจจบลงด้วยการผ่อนคลายจำนวนชี้แจง อัลกอรึทึมที่ได้รับการปรับปรุงที่พวกเขานำเสนอคือ Bellman-Ford ซึ่งมีรอบ
Alex สิบ Brink

3

ที่ยาวที่สุดเส้นทางที่สามารถจะไม่รอบใด ๆ |V|ที่เป็น เราเริ่มต้นด้วยแหล่งที่มาดังนั้นเราจึงมีเส้นทางที่มีความยาว 1 ดังนั้นเราจึงต้องการ|V| - 1โหนดเพิ่มเติมเพื่อให้ได้เส้นทางที่ยาวที่สุด

คำสั่งซื้อไม่สำคัญเนื่องจากทุกคำสั่งจะรักษาค่าคงที่: หลังจากnการวนซ้ำค่าสำหรับแต่ละโหนดจะน้อยกว่าหรือเท่ากับค่าใช้จ่ายของเส้นทางต้นทุนขั้นต่ำจากsไปยังโหนดที่มีค่ามากที่สุดnขอบ

หากที่จุดเริ่มต้นของการทำซ้ำค่าใช้จ่ายจะถูกต้องขึ้นอยู่กับnโหนดจากนั้นในตอนท้ายของการทำซ้ำมันถูกต้องขึ้นอยู่กับn+1โหนด การเรียงลำดับใหม่อาจทำให้บางโหนดมีต้นทุนที่ต่ำกว่าก่อนที่พวกเขาจะได้รับการปรับปรุงตามปกติ แต่ในที่สุดพวกเขาก็จะได้รับการอัปเดตต่อไป


ฉันไม่รู้ว่าเป็นแค่ฉันหรือไม่สามารถจินตนาการถึงข้อเท็จจริงเหล่านี้ได้อย่างง่ายดาย สำหรับฉันฉันยังคิดว่าอาจมีบางโหนดที่ไม่ได้อัปเดตภายในการทำซ้ำ V-1
user1675999

ไม่คุณมี | E | = | V | -1 ขอบเมื่อคุณมี | V | โหนดเชื่อมต่อโดยเส้นทางที่เรียบง่ายโดยไม่ต้องวงจร และคุณมี | V | -1 ซ้ำลบคำตอบของคุณเพราะมันผิด
แซมส.

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