Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
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ÂNTÍCHVÀĐÁNHGIÁTHUẬTTOÁN ĐỀ SỐ 2: BÀITOÁNLUỒNGCỰCĐẠITHUẬTTOÁNFORD – FULKERSON KIỂM TRA TÍNH ĐÚNG ĐẮN VÀĐÁNHGIÁ 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ỒNGCỰCĐẠIBàitoánluồngcự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àitoá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ỹ FordFulkerson 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ồngGiá 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ồngcự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àitoá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ậttoánluồngcựcđại VI V.1 Bàitoánluồngcự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ồngcự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ồngGiả 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ậttoá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ậttoán kết thúc Nếu có, tiếp bước + Nếu δ(P) = +∞ thuậttoán kết thúc Trong δ(P) - Lượngluồ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ậttoá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ồngcực đại, lát cắt hẹp xác định ThuậttoánFord – Fulkerson mô tả thủ tục sau: Procedure Max_Flow; * ThuậttoánFord – Fulkerson * 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ậttoá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ậttoá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ậttoá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ậttoá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ồngcựcđại End Định lý (Định lý luồngcựcđại mạng lát cắt hẹp nhất) Luồngcự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ồngcựcđại với luồng cung số nguyên 9 V.2 Thuậttoán song song tìm luồngcự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ậttoán tìm luồngcự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àitoán tìm luồngcự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ồng có giá trị lớn getData getNetworks getData V.2.2 Ý tưởng thuậttoán Dựa thuậttoán truyền thống thuậttoán hoán chuyển nguồn đích, Start Waiting xây dựng thuậttoán song song tìm luồngcựcđại Ý tưởng phương pháp Waiting thay thuậttoá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ậttoá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ậttoá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ồngcự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ậttoá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ậttoá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ậttoá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ÀITOÁN ỨNG DỤNG I Ứng dụng thuậttoán Ford-Fulkerson giải toánluồngcựcđạiBàitoá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ậttoán Ford-Fulkerson tìm luồngcự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ậttoán mô tả đồ thị bảng Mạng với luồngcựcđại thu Hình Lát cắt bé X = {s,c}, X* = {b,d,e,t} giá trị luồngcự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ồngcự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ồngcựcđại lớn thuậttoá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ồngcự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ậttoán không dừng, tệ dãy giá trị luồng xây dựng theo thuậttoán hội tụ nó106,1 không hội tụ đến giá trị luồngcựcđại Như vậy, muốn thuậttoá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ậttoá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ậttoá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ồngcự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ồngcự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 Và 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ậttoá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