Lưu lượng tối đa tăng dần trong đồ thị động


12

Tôi đang tìm kiếm một thuật toán nhanh để tính toán lưu lượng tối đa trong các biểu đồ động. tức là đã cho một đồ thị G=(V,E) và chúng ta có luồng tối đa trong G từ s đến t . Sau đó mới / nút cũ u thêm / xóa với các cạnh tương ứng của nó để tạo thành một đồ thị G 1 . Lưu lượng tối đa trong biểu đồ mới được tạo là gì? Có cách nào để ngăn chặn tính toán lại lưu lượng tối đa?Fs,tVFGstuG1

Bất kỳ quá trình tiền xử lý nào không tốn nhiều thời gian / bộ nhớ đều được đánh giá cao.

Ý tưởng đơn giản nhất là tính toán lại dòng chảy.

Một ý tưởng đơn giản khác là như vậy, lưu tất cả các đường dẫn tăng được sử dụng trong tính toán lưu lượng tối đa trước đó, để thêm một đỉnh , chúng ta có thể tìm thấy các đường dẫn đơn giản (trong biểu đồ dung lượng được cập nhật theo bước trước) bắt đầu từ nguồn, đi đến v rồi đi đến đích, nhưng vấn đề là, đường dẫn này phải đơn giản, tôi không thể tìm thấy tốt hơn O ( n m ) cho trường hợp này, với m = | E | . (Cũng lưu ý rằng nếu đó chỉ là một con đường thì điều này có thể được thực hiện trong O ( n + m ) nhưng không phải vậy.)vvO(nm)m=|E|O(n+m)

Ngoài ra để loại bỏ nút trên ý tưởng không hoạt động.

Ngoài ra tôi đã thấy các bài báo như Cách tiếp cận tăng dần cho các cạnh , nhưng dường như chúng không đủ tốt trong trường hợp này, nó nhiều hơn cho mỗi cạnh và dường như không mở rộng phù hợp trong trường hợp này (chúng tôi chỉ tính toán lại một luồng). Hiện tại tôi cũng đang sử dụng thuật toán lưu lượng tối đa của Ford-Fulkerson Nếu có tùy chọn tốt hơn cho các thuật toán trực tuyến, thật tốt khi biết điều đó.O(m)


Bạn có thể vui lòng làm rõ "nhưng vấn đề là, phần này nên đơn giản"? Tôi đã không nhận được nó.
Dmytro Korduban

@ maldini.ua, Thực tế, ý tôi là, Con đường đi từ nguồn đến và sau đó đường dẫn từ v đến đích không nên có đỉnh chung (trừ v ). Giả sử v là nút mới được thêm vào. Nếu không phải như vậy, chúng ta có thể bỏ qua một số kiểm tra và chúng ta có thể có thuật toán nhanh hơn (Trung bình hoặc có thể không có triệu chứng). vvvv
Saeed

Có nó, nhưng đối với tôi nó không phải là một cái gì đó đặc biệt về . Tôi nghĩ ý tưởng tính toán đơn giản nhất là như sau: 1) thêm đỉnh mới với các cạnh vào biểu đồ dư ; 2) tìm luồng tối đa trong biểu đồ dư được cập nhật bằng thuật toán luồng tối đa bạn chọn. Trường hợp bạn đề xuất sẽ được xử lý "tự động" bằng thuật toán dòng chảy tối đa (giả sử, nó sẽ không tìm thấy bất kỳ đường dẫn tăng nào, v.v.). Nếu bạn quan tâm đến việc loại bỏ các nút, tôi có thể viết nó trong câu trả lời. PS Để rõ ràng, bạn có đồ thị có hướng hay không có hướng? v
Dmytro Korduban

@ maldini.ua, tính toán lại bình thường thêm sự phức tạp đối với giải pháp hiện tại, vì vậy tôi không nghĩ nó tốt (có thể là tốt khi biết rằng thông thường quá nhiều cạnh là vô ích và thực tế nó không gây ra vấn đề hiệu suất rất cao), nhưng nếu bạn có ý tưởng về việc loại bỏ nút, tôi quan tâm để xem ý tưởng của bạn, đồ thị cũng được hướng. PS nhưng tôi quan tâm đến cả hai trường hợp. |G|
Saeed

