1. Trang chủ
  2. » Giáo án - Bài giảng

Tiểu luận môn phân tích và đánh giá thuật toán bài toán luồng cực đại thuật toán ford fulkerson

20 437 1

Đ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

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 492,58 KB

Nội dung

KHOA CÔNG NGHỆ THÔNG TIN _ & _ BÀI TẬP LỚN MÔN HỌC: PHÂN TÍCH ĐÁNH GIÁ THUẬT TOÁN ĐỀ SỐ 2: BÀI TOÁN LUỒNG CỰC ĐẠI THUẬT TOÁN FORDFULKERSON KIỂM TRA TÍNH ĐÚNG ĐẮN ĐÁNH GIÁ HIỆU QUẢ Giảng viên hướng dẫn : TS Tống Minh Đức Học viên : Nguyễn Tiến Thụy Lớp : Cao học HTTT- K27B Hà Nội, 2016 MỤC LỤC 2 CHƯƠNG I: LUỒNG CỰC ĐẠI 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 lý thuyết tổ hợp Bài toán đề xuất vào Đầu Những Năm 1950, gắn liền với tên tuổi hai nhà bác học Mỹ Ford Fulkerson I Mạng Định nghĩa: Mạng đồ thị có hướng G = (V, E) đó: - Có đỉnh s cung vào gọi đỉnh phát - Có đỉnh t cung gọi đỉnh thu Mỗi 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 Quy ước mạng cung (v,w) ta thêm vào cung (v,w) với khả thông qua c[v,w] gán Với mạng G = (V, E, c), ta ký hiệu: W-(x) = {(v,w) ∈ E | v ∈ V}: tập cung vào đỉnh v W+(x) = {(w,v) ∈ E | v ∈ V}: tập cung khỏi đỉnh v II Luồng mạng Định nghĩa: Giả sử cho mạng G = (V,E) Ta gọi luồng f mạng G = (V,E) á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: Điều kiện 1: Luồng cung e ∈ E không vượt khả thông qua nó: ≤ f (e) ≤ c(e) Điều kiện 2: Đ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: t(W-(x)) = t(W+(x)), ∀x ≠ s, t III Tính chất luồng Với tập B ⊆ V, ký hiệu: W-(B) = { (a, b)∈ E | a∉B, b∈B } - tập cung vào B 3 W+(B) = { (a, b)∈ E | a∈B, b∉B } - tập cung từ B Khi tập đỉnh B không chứa s t thì: t (W-(B)) = t (W+(B)) Theo tính chất b) luồng: ∑ t (W-(x)) =∑ t (W+(x)) Cạnh kề với đỉnh x có đỉnh đầu đỉnh cuối nằm tập B có mặt hai vế đẳng thức lần, giản ước IV Giá trị luồng Giá trị luồng tính tổng giá trị cung từ đỉnh nguồn s (đỉnh Hình 1), tổng giá trị cung vào đỉnh thứ t (đỉnh Hình 1) Hình 1: Luồng cực đại với giá trị luồng khả thông qua cặp cạnh V Ứng dụng thực tế - Xét đồ thị tương ứng hệ thống ống dẫn dầu Trong ống tương ứng với cung, điểm phát 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 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 - Xác định cường độ lớn dòng vận tải nút đồ giao thông 4 Bài toán cặp ghép: có m chàng trai n cô gái Mỗi chàng trai ưa thích số cô gái Hãy tìm cách ghép cặp cho số cặp ghép nhiều - Một số thuật toán luồng cực đại VI V.1 Bài toán luồng cực đại mạng V.1.1 Lát cắt - Đường tăng luồng a) Lát cắt Đị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ố 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*) 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 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ố G f =(V,Ef), với tập cung Ef trọng số cung xác định theo quy 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 5 Ví dụ: Đồ thị tăng luồng xây dựng từ đồ thị G hình Hình Mạng G luồng f Đồ thị có trọng số Gf tương ứng b) Đường tăng luồng Giả sử P = (s = v0,v1,v2,…,vk= t) đường từ s đến t đồ thị tăng luồng G f Gọi d giá trị nhỏ trọng số cung đường P Xây dựng luồng f' mạng G theo quy tắc sau: f(u,v) = f(u,v) + d, (u,v) ∈ P cung thuận f(u,v) – d, (u,v) ∈ P cung nghịch f(u,v), (u,v) ∉ P Hình 2: Đường tăng luồng Dễ dàng kiểm tra f' xây dựng luồng mạng val(f')= val(f) + d Thủ tục biến đổi luồng vừa nêu tăng luồng dọc theo đường P 6 Hình 3: Luồng trước sau tăng Đường tăng luồng P = (1,3,4,2,5,6), có giá trị số nhỏ đường d=2 [1,3] cung thuận, val(f) = + = 4, [3,4] cung thuận, val(f) = + = [4,2] cung nghịch , val(f) = – = 3, [2,5] cung thuận, val(f) = + = [5,6] cung thuận, val(f) = + = Sau biến đổi ta có luồng mang giá trị val(f) = + - + + = V.1.2 Thuật toán Ford-Fulkerson + Xuất phát từ luồng chấp nhận f + Tìm đường tăng luồng P Nếu thuật toán kết thúc Nếu có, tiếp bước + Nếu δ(P) = +∞ thuật toán kết thúc Trong δ(P) - Lượng luồng tăng thêm, hay nói khác làm tăng luồng (flow augmentation) dọc theo đường tăng luồng P lượng thích hợp mà ràng buộc toán thoả mãn Cách tìm đường tăng luồng Ta sử dụng thuật toán gán nhãn có nội dung sau Một đường P thoả mãn đường tăng luồng, từ s đến u (chưa tới t) gọi đường chưa bão hoà Đỉnh u gán nhãn, ta biết có đường chưa bão hoà từ s tới u Tiếp theo xét tất đỉnh v liền kề với đỉnh u, kiểm tra xem chúng gán nhãn hay không Nếu (u,v) có luồng cung f(u,v) < c(u,v) ta nối thêm cung (u,v) đường chưa bão hoà P từ s đến u để đường chưa bão hoà tới v Vậy v gán nhãn Bước lặp tăng luồng (Ford - Fulkerson): Tìm đường tăng luồng P luồng có Tăng luồng dọc theo đường P 7 Khi có luồng cực đại, lát cắt hẹp xác định Thuật toán FordFulkerson mô tả thủ tục sau: Procedure Max_Flow; * Thuật toán FordFulkerson * begin (* Khởi tạo: Bắt đầu từ luồng với giá trị *) for u ∈ V for v ∈ V f(u,v):=0; Stop:=false; While not Stop if< Tìm đường tăng luồng P> then else Stop:= true; end; * Thuật toán gán nhãn (The labeling algorithm) Gọi VT tập đỉnh gán nhãn chưa thăm Ta có thuật toán để tìm đường tăng luồng Xuất phát với VT = {s} s đỉnh bắt đầu ( đỉnh đánh dấu đầu tiên) Một bước lặp có VT hành gồm ba bước sau: + Nếu t ∈ VT VT = ∅, thuật toán kết thúc Ngược lại chọn đỉnh u ∈ VT để thăm đưa khỏi VT Xét tất đỉnh cạnh u, tức xét cung có dạng (u,v) (v,u) + Nếu (u,v) ∈ E, f(u,v) < c(u,v) v chưa gán nhãn gán nhãn đưa v vào tập VT + Nếu (v,u) ∈ E, f(v,u) > v chưa gán nhãn gán nhãn đưa vào tập VT 8 Sơ đồ thuật toán Ford-Fulkerson tổng quát Begin Mạng với luồng zero Stop:= False Tăng luồng True not Stop True Find_Path Path-Found False False Stop:= False Mạng với luồng cực đại End Đị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 Định lý (Định lý tính nguyên) Nếu tất khả thông qua số nguyên tìm luồng cực đại với luồng cung số nguyên 9 V.2 Thuật toán song song tìm luồng cực đại Hiện nay, mô hình xử lý song song phát triển mạnh mẽ giải vấn đề bế tắc mà mô hình xử lý gặp phải vấn đề thời gian thực chương trình, tốc độ xử lý, khả lưu trữ nhớ, xử lý liệu với quy mô lớn Client1 Server Client1 Trong bối cảnh đó, thuật toán tìm luồng cực đại cần phát triển theo hướng song song nhằm phát huy sức mạnh toán Connect Connect Connect V.2.1 Bài toán tìm luồng cực đại mạng Cho mạng G(V,E,C), nguồn a, đích z Trong số luồng mạng G, tìm luồnggiá trị lớn getData getNetworks getData V.2.2 Ý tưởng thuật toán Dựa thuật toán truyền thống thuật toán hoán chuyển nguồn đích, Start Waiting xây dựng thuật toán song song tìm luồng cực đại Ý tưởng phương pháp Waiting thay thuật toán truyền thống dùng vi xử lý thực công việc từ đỉnh nguồn đến đỉnh đích Trong thuật toán song song sử dụng hai vi xử lý thực cônggetData việc song song, vi xử lý xuất phát từ đỉnh nguồn, vi xử Init() Init() lý xuất phát từ đỉnh đích Hai vi xử lý trình tìm đường tăng luồng gặp đỉnh trung gian t đó, T công việc vi xử lý xử lý công Display việc từ đỉnh t đến nút nguồn, công việc từ đỉnh t đến nút đích getData getData Stop vi xử lý xử lý_Maxflow F V.2.3 Xây dựng thuật toán song song T G =CheckSteped (V , E ) với nguồnEnda, đích z, khả năngT thông Exit  Đầu vào: qua: ExitMạng C = ( cij ) , ( i, j ) ∈ G Stop F Stop T F Các đỉnh G xếpthentheo thứ If(c1ed=1&c2ed=1) Step=2; Danhtự thucnào C1, C2đó sinh nhan getStep F Steped=1 =2 Đầu ra: Luồng cực đại F = ( f ij ), ( i, j ) ∈ G  Các bước T F getStep T T Bước1: Khởi tạo If(c1ed1=2|c2ed=2) then c1ed=2, c2ed=2, Step=3, Danh thuc C1, C2 tang luong, xoa nhan Assign _label Step=2 F T F Bước 3: Hiệu chỉnh Ttăng luồng, xóa nhãn F T if(c1ed1=3&c2ed=3) then c1ed=1, C2 sinh nhan Đây thuật toán song song tổngc2ed=1, quát,Step=2, có Danh thểthuc ápC1,dụng hiệu cho Inc_flow Inc_flow Steped =3 l Step=3 Del_label Del_label loại mạng Nếu thuật toán cài đặt môi trường xử lý song song tối ưu, F F dự kiến thời gian tính toán giảm nửa so với thuật toán truyền thống T Step=4 Assign _label Step=2 Bước 2: Sinh nhãn F Step=3 Steped =2 T Stop=True F If(c1ed=4|c2ed=4)then c1ed=4, c2ed=4, Step=4; Thong bao Step=4 dung C1, C2 Steped =4 F Waiting T 10 10 Stop=True F Waiting CHƯƠNG 2: BÀI TOÁN ỨNG DỤNG I Ứng dụng thuật toán Ford-Fulkerson giải toán luồng cực đại Bài toán thực tế: Dầu bơm từ tàu chở dầu (đỉnh s) qua trạm trung chuyển (các đỉnh b, c, d, e) tới bể chứa (đỉnh t) Các cung có hướng đồ thị biểu diễn đường ống dẫn cho biết hướng luồng dầu ống Các số cung khả thông qua (có thể hiểu thiết diện) ống dẫn dầu tương ứng Cần xác định luồng dầu lớn bơm từ tàu chở dầu vào bể chứa cách (lượng dầu bơm qua trạm theo đường ống cho)? Áp dụng thuật toán Ford-Fulkerson tìm luồng cực đại cách gán nhãn cho đỉnh mạng G với luồng f cho Hình 3, hai số viết bên cạnh cung khả thông qua luồng cung Kết bước thuật toán mô tả đồ thị bảng Mạng với luồng cực đại thu Hình Lát cắt bé X = {s,c}, X* = {b,d,e,t} giá trị luồng cực đại b d 6,4 6,5 5,4 t 3,1 s 3,0 5,2 c Hình 1,1 6,1 e + Bước lặp 1: s → b → d → t, δ1 = b(s+,1) 6,4 6,5 5,4 s (s,) d(b+,1) t(d+,1) 3,1 3,0 5,2 c(s+,3) b 6,1 e(b+,1) 1,1 d 6,5 6,6 5,5 t 3,1 s 3,0 5,2 c 11 11 1,1 6,1 e + Bước lặp 2: s → c → d → b → e → t, δ2 = b(d-,2) d(c+,2) 6,5 6,6 5,5 s (-,) t(e+,2) 3,1 3,0 5,2 c(s+,3) b 6,1 e(b+,2) 1,1 d 6,3 6,6 5,5 t 3,3 s 3,2 5,4 c 6,3 e 1,1 + Bước lặp 3: Không đường tăng luồng, Val(fmax) = 5+4 = b d 6,3 6,6 5,5 t 3,3 s 3,2 5,4 c 1,1 6,3 e Hình Mạng G với luồng cực đại lát cắt hẹp Độ phức tạp thuật toán: Nếu 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 nhiều bước tăng luồng Ví dụ hình minh hoạ cho điều Hình 5(a) mô tả mạng cần xét với khả thông qua cung Hình 5(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 5(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.10 lần tăng luồng theo đường (s,b,a,t) (s,b,a,t) cách luân phiên ta thu luồng cực đại 12 12 (c) a b toán Ford- Fulkerson Hình 5: Ví dụ tồi tệ với thuật 1,0 Hơn 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ụ nó106,1 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 hết sức106,1 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_Path106,1 mô tảs 106,1 trên, danh sách VT tổ chức dạng QUEUE (nghĩa ta thực tìm t đườ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(n+m), thuật toán thu có độ phức tạp tính toán O(nm2) II Chương trình ứng dụng (b) đầu vào II.1 Dữ liệu Input: file văn “mf1.in”, “mf2.in”, “mf3.in” tương ứng với kích thước mạng có kích thước: - Mạng có đỉnh , cạnh - Mạng có đỉnh, 11 cạnh - Mạng có 101 đỉnh, 200 cạnh a b 13 13 1,1 106,0 106,1 Cấu trúc file liệu đầu vào: - Dòng 1: Chứa số nguyên tương ứng với số đỉnh 106,1 106,0 (n) số cạnh mạng s (e) - Đỉnh phát s mặc định đỉnh đầu (đỉnh 0) vàt đỉnh thu t mặc định đỉnh cuối (n-1) - Các dòng tiếp theo: Mỗi dòng chứa số nguyên tương ứng với đỉnh đầu, đỉnh cuối khả thông qua cạnh Dữ liệu biểu diễn ma trận trọng số đồ thị có hướng, minh hoạ cho mạng cần tìm luồng cực đại II.2 Dữ liệu đầu (a) s Output: Dữ liệu đầu thể hình command với ma trận đầu vào giá trị luồng cực đại mạng 106 II.3 Mô tả liệu Mô tả liệu mf1.in 68 015 025 136 143 233 241 356 456 mf2.in 11 016 024 037 157 215 235 253 359 424 464 12 106 a b 106 106 3t 6 s t 6 s 7 5 126 14 14 4 t 64 456 Ma trận vuông xây dựng sau mf1.in 055000 000630 000310 000006 000006 mf2.in 06470000 00000700 05050300 00000900 00400640 0 0 0 12 Tương tự mạng đầu vào lấy từ file mf3.in có 101 đỉnh 200 cạnh biểu lưu đồ ma trận tương ứng II.4 Một số hàm chương trình II.4.1 Thuật toán Ford-Fulkerson – Tìm đường tăng luồng int max_flow (int s, int t) { int u,v; int max_flow = 0; for (u=0; u=0; u=pred[u]) { v=pred[u]; flow[u][v] -= path_flow; flow[v][u] += path_flow; } max_flow += path_flow; } return max_flow; } 15 15 II.4.2 Hàm kiểm tra có tồn luồng cần tìm hay không int bfs (int start, int target) { int u,v; for (u=0; u 10) { cout

Ngày đăng: 03/10/2017, 13:26

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w