Đồ án cấu trúc dữ liệu và giải thuật đề tài tìm luồng cực đại

16 234 0
Đồ án cấu trúc dữ liệu và giải thuật đề tài tìm luồng cực đại

Đ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

Đồ án giải thuật và lập trình trường đại học bách khoa đà nẵng khoa công nghệ thông tin, đề tài luồng cực đại trên mạng. Đồ án cấu trúc giải thuật và lập trình trường đại học bách khoa đà nẵng khoa công nghệ thông tin, đề tài tìm luồng cực đại trên mạng

ĐẠI HỌC ĐÀ NẴNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN ĐỒ ÁN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Đề tài 2: Tìm luồng cực đại mạng GVHD : PHAN THANH TAO SVTH : VÕ VĂN HÙNG LỚP : 17T2 NHÓM : 17.12B Đà Nẵng 12-2019 Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao LỜI MỞ ĐẦU Luồng cực đại toán tối ưu đồ thị tìm ứng dụng rộng rãi thực tế 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 nhà toán học Mỹ Lester Randolph Ford Delbert Ray Fulkerson [1] Bài tốn tìm luồng cực đại áp dụng nhiều thực tiễn sống như: tính tốn lượng nước lớn vận chuyển hai địa điểm (điểm phát điểm thu) mạng ống nước; xác định cường độ dòng vận tải lớn hai nút hệ thống giao thông thành phố toán ghép cặp hay toán lập lịch Trong báo cáo này, em trình bày tốn tìm luồng cực đại mạng sử dụng thuật toán Ford-Fulkerson để giải toán đặt Em xin chân thành cảm ơn thầy Phan Thanh Tao hướng dẫn giúp đỡ em suốt trình nghiên cứu tìm hiểu để hồn thành đề tài Rất mong nhận góp ý thầy (cơ) để đề tài em hoàn thiện Trang Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao MỤC LỤC LỜI MỞ ĐẦU MỤC LỤC DANH MỤC HÌNH VẼ GIỚI THIỆU ĐỀ TÀI CƠ SỞ LÝ THUYẾT 2.1 Ý tưởng 2.2 Cơ sở lý thuyết TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN 3.1 Phát biểu toán 3.2 Cấu trúc liệu 3.3 Thuật toán CHƯƠNG TRÌNH VÀ KẾT QUẢ 4.1 Tổ chức chương trình 4.2 Ngôn ngữ cài đặt 13 4.3 Kết 13 4.3.1 Giao diện chương trình 13 4.3.2 Kết thực thi chương trình 14 4.3.3 Nhận xét 15 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 15 5.1 Kết luận 15 5.2 Hướng phát triển 15 TÀI LIỆU THAM KHẢO 16 Trang Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao DANH MỤC HÌNH VẼ Hình 1: Mạng G…………………………………………………………….…….6 Hình 2: Mạng G luồng mạng G……………………… ……………… Hình 3: File input.txt…………………………………………………………… Hình 4: File output.txt……………………………………………………… … Hình 5: Giao diện chương trình…………………………………… 14 Hình 6: Đồ thị luồng cực đại mạng G………………………………… 14 Hình 7: File output.txt………………………………………………………… 15 Trang Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao GIỚI THIỆU ĐỀ TÀI “Tìm luồng cực đại mạng” Nhiều tốn quy hoạch tuyến tính quy tốn làm cực tiểu phí tổn vận chuyển hàng mạng (gồm nút cung đường) cho đảm bảo nhu cầu số nút biết nguồn cung cấp số nút khác Các toán gọi toán luồng mạng (network flow problem) toán chuyển vận (transshipment problem) Đây lớp toán quan trọng hay gặp quy hoạch tuyến tính Lớp bao gồm tốn quen thuộc thực tế như: toán vận tải, tốn mạng điện mạng giao thơng, toán quản lý phân bổ vật tư, toán đường ngắn nhất, toán luồng cực đại… Bài toán tìm luồng cực đại tốn tối ưu đồ thị mang tính thực tiễn, ứng dụng cao sống như: tính tốn lưu lượng nước (dầu) lớn vận chuyển hai địa điểm (điểm phát điểm thu) mạng ống nước (dầu); xác định cường độ dòng vận tải lớn hai nút hệ thống giao thông thành phố… Vì vậy, việc nghiên cứu đề tài góp phần đề giải pháp tối ưu nhằm giải vấn đề vận chuyển, giao thông… CƠ SỞ LÝ THUYẾT 2.1 Ý tưởng Xuất phát từ luồng trước (bắt đầu từ luồng ban đầu với F = 0), ta tìm đường khơng định hướng từ đỉnh phát đến đỉnh thu, tiến hành hiệu chỉnh giá trị luồng đường cho luồng có giá trị lớn Lặp lại khơng cịn tìm đường tăng luồng thuật tốn dừng luồng bước lặp cuối luồng cực đại Đường tăng luồng P có dạng: - P: s→…→i→j→…→t (i,j) cung thuận P: s→…→i←j→…→t (j,i) cung nghịch 2.2 Cơ sở lý thuyết 2.2.1 Các khái niệm Mạng[2] - Mạng đồ thị có hướng, có trọng số G=(V,E,C) thỏa mãn:  G liên thông yếu (nếu bỏ hướng cạnh liên thơng)  Có đỉnh s khơng có cung vào gọi đỉnh phát  Có đỉnh t khơng có cung gọi đỉnh thu  Mỗi cung (i,j) ∈ E gán số cij ≥ gọi khả thơng qua cung (i,j) - Ví dụ: Trang Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao 12 a b 13 t s 15 c d Hình Mạng G Luồng[2] Cho mạng G=(V,E,C), V tập đỉnh, E tập cạnh C tập trọng số Luồng F mạng G tập giá trị {fij |(i, j) ∈ E} thỏa mãn: - ∀(i,j) ∈ E: ≤ fij ≤cij - ∀ k ∉{s,t} (s đỉnh phát, t đỉnh thu): ∑ 𝑓𝑖𝑘 = ∑ 𝑓𝑘𝑗 (𝑖,𝑘)∈𝐸 (𝑘,𝑗)∈𝐸 Ví dụ: 12(8) a b 5(5) 13(8) 3(3) t s 6(6) 15(15) 6(6) c d 9(9) Hình Mạng G luồng mạng G Với đồ thị tập {fij}(giá trị biểu diễn ngoặc đơn) luồng: fsa=8, fab=8, fbt=5, fbc=3, fsd=6, fsc=6, fcd=9, fdt=15 Trang Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao Giá trị luồng[2] Cho mạng G=(V,E,C) Giá trị luồng F tổng giá trị cung từ đỉnh phát s, tổng giá trị cung vào đỉnh thu t Kí hiệu Vf ∑ 𝑓𝑠𝑘 = ∑ 𝑓𝑘𝑡 (𝑠,𝑘)∈𝐸 (𝑘,𝑡)∈𝐸 Luông cực đại mạng G luồng có giá trị lớn tất luồng G Lát cắt[2] Cho mạng G =(V,E,C) Lát cắt S= (V1,V2) phân hoạch tập đỉnh V mạng G thành hai tập V1 V2 =V\V1, s ∈ V1, t ∈ V2 Khả thông qua hay giá trị lát cắt S = (V1,V2) số c(V1,V2) = ∑cij với vi ∈ V1 vj ∈ V2 Lát cắt có khả thơng qua nhỏ gọi lát cắt cực tiểu 2.2.2 Định lý Ford-Fulkerson[2] Luồng cực đại lát cắt cực tiểu TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN 3.1 Phát biểu toán Phát biểu toán: Cho mạng G =(V,E,C) với đỉnh phát s, đỉnh thu t khả thông qua cung cij(i,j ∈ V) Trong tất luồng có mạng, tìm luồng có giá trị cực đại Input: Số lượng đỉnh (node) mạng G, đỉnh phát s đỉnh thu t, ma trận trọng số chứa khả thông qua cung cij chứa file input.txt, với: - Hàng thứ chứa số lượng đỉnh mạng Đỉnh phát s ứng với đỉnh 0, đỉnh thu t ứng với đỉnh n-1 n hàng (mỗi hàng chứa n số) ma trận trọng số chứa khả thông qua cung Trang Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao Hình File input.txt Output: Giá trị luồng cực đại Vmax(f), ma trận trọng số F luồng cực đại cung chứa file output.txt, với: - Hàng thứ giá trị luồng cực đại Vmax(f) n hàng (mỗi hàng chứa n số) ma trận trọng số chứa luồng cực đại cung Hình File output.txt 3.2 Cấu trúc liệu - Xây dựng lớp Node để biểu diễn thuộc tính đỉnh trạng thái, nhãn, đỉnh kề trước luồng P - Sử dụng hai file input.txt output.txt để nhập liệu xuất kết - Sử dụng mảng hai chiều biểu diễn khả thông qua cung mạng luồng cung 3.3 Thuật toán a Thuật toán Ford-Fulkerson[2] Trang Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao Thuật tốn Ford-Fulkerson để tìm luồng cực đại F mạng G = (V, E, C) với đỉnh phát s đỉnh thu t gồm bước sau:  Bước 1: Khởi tạo luồng F=0; ∀(i,j) ∈ E: fij=0  Bước 2: Lặp hết đường tăng luồng: - Tìm đường tăng luồng P: s→t với lượng tăng luồng δ: + Đặt nhãn cho s ∞ + Lặp đỉnh t có nhãn δt: đỉnh vi vừa có nhãn đánh nhãn lại đỉnh vj kề vô hướng với vI thỏa mãn hai trường hợp sau:  Nếu có cung (i,j) cij – fij>0(chưa bão hịa) đánh nhãn đỉnh j δj = min(δi,cij – fij), nạp cung thuận vào P  Nếu có cung (j,i) fij>0 nhãn đỉnh j δj = min(δi, fij), nạp cung nghịch vào P - Tăng luồng dọc theo P lượng δ: + Khi đỉnh t vừa có nhãn δt có lượng tăng luồng δ = δt; ngược lại không đánh nhãn đỉnh t hết đường tăng luồng(thuật tốn dừng) + Tăng luồng dọc theo P lượng δ theo công thức:  f’ij = fij + δ , (i,j) cung thuận  f’ij = fij - δ , (j,i) cung nghịch b Độ phức tạp thuật toán Ford-Fulkerson Xét mạng G = (V,E,C), khả thông qua cung số tự nhiên, luồng thu có giá trị số tự nhiên: - Mỗi đường tăng luồng tìm khoảng thời gian bị chặn O(E) có mạng G có E cạnh - Mỗi lần tăng luồng tăng lượng có giá trị nguyên dương nên lượng nhỏ tăng Vậy giá trị luồng cực đại F số lần tăng luồng bị chặn F/1 = F Vậy thời gian chạy thuật toán Ford-Fulkerson bị chặn O(E*F) CHƯƠNG TRÌNH VÀ KẾT QUẢ 4.1 Tổ chức chương trình File Node.h class Node { int status; // 0: chua duong tang luong int before; // dinh ke int label; // nhan cua public: Node(); ~Node(); void resetnode(int s = void setstatus(); int getstatus(); int getbefore(); gan nhan; 1: da gan nhan; -1: dua dinh vao truoc tren duong tang luong dinh , int l = 0, int b = -1); Trang Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao int getlabel(); }; File Node.cpp #include "Node.h" Node::Node() { this->status = 0; this->label = 0; this->before = -1; } Node::~Node(){ } void Node::resetnode(int s,int l,int b) { this->status = s; this->label = l; this->before = b; } int Node::getstatus() { return this->status; } void Node::setstatus() { this->status = -1; } int Node::getlabel() { return this->label; } int Node::getbefore() { return this->before; } File Program.cpp #include #include #include #include "Node.h" using namespace std; int n; Node* node; int s, t; int **c; int **f; int F; void Inputdata() { ifstream file_in; file_in.open("input.txt", ios::in); //kiem tra co mo duoc file, neu khong thi nem ngoai le if (file_in.fail()) { throw "Can't open the input file"; } Trang 10 Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao //nhap so luong dinh va kha nang thong qua cua cac cung file_in >> n; c = new int* [n]; for (int i = 0; i < n; i++) { c[i] = new int[n]; for (int j = 0; j < n; j++) file_in >> c[i][j]; } file_in.close(); } void Initialize() { //khoi tao luong ban dau bang f = new int* [n]; for (int i = 0; i < n; i++) { f[i] = new int[n]; for (int j = 0; j < n; j++) f[i][j] = 0; } //Khoi tao cac dinh node = new Node[n]; s = 0; t = n - 1; //Khoi tao gia tri luong cuc dai F = 0; } void Max_Flow() { // Lap cho den het duong tang luong while (true) { //Xoa nhan tat ca cac dinh va gan nhan cho dinh phat la vo cung for (int i = 1; i < n; i++) { node[i].resetnode(); } node[s].resetnode(1, 1000, -1); //Lap cho den dinh t co nhan while(node[t].getstatus()==0) { //Tim dinh j co nhan de dua vao duong tang luong int j; for (j = 0; j < n; j++) { if (node[j].getstatus() == 1) { break; } } if (j == n) return;//Het duong tang luong,thuat toan dung node[j].setstatus(); // Dua j vao duong tang luong //Danh nhan lai moi dinh ke vo huong voi dinh j Trang 11 Đồ án Cấu trúc liệu Giải thuật GVHD: Phan Thanh Tao for (int i = 1; i < n; i++) { if (node[i].getstatus() == 0) { //Cung dang (j,i) va chua bao hoa if (c[j][i] > && (c[j][i] - f[j][i] > 0)) { int flow; if (node[j].getlabel()>c[j][i]-f[j][i]) flow = c[j][i] - f[j][i]; else flow = node[j].getlabel(); node[i].resetnode(1, flow, j); } //Cung dang (i,j) if (c[i][j] > && f[i][j] > 0) { int flow; if (node[j].getlabel() > f[i][j]) flow = f[i][j]; else flow = node[j].getlabel(); node[i].resetnode(1, flow, j); } } } } // Tang gia tri cua luong int delta = node[t].getlabel(); F += delta; // Hieu chinh luong doc theo duong tang luong int after = t; while (after != s) { int before = node[after].getbefore(); if (c[before][after] > 0) f[before][after] += delta; if (c[after][before] > 0) f[before][after] -= delta; after = before; } } } void Outputdata() { ofstream file_out; file_out.open("output.txt", ios::out); file_out

Ngày đăng: 01/09/2020, 12:50

Hình ảnh liên quan

Hình 1. Mạng G - Đồ án cấu trúc dữ liệu và giải thuật đề tài tìm luồng cực đại

Hình 1..

Mạng G Xem tại trang 6 của tài liệu.
Hình 2. Mạng G và luồng trên mạng G - Đồ án cấu trúc dữ liệu và giải thuật đề tài tìm luồng cực đại

Hình 2..

Mạng G và luồng trên mạng G Xem tại trang 6 của tài liệu.
Hình 6. Đồ thi và luồng cực đại của mạng G - Đồ án cấu trúc dữ liệu và giải thuật đề tài tìm luồng cực đại

Hình 6..

Đồ thi và luồng cực đại của mạng G Xem tại trang 14 của tài liệu.
Hình 5. Giao diện chính của chương trình - Đồ án cấu trúc dữ liệu và giải thuật đề tài tìm luồng cực đại

Hình 5..

Giao diện chính của chương trình Xem tại trang 14 của tài liệu.

Từ khóa liên quan

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

Tài liệu liên quan