Hãy nhớ rằng bạn chạy nó trong biểu đồ dư, sẽ có rất nhiều cạnh có dung lượng bằng không tại thời điểm này. Thông thường nó hoạt động khá nhanh, đặc biệt là trong các biểu đồ thưa thớt (ít nhất là nó hoạt động với tôi). Mặt khác, cách tiếp cận "con đường đơn giản" nghe có vẻ hơi phức tạp đối với tôi. Cũng đừng quên bạn có bị ràng buộc về thời gian chạy cho Ford-Fulkerson (trong đó | f | bị giới hạn bởi tổng công suất các cạnh liền kề của v ). O(|f||E|)|f|v
Dmytro Korduban

Câu trả lời:


6

Cách tiếp cận được mô tả có thể không tối ưu về mặt lý thuyết. Nó chỉ là một giải pháp thực tế đơn giản có thể làm việc cho tác giả. Tôi không thể cung cấp bất kỳ tài liệu tham khảo nào vì tôi luôn nghĩ rằng đó là một văn hóa dân gian được biết đến rộng rãi, nhưng thật kỳ lạ là không ai đăng nó trong câu trả lời. Vì vậy, tôi làm điều đó.

Giả sử chúng ta có một mạng vô hướng . Giả sử nó được lưu trữ trong một cấu trúc dữ liệu cho phép chèn / xóa đỉnh / cung dễ dàng. Đôi khi chúng ta sẽ sử dụng mạng dư G f (tức là với công suất được cập nhật c f = c - f ).G=(V,E,c)Gfcf=cf

Phần đầu tiên là làm thế nào để xử lý chèn / xóa đỉnh. Nó ít nhiều đơn giản cho việc chèn thêm:

  1. Thêm một đỉnh mới với các cạnh tương ứng vào mạng dư.
  2. Tìm một luồng tối đa trong mạng dư được cập nhật bằng thuật toán luồng tối đa bạn chọn.

Đối với việc xóa mọi thứ trở nên phức tạp hơn. Hãy tưởng tượng chúng ta chia đỉnh chúng ta sắp xóa thành 2 nửa v i nv o u t sao cho tất cả các điểm trong cung đến v i n , tất cả các cung ngoài đi từ v o u t và các đỉnh mới này được kết nối bởi một vòng cung có sức chứa vô hạn. Sau đó xóa v tương đương với xóa cung giữa v i nv o u t . Điều gì sẽ xảy ra trong trường hợp này? Hãy biểu thị bằng f vvvinvoutvinvoutvvinvoutfvdòng chảy qua đỉnh . Sau đó, v i n sẽ gặp quá nhiều đơn vị lưu lượng f vv o u t sẽ bị thiếu đơn vị lưu lượng f v ngay sau khi xóa (các ràng buộc dòng chảy sẽ bị phá vỡ rõ ràng). Để làm cho các ràng buộc luồng được giữ lại, chúng ta nên sắp xếp lại các luồng, nhưng chúng ta cũng muốn giữ giá trị luồng ban đầu càng cao càng tốt. Trước tiên hãy xem chúng ta có thể sắp xếp lại mà không làm giảm tổng lưu lượng. Để kiểm tra xem tìm max max ~ f v từ v i n đến v o uvvinfvvoutfvfv~vin trong mạng dư "đã cắt" (nghĩa là không có cung nối giữa v i n v o u t ). Chúng ta nên ràng buộc nó bởi f v rõ ràng. Nếu nó xảy ra bằng f v thì chúng ta thật may mắn: chúng ta đã gán lại luồng đã đi quavtheo cách mà tổng lưu lượng không bị thay đổi. Trong trường hợp khác, tổng lưu lượng phải giảm bởi "vô dụng" vượt quáđơn vịΔ= f v - ~ f v . Để làm điều đó, tạm thời kết nốistvoutvinvoutfvfvvΔ=fvfv~stbởi một cung có dung lượng vô hạn và chạy lại thuật toán maxflow từ đến v o u t (chúng ta nên ràng buộc dòng chảy bằng Δ ). Điều đó sẽ sửa chữa mạng còn lại và làm cho dòng chảy hạn chế được tổ chức một lần nữa, tự động giảm tổng lưu lượng của Δ .vinvoutΔΔ

Độ phức tạp thời gian của các cập nhật như vậy có thể phụ thuộc vào thuật toán maxflow chúng tôi sử dụng. Tuy nhiên, trường hợp xấu nhất có thể khá tệ, nhưng nó vẫn tốt hơn so với tính toán lại tổng thể.

