Thuật toán Bellman-Ford - Tại sao các cạnh có thể được cập nhật không theo thứ tự?


14

Các thuật toán Bellman-Ford xác định con đường đi ngắn nhất từ một nguồn đến tất cả các đỉnh khác. Ban đầu khoảng cách giữa s và tất cả các đỉnh khác được thiết lập để . Sau đó, con đường ngắn nhất từ s đến mỗi đỉnh được tính toán; điều này diễn ra cho | V | - 1 lần lặp. Câu hỏi của tôi là:sss|V|1

  • Tại sao cần phải có lần lặp?|V|1
  • Sẽ có vấn đề gì nếu tôi kiểm tra các cạnh theo thứ tự khác?
    Nói, nếu lần đầu tiên tôi kiểm tra các cạnh 1,2,3, nhưng sau đó ở lần lặp thứ hai, tôi kiểm tra 2,3,1.

Giáo sư MIT Eric cho biết thứ tự không thành vấn đề, nhưng điều này làm tôi bối rối: thuật toán sẽ không cập nhật sai một nút dựa trên cạnh nếu giá trị của nó phụ thuộc vào cạnh x 1 nhưng x 1 được cập nhật sau x 2 ?x2x1x1x2


Những gì bạn thực hiện xem xét? Rõ ràng, lập trình động không có vấn đề với trật tự, rõ ràng; đối với những người khác nó có thể là không tầm thường.
Raphael

Câu trả lời:


15

Hãy xem xét con đường đi ngắn nhất từ đến t , s , v 1 , v 2 , ... , v k , t . Con đường này bao gồm nhiều nhất | V | - 1 cạnh, bởi vì lặp lại một đỉnh trong một con đường ngắn nhất luôn là một ý tưởng tồi (hoặc ít nhất là có một con đường ngắn nhất không lặp lại các đỉnh), nếu chúng ta không có chu kỳ trọng lượng âm.sts,v1,v2,,vk,t|V|1

Trong vòng một, chúng ta biết rằng các cạnh sẽ được nới lỏng, do đó, ước tính khoảng cách cho v 1 sẽ chính xác sau vòng này. Lưu ý rằng chúng tôi không biết v 1 là gì vào thời điểm này, nhưng vì chúng tôi đã thư giãn tất cả các cạnh, chúng tôi cũng phải thư giãn cái này. Ở vòng hai, chúng tôi thư giãn ( v 1 , v 2 ) tại một số điểm. Chúng tôi vẫn không biết v 1 hoặc v 2 là gì, nhưng chúng tôi biết ước tính khoảng cách của họ là chính xác.(s,v1)v1v1(v1,v2)v1v2

Lặp lại điều này, sau một số vòng , chúng ta đã thư giãn ( v k , t ) , sau đó ước tính khoảng cách cho t là chính xác. Chúng tôi không biết k là gì cho đến khi toàn bộ thuật toán kết thúc, nhưng chúng tôi biết rằng nó sẽ xảy ra tại một số điểm (giả sử không có chu kỳ trọng lượng âm).k+1(vk,t)tk

Vì vậy, quan sát quan trọng là sau vòng , nút thứ i của đường dẫn ngắn nhất phải có ước tính khoảng cách được đặt thành giá trị chính xác. Vì đường dẫn nhiều nhất | V | - 1 cạnh dài, | V | - 1 vòng đủ để tìm con đường ngắn nhất này. Nếu một | V | Vòng thứ hai vẫn thay đổi một cái gì đó, sau đó một cái gì đó kỳ lạ đang diễn ra: tất cả các đường dẫn đã được 'giải quyết' đến các giá trị cuối cùng của chúng, vì vậy chúng ta phải có tình huống tồn tại một số chu kỳ trọng lượng âm.ii|V|1|V|1|V|


Tôi có một nghi ngờ nhỏ ở đây. Tôi tin rằng | v | -1 là số vòng tròn tồi tệ nhất mà sau đó đường đi ngắn nhất được tính từ s đến t. Hãy nghĩ rằng chúng ta có các đỉnh s, v1, v2..vn, t. Nếu các cạnh được chọn theo thứ tự này nói (s, v1), (v1, v2) .. (vn, t), sau đó trong một lần lặp duy nhất, chúng ta sẽ có con đường ngắn nhất từ ​​s đến t. Đây chỉ là để hiểu và trong thuật ngữ thực tế chúng ta không biết thứ tự các cạnh được chọn và do đó | v | -1 vòng. Tôi đúng không?
whokares

