Bài toán luồng cực đại trong mạng

13 667 2
Bài toán luồng cực đại trong mạng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài toán luồng cực đại mạng Bài toán luồng cực đại mạng Bởi: Khoa CNTT ĐHSP KT Hưng Yên Bài toán luồng cực đại mạng Bài toán luồng cực đại mạng số toán tối ưu đồ thị tìm ứng dụng rộng rãi thực tế ứng dụng thú vị lý thuyết tổ hợp Bài toán đề xuất vào đầu năm 1950, gắn liên với tên tuổi hai nhà toán học Mỹ Ford Fulkerson Trong chương chúng trình bày thuật toán Ford Fulkerson để giải toán đặt nêu sô ứng dụng toán Mạng Luồng mạng Bài toán luồng cực đại Định nghĩa Ta gọi mạng đồ thị có hướng G = (V,E), đỉnh s cung vào gọi đỉnh phát, đỉnh t cung gọi điểm thu cung e=(v,w) ∈ E gán với số không âm c(e) =c(v,w) gọi khả thông qua cung e Để thuận tiện cho việc trình bày ta qui ước cung (v,w) khả thông qua c(v,w) gán Định nghĩa Giả sử cho mạng G=(V,E) Ta gọi mạng f mạng G=(V,E) ;là ánh xạ f: E→R+ gán cho cung e =(v,w) ∈ E số thực không âm f(e)=f(v,w), gọi luồng cung e, thoả mãn điểu kiện sau: - Luồng cung e ∈ E không vượt khả thông qua nó: - Điều kiện cân luồng đỉnh mạng: Tổng luồng cung vào đỉnh v tổng luồng cung khỏi đỉnh v, v ≠ s, t: 1/13 Bài toán luồng cực đại mạng N-(v) – tập đỉnh mạng mà từ có cung đến v, N+(v) - tập đỉnh mạng mà từ v có cung đến nó: Giá trị luồng f số Bài toán luồng cực đại mạng: Cho mạng G(V,E) Hãy tìm luồng f* mạng với giá trị luồng val(f*) lớn Luồng ta gọi luồng cực đại mạng Bài toán xuất nhiều ứng dụng thực tế Chẳng hạn cần xác định cường độ lớn dòng vận tải hai nút đồ giao thông Trong ví dụ lời giải toán luồng cực đại cho ta đoạn đường đông xe chúng tạo thành "chỗ hẹp" tương ứng với dòng giao thông xét theo hai nút chọn Một ví dụ khác xét đồ thị tương ứng với hệ thống đường ống dẫn dầu Trong ống tương ứng với cung, điểm phát coi tầu chở dầu, điểm thu bể chứa, điểm nối ống nút đồ thị Khả thông qua cung tương ứng với tiết diện ống Cần phải tìm luồng dầu lớn bơm từ tàu chở dầu vào bể chứa Lát cắt đường tăng luồng Định lý ford_fulkerson Định nghĩa Ta gọi lát cắt (X, X*) cách phân hoạch tập đỉnh V mạng thành hai tập X X* = V\X, s ∈ X, t ∈ X* Khả thông qua lát cắt (X, X*) số 2/13 Bài toán luồng cực đại mạng c(X,X*) = ?c(v,w) v∈X w ∈ X* Lát cắt với khả thông qua nhỏ gọi lát cắt hẹp Bổ đề Giá trị luồng f mạng nhỏ khả thông qua lát cắt (X, X*) nó: val(f) ≤ c(X, X*) Chứng minh Cộng điều kiện cân luồng Divf(v)=0 với v∈ X Khi ta có tổng gồm số hạng dạng f(u,v) với dấu cộng dấu trừ mà có hai đỉnh u,v phải thuộc tập X Nếu hai đỉnh u,v tập X, f(u,v) xuất với dấu cộng Divf(v) với dấu trừ Divf(u), thế, chúng triệt tiêu lẫn Do đó, sau giản ước số hạng vế trái, ta thu Mặt khác, từ điều kiện rõ ràng 3/13 Bài toán luồng cực đại mạng suy val(f)≤c(X, X*) Bổ đề chứng minh Hệ Giá trị luồng cực đại mạng không vượt khả thông qua lát cắt hẹp mạng Ford Fulkerson chứng minh giá trị luồng cực đại mạng khả thông qua lát cắt hẹp Để phát biểu chứng minh kết chúng cần thêm số khái niệm Giả sử f luồng mạng G = (V, E) Từ mạng G =(V, E) ta xây dựng đồ thị có trọng số cung Gf = (V, Ef), với tập cung Ef trọng số cung xác định theo qui tắc sau : - Nếu e = (v,w) ∈ E với f(v,w) = 0, (v,w) ∈ Ef với trọng số c(v,w); - Nếu e = (v,w) ∈ E với f(v,w) =c(v,w), (w,v) ∈ Ef với trọng số f(v,w); - Nếu e = (v,w) ∈ E với < f(v,w) < c(v,w), (v,w) ∈ Ef với trọng số c(v,w) - f (v,w) (w,v) ∈ Ef với trọng số f(v,w) Các cung Gf đồng thời cung G gọi cung thuận, cung lại gọi cung nghịch Đồ thị Gf gọi đồ thị tăng luồng Ví dụ 1: Các số viết cạnh cung G hình 9.1 theo thứ tự khả thông qua luồng cung 4/13 Bài toán luồng cực đại mạng Hình 9.1 Mạng G luồng f Đồ thị có trọng số G f tương ứng Giả sử P = (s = v0, v1, , vk = t) đường từ s đến t đồ thị tăng luồng Gf Gọi ε giá trị nhỏ trọng số cung đường P Xây dựng luồng f’ mạng theo qui tắc sau: f(u,v) + ε , (u,v) ∈ P cung thuận f’(u,v) = f(u,v) - ε , (v,u) ∈ P cung nghịch f(u,v), (u,v) ∈ P Dễ dàng kiểm tra f’ xây dựng luồng mạng val(f’) = val(f) + ε Ta gọi thủ tục biến đổi luồng vừa nêu tăng luồng dọc theo đường P Định nghĩa Ta gọi đường tăng luồng f đường từ s đến t đồ thị tăng luồng G(f) Định lý Các mệnh đề tương đương: (i) f luồng cực đại mạng; (ii) không tìm đường tăng luồng f; (iii) val(f) = c(X,X*) với lát cắt (X, X*) 5/13 Bài toán luồng cực đại mạng Chứng minh (i) ⇒ (ii) Giả sử ngược lại, tìm đường tăng luồng P Khi ta tăng giá trị luồng cách tăng luồng dọc theo đường P Điều mâu thuẫn với tính cực đại luồng f (ii) ⇒ (iii) Giả sử không tìm đường tăng luồng Ký hiệu X tập tất đỉnh đến từ đỉnh s đồ thị Gf, đặt X*=V\X Khi (X, X*) lát cắt, f(v,w) = với v ∈ X*, w ∈ X nên val(f) = ? f(v,w) - ? f(v,w) = ? f(v,w) X* w∈ X v∈X v ∈ X* v∈ X w∈ w∈ X* Với v ∈ X, w ∈ X*, (v,w) ∈ Gf, nên f(v,w) = c(v,w) Vậy val(f) = ? f(v,w) = ? c(v,w) = c(X,X*) v∈X v∈X w∈ X* w∈ X* (iii) ⇒ (i) Theo bổ đề 9.1, val(f) ≤ c(X,X*) với luồng f với lát cắt (X,X*) Vì vậy, từ đẳng thức val(f) = c(X,X*) suy luồng f luồng cực đại mạng Thuật toán tìm luồng cực đại Định lý sở để xây dựng thuật toán lặp sau để tìm luồng cực đại mạng: Bắt đầu từ luồng với luồng tất cung (ta gọi luồng luồng không), lặp lại bước lặp sau thu luồng mà không đường tăng: Bước lặp tăng luồng (Ford-Fulkerson): Tìm đường tăng P luồng có Tăng luồng dọc theo đường P Khi có luồng cực đại, lát cắt hẹp theo thủ tục mô tả chứng minh định lý Sơ đồ thuật toán Ford-Fulkerson mô tả thủ tục sau đây: Procedure Max_Flow; (* Thuật toán Ford-Fulkerson *) Begin (* Khởi tạo: Bắt đầu từ luồng với giá trị *) 6/13 Bài toán luồng cực đại mạng for u ∈ V for v ∈ V f(u,v) := 0; stop := false; while not stop if then else stop:=true; End; Để tìm đường tăng luồng G(f) sử dụng thuật toán tìm kiếm theo chiều rộng (hay tìm kiếm theo chiều sâu), đỉnh s không cần xây dựng tường minh đồ thị G(f) Ford-Fulkerson đề nghị thuật toán gán nhãn chi tiết sau để giải toán luồng cực đại mạng Thuật toán luồng chấp nhận mạng (có thể luồng không) , sau ta tăng luồng cách tìm đường tăng luồng Để tìm đường tăng luồng ta áp dụng phương pháp gán nhãn cho đỉnh Mỗi đỉnh trình thực thuật toán ba trạng thái: chưa có nhãn, có nhãn chưa xét, có nhãn xét Nhãn đỉnh v gồm hai phần có hai dạng sau : [,] [] Phần thứ +p(v) (-p(v)) cần tăng giảm luồng theo cung (p(v),v)( cung (v, p(v)) phần thứ hai lượng lớn tăng giảm luồng theo cung Đầu tiên có đỉnh s khởi tạo nhãn nhãn chưa xét, tất đỉnh lại chưa có nhãn Từ s ta gán nhãn cho tất đỉnh kề với nhãn đỉnh s trở thành xét Tiếp theo, từ đỉnh v có nhãn chưa xét ta lại gán nhãn cho tất đỉnh chưa có nhãn kề với nhãn đỉnh v trở thành xét Quá trình lặp lại đỉnh t trở thành có nhãn nhãn tất đỉnh có nhãn đầu xét đỉnh t nhãn Trong trường hợp thứ ta tìm đường tăng luồng, trường hợp thứ hai luồng xét không tồn đường tăng luồng (tức luồng cực đại) Mỗi tìm đường tăng luồng, ta lại tăng luồng theo đường tìm được, sau xoá tất nhãn đổi với luồng thu lại sử dụng phép gán nhãn đỉnh để tìm đường tăng luồng Thuật toán kết thúc luồng có mạng không tìm đường tăng luồng Hai thủ tục tìm đường tăng luồng mô tả sau : Procedure Find-path; { Thủ tục gán nhãn đường tăng luồng p[v], [v] nhãn đỉnh v; 7/13 Bài toán luồng cực đại mạng VT danh sách đỉnh có nhãn chưa xét ; c[u,v] khả thông qua cung (u,v),u,v V; f[u,v] luồng cung (u,v), (u,v V); } BEGIN p[s] := s ; [s] :=; VT := {s}; Pathfound := true; While VT {} BEGIN u VT ; ( * lấy u từ VT *) For vV If (v chưa có nhãn) then Begin If (c[u,v] >0) and (f[u,v] < c[u,v] ) then Begin P[v] := u ; [v] := {[u],c[u,v]-f[u,v] }; VT:=VT{v}; (* nạp v vào danh sách đỉnh có nhãn *) If v = t then exit; End Else If (c[v,u] > 0) and (f[v,u] < 0) then Begin P[v] := u ; 8/13 Bài toán luồng cực đại mạng [v] := {[u] , f[u,v] }; VT:=VT{v};(* nạp v vào danh sách đỉnh có nhãn *) If v = t then exit; End; End; End; PathFound :=false; End; Procedure Inc_flow ; { thuật toán tăng luồng theo đường tăng } Begin v := t ; u := t ; tang := [t]; while u s begin v := p[u]; if v > then f[v,u] := f[v,u] + tang else begin v := -v; f[u,v] :=f[u,v] –tang; end; u := v ; 9/13 Bài toán luồng cực đại mạng end; Procedure FF; { thủ tục thể thuật toán Ford_fulkerson } Begin (* khởi tạo luồng với giá trị *) For u V For v V f[u,v] :=0; Stop := false; While not Stop begin find_path; If pathfound then Inc_flow Else Stop:=true; End; < Luồng cực đại mạng f[u,v], u,v V > < Lát cắt hẹp (VT , V\ VT) > End; Giả sử khả thông qua tất khung đồ thị số nguyên Khi sau lần tăng luồng, giá trị luồng tăng lên Từ suy thuật toán Ford_Fulkerson dừng sau không val(f*) lần tăng luồng cho ta luồng cực đại mạng Đồng thời, rõ ràng f*(u,v) số nguyên cung (u,v) ∈ E Từ có kết sau: Định lý (Định lý luồng cực đại mạng lát cắt hẹp nhất) Luồng cực đại mạng khả thông qua lát cắt hẹp 10/13 Bài toán luồng cực đại mạng Định lý (Định lý tính nguyên) Nếu tất khả thông qua số nguyên luồng tìm cực đại với luồng cung số nguyên Tuy nhiên, khả thông qua số lớn giá trị luồng cực đại lớn thuật toán mô tả đòi hỏi thực nhiều bước tăng luồng Ví dụ hình minh hoạ cho điều Hình 2(a) mô tả mạng cần xét với khả thông qua cung Hình 2(b) mô tả luồng cung (số thứ hai bên cạnh cung) sau thực tăng luồng dọc theo đường tăng luồng (s, a, b, t) Hình 2(c) mô tả luồng cung sau thực tăng luồng dọc theo đường tăng luồng (s, b, a, t) Rõ ràng, sau 2.106 lần tăng luồng theo đường (s, a, b, t) (s, b, a, t) cách luân phiên ta thu luồng cực đại Hình Ví dụ tồi tệ thuật toán Ford_Fulkerson Hơn nữa, khả thông qua số vô tỉ, người ta xây dựng ví dụ thuật toán không dừng, tệ dãy giá trị luồng xây dựng theo thuật toán hội tụ không hội tụ đến giá trị luồng cực đại Như vậy, muốn thuật toán làm việc hiệu quả, việc lựa chọn đường tăng luồng cần tiến hành cẩn thận Edmonds Karp đường tăng luồng chọn đường ngắn từ s đến t đồ thị Gf Điều thực hiện, thủ tục tìm đường tăng Find_Path mô tả trên, danh sách VT tổ chức dạng QUEUE (nghĩa ta thực tìm đường tăng thủ tục tìm kiếm theo chiều rộng) thuật toán kết thúc sau không mn/2 lần sử dụng đường tăng luồng Nếu để ý rằng, tìm kiếm theo chiều rộng đồ thị đòi hỏi thời gian O(m+n), thuật toán thu có độ phức tạp tính toán O(nm2) 11/13 Bài toán luồng cực đại mạng Nhờ cách tổ chức tìm đường tăng khéo léo hơn, người ta xây dựng thuật toán với độ phức tạp tính toán tốt như: O(n2m) (Dinic, 1970) O(n3) (Karzanov, 1974), O(n2m2), (Cherkasky, 1977), O(nm log n) (Sleator, - Tarrjan, 1980) Ta kết thúc mục ví dụ minh hoạ cho thuật toán Ford_Fulkerson sau Hình 3(a) cho mạng G với thông qua tất cung luồng giá trị 10 Hai số viết bên cạnh cung khả thông qua cung (số ngoặc) luồng cung Đường tăng luồng có dạng (s, v3, v2, v6, v7, t) Ta tính ε (t) = 1, giá trị luồng tăng từ 10 lên Hình (b) cho luồng thu sau tăng luồng theo đường tăng tìm Hình Tăng luồng dọc theo đường tăng Luồng hình 3(b) cực đại Lát cắt hẹp X = { s, v2, v3, v5}, X* = { v4, v6, v7, t} 12/13 Bài toán luồng cực đại mạng Giá trị luồng cực đại 11 13/13 [...].. .Bài toán luồng cực đại trong mạng Định lý 5 (Định lý về tính nguyên) Nếu tất cả các khả năng thông qua là các số nguyên thì luồng tìm được cực đại với luồng trên các cung là các số nguyên Tuy nhiên, nếu các khả năng thông qua là các số rất lớn thì giá trị của luồng cực đại cũng có thể là rất lớn và khi đó thuật toán mô tả ở trên sẽ đòi hỏi thực hiện rất nhiều bước tăng luồng Ví dụ trong hình... O(m+n), thì thuật toán thu được sẽ có độ phức tạp tính toán là O(nm2) 11/13 Bài toán luồng cực đại trong mạng Nhờ cách tổ chức tìm đường tăng khéo léo hơn, người ta đã xây dựng được thuật toán với độ phức tạp tính toán tốt hơn như: O(n2m) (Dinic, 1970) O(n3) (Karzanov, 1974), O(n2m2), (Cherkasky, 1977), O(nm log n) (Sleator, - Tarrjan, 1980) Ta kết thúc mục này bởi ví dụ minh hoạ cho thuật toán Ford_Fulkerson... cho mạng G cùng với thông qua của tất cả các cung và luồng giá trị 10 trong nó Hai số viết bên cạnh mỗi cung là khả năng thông qua của cung (số trong ngoặc) và luồng trên cung Đường tăng luồng có dạng (s, v3, v2, v6, v7, t) Ta tính được ε (t) = 1, giá trị luồng tăng từ 10 lên 1 Hình 3 (b) cho luồng thu được sau khi tăng luồng theo đường tăng tìm được Hình 3 Tăng luồng dọc theo đường tăng Luồng trong. .. Hình 3 (b) cho luồng thu được sau khi tăng luồng theo đường tăng tìm được Hình 3 Tăng luồng dọc theo đường tăng Luồng trong hình 3(b) đã là cực đại Lát cắt hẹp nhất X = { s, v2, v3, v5}, X* = { v4, v6, v7, t} 12/13 Bài toán luồng cực đại trong mạng Giá trị luồng cực đại là 11 13/13 ... ta thu được luồng cực đại Hình 2 Ví dụ tồi tệ đối với thuật toán Ford_Fulkerson Hơn thế nữa, nếu các khả năng thông qua là các số vô tỉ, người ta còn xây dựng được ví dụ để cho thuật toán không dừng, và tệ hơn nếu dãy các giá trị luồng xây dựng theo thuật toán hội tụ thì nó còn không hội tụ đến giá trị luồng cực đại Như vậy, muốn thuật toán làm việc hiệu quả, việc lựa chọn đường tăng luồng cần được tiến... tả mạng cần xét với các khả năng thông qua trên các cung Hình 2(b) mô tả luồng trên các cung (số thứ hai bên cạnh cung) sau khi thực hiện tăng luồng dọc theo đường tăng luồng (s, a, b, t) Hình 2(c) mô tả luồng trên các cung sau khi thực hiện tăng luồng dọc theo đường tăng luồng (s, b, a, t) Rõ ràng, sau 2.106 lần tăng luồng theo đường (s, a, b, t) và (s, b, a, t) một cách luân phiên ta thu được luồng. .. và Karp chỉ ra rằng nếu đường tăng luồng được chọn là đường ngắn nhất từ s đến t trên đồ thị Gf Điều đó có thể thực hiện, nếu trong thủ tục tìm đường tăng Find_Path mô tả ở trên, danh sách VT được tổ chức dưới dạng QUEUE (nghĩa là ta thực hiện tìm đường tăng bởi thủ tục tìm kiếm theo chiều rộng) thì thuật toán sẽ kết thúc sau không quá mn/2 lần sử dụng đường tăng luồng Nếu để ý rằng, tìm kiếm theo .. .Bài toán luồng cực đại mạng N-(v) – tập đỉnh mạng mà từ có cung đến v, N+(v) - tập đỉnh mạng mà từ v có cung đến nó: Giá trị luồng f số Bài toán luồng cực đại mạng: Cho mạng G(V,E) Hãy tìm luồng. .. 3/13 Bài toán luồng cực đại mạng suy val(f)≤c(X, X*) Bổ đề chứng minh Hệ Giá trị luồng cực đại mạng không vượt khả thông qua lát cắt hẹp mạng Ford Fulkerson chứng minh giá trị luồng cực đại mạng. .. với luồng f với lát cắt (X,X*) Vì vậy, từ đẳng thức val(f) = c(X,X*) suy luồng f luồng cực đại mạng Thuật toán tìm luồng cực đại Định lý sở để xây dựng thuật toán lặp sau để tìm luồng cực đại mạng:

Ngày đăng: 31/12/2015, 12:06

Từ khóa liên quan

Mục lục

  • Bài toán luồng cực đại trong mạng

  • Mạng. Luồng trong mạng. Bài toán luồng cực đại

  • Lát cắt. đường tăng luồng. Định lý ford_fulkerson

  • Thuật toán tìm luồng cực đại

    • Hai thủ tục tìm đường tăng luồng có thể mô tả như sau :

    • Procedure Find-path;

    • { Thủ tục gán nhãn đường tăng luồng

    • p[v], [v] là nhãn của đỉnh v;

    • VT là danh sách các đỉnh có nhãn chưa xét ;

    • c[u,v] là khả năng thông qua của cung (u,v),u,v V;

    • f[u,v] là luồng trên cung (u,v), (u,v V); }

    • BEGIN

    • p[s] := s ; [s] :=; VT := {s};

    • Pathfound := true;

    • While VT <> {} do

    • BEGIN

    • u VT ; ( * lấy u từ VT *)

    • For vV do

    • If (v chưa có nhãn) then

    • Begin

    • If (c[u,v] >0) and (f[u,v] < c[u,v] ) then

Tài liệu cùng người dùng

Tài liệu liên quan