Phần thứ hai là sử dụng thuật toán maxflow. Theo tôi hiểu, tác giả cần thuật toán không phức tạp (nhưng vẫn hiệu quả) với hằng số ẩn nhỏ để chạy nó trên nền tảng di động. Sự lựa chọn đầu tiên của ông về Ford-Fulkerson (tôi hy vọng nó sẽ là Edmonds-Karp ) trông không tệ lắm từ quan điểm này. Nhưng có một số khả năng khác. Người tôi sẽ khuyên bạn nên thử đầu tiên là biến thể của thuật toán dinitz vì nó khá nhanh trong thực tế và có thể được thực hiện một cách rất đơn giản. Các tùy chọn khác có thể bao gồm quy mô công suất Ford-Fulkerson trong O ( | E |O(|V|2|E|) và, sau tất cả, các phiên bản khác nhau của tính năng đẩy lại với phương pháp phỏng đoán. Dù sao hiệu suất sẽ phụ thuộc vào một trường hợp sử dụng vì vậy tác giả nên tìm ra cái tốt nhất theo kinh nghiệm.O(|E|2logCmax)


Sau khi đọc câu trả lời cuối cùng của vzn, tôi đã tìm thấy cách tiếp cận tương tự được mô tả ở trang 90 này .
Dmytro Korduban

Theo tôi hiểu trong việc loại bỏ nút, By bạn sẽ tính toán lưu lượng trong biểu đồ dư, nhưng tôi nghĩ điều đó không đúng, thực tế trong biểu đồ dư bạn có một số cạnh được sử dụng để tính f v và bạn nên thêm dung lượng bổ sung cho các cạnh này , sau đó tính ~ f v , sau đó sử dụng Δ . fv~fvfv~Δ
Saeed

Khi bạn đẩy 1 đơn vị lưu lượng từ sang u , bạn giảm c f ( v , u ) 1 và tăng c f ( u , v ) lên 1 vì lưu lượng là đối xứng ( f ( v , u ) = - f ( u , v ) ). Điều này xác định biểu đồ dư thực sự, vì vậy mọi thứ hoạt động tốt trong đó. vucf(v,u)cf(u,v)f(v,u)=f(u,v)
Dmytro Korduban

Bất kỳ ý tưởng nào bạn sẽ làm điều này nếu bạn muốn thay đổi công suất cạnh?
Chet

-1

ok có tính đến thông tin mới và tránh một số giới thiệu sai lầm bắt đầu / cá trích đỏ (mea culpa), đây là một số giới thiệu mới về điều này.

Giải quyết nhanh chóng một chuỗi các vấn đề về dòng chảy tối đa trực tuyến với phần mở rộng để tính toán mức cắt tối thiểu mạnh mẽ Doug Altner và Özlem Ergun

tham chiếu này xem xét các chuỗi MFP trực tuyến và "khởi đầu ấm áp", nghĩa là xây dựng các nhóm tăng dần cho MFP trước đó. "Chúng tôi chứng minh rằng các thuật toán của chúng tôi giảm thời gian chạy xuống một bậc độ lớn khi so sánh các mã tương tự sử dụng bộ giải MFP hộp đen. Đặc biệt, chúng tôi cho thấy thuật toán của chúng tôi để cắt giảm tối thiểu mạnh mẽ có thể giải quyết các trường hợp cần đến bốn giây giờ sử dụng bộ giải dòng chảy tối đa hộp đen. "


tiến bộ về các vấn đề liên quan đến dòng chảy tối đa Altner, Douglas S., georgia tech

trong luận án Phd 2008 này (pdf có thể tải xuống), tác giả đã xem xét vấn đề tăng dần các cung có vẻ "đủ gần" với vấn đề thêm các đỉnh mới (với nhiều cung mới).

phần lớn giới thiệu này liên quan đến việc xóa các phần của mạng (cắt / "giao thoa") như đã nêu trong phần 1 của bản tóm tắt

xem đặc biệt "IV GIẢI QUYẾT CÁC YÊU CẦU TRỰC TUYẾN CỦA HOA HỒNG TỐI ĐA .... .... p63".

p 63 "Tuy nhiên, mục tiêu của chương này là thuyết phục người đọc rằng lặp đi lặp lại bằng cách sử dụng bộ giải dòng chảy tối đa hộp đen để giải quyết một chuỗi lớn MFP có thể dẫn đến một số lượng lớn các tính toán không cần thiết."

p66 "Trong các ứng dụng đã nói ở trên, các MFP thường tương tự về mặt cấu trúc. Đó là, MFP tiếp theo trong chuỗi khác với trước đó bằng cách thêm hoặc loại bỏ một số lượng nhỏ các cung hoặc bằng cách dự đoán khả năng của một bộ cung tròn cục bộ. , khi giải quyết những trường hợp này, thời gian và không gian cần thiết để lưu trữ bất cứ thứ gì ngoài giải pháp cho vấn đề trước đó thường không có cơ sở. "

tác giả p67 cũng sử dụng phương pháp "khởi đầu ấm áp" ở đây. "Một chiến lược hiệu quả hướng tới việc giải quyết nhanh chóng toàn bộ chuỗi các vấn đề tối ưu hóa trực tuyến là phát triển các heuristic tái cấu trúc hiệu quả. Cuối cùng, chúng tôi phát triển một thuật toán dòng chảy tối đa được sửa đổi được thiết kế để khởi động ấm hiệu quả."

xem đặc biệt p71 có vấn đề cung mới tăng dần cụ thể:

Vấn đề tái mở rộng lưu lượng tối đa Arc mới (NAMFRP)

tác giả xem xét các vấn đề chung hơn p67

Vấn đề tái mở rộng lưu
lượng tối đa (MFROP) Vấn đề mở lại lưu lượng hồ quang đơn cực đại (MFSAROP)


-3

từ một số tìm kiếm nhanh, có vẻ như phiên bản trực tuyến là một lĩnh vực nghiên cứu tích cực. bạn không đề cập đến khu vực ứng dụng có thể giúp thu hẹp tìm kiếm tài liệu. một lựa chọn là tìm kiếm một lĩnh vực ứng dụng có sự đổi mới nhất hoặc mới nhất. do đó có một số ứng dụng của dòng chảy tối đa gia tăng trong các hệ thống tầm nhìn & một số thuật toán cho nó ở đó; hãy thử Maximum Flows by Incremental Breadth-First Search tại các phòng thí nghiệm nghiên cứu của microsoft. diễn giải phần giới thiệu của bài báo này, rõ ràng đối với các trường hợp thị giác, thuật toán Boykov và Kolmogorov hoạt động tốt và không có phản ứng thời gian theo hàm mũ nào được biết mặc dù bên ngoài các ứng dụng thị giác có thể hoạt động kém. vì vậy có thể đáng để thử thuật toán B & K trên dữ liệu của bạn và xem cách nó hoạt động &

bạn dường như đang nói rằng một thuật toán gia tăng tuyến tính trong số cạnh của đồ thị là không đủ tốc độ? Nhưng đó không phải là hiệu quả khá cao? bạn đang đối phó với bao nhiêu cạnh? có lẽ cách tiếp cận có thể là giảm chi phí di chuyển ngang qua biểu đồ nếu đó là một yếu tố đắt đỏ hoặc là một yếu tố quan trọng (ví dụ: biểu đồ được lưu trữ trong db so với biểu đồ được lưu trữ trong bộ nhớ)

đây là một bài báo thú vị lập luận rằng trong khi thuật toán không tăng cho lưu lượng tối đa nằm trong P, phiên bản gia tăng là NP hoàn chỉnh. "Theo hiểu biết tốt nhất của chúng tôi, kết quả của chúng tôi là người đầu tiên tìm ra vấn đề về thời gian P có phiên bản gia tăng là NP hoàn chỉnh."

Dòng chảy tăng dần theo Hartline, Sharp


Cảm ơn, tôi đã không đọc các tài liệu tham khảo của bạn, tôi sẽ xem chúng (tôi thấy một số giấy tờ trước đây và thấy chúng vô dụng), nhưng về vấn đề của tôi, Đó là một vấn đề trong tình hình làm việc thực sự trong tiếp thị chứng khoán. Có một chút phức tạp để nói những gì đã xảy ra khi tôi thấy rằng tôi nên giải quyết vấn đề này. Thực tế tôi đã không nghĩ rằng nó khó ngay từ cái nhìn đầu tiên nhưng sau khi thử một số mã tôi thấy nó không dễ dàng như vậy. thuật toán này sẽ được chạy trên điện thoại di động, chúng không quá nhanh (và khách hàng không thích thuật toán của tôi :). Ngoài ra đôi khi quá nhiều cạnh sẽ đến với nút mới. và đây là nút cổ chai.
Saeed

hấp dẫn. âm thanh như bạn có thể nên đi với heuristic dựa trên sức mạnh xử lý hạn chế và cần cập nhật nhanh. thay vào đó, quá trình xử lý có thể được chuyển từ "máy khách" (trong trường hợp của bạn là điện thoại) sang máy chủ không? Có phải mọi khách hàng phải tính toán một phiên bản khác nhau (tức là dữ liệu khác nhau) của vấn đề không?
vzn

Ở Iran, vấn đề lớn nhất là tốc độ kết nối internet, vì vậy tôi không thể chuyển nó sang phía máy chủ. Nếu nó ổn (tốc độ tốt), chắc chắn tính toán lại sẽ không tệ.
Saeed

6
Tôi không thấy cách này trả lời câu hỏi ban đầu, đó là về một biểu đồ phát triển theo thời gian bằng cách thêm các nút và cạnh. Bài báo đầu tiên mô tả một thuật toán gia tăng cho bài toán luồng tối đa một lần bắn tiêu chuẩn. Báo cáo thứ hai mô tả một giấy cho một khác nhau vấn đề "gia tăng maxflow", trong đó tập các cạnh là cố định nhưng năng lực của họ phát triển theo thời gian.
Jeffε

1
@ Jɛ ff E, vâng, bạn đúng :) thực tế trước đây tôi thấy các giấy tờ tương tự với các giấy tờ được tham chiếu, nhưng như bạn nói chúng không liên quan đến vấn đề của tôi, hầu hết các giấy tờ tôi thấy cho đến bây giờ là những gì tôi đã tham chiếu.
Saeed

