Tìm chu kỳ âm cho thuật toán hủy chu kỳ


9

Tôi đang thực hiện thuật toán hủy chu kỳ để tìm ra giải pháp tối ưu cho bài toán dòng chi phí tối thiểu. Bằng cách tìm và loại bỏ các chu kỳ chi phí âm trong mạng dư, tổng chi phí được hạ xuống trong mỗi vòng. Để tìm chu kỳ âm tôi đang sử dụng thuật toán bellman-ford.

Vấn đề của tôi là: Bellman-ford chỉ tìm thấy các chu kỳ có thể truy cập được từ nguồn, nhưng tôi cũng cần tìm các chu kỳ không thể truy cập được.

Ví dụ: Trong mạng sau, chúng tôi đã áp dụng một luồng tối đa. Các cạnh làm cho nó rất đắt. Trong mạng dư, chúng ta có chu kỳ chi phí âm với công suất . Loại bỏ nó, sẽ cung cấp cho chúng ta một giải pháp rẻ hơn sử dụng các cạnh (A, C)(C, T) , nhưng chúng ta không thể đạt được nó từ nguồn S .1 ( A , C ) ( C , T ) S(A,B)1(A,C)(C,T)S

Nhãn: Lưu lượng / Công suất, Chi phí

nhập mô tả hình ảnh ở đây

Tất nhiên, tôi có thể chạy Bellman-ford nhiều lần với mỗi nút dưới dạng nguồn, nhưng điều đó không có vẻ là một giải pháp tốt. Tôi hơi bối rối vì tất cả các bài báo tôi đọc dường như bỏ qua bước này.

Bạn có thể cho tôi biết, làm thế nào để sử dụng bellman-ford để tìm mọi chu kỳ tiêu cực (có thể tiếp cận hay không)? Và nếu không thể, bạn đề xuất thuật toán nào khác?


Nếu một chu kỳ không thể đạt được thông qua nguồn, làm thế nào nó có thể ảnh hưởng đến tổng lưu lượng?
Nicholas Mancuso

Nó sẽ không ảnh hưởng đến giá trị dòng chảy nhưng tổng chi phí. Xem ví dụ mới.
Patrick Schmidt

2
Tôi nghĩ bạn nên chạy Bellman-Ford từ bồn rửa, phải không? Nếu bạn tìm thấy một luồng tối đa, , thì dưới biểu đồ dư G f sẽ không có đường dẫn từ s đến t . Do đó, Bellman-Ford nên được chạy trên G f với t . fGfstGft
Nicholas Mancuso

Câu trả lời:


2

Để mở rộng theo nhận xét của tôi, hãy nhớ rằng, thuật toán tìm dòng chảy chi phí tối thiểu này dựa trên thực tế rằng là tối đa. Bằng cách đầu tiên chạy Ford-Fulkerson để tìm f và kết quả là mạng dư G f , chi phí f sau đó được giảm bằng cách tìm chu kỳ âm trong G f . Đó là, bằng cách tìm các chu kỳ âm trong G f, chúng tôi không thay đổi lượng dòng chảy, f , mà chỉ là chi phí.ffGffGfGff

Bây giờ bằng cách chạy Bellman-Ford từ trong G f, chúng ta có thể theo dõi ngược trên các cạnh có luồng không âm (theo định nghĩa của G f ). Nếu các chu kỳ liền kề với bất kỳ cạnh nào trong các đường dẫn này, thì chúng ta có thể "chuyển" một lượng dòng chảy sang các cạnh khác trong chu trình. Nói cách khác, chúng tôi giữ lưu lượng ròng cho một số chu kỳ như nhau, nhưng có thể thay đổi chi phí.tGfGf

Lưu ý một chu kỳ không thể truy cập từ phải có lưu lượng bằng không. Nếu không, chúng ta sẽ có một mâu thuẫn trong f là tối đa.tf


Tôi xin lỗi vì "bàn tay lượn sóng" của lời giải thích này. Tôi sẽ cố gắng trang trọng hơn khi có thời gian tối nay.


T

0

Đề nghị của tôi: Bạn phải bắt đầu thuật toán từ T, để tìm chu kỳ âm trong mạng dư của bạn. Kết quả phải giống nhau, nhưng sau đó bạn có thể đạt được vòng tròn


1
Điều này hoạt động cho biểu đồ này, nhưng bạn có thể có các chu kỳ âm không được kết nối với S hoặc T. Tôi nghi ngờ rằng OP muốn một giải pháp hoạt động chung.
Peter Shor

vâng, nói chung bạn không thể tìm thấy mọi chu kỳ tiêu cực, nhưng OP muốn cải thiện Mạng còn lại của mình bằng cách kiểm tra chi phí. Sau đó, các vòng tròn tiêu cực không thể truy cập không thành vấn đề
Sven Jung

T

STTSST

tất nhiên là như vậy nếu bạn đảo ngược mọi cạnh và bắt đầu từ T, vì không có gì thay đổi. Nhưng tại sao không bắt đầu tại T mà không đảo ngược các cạnh? Sau đó, bạn nên tìm một chu kỳ tiêu cực có thể tiếp cận, nếu có. Câu hỏi là, nếu các chu kỳ tiêu cực không thể truy cập thực sự không quan trọng
Sven Jung

0

Tôi nghĩ rằng không đủ để chạy Bellman-Ford từ T hoặc S. Hãy xem xét một ví dụ trong đó có một cạnh từ S đến T và một chu kỳ chi phí âm không thể đạt được từ cả S hoặc T.

Một giải pháp là thêm S 'phụ và thêm cạnh từ S' vào bất kỳ đỉnh nào khác với 0 chi phí. Sau đó chạy Bellman-Ford từ S '. Theo cách này, tất cả các chu kỳ tiêu cực có thể truy cập từ S '.

Hơn nữa, bạn không thực sự cần thêm đỉnh phụ S 'đó vào việc triển khai. Chỉ cần khởi tạo d (v) = 0 cho bất kỳ đỉnh v.

Xem cách Boost Graph Library thực hiện nó.

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.