1
@whokares: vâng, bạn có thể gặp may mắn và tìm ra con đường ngắn nhất trong vòng đầu tiên. Bạn không biết chắc chắn cho đến vòng cuối cùng rằng giá trị bạn tìm thấy thực sự là con đường ngắn nhất, nhưng nó có thể là. Thuật toán của Dijkstra về cơ bản là 'nguyên nhân' xảy ra: nếu tất cả các cạnh đều có trọng số không âm, thì hàng đợi ưu tiên được sử dụng trong thuật toán của Dijkstra 'dự đoán' thứ tự bạn nên thư giãn các cạnh để bạn tìm thấy tất cả các con đường ngắn nhất trong vòng thư giãn đầu tiên của mình.
Alex ten Brink

Cảm ơn đã cập nhật. Tôi hiểu rồi. Trong một trong những tài liệu, nó được đề cập là <br> Slide 6: Một sự lựa chọn không tốt về trật tự thư giãn có thể dẫn đến nhiều thư giãn theo cấp số nhân: <br> Slide 8: Thư giãn thông minh theo thứ tự thư giãn cạnh <br>
whokares

Không phân biệt thứ tự các cạnh trong mỗi lần lặp, các đường dẫn ngắn nhất sẽ được tính theo | v | -1 lần lặp phải không? Tại sao anh ta nói theo cấp số nhân. Ý anh ta là nếu chúng ta chọn cùng một thứ tự cho tất cả các lần lặp mà chúng ta thường làm, mã thư giãn sẽ được gọi nhưng việc cập nhật nhãn cho một đỉnh có thể chỉ xảy ra ít lần hơn vì đơn hàng do đó tiết kiệm bộ xử lý thời gian ?
whokares

1
@whokares: thuật toán đầu tiên họ trình bày (có thể có thời gian chạy theo cấp số nhân) không làm thư giãn tất cả các cạnh trong một vòng, mà thay vào đó tìm thấy một số cạnh mà thao tác thư giãn sẽ thay đổi điều gì đó và làm giảm cạnh này. Nếu bạn tiếp tục làm điều này và không có chu kỳ trọng lượng âm, thì cuối cùng không có cạnh nào giúp bạn nữa và bạn dừng lại. Tuy nhiên, vì bạn không có vòng và không đặt thứ tự nào để thư giãn ở cạnh nào, nên cuối cùng bạn có thể thực hiện một số lần thư giãn theo cấp số nhân. Thuật toán cải tiến mà họ trình bày là Bellman-Ford, vốn có vòng.
Alex ten Brink

3

Con đường dài nhất có thể không có bất kỳ chu kỳ nào |V|. Chúng tôi bắt đầu với một nguồn, vì vậy chúng tôi đã có đường dẫn có độ dài 1, vì vậy chúng tôi cần |V| - 1nhiều nút hơn để có đường dẫn dài nhất.

Thứ tự không quan trọng bởi vì mọi đơn hàng sẽ duy trì bất biến: sau các nlần lặp, giá trị cho mỗi nút nhỏ hơn hoặc bằng chi phí của đường dẫn chi phí tối thiểu từ sđến nút chứa ở hầu hết ncác cạnh.

Nếu, khi bắt đầu một lần lặp, chi phí là chính xác cho ncác nút, thì khi kết thúc việc lặp lại, nó đúng với n+1các nút. Việc sắp xếp lại có thể khiến một số nút có chi phí thấp hơn trước khi chúng thường được cập nhật, nhưng cuối cùng chúng sẽ được cập nhật.


Tôi không biết nếu đó chỉ là tôi, hoặc tôi không thể thực sự hình dung những sự thật này một cách dễ dàng. Đối với tôi, tôi vẫn nghĩ rằng có thể có một số nút chưa cập nhật trong các lần lặp V-1.
dùng1675999

Không, bạn có | E | = | V | -1 cạnh khi bạn có | V | các nút được kết nối bởi một đường dẫn đơn giản không có chu kỳ. Và bạn có các lần lặp | V | -1, xóa phản hồi của bạn vì nó sai.
Sam

@sam Bạn là ai và bạn nói gì phải làm gì với câu trả lời?
fgb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.