Luồng cực đại trong mạng và một số bài toán ứng dụng
Số trang: 25
Loại file: doc
Dung lượng: 314.50 KB
Lượt xem: 14
Lượt tải: 0
Xem trước 3 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Bài toán luồng cực đại trong mạng là một trong những bài toán tối ưu trên đồ thị tìm được những ứng dụng rộng rãi trong thực tế cũng như những ứng dụng thú vị trong lý thuyết tổ hợp. Bài toán được đề xuất vào đầu những năm 1950, và gắn liền với tên tuổi của hai nhà toán học Mỹ là Ford và Fulkerson. Trong nội dung bài viết này chúng tôi muốn trình bày thuật toán của hai ông và cài đặt nó cũng như đưa ra một số bài toán ứng dụng của thuật toán. ...
Nội dung trích xuất từ tài liệu:
Luồng cực đại trong mạng và một số bài toán ứng dụng Luồng cực đại trong mạng và một số bài toán ứng dụng Nguyễn Văn Trường Bài toán luồng cực đại trong mạng là một trong những bài toán tối ưu trên đồ thị tìm được những ứng dụng rộng rãi trong thực tế cũng như những ứng dụng thú vị trong lý thuyết tổ hợp. Bài toán được đề xuất vào đầu những năm 1950, và gắn liền vơi tên tuổi của hai nhà toán học Mỹ là Ford và Fulkerson. Trong nội dung bài viết này chúng tôi muốn trình bày thuật toán của hai ông và cài đặt nó cũng như đưa ra một số bài toán ứng dụng của thuật toán. 1. Một số khái niệm Định nghĩa 1. Mạng là một đồ thị có hướng G = (V,E), trong đó có duy nhất một đỉnh s không có cung đi vào gọi là điểm phát và có duy nhất một đỉnh t không có cung đi ra gọi là điểm thu và mỗi cung e = (v,w) thuộc E được gán với một số không âm c(e) = c(v,w) gọi là khả năng thông qua của cung e (nếu không có cung (v,w) thì khả năng thông qua c(v,w) được gán bằng 0). Định nghĩa 2. Một luồng f trong mạng G = (V,E) là ánh xạ f : E → R+ gán cho mỗi cung e = (v,w) thuộc E một số thực không âm f(e) = f(v,w), gọi là luồng trên cung e, thoả mãn các điều kiện sau: 1) Luồng trên mỗi cung e thuộc E không vượt quá khả năng thông qua của nó: 0 ≤ f(e) ≤ c(e). 2) Điều kiện cân bằng luồng trên mỗi đỉnh của mạng là tổng luồng trên mỗi cung đi vào đỉnh v bằng tổng luồng trên các cung đi ra khỏi đỉnh v, nếu v ≠ s và v ≠ t thì: Divf(v) = Σf(w,v) - Σ f(v,w) = 0 w thuộc G - (v) w thuộc G + (v) trong đó G - (v) là tập các đỉnh của mạng mà từ đó có cung đến v, và G + (v) là tập các đỉnh của mạng mà từ v có cung đến nó. G - (v) = { w thuộc V : (w,v) thuộc E}; G + (v) = { w thuộc V : (v,w) thuộc E}; 3) Giá trị của luồng f là số: val( f ) = Σ f(s,w) = Σ f(w,t) w thuộc G + (v) w thuộc G - (v) Bài toán luồng cực đại trong mạng: Cho mạng G = (V,E). Hãy tìm luồng f*trong mạng với giá trị luồng val(f*) là lớn nhất. Luồng như vậy sẽ được gọi là luồng cực đại trong mạng. Bài toán như vậy có thể xuất hiện rất nhiều trong ứng dụng thực tế mà chúng ta sẽ nghiên cứu trong phần 3 tiếp theo dưới đây. Định nghĩa 3. Lát cắt (X,X*) là một cách phân hoạch tập đỉnh V của mạng ra thành hai tập X và X* = VX, trong đó s thuộc X và t thuộc X*. Khả năng thông qua của lát cắt (X,X*) là số: c(X,X*) = Σ c(v,w). v thuộc X w thuộc X* Lát cắt với khả năng thông qua nhỏ nhất được gọi là lát cắt hẹp nhất. Bổ đề 1. Giá trị của mọi luồng f trong mạng luôn nhỏ hơn hoặc bằng khả năng thông qua của lát cắt bất kỳ của nó: val(f) ≤ c(X,X*). (do phạm vi có hạn của bài báo nên các phần chứng minh xin xem thêm trong [1] ) Hệ quả 1. Giá trị luồng cực đại trong mạng không vượt quá khả năng thông qua của lát cắt hẹp nhất trong mạng. Ford và Fulkerson đã chứng minh được rằng: giá trị luồng cực đại trong mạng đúng bằng khả năng thông qua của lát cắt hẹp nhất. Ta đưa thêm vào một số khái niệm sau: Giả sử f là một luồng trong mạng G = (V,E). Từ mạng G = (V,E) ta xây dựng đồ thị có trọng số trên mạng Gf = (V,Ef), với tập các cung Ef và trọng số trên các cung được xác định như sau: 1) Nếu e = (v,w) thuộc E với f(v,w) = 0, thì (v,w) thuộc Ef với trọng số c(v,w). 2) Nếu e = (v,w) thuộc E với f(v,w) = c(v,w), thì (v,w) thuộc Ef với trọng số f(v,w). 3) Nếu e = (v,w) thuộc E với 0 < f(v,w) < c(v,w) thì (v,w) thuộc Ef với trọng số c(v,w) - f(v,w) và (w,v) thuộc Ef với trọng số f(v,w). Các cung của Gf đồng thời cũng là cung của G được gọi là cung thuận, các cung còn lại được gọi là cung nghịch. Đồ thị Gf được gọi là đồ thị tăng luồng. Ví dụ: các số viết cạnh các cung của G ở hình vẽ dưới theo thứ tự là khả năng thông qua và luồng f trên cung. Giả sử P = (s = v1,v2,v3,.. ,vk = t) là một đường đi từ s đến t trên đồ thị tăng luồng Gf. Gọi d là giá trị nhỏ nhất của các trọng số của các cung trên đường đi P. Xây dựng luồng f′ trên mạng G theo qu y tắc sau: f′(u,v) nhận một trong các giá trị sau: 1) f(u,v) + d nếu (u,v) thuộc P là cung thuận. 2) f(u,v) - d nếu (u,v) thuộc P là cung nghịch. 3) f(u,v) nếu (u,v) không thuộc P. Dễ dàng kiểm tra được rằng f′ xây dựng như trên là một luồng trên mạng và val(f′) = val(f) + d. Thủ tục biến đổi vừa nêu gọi là tăng luồng dọc theo đường P. Địng nghĩa 4. Đường tăng luồng f là mọi đường đi từ s đến t trên đồ thị tăng luồng G(f). Định lý 1. Các mệnh đề sau là tương đương: 1) f là luồng cực đại trong mạng 2) không tìm được đường tăng luồng f 3) val(f′) = c(X,X*) với một lát cắt (X,X*) nào đó. 2.Thuật toán tìm luồng cực đại trong mạng Định lý 1 là cơ sở để xây dựng thuật toán lặp sau đây để tìm luồng cực đại trong mạng: Bắt đầu từ luồng với tất cả các cung bằng 0 (luồng đó được gọi là luồng không), và thực hiện hai thao tác: a) Tìm đường tăng P đối với luồng hiện có; b) Tăng luồng dọc theo đường P, lặp đi lặp lại cho đến khi thu được luồng mà đối với nó không còn đường tăng (bước lặp trên được gọi là bước lặp tăng luồng Ford- Fulkerson). Sơ đồ thuật toán Ford-Fulkerson được mô tả trong 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ị 0 *) for u thuộc V do for v thuộc V do f(u,v):=0; Stop:= false; While not Stop do If {tìm được đường tăng luông P}then {tăng luồng dọc theo P} else stop:=true; End; Để tìm được đường tăng luồng trong Gf có thể 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 bắt đầu từ đỉnh s, nhưng sử dụng thuật toán gán nhãn của Ford-Fulkerson sẽ tối ưu hơn. Thuật toán bắt đầu từ luồng chấp nhận nào đó trong mạng (có thể bắt đầu từ luồng không), sau đó tăng luồng bằng cách tìm các đường tăng luồng bằng phương pháp gán nhãn cho các đỉnh. Mỗi đỉnh trong quá trình gán nhãn sẽ ở một trong ba trạng thái: chưa có nhãn, có nhãn chưa xét và có nhãn đã xét. Nhãn của đỉnh v có hai phần và ở một trong hai dạng sau:[+p(v), e (v)] hoặc[-p(v), e (v)]. Phần thứ nhất +p(v) (-p(v)) chỉ ra là cần tăng (giảm) luồng theo cung (p(v),v) (cung (v,p(v))), còn phần thứ hai e (v) chỉ ra lượng lớn nhất có thể tăng hoặc giảm luồng theo cung ...
Nội dung trích xuất từ tài liệu:
Luồng cực đại trong mạng và một số bài toán ứng dụng Luồng cực đại trong mạng và một số bài toán ứng dụng Nguyễn Văn Trường Bài toán luồng cực đại trong mạng là một trong những bài toán tối ưu trên đồ thị tìm được những ứng dụng rộng rãi trong thực tế cũng như những ứng dụng thú vị trong lý thuyết tổ hợp. Bài toán được đề xuất vào đầu những năm 1950, và gắn liền vơi tên tuổi của hai nhà toán học Mỹ là Ford và Fulkerson. Trong nội dung bài viết này chúng tôi muốn trình bày thuật toán của hai ông và cài đặt nó cũng như đưa ra một số bài toán ứng dụng của thuật toán. 1. Một số khái niệm Định nghĩa 1. Mạng là một đồ thị có hướng G = (V,E), trong đó có duy nhất một đỉnh s không có cung đi vào gọi là điểm phát và có duy nhất một đỉnh t không có cung đi ra gọi là điểm thu và mỗi cung e = (v,w) thuộc E được gán với một số không âm c(e) = c(v,w) gọi là khả năng thông qua của cung e (nếu không có cung (v,w) thì khả năng thông qua c(v,w) được gán bằng 0). Định nghĩa 2. Một luồng f trong mạng G = (V,E) là ánh xạ f : E → R+ gán cho mỗi cung e = (v,w) thuộc E một số thực không âm f(e) = f(v,w), gọi là luồng trên cung e, thoả mãn các điều kiện sau: 1) Luồng trên mỗi cung e thuộc E không vượt quá khả năng thông qua của nó: 0 ≤ f(e) ≤ c(e). 2) Điều kiện cân bằng luồng trên mỗi đỉnh của mạng là tổng luồng trên mỗi cung đi vào đỉnh v bằng tổng luồng trên các cung đi ra khỏi đỉnh v, nếu v ≠ s và v ≠ t thì: Divf(v) = Σf(w,v) - Σ f(v,w) = 0 w thuộc G - (v) w thuộc G + (v) trong đó G - (v) là tập các đỉnh của mạng mà từ đó có cung đến v, và G + (v) là tập các đỉnh của mạng mà từ v có cung đến nó. G - (v) = { w thuộc V : (w,v) thuộc E}; G + (v) = { w thuộc V : (v,w) thuộc E}; 3) Giá trị của luồng f là số: val( f ) = Σ f(s,w) = Σ f(w,t) w thuộc G + (v) w thuộc G - (v) Bài toán luồng cực đại trong mạng: Cho mạng G = (V,E). Hãy tìm luồng f*trong mạng với giá trị luồng val(f*) là lớn nhất. Luồng như vậy sẽ được gọi là luồng cực đại trong mạng. Bài toán như vậy có thể xuất hiện rất nhiều trong ứng dụng thực tế mà chúng ta sẽ nghiên cứu trong phần 3 tiếp theo dưới đây. Định nghĩa 3. Lát cắt (X,X*) là một cách phân hoạch tập đỉnh V của mạng ra thành hai tập X và X* = VX, trong đó s thuộc X và t thuộc X*. Khả năng thông qua của lát cắt (X,X*) là số: c(X,X*) = Σ c(v,w). v thuộc X w thuộc X* Lát cắt với khả năng thông qua nhỏ nhất được gọi là lát cắt hẹp nhất. Bổ đề 1. Giá trị của mọi luồng f trong mạng luôn nhỏ hơn hoặc bằng khả năng thông qua của lát cắt bất kỳ của nó: val(f) ≤ c(X,X*). (do phạm vi có hạn của bài báo nên các phần chứng minh xin xem thêm trong [1] ) Hệ quả 1. Giá trị luồng cực đại trong mạng không vượt quá khả năng thông qua của lát cắt hẹp nhất trong mạng. Ford và Fulkerson đã chứng minh được rằng: giá trị luồng cực đại trong mạng đúng bằng khả năng thông qua của lát cắt hẹp nhất. Ta đưa thêm vào một số khái niệm sau: Giả sử f là một luồng trong mạng G = (V,E). Từ mạng G = (V,E) ta xây dựng đồ thị có trọng số trên mạng Gf = (V,Ef), với tập các cung Ef và trọng số trên các cung được xác định như sau: 1) Nếu e = (v,w) thuộc E với f(v,w) = 0, thì (v,w) thuộc Ef với trọng số c(v,w). 2) Nếu e = (v,w) thuộc E với f(v,w) = c(v,w), thì (v,w) thuộc Ef với trọng số f(v,w). 3) Nếu e = (v,w) thuộc E với 0 < f(v,w) < c(v,w) thì (v,w) thuộc Ef với trọng số c(v,w) - f(v,w) và (w,v) thuộc Ef với trọng số f(v,w). Các cung của Gf đồng thời cũng là cung của G được gọi là cung thuận, các cung còn lại được gọi là cung nghịch. Đồ thị Gf được gọi là đồ thị tăng luồng. Ví dụ: các số viết cạnh các cung của G ở hình vẽ dưới theo thứ tự là khả năng thông qua và luồng f trên cung. Giả sử P = (s = v1,v2,v3,.. ,vk = t) là một đường đi từ s đến t trên đồ thị tăng luồng Gf. Gọi d là giá trị nhỏ nhất của các trọng số của các cung trên đường đi P. Xây dựng luồng f′ trên mạng G theo qu y tắc sau: f′(u,v) nhận một trong các giá trị sau: 1) f(u,v) + d nếu (u,v) thuộc P là cung thuận. 2) f(u,v) - d nếu (u,v) thuộc P là cung nghịch. 3) f(u,v) nếu (u,v) không thuộc P. Dễ dàng kiểm tra được rằng f′ xây dựng như trên là một luồng trên mạng và val(f′) = val(f) + d. Thủ tục biến đổi vừa nêu gọi là tăng luồng dọc theo đường P. Địng nghĩa 4. Đường tăng luồng f là mọi đường đi từ s đến t trên đồ thị tăng luồng G(f). Định lý 1. Các mệnh đề sau là tương đương: 1) f là luồng cực đại trong mạng 2) không tìm được đường tăng luồng f 3) val(f′) = c(X,X*) với một lát cắt (X,X*) nào đó. 2.Thuật toán tìm luồng cực đại trong mạng Định lý 1 là cơ sở để xây dựng thuật toán lặp sau đây để tìm luồng cực đại trong mạng: Bắt đầu từ luồng với tất cả các cung bằng 0 (luồng đó được gọi là luồng không), và thực hiện hai thao tác: a) Tìm đường tăng P đối với luồng hiện có; b) Tăng luồng dọc theo đường P, lặp đi lặp lại cho đến khi thu được luồng mà đối với nó không còn đường tăng (bước lặp trên được gọi là bước lặp tăng luồng Ford- Fulkerson). Sơ đồ thuật toán Ford-Fulkerson được mô tả trong 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ị 0 *) for u thuộc V do for v thuộc V do f(u,v):=0; Stop:= false; While not Stop do If {tìm được đường tăng luông P}then {tăng luồng dọc theo P} else stop:=true; End; Để tìm được đường tăng luồng trong Gf có thể 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 bắt đầu từ đỉnh s, nhưng sử dụng thuật toán gán nhãn của Ford-Fulkerson sẽ tối ưu hơn. Thuật toán bắt đầu từ luồng chấp nhận nào đó trong mạng (có thể bắt đầu từ luồng không), sau đó tăng luồng bằng cách tìm các đường tăng luồng bằng phương pháp gán nhãn cho các đỉnh. Mỗi đỉnh trong quá trình gán nhãn sẽ ở một trong ba trạng thái: chưa có nhãn, có nhãn chưa xét và có nhãn đã xét. Nhãn của đỉnh v có hai phần và ở một trong hai dạng sau:[+p(v), e (v)] hoặc[-p(v), e (v)]. Phần thứ nhất +p(v) (-p(v)) chỉ ra là cần tăng (giảm) luồng theo cung (p(v),v) (cung (v,p(v))), còn phần thứ hai e (v) chỉ ra lượng lớn nhất có thể tăng hoặc giảm luồng theo cung ...
Tìm kiếm theo từ khóa liên quan:
điều hành mạng an ninh mạng mạng máy tính luồng cực đại mạng bài toán ứng dụngTài liệu cùng danh mục:
-
173 trang 415 3 0
-
41 trang 330 4 0
-
78 trang 308 1 0
-
160 trang 263 2 0
-
Chuẩn bị cho hệ thống mạng công ty
2 trang 258 0 0 -
Tập bài giảng Thiết kế mạng - ThS. Trần Văn Long, ThS. Trần Đình Tùng (Biên soạn)
222 trang 257 0 0 -
74 trang 241 4 0
-
Ngân hàng câu hỏi trắc nghiệm môn mạng máy tính
99 trang 235 1 0 -
60 trang 232 1 0
-
Tập bài giảng Xử lý tín hiệu số
262 trang 231 0 0
Tài liệu mới:
-
12 trang 0 0 0
-
7 trang 0 0 0
-
8 trang 0 0 0
-
91 trang 0 0 0
-
Đề tài: Hoàn thiện hệ thống kênh phân phối
76 trang 1 0 0 -
26 trang 0 0 0
-
238 trang 0 0 0
-
77 trang 0 0 0
-
Sáng kiến kinh nghiệm Mầm non: Những biện pháp nâng cao chất lượng bữa ăn cho trẻ mầm non
22 trang 0 0 0 -
66 trang 0 0 0