Xem mẫu

  1. Luồng trên mạng V0.1 Trần Vĩnh Đức HUST Ngày 20 tháng 11 năm 2019 CuuDuongThanCong.com https://fb.com/tailieudientucntt 1 / 34
  2. Tài liệu tham khảo ▶ S. Dasgupta, C. H. Papadimitriou, and U. V. Vazirani, Algorithms, July 18, 2006. CuuDuongThanCong.com https://fb.com/tailieudientucntt 2 / 34
  3. Nội dung Bài toán luồng cực đại trên mạng Thuật toán Ford-Fulkerson Luồng cực đại và lát cắt cực tiểu Tính hiệu quả của thuật toán CuuDuongThanCong.com https://fb.com/tailieudientucntt
  4. Bài toán chuyển dầu ng drawing with capacities drawing with flow flow rep 0 1 0 2 1 3 1 4 2 3 2 4 3 5 4 5 sink Anatomy of a network-flow problem CuuDuongThanCong.com https://fb.com/tailieudientucntt 4 / 34
  5. Mô hình bài bài toán a 2 d 3 10 1 2 s 3 b 1 1 t 4 5 c 5 e ▶ Đồ thị có hướng biểu diễn mạng đường ống, dầu có thể được chuyển qua đường ống này ▶ Mục tiêu là chuyển dầu từ s đến t, nhiều nhất có thể. CuuDuongThanCong.com https://fb.com/tailieudientucntt 5 / 34
  6. Một luồng chuyển 7 đơn vị dầu từ s tới t luồng khả năng thông qua a 2/2 d 2/3 0/10 1/1 2/2 s 1/3 b 1/1 0/1 t 4/4 5/5 c 5/5 e Liệu có cách nào làm tốt hơn? CuuDuongThanCong.com https://fb.com/tailieudientucntt 6 / 34
  7. Mạng Định nghĩa Một mạng được định nghĩa là bộ G = (V, E, s, t, c), ở đây ▶ (V, E) là một đồ thị có hướng; ▶ s, t ∈ V, gọi là đỉnh nguồn và đỉnh đích; và ▶ c là một hàm gắn trên mỗi cạnh e của G một giá trị ce > 0 gọi là khả năng thông qua. Bài toán Ta muốn chuyển nhiều dầu nhất có thể từ s tới t mà không vượt quá khả năng thông qua trên mỗi cạnh. CuuDuongThanCong.com https://fb.com/tailieudientucntt 7 / 34
  8. Định nghĩa (Luồng) Một luồng trên mạng G là một hàm f : E −→ R+ ∪ {0}, gắn mỗi cạnh e của G với một giá trị số fe , sao cho: 1. Không vi phạm khả năng thông qua: 0 ≤ fe ≤ ce với mọi e ∈ E 2. Với mọi đỉnh u, ngoại trừ s và t, tổng luồng vào u bằng tổng luồng ra khỏi u: ∑ ∑ fwu = fuz . (w,u)∈E (u,z) Nói cách khác, mạng là bảo toàn (theo luật Kirchhoff). CuuDuongThanCong.com https://fb.com/tailieudientucntt 8 / 34
  9. Luồng và lượng dầu chuyển luồng khả năng thông qua a 2/2 d 2/3 0/10 1/1 2/2 s 1/3 b 1/1 0/1 t 4/4 5/5 c 5/5 e CuuDuongThanCong.com https://fb.com/tailieudientucntt 9 / 34
  10. Định nghĩa Giá trị của luồng là tổng lượng gửi từ s đến t. Theo luật bảo toàn, size(f) bằng lượng rời khỏi s: ∑ size(f) = fsu . (s,u)∈E ▶ Mục đích của chúng ta là tìm được luồng có giá trị cực đại. ▶ Tương đương, tìm cách gán giá trị {fe : e ∈ E} thỏa mãn một số ràng buộc. ▶ Đây là một bài toán quy hoạch tuyến tính. CuuDuongThanCong.com https://fb.com/tailieudientucntt 10 / 34
  11. Ví dụ Bài toán tìm luồng cực đại trong mạng a 1 1 s 1 t 1 1 b tương đương với bài toán quy hoạch tuyến tính max fsa + fsb 0 ≤ fsa , fsb , fab , fat , fbt ≤ 1 fsa = fat + fab fsb + fab = fbt CuuDuongThanCong.com https://fb.com/tailieudientucntt 11 / 34
  12. Nội dung Bài toán luồng cực đại trên mạng Thuật toán Ford-Fulkerson Luồng cực đại và lát cắt cực tiểu Tính hiệu quả của thuật toán CuuDuongThanCong.com https://fb.com/tailieudientucntt
  13. Thuật toán tham lam ▶ Bắt đầu với luồng 0 ▶ Lặp lại: Chọn một đường đi thích hợp từ s tới t và tăng luồng nhiều nhất có thể dọc theo đường này. CuuDuongThanCong.com https://fb.com/tailieudientucntt 13 / 34
  14. Khởi tạo Tăng luồng a a 0/1 0/1 1/1 1/1 s 0/1 t s 0/1 t 0/1 0/1 0/1 0/1 b b Tăng luồng Luồng cực đại a a 1/1 1/1 1/1 1/1 s 0/1 t s 0/1 t 1/1 1/1 1/1 1/1 b b CuuDuongThanCong.com https://fb.com/tailieudientucntt 14 / 34
  15. Khởi tạo Tăng luồng a a 0/1 0/1 1/1 0/1 s 0/1 t s 1/1 t 0/1 0/1 0/1 1/1 b b Hủy luồng trên cạnh a → b Luồng cực đại a a 1/1 1/1 1/1 1/1 s 0/1 t s 0/1 t 1/1 1/1 1/1 1/1 b b CuuDuongThanCong.com https://fb.com/tailieudientucntt 15 / 34
  16. Tìm đường tăng luồng Tìm cạnh (u, v) có một trong hai kiểu ▶ (u, v) ∈ E và khả năng thông qua cuv vẫn chưa đầy. Khi đó fuv có thể tăng thêm nhiều nhất là cuv − fuv . ▶ (v, u) ∈ E và có một luồng qua đó, tức là fvu > 0. Khi đó ta có thể giảm một phần hoặc toàn bộ fvu . CuuDuongThanCong.com https://fb.com/tailieudientucntt 16 / 34
  17. Đường tăng luồng Cạnh gốc Cạnh ngược ▶ e = (u, v) ∈ E ▶ eR = (v, u) ▶ Luồng fe ▶ “Giảm” luồng fe đã gửi ▶ Khả năng ce Khả năng thông qua còn lại Ví dụ a { 1/1 0/1 ce − fe nếu e ∈ E s 1/1 t cf (e) = fe nếu eR ∈ E. 0/1 1/1 b CuuDuongThanCong.com https://fb.com/tailieudientucntt 17 / 34
  18. Đồ thị tăng luồng Định nghĩa Đồ thị tăng luồng của mạng G với luồng f là đồ thị Gf = (V, Ef , cf ) với Ef = {e : fe < ce } ∪ {eR : fe > 0}. Ví dụ Mạng G với luồng f và đồ thị tăng luồng Gf tương ứng. a a 1/1 0/1 1 1 s 1/1 t s 1 t 0/1 1/1 1 1 b b CuuDuongThanCong.com https://fb.com/tailieudientucntt 18 / 34
  19. Đường tăng luồng Định nghĩa ▶ Một đường tăng luồng là một đường đi từ s đến t trong đồ thị tăng luồng Gf . ▶ Khả năng thông qua của đường tăng luồng P là cf (P) = min{cf (e) : e ∈ P} Augment(f, c, P) δ = cf (P) foreach cạnh e ∈ P: if (e ∈ E) fe = fe + δ else f(eR ) = f(eR ) − δ return f CuuDuongThanCong.com https://fb.com/tailieudientucntt 19 / 34
  20. Thuật toán Ford-Fulkerson Ford-Fulkerson (G) foreach cạnh e ∈ E: fe = 0 Gf = đồ thị tăng luồng của G và f while (còn đường tăng luồng P trong Gf ): f = Augment(f, c, P) Cập nhật Gf return f CuuDuongThanCong.com https://fb.com/tailieudientucntt 20 / 34
nguon tai.lieu . vn