Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 24 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
24
Dung lượng
1,22 MB
Nội dung
ĐẠI HỌC ĐÀ NẴNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THƠNG TIN ĐỒ ÁN GIẢI THUẬT & LẬP TRÌNH Đề tài : Tìmluồngcựcđạimạng GVHD SVTH LỚP NHÓM : : : : NGUYỄN VĂN HIỆU VÕ ĐỨC HÙNG SƠN – MAI VĂN TUẤN 16T3 16N11E Đà Nẵng 12-2018 Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu LỜI MỞ ĐẦU Bài toán luồngcựcđạimạng số tốn tối ưu đồ thị tìm ứng dụng rộng rãi thực tế Bài toán đề xuất vào đầu năm 1950 [1], gắn liền với tên tuổi hai nhà bác học Mỹ L.R.Ford D.R.Fulkerson Bài toán luồngcựcđạimạng có nhiều ứng dụng thực tế như: Bài tốn xác định cường độ dòng lớn dòng vận tải hai nút đồ giao thơng, tốn tìmluồng dầu lớn bơm từ tàu chở dầu vào bể chứa hệ thống đường ống dẫn dầu…Ngoài ra, ứng dụng tốn để giải tốn như: tốn phân nhóm sinh hoạt, tốn lập lịch cho hội nghị… Trong báo cáo chúng em trình bày “Bài tốn luồngcựcđại mạng” sử dụng thuật toán Ford - Fulkerson (1962) để giải toán đặt Chúng em xin gửi lời cảm ơn chân thành đến thầy Nguyễn Văn Hiệu hướng dẫn giúp đỡ chúng em hoàn thành đề tài Trong trình nghiên cứu đề tài , kiến thức chuyên ngành hạn chế nên chúng em nhiều thiếu sót tìm hiểu trình bày đề tài Rất mong nhận góp ý thầy/cơ để đề tài chúng em đầy đủ hoàn chỉnh Trang Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Mục lục LỜI MỞ ĐẦU I GIỚI THIỆU ĐỀ TÀI I.1 Tên đề tài I.2 Lý chọn đề tài I.3 Mục đích đề tài II CƠ SỞ LÝ THUYẾT II.1 Ý tưởng II.2 Cơ sở lý thuyết II.2.1 Định nghĩa II.2.2 Bài toán luồngcựcđại III TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN III.1 Phát biểu toán III.2 Cấu trúc liệu III.3 Thuật toán IV CHƯƠNG TRÌNH VÀ KẾT QUẢ 16 IV.1 Tổ chức chương trình 16 IV.2 Ngôn ngữ cài đặt 22 IV.3 Kết quả: 22 IV.3.1 Giao diện chương trình 22 IV.3.2 Kết thực thi chương trình 23 IV.3.3 Nhận xét: 23 V KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 23 V.1 Kết luận: 23 V.2 Hướng phát triển: 23 TÀI LIỆU THAM KHẢO 24 Trang Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu I GIỚI THIỆU ĐỀ TÀI I.1 Tên đề tài “Tìm luồngcựcđại mạng” I.2 Lý chọn đề tài Bài tốn tìmluồngcựcđạimạng giúp giải nhiều vấn đề thực tế, xác định cường độ dòng lớn dòng vận tải hai nút đồ giao thơng, tốn tìmluồng dầu lớn bơm từ tàu chở dầu vào bể chứa hệ thống đường ống dẫn dầu… Vì vậy, chúng em định chọn đề tài để nghiên cứu thêm nó, sau áp dụng thực tế Ngoài ra, đề tài không dễ, chúng em muốn thử thách, cải thiện lực I.3 Mục đích đề tài Giúp chúng em hiểu toàn luồngcựcđạimạng Nắm rõ thuật tốn Ford-Fullkerson Tìmluồngcựcđạimạng Nâng cao kĩ làm việc nhóm, kĩ tìm kiếm, đọc tài liệu II CƠ SỞ LÝ THUYẾT II.1 Ý tưởng Ý tưởng xây dựng luồngcựcđại sau: xuất phát từ luồng đó, ta tìm đường (không định hướng) từ a đến z, tiến hành hiệu chỉnh giá trị luồng đường cho luồng có giá trị lớn Nếu khơng tìm đường luồngluồngcựcđại Giả sử P = (a, u, …, i, j, …, v, z) đường hướng từ a đến z Nếu cạnh (i, j) cung cung hướng với P Ngược lại (j, i) cung cung ngược hướng với P Tập cung hướng với P kí hiệu P+ Tập cung ngược hướng với P kí hiệu P- II.2 Cơ sở lý thuyết II.2.1 Định nghĩa Mạng[2] Mạng đồ thị có hướng G = (V,E,c) thỏa mãn : Có đỉnh s khơng có cung vào gọi đỉnh nguồn Có đỉnh t khơng có cung gọi đỉnh đích Trang Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Trọng số Cij cung (i,j) số không âm gọi khả thông qua cung Đồ thị liên thơng yếu Ví dụ : Đồ thị sau mạng với đỉnh phát s đỉnh thu t a c s t b d Hình Ta có khả thơng qua csa = , csb = 5, cac= 2, cbc= 2, cbd = , cct = 4, cdt = Luồng[2] Cho mạng G, với khả thông qua cij, (i,j) G Tập giá trị {fij (i, j) G} Gọi luồngmạng G thoã mãn - fij cij (i, j) G - Với đỉnh k nguồn(s) đích(t) ( i , k )G fik ( k , j )G f kj Ví dụ 2: Với đồ thị ví dụ trên, tập {fij} sau luồng fab = 2, fbc =2, fcz = 3, fad = 3, fdc = 1, fde = 2, fez = biểu diễn số ngoặc đơn mạng b 2(2) c 3(2) 4(3) a 2(1) z 5(3) 4(2) c 2(2) e Hình Định lý [1] Cho fij, (i,j)G, luồngmạng G với nguồn a đích z Khi đó: Trang Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu f (a,i)G (i , z )G fiz Chứng minh: Gọi V tập đỉnh Với đỉnh i,j không kề ta gán fij=0 Ta có: f jV iV fiz jV iV fij f ji jV iV iV f f jV \ a , z iV ij iV ji fiz f zi f f iV iV iV iV a ,i G f a ,i G i , z G f fiz i , z G fiz Giá trị luồng[2] Cho luồng f mạng G Giá trị luồng f định nghĩa đạilượng Val(f) = ∑(s,i) Gfsi = ∑(i,t) Gfit II.2.1 Bài toán luồngcựcđại 1.Định lý 2[2] Cho f luồng G Giả sử P = (s, u, …, i, j,…, v, t) đường không định hướng từ a đến z thoã -Với cung (i, j) hướng với P fij < cij -Với cung (i, j) ngược hướng với P < fij Đặt := min{x x M}>0 Trong M tập giá trị cij –fij, (i, j)P+ fij, (i, j)PTa xây dựng luồng f’ sau fij (i, j) P fij' : fij (i, j) P+ fij (i, j) P- Trang Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Khi luồng f’ có giá trị lớn giá trị luồng f lượng , tức Val(f’) = Val(f) + Chứng minh: Theo cách xây dựng f’ thỗ mãn điều kiện luồng Cung (s, u)P, có f'su = fsu + nên giá trị Val(f) = ∑(s,i) Efsi = ∑(s,i) Efsi + III TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN III.1 Phát biểu toán Trong thực tế ta thường gặp tốn gọi tốn tìmluồngcựcđại sau: Cho mạng G với nguồn s, đích t khả thông qua cij, (i,j)G Trong số luồngmạng G, tìmluồng có giá trị lớn Input: Mạng G với đỉnh phát s, đỉnh thu t, khả thông qua cung Cụ thể, file input.txt gồm: Hàng thứ n – số đỉnh n hàng khả thông qua đỉnh tương ứng, đỉnh phát đỉnh 0, đỉnh thu đỉnh n – 1 2 0(s) (t) 4 Trang Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Output: Giá trị lớn luồng, F = { fij } với (i,j) E Cụ thể, file output.txt gồm: Hàng thứ giá trị luồngcựcđại n hàng giá trị luồng đỉnh tương ứng III.2 Cấu trúc liệu Chương trình cài đặt sử dụng: + Mảng hai chiều để biểu diễn khả thông qua cung mạng, biểu diễn luồng cung + Mảng chiều để lưu vết đường tăng luồng (đặt nhãn cho đỉnh) + Cài đặt lớp Node để biểu diễn đỉnh + Sử dụng kiểu file text để lấy liệu lưu kết có từ chương trình III.3 Thuật toán - Thuật toán Ford- Fulkerson [2] Đầu vào: Mạng G với nguồn a, đích z, khả thơng qua C = (cij), (i, j)G Ký hiệu a = v0, …, = z Đầu ra: Luồngcựcđại F = (fij), (i, j)G Các bước: Bước (i): Khởi tạo luồng xuất phát: fij:=0 (i, j)E Bước (ii): Đặt nhãn cho nguồn: Cho nguồn a mang nhãn (,) Bước (iii): Kiểm tra nhãn đích: đích z có nhãn, sang bước (vi), ngược lại sang bước (iv) Bước (iv): Trang Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Xác định đỉnh đánh dấu Trong số đỉnh mang nhãn chưa đánh dấu chọn đỉnh vi với số i nhỏ Nếu không tồn đỉnh vậy, kết thúc, luồng F cựcđại Ngược lại gán v:= vi đánh dấu đỉnh v Bước (v): Đặt nhãn đỉnh chưa có nhãn kề đỉnh v: Giả sử (,) nhãn đỉnh v Xét cung có dạng (v,w), (w,v) theo thứ tự (v,v0), (v0,v), (v,v1),(v1,v) w chưa mang nhãn Với cung dạng (v,w), fvw < cvw, đặt nhãn đỉnh w (v, {, cvw - fvw}), fvw = cvw , không đặt nhãn đỉnh w Với cung dạng (w, v), fwv >0, đặt nhãn đỉnh w (v, {, fwv}), fwv = , không đặt nhãn đỉnh w Sang bước (iii) Bước (vi): Hiệu chỉnh luồng: Giả sử (, ) nhãn đích z Đặt W0 :=z, w1 := Nếu nhãn wi (’,’), đặt wi+1 := ’ Tiếp tục trình wk = a Đến nhận đường P từ a đến z P = (a = wk, wk-1,…., w0 = z) Ta hiệu chỉnh luồng f P sau: fij (i, j) P+ fij : fij (i, j) PSau xố tất nhãn đỉnh P quay lại bước (ii) Minh họa thuật tốn Ford- Fulkerson: • Tìmluồngcựcđạimạng G a b s t c • d Thứ tự đỉnh: s a b c d t Trang Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Bước 1: khởi tạo luồng ban đầu Bước 2: Đặt nhãn cho đỉnh nguồn Trang 10 Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Bước 3: Kiểm tra nhãn đích: đích t có nhãn, sang bước (6), ngược lại sang bước (4) t chưa có nhãn, sang bước 4: Bước 4: Xét đỉnh mang nhãn, chọn đỉnh v để đánh dấu Bước 5: Gán nhãn cho đỉnh kề v Quay lại bước 3: t chưa có nhãn, sang bước Trang 11 Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Bước 4: xác định đỉnh gán nhãn đánh dấu: Bước 5: gán nhãn đỉnh kề v: Quay lại bước : t chưa có nhãn, sang bước 4: Trang 12 Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Bước 4: Xác định đỉnh cần đánh dấu: Bước 5: gán nhãn cho đỉnh kề v Quay lại bước 3: t có nhãn, sang bước 6: Trang 13 Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Bước 6: Hiệu chỉnh luồng Val(f) = Xóa tất nhãn P quay lại bước Trang 14 Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu Val (f) = Xóa tất nhãn P quay lại bước Val (f) = Xóa tất nhãn P quay lại bước Trang 15 Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu IV CHƯƠNG TRÌNH VÀ KẾT QUẢ IV.1 Tổ chức chương trình #include #include #include #include "Node.h" using namespace std; #define INF 1000 #define INPUT "input.txt" #define OUTPUT "output.txt" int n; // so dinh int beginNode, endNode; //dinh phat - dinh thu int **c; //kha nang thong qua cua cac cung int **f; //luong hien tai cua cac cung Node *node; //cac dinh int max_f; //gia tri luongcucdai bool Input(); //nhap du lieu tu file void Init(); //khoi tao luong ban dau void FordFulkerson(); void MakeLabel(int v); //gan nhan cac dinh ke dinh v void EditFlow(); void Output(); //xuat ket qua file void Destroy(); //giai phong bo nho Trang 16 Đồ án Giải thuật & Lập trình GVHD: Nguyễn Văn Hiệu int main() { bool input = Input(); if (!input) { cout