-5

một khả năng / hướng khác là thuật toán lưu lượng tối đa đẩy lại , đó là "một trong những thuật toán hiệu quả nhất cho lưu lượng tối đa" và có thể có các cấu hình phức tạp tốt hơn tùy thuộc vào dữ liệu của bạn. ví dụ như trang wikipedia

việc thực hiện với quy tắc lựa chọn đỉnh của FIFO có Ôi(V3) thời gian chạy, quy tắc lựa chọn đỉnh hoạt động cao nhất cung cấp Ôi(V2E) độ phức tạp và việc triển khai với cấu trúc dữ liệu cây động của Sleator và Tarjan chạy trong Ôi(VEtôiog(V2/E))thời gian. hiệu quả không triệu chứng hơn Edmonds-Karp


3
Một lần nữa, tôi không thấy câu trả lời này có liên quan đến câu hỏi được đăng. Push-relabel là một chiến lược sách giáo khoa nổi tiếng để trả lời cho vấn đề dòng chảy tối đa tiêu chuẩn.
Jeffε

vậy là ford-Fulkerson ... phải không? & OP yêu cầu một cái gì đó tốt hơn. Bạn có biết một cái gì đó chứng minh rằng việc đẩy lùi là tồi tệ hơn so với ford-Fulkerson? OP không rõ ràng là quen thuộc với đẩy lại. geez, thuật toán xuất hiện trong sách giáo khoa chắc chắn không phải là một phê bình ngay lập tức để từ chối câu trả lời ở đây, phải không?
vzn

3
Thật ra, có; câu hỏi được trả lời trong sách giáo khoa tiêu chuẩn (hoặc wikipedia) không phải là cấp độ nghiên cứu. Tuy nhiên, câu hỏi được đăng đầu tiên về dòng chảy gia tăng rất thú vị và chắc chắn trong phạm vi. (Việc thiếu câu trả lời dứt khoát cho thấy câu trả lời đúng có thể là "Câu hỏi hay. Không ai biết.")
Jeffε

vzn, cảm ơn vì sự đóng góp của bạn, nhưng: "bạn có biết điều gì đó chứng minh việc đẩy mạnh không tốt hơn ford-Fulkerson" không phải là lý do chính đáng để đăng nó dưới dạng câu trả lời, Nếu bạn biết tại sao "đẩy lại" trong thuật toán trực tuyến thì tốt hơn hơn Ford-Falkerson là tốt để nói điều đó, cá nhân tôi thích Ford-Falkerson vì tính đơn giản, yếu tố không đổi thấp và tôi biết điều đó từ quá khứ. Nhưng như tôi đã nói, tôi không thể nói đó là lựa chọn tốt trong mọi trường hợp, những thuật toán này không chỉ đơn giản là có thể so sánh được, chúng cần các bài kiểm tra thực tế.
Saeed

Hãy xem pt là nếu bạn có một thuật toán lưu lượng tối đa không chạy tốt cho dữ liệu của mình, hãy thử một thuật toán khác được cho là hoạt động tốt vì có khá nhiều tối ưu hóa cho các cấu hình dữ liệu khác nhau. không, nó không trực tuyến / "đỉnh tăng dần" nhưng nó có thể hoạt động tốt hơn cho trường hợp ngoại tuyến nếu không có giải pháp thay thế. các phiên bản trực tuyến trong khi chúng tồn tại như tôi tìm thấy ở trên, có thể sẽ khó thực hiện hơn ...
vzn
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.