1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Tìm hiểu thuật toán tối ưu trên đồ thị và hướng ứng dụng (tt)

48 198 0

Đ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 48
Dung lượng 1,51 MB

Nội dung

LỜI CẢM ƠN Để hoàn thành tốt đề tài Nghiên cứu khoa học nhờ hướng dẫn giúp đỡ giảng viên Ts Hoàng Văn Dũng Em xin chân thành cảm ơn giúp đỡ thầy Em cảm ơn thầy cô khoa Kỹ thuật – Công nghệ thông tin trường Đại học Quảng Bình tận tình giảng dạy, truyền đạt kiến thức quý báu tạo điều kiện cho em hoàn thành báo cáo Mặc dù cố gắng nhiều để hoàn thành đề tài với tất nổ lực thân, không tránh khỏi thiếu sót Em mong nhận ủng hộ giúp đỡ thầy cô bạn Quảng Bình, ngày 20 tháng 05 năm 2017 Sinh viên thực Phạm Tuấn Vũ MỞ ĐẦU 1 Lý chọn đề tài Mục tiêu nghiên cứu Nội dung nghiên cứu Đối tượng, phạm vi nghiên cứu Phương pháp nghiên cứu CHƯƠNG 1: ĐẠI CƯƠNG VỀ LÝ THUYẾT ĐỒ THỊ 1.1 Một số khái niệm liên quan đến đồ thị 1.1.1 Định nghĩa đồ thị 1.1.2 Các loại đồ thị 1.2 Đồ thị con, đồ thị phận tính liên thơng đồ thị 1.2.1 Đồ thị con, đồ thị phận 1.2.2 Tính liên thông đồ thị 1.3 Đồ thị Euler, đồ thị nửa Euler đồ thị Hamilton 1.3.1 Đồ thị Euler đồ thị nửa Euler 1.3.2 Đồ thị Hamilton 1.4 Biểu diễn đồ thị máy tính 1.4.1 Biểu diễn ma trận kề, ma trận trọng số: 1.4.2 Danh sách cạnh 1.4.3 Danh sách kề CHƯƠNG 2: GIỚI THIỆU MỘT SỐ THUẬT TOÁN TRÊN ĐỒ THỊ 12 2.1 Thuật tốn tìm kiếm đồ thị 12 2.1.1 Tìm kiếm theo chiều sâu đồ thị 12 2.1.2 Tìm kiếm theo chiều rộng đồ thị 12 2.1.3 Tìm đường kiểm tra tính liên thông 14 2.2 Đồ thị có trọng số tốn tìm đường ngắn 14 2.2.1 Đường ngắn đồ thị khơng có trọng số 14 2.2.2 Tìm đường ngắn 15 2.2.3 Thuật toán Ford – Bellman 15 2.2.4 Thuật toán Dijkstra 15 2.2.5 Thuật toán Floyd – đường ngắn tất cặp đỉnh 16 CHƯƠNG 3: LUỒNG CỰC ĐẠI HƯỚNG ỨNG DỤNG 18 3.1 Giới thiệu luồng cực đại 18 3.1.1 Bài toán luồng mạng 18 3.1.2 Bài toán luồng cực đại mạng 18 3.1.3 Mạng, luồng mạng, toán luồng cực đại 18 3.2 Ứng dụng toán luồng cực đại mạng 19 3.3 Một số toán tối ưu tổ hợp ứng dụng từ toán luồng 25 3.3.1 Bài toán thủy lợi 26 3.3.2 Bài toán hệ thống đại diện chung 27 3.3.3 Về toán tối ưu rời rạc 27 3.4 Kết luận 28 CHƯƠNG 4: MƠ PHỎNG THUẬT TỐN 29 4.1 Phát biểu toán 29 4.2 Yêu cầu toán 30 4.3 Cấu trúc chương trình 31 4.4 Hoạt động chương trình 33 4.4.1 Chức file class chương trình 34 4.4.2 Trình tự hoạt động 35 KẾT LUẬN HƯỚNG PHÁT TRIỂN 36 TÀI LIỆU THAM KHẢO 37 PHỤ LỤC 38 DANH MỤC TỪ VIẾT TẮT: Tiếng việt: Từ viết tắt NNLT Diễn giải Ngôn ngữ lập trình Tiếng anh: Từ viết tắt Linked Adjancency List Strongly connected Depth first search (DFS) BFS Diễn giải Danh sách kề liên kết Liên thơng mạnh Tìm kiếm sâu Tìm kiếm theo chiều rộng DANH MỤC HÌNH ẢNH Hình 1.1 Đồ thị liên thông, đồ thị không liên thông Hình 1.2 Liên thơng mạnh liên thông yếu Hình 1.3 Bảy cầu sơng Pregel Hình 1.4 Đồ thị biểu diễn thành phố Konigsberg Hình 1.5 Đồ thị Euler đồ thị nửa Euler Hình 1.6 Đường Hamilton Hình 1.7.Đồ thịhướng G Đồ thịhướng G1 Hình 4.1 Cấu trúc chương trình 31 Hình 4.2 Giao diện ứng dụng 32 Hình 4.3 Giao diên chạy ứng dụng 32 Hình 4 Vẽ điểm 33 Hình 4.5 Vẽ đường 34 Hình 4.6 Các chức chương trình 35 MỞ ĐẦU Lý chọn đề tài Trong năm trở lại đây, với đời máy tính điện tử phát triển nhanh chóng Tin học, lý thuyết đồ thị quan tâm đến nhiều Đặc biệt thuật toán đồ thị có nhiều ứng dụng nhiều lĩnh vực khác như: Mạng máy tính, Lý thuyết mã, Tối ưu hố, Kinh tế học v.v Nó trả lời cho câu hỏi: Hai máy tính mạng liên hệ với hay không? Hay vấn đề phân biệt hai hợp chất hố học có công thức phân tử lại khác công thức cấu tạo giải nhờ mơ hình đồ thị Lý thuyết đồ thị khơng có nhiều ứng dụng thực tế mà cơng cụ đắc lực cho ngành cơng nghệ thơng tin Nó giúp cho mô tả cách dễ dàng tốn phức tạp cụ thể, để từ ta mã hố tốn vào máy tính Hiện có nhiều tài liệu, sách, giáo trình viết lý thuyết đồ thị với nội dung, đầy đủ giúp cho người muốn nghiên cứu lý thuyết đồ thị tham khảo Tuy nhiên hầu hết tài liệu nghiên cứu lý thuyết xây dựng thuật toán chung cho tốn mà chưa có nhiều tài liệu viết ứng dụng thuật toán để giải toán ứng dụng cụ thể Để thực hóa việc học tập, giảng dạy Tin học trường Trung học phổ thông trường Đại học, Cao đẵng luận văn “Tìm hiểu thuật tốn tối ưu đồ thị hướng ứng dụng ” thực cần thiết Mục tiêu nghiên cứu Mục tiêu đề tài nghiên cứu lý thuyết đồ thị số thuật toán ứng dụng đồ thị vào học tập sống Nội dung nghiên cứu - Chương I: Tổng quan lý thuyết đồ thị - Chương II: Một số toán tối ưu đồ thị - Chương III: Luồng cực đại hướng ứng dụng - Chương IV: Mơ thuật tốn Đối tượng, phạm vi nghiên cứu - Đối tượng nghiên cứu: Lý thuyết đồ thị ứng dụng đồ thị - Phạm vi nghiên cứu: Lý thuyết đồ thị, ứng dụng, xây dựng, lập trình mơ hệ thống hóa ứng dụng thuật toán liên quan đến đồ thị nhằm phục vụ cho việc học tập việc giảng dạy nhà trường Phương pháp nghiên cứu - Phương pháp nghiên cứu lý thuyết: + Nghiên cứu lý thuyết đồ thị, thuật toán ứng dụng đồ thị + Hệ thống hóa số ứng dụng đồ thị - Phương pháp nghiên cứu thực nghiệm: Sử dụng phương pháp nghiên cứu lý thuyết kết hợp với nghiên cứu thực nghiệm: + Nghiên cứu, tìm hiểu ứng dụng liên quan đến đề tài thực tế + Viết chương trình cho tốn ứng dụng cụ thể CHƯƠNG 1: ĐẠI CƯƠNG VỀ LÝ THUYẾT ĐỒ THỊ 1.1 Một số khái niệm liên quan đến đồ thị 1.1.1 Định nghĩa đồ thị Định nghĩa: Đồ thị cấu trúc rời rạc bao gồm đỉnh cạnh nối đỉnh đồ thị Các loại đồ thị khác phân biệt kiểu số lượng cạnh nối hai đỉnh đồ thị [2] - Nếu cạnh u = (x,y) mà x y hai đỉnh phân biệt ta nói x, y hai đỉnh kề - Nếu u = (x,x) u cạnh có hai đỉnh trùng ta gọi khuyên - Nếu u = (x,y) mà x,y cặp đỉnh có phân biệt thứ tự hay có hướng từ x đến y u cung, x gốc y x đỉnh ra, y đỉnh vào - Khi cặp đỉnh (x, y) có nhiều cạnh ta nói cạnh cặp đỉnh cạnh song song cạnh bội 1.1.2 Các loại đồ thị a Đồ thịhướng Đồ thị G= gọi đồ thịhướng tất cạnh u ε U mà cặp đỉnh thuộc u = (x,y) (trong x,y ε X) không phân biệt thứ tự Đồ thịhướng đồ thị khơng có cung [2] b Đồ thịhướng Đồ thị G = gọi đồ thịhướng tất cạnh u ϵ U mà cặp đỉnh thuộc u = (x, y) (trong x,y ε X) có phân biệt thứ tự Đồ thịhướng đồ thị mà u=(x, y) ε X cung [2] 1.2 Đồ thị con, đồ thị phận tính liên thơng đồ thị 1.2.1 Đồ thị con, đồ thị phận Cho đồ thị G = - Nếu đồ thị ta bỏ số đỉnh cạnh(cung) xuất phát từ đỉnh phần lại đồ thị gọi đồ thị đồ thị G cho - Nếu đồ thị G ta bỏ số cạnh giữ nguyên đỉnh phần lại đồ thị gọi đồ thị phận đồ thị G 1.2.2 Tính liên thơng đồ thị 1.2.2.1 Tính liên thơng đồ thịhướng Định nghĩa: Một đồ thị gọi liên thơng có đường cặp đỉnh phân biệt đồ thị Ngược lại, đồ thị gọi không liên thông [2] G: liên thông; H: không liên thông G H Hình 1.1 Đồ thị liên thơng, đồ thị khơng liên thông Cho đồ thị G=(V,E) v V V' tập hợp đỉnh V liên thông với v, E' tập hợp cạnh nối đỉnh V' Khi đồ thị G' = (V',E') gọi thành phần liên thông (connected component) G chứa v Đương nhiên v u liên thông G thành phần liên thơng G chứa v thành phần liên thông chứa u Định lý: Đồ thị G=(V, E) liên thông G có thành phần liên thơng [2] 1.2.2.2 Tính liên thơng đồ thịhướng G gọi liên thông mạnh tồn đường (theo cung định hướng) hai đỉnh đồ thị, g gọi liên thông yếu đồ thịhướng liên thơng Hình 1.2 Liên thơng mạnh liên thơng yếu Định lý: Nếu đồ thị G=(V, E) có hai đỉnh bậc lẻ hai đỉnh phải liên thông với [2] Định lý: (Định lý điều kiện cần đủ đồ thị lưỡng phân) Đồ thị G = (V, E) đồ thị lưỡng phân chu trình có độ dài chẵn [2] 1.3 Đồ thị Euler, đồ thị nửa Euler đồ thị Hamilton 1.3.1 Đồ thị Euler đồ thị nửa Euler Xét toán cầu Konigsberg [3] Thành phố Konigsberg thuộc nước Cộng hồ Litva có sơng Pregel chảy qua, sơng có cù lao Kneiphof tạo nên bốn vùng đất Người ta xây dựng cầu để nối vùng đất lại với Năm 1736 L Euler, nhà toán học người Thuỵ Sĩ đưa tốn sau đây: Hỏi qua cầu, cầu qua lần quay trở chỗ xuất phát hay khơng? Bài tốn làm say mê cư dân thành phố Họ háo hức thử khơng thành cơng Sau đó, L Euler chứng minh tốn khơng giải Hình 1.3 Bảy cầu sơng Pregel Nếu biểu diễn vùng đất: A, B, C, D đỉnh đa đồ thịvơ hướng có cạnh nối chúng có cầu nối tương ứng, tốn đưa việc tìm chu trình qua cạnh đồ thị lần Hình 1.4 Đồ thị biểu diễn thành phố Konigsberg Trong lý thuyết đồ thị, cho đồ thị G=(V,E), V tập hợp đỉnh, E tập hợp cạnh Từ toán trên, người ta đưa khái niệm, định nghĩa chu trình đường Euler - Đường Euler đường đi, qua tất cạnh đồ thị, cạnh lần điểm đầu điểm cuối khơng trùng - Chu trình Euler chu trình qua tất cạnh đồ thị, cạnh lần đỉnh đầu đỉnh cuối trùng (đồ thị có đỉnh lập) CHƯƠNG 4: MƠ PHỎNG THUẬT TỐN 4.1 Phát biểu tốn Hiện có nhiều tài liệu, sách, giáo trình viết lý thuyết đồ thị với nội dung, đầy đủ giúp cho người muốn nghiên cứu lý thuyết đồ thị tham khảo Tuy nhiên hầu hết tài liệu nghiên cứu lý thuyết xây dựng thuật tốn chung cho tốn mà chưa có nhiều tài liệu viết ứng dụng thuật toán để giải toán ứng dụng cụ thể Để thực hóa việc học tập, giảng dạy cách tạo ứng dụng nhằm nâng cao hiệu dạy học thúc đẩy trình tự học, nghiên cứu học sinh, sinh viên theo hướng tối ưu hố, kích thích lực sáng tạo, với lý luận văn xây dựng ứng dụng tìm luồng cực đại sử dụng thuật toán ford fulkerson cần thiết * Phát biểu toán Giả xử đồ thị G, ngồi khả thơng qua cung c(u,v), đỉnh v  V có khả thơng qua đỉnh d(v), đòi hỏi tổng luồng vào đỉnh v khơng vượt d(v), tức  f (w, v)  d (v) wV Cần phải tìm luồng cực đại s t mạng Xây dựng mạng G’ cho: đỉnh v G tương ứng với hai đỉnh v+, vtrong G’, cung (u,v) G ứng với cung (u,v+) G’, cung (v,w) G ứng với cung (v-,w+) G’ Ngoài ra, cung (v+,v-) G’ có khả thơng qua d(v), tức khả thông qua đỉnh v G * Phương pháp giải Từ mạng G = (V,E) với khả thông qua cung đỉnh Ta tìm luồng cực đại mạng qua hai bước sau: Bước 1: Xác định mạng G’ Bước 2: Tìm luồng cực đại mạng G’ Bắt đầu từ luồng zero với khả thông qua cung Hai bước ta biểu diễn dạng sơ đồ thuật toán sau: 29 Begin Mạng G Mạng G’ Luồng cực đại G’ End * Biểu diễn đồ thị - Biểu diễn mạng G với khả thông qua cung - đỉnh Giả sử mạng G = (V,E), |V| = n Ta biểu diễn ma trận trọng số A cấp n x n sau: di i = j A = ( aij ) = c[i,j] [i,j]  E Trong đó: di khả thơng qua đỉnh i; C[i,j] khả thông qua cung [i,j] - Biểu diễn mạng G’ tương ứng với mạng G Mạng tương ứng với G = (V,E), |V | = n mạng G’ = (V’,E’), |V’| = |V |, |E’| = |E | - Được biểu diễn thông qua ma trận A’ cấp (2n x 2n) sau: A’ = ( a’ij ) = 4.2 Yêu cầu ứng dụng i = j c[i,j] [i,j]  E’ - Sử dụng ngơn ngữ lập trình Java để viết thuật tốn Ford Fulkerson [4] - Cơng cụ thiết kế IdeaIU để xây dựng giao diện - Các chức như: + Phương thức Method Input: 30 Chọn phương thức nhập vào, bao gồm: Demo: Sử dụng đồ thị có sẵn ứng dụng Drow: Tự vẽ đồ thị + Point: Chọn điểm bắt đầu điểm kết thúc đồ thị + Output: Gồm giao diện hiển thị kết Hiển thị dạng hình ảnh trực quan Hiển thị dạng ma trận Hiển thị số luồng cực đại thứ tự đỉnh + Các công cụ lưu file, mở file 4.3 Cấu trúc chương trình Hình 4.1 Cấu trúc chương trình Project gồm packages demo, file, icon packages demo chứa file liệu phục vụ đồ thị xây dựng sẵn, packages file chứa file about help chứa nội dung giới thiệu chương trình trợ giúp người dùng, packages icon chứa ảnh làm icon, packages packages chứa file cài đặt chương trình 31 Hình 4.2 Giao diện ứng dụng Giao diện chạy chương trình Hình 4.3 Giao diên chạy ứng dụng 32 4.4 Hoạt động chương trình Giao diện chương trình gồm ba phần chính:  Phần điểu khiển: phần bên trái gồm mục cho phép chọn loại đồ thị (Map Type) có hướng vơ hướng, chọn điểm đầu, điểm cuối đường (Point), chọn chế độ tự vẽ hay dùng demo có sẵn (Input Method), chế độ chạy toàn chạy theo bước cuối ma trận trọng số đồ thị  Phầm vẽ đồ thị nằm bên phải Phần chia làm phần, giao diện để vẽ đồ thị dọc cho phép chọn đối tượng vẽ (vẽ điểm, vẽ đường thẳng, di chuyển điểm, tạo cập nhật đồ thông tin đồ thị) Sau vẽ xong đồ thị, người dùng nhấn vào nút cập nhật đồ thị phần điểu khiển cho phép chọn điểm đầu, điểm cuối cập nhật ma trận trọng số chạy Hình 4 Vẽ điểm 33 Hình 4.5 Vẽ đường  Phần Log nằm để ghi lại trình thực Phần có phần nhỏ, phần hiển thị lại đường đi, phần bảng hiển thị thông tin giống thực tay việc tìm đường Ngồi bên menu chứa menu lựa chọn 4.4.1 Chức file class chương trình Packages chứa file *.java MyMain, MyFrame, MyDraw, MyLine, MyPoint, FordFulkerson, MyData, MyPopupMenu HelpAndAbout Class MyMain chứa hàm main khởi chạy chương trình việc tạo gọi cửa sổ chương trình class MyFrame Class MyFrame cửa sổ chương trình cho phép người dùng tương tác Class MyPoint chứa thuộc tính điểm Class MyLine chứa thuộc tính đường Class MyDraw JPanel nằm Frame (phần màu xẫm bên phải) để hiển thị vẽ đối tượng (các điểm đường đồ thị) Class FordFulkerson chứa phương thức thực thuật tốn FordFulkerson Class MyData gồm thuộc tính liệu phục vụ cho việc sử dụng demo 34 xây dựng sẵn Class MyPopupMenu chứa số tùy biến để thực việc hiển thị menu click chuột phải cho phép xóa thay đổi điểm, đường Class HelpAndAbout tạo cửa sổ hiển thị nội dung trợ giúp giới thiệu Hình 4.6 Các chức chương trình 4.4.2 Trình tự hoạt động Khi chạy chương trình, Class MyMain gọi đến MyFrame để tạo giao diện chương trình Khi giao diện khởi tạo gọi đến MyDraw phần để vẽ đồ thị Trong trình tương tác xử lý, class khác gọi đến MyPoint gọi vẽ điểm MyLine gọi thực vẽ đường đồ thị FordFulkerson gọi thực việc tìm kiếm đường sau vẽ xong đồ thị MyData gọi đến sử dụng chương trình demo có sẵn MyPopupMenu thực click chuột phải để thực xóa, sửa đồ thị Khi chọn menu Help About HelpAndAbout gọi để hiển thị phần trọ giúp giới thiệu chương trình 35 KẾT LUẬN HƯỚNG PHÁT TRIỂN  Kết Luận - Lý thuyết đồ thị có nhiều ứng dụng thực tế mà công cụ đắc lực cho ngành công nghệ thông tin Nó giúp cho mơ tả cách dễ dàng toán phức tạp cụ thể, để từ ta mã hố tốn vào máy tính mà tốn luồng cực đại mạng hai nhà toán học Mỹ Ford Fullkerson ví dụ điển hình, thơng qua việc cài đặt thuật tốn giúp có giải pháp, lựa chọn đắn để đem lại hiệu kinh tế - Luận văn nghiên cứu trình bày kiến thức lý thuyết đồ thị, luận văn phân tích kỹ thuật tốn tốn ứng dụng thuật toán đồ thị - Để thực hóa việc học tập, giảng dạy luận văn tạo ứng dụng tìm luồng cực đại sử dụng thuật toán ford fulkerson với giao diện dễ sử dụng, tốn nhớ, tốc độ xử lý thực ứng dụng nhanh nhằm nâng cao hiệu dạy học thúc đẩy trình tự học, nghiên cứu học sinh, sinh viên theo hướng tối ưu hố, kích thích lực sáng tạo  Hướng Phát Triển - Do thời gian kinh nghiệm nghiên cứu thiếu, kiến thức hạn chế, hướng phát triển luận văn tìm hiểu sâu thuật toán tối ưu đồ thị hoàn thiện sản phẩm ứng dụng 36 TÀI LIỆU THAM KHẢO [1] Lê Duy Quang, (2015), Bài toán luồng cực đại [2] Lê Minh Hoàng, (2002), Chuyên đề lý thuyết đồ thị [3] Lương Văn Chất, (2012), Nghiên cứu thuật toán lý thuyết đồ thị ứng dụng dạy tin học chuyên Trung học phổ thông [4] Đặng Qúy Linh, (2012), Bài tốn tìm luồng cực đại mạng theo thuật toán ford-fulkerson Website: [5] http://vnoi.info/wiki/translate/wcipeg/Flows, Lý Thuyết đồ thị [6] https://vi.wikipedia.org/wiki/ , Lý Thuyết đồ thị, toán luồng cực đại 37 PHỤ LỤC Code Java: Ford Fullkerson package nguyenvanquan7826; import java.util.ArrayList; public class FordFulkerson { private boolean debug = true; private ArrayList arrMyPoint = new ArrayList(); private ArrayList arrMyLine = new ArrayList(); public int input(int G[][]) { int n = arrMyPoint.size(); // System.out.println(size); G = new int[n][n]; for (int i = 1; i < arrMyLine.size(); i++) { G[arrMyLine.get(i).getIndexPointA()][arrMyLine.get(i).getIndexPointB()] = arrMyLine.get(i).getCost(); } return n; } void outMatrix(int G[][], int n) { for (int u = 1; u < n; u++) { for (int v = 1; v < n; v++) { System.out.print(G[u][v]); } System.out.println(); } } boolean bfs(int rG[][], int pre[], int s, int t, int n) { boolean visited[] = new boolean[n]; for (int i = 0; i < n; ++i) { visited[i] = false; } ArrayList q = new ArrayList(); q.add(s); visited[s] = true; pre[s] = -1; while (!q.isEmpty()) { int u = q.get(0); q.remove(0); for (int v = 1; v < n; v++) { if (!visited[v] && rG[u][v] > 0) { q.add(v); 38 pre[v] = u; visited[v] = true; } } } return visited[t]; } int fordFulkerson(int G[][], int rG[][], int s, int t, int n) { int u, v; int sum = 0; int pre[] = new int[n]; int maxFlow = 0; for (u = 0; u < n; u++) { for (v = 0; v < n; v++) { rG[u][v] = G[u][v]; sum += G[u][v]; } } if (debug) System.out.println("sum = " + sum); String textLog = ""; while (bfs(rG, pre, s, t, n) == true) { int numFlow = sum; v = t; u = pre[v]; int path[] = new int[n]; int indexPath = 0; while (v != s) { textLog = v + "< "; if (debug) System.out.println(textLog); if (onRunListener != null) { onRunListener.onLog(textLog); } path[indexPath++] = v; numFlow = Math.min(numFlow, rG[u][v]); v = u; u = pre[v]; } textLog = v + "\n" + "numFlow = " + numFlow + "\n"; if (debug) System.out.println(v + "\n" + "numFlow = " + numFlow + "\n"); 39 if (onRunListener != null) { onRunListener.onLog(textLog); } path[indexPath++] = v; if (onRunListener != null) { onRunListener.onPathStep(path, indexPath); } v = t; u = pre[v]; while (v != s) { rG[u][v] = rG[u][v] - numFlow; rG[v][u] = rG[v][u] + numFlow; v = u; u = pre[v]; } maxFlow = maxFlow + numFlow; } return maxFlow; } int fordFulkersonStep(int G[][], int rG[][], int s, int t, int n, int step) { int u, v; int sum = 0; int pre[] = new int[n]; int maxFlow = 0; for (u = 0; u < n; u++) { for (v = 0; v < n; v++) { rG[u][v] = G[u][v]; sum += G[u][v]; } } if (debug) System.out.println("sum = " + sum); String textLog = ""; int mStep = 0; while (bfs(rG, pre, s, t, n) == true && mStep < step) { int numFlow = sum; v = t; u = pre[v]; int path[] = new int[n]; int indexPath = 0; 40 while (v != s) { textLog += v + "< "; if (debug) System.out.println(textLog); path[indexPath++] = v; numFlow = Math.min(numFlow, rG[u][v]); v = u; u = pre[v]; } textLog += v + "\n" + "numFlow = " + numFlow + "\n"; if (debug) System.out.println(v + "\n" + "numFlow = " + numFlow + "\n"); path[indexPath++] = v; if (onRunListener != null) { onRunListener.onPathStep(path, indexPath); } v = t; u = pre[v]; while (v != s) { rG[u][v] = rG[u][v] - numFlow; rG[v][u] = rG[v][u] + numFlow; v = u; u = pre[v]; } maxFlow = maxFlow + numFlow; mStep++; } if (onRunListener != null) { onRunListener.onLog(textLog); } return maxFlow; } void track(int G[][], int rG[][], int n) { System.out.println("Edeg of MaxFlow with value:\n"); for (int u = 1; u < n; u++) { for (int v = 1; v < n; v++) { int f = G[u][v] - rG[u][v]; if (f > 0) { System.out.println(u + "->" + v + " [" + f + "]"); if (onRunListener != null) { onRunListener.onLoadEdeg(u, v, f); } } } 41 } } public FordFulkerson setArrMyPoint(ArrayList arrMyPoint) { this.arrMyPoint = arrMyPoint; return this; } public FordFulkerson setArrMyLine(ArrayList arrMyLine) { this.arrMyLine = arrMyLine; return this; } void run(int s, int t) { int G[][] = null, rG[][] = null; int n = arrMyPoint.size(); // System.out.println(size); G = new int[n][n]; rG = new int[n][n]; for (int i = 1; i < arrMyLine.size(); i++) { G[arrMyLine.get(i).getIndexPointA()][arrMyLine.get(i).getIndexPointB()] = arrMyLine.get(i).getCost(); } int maxFlow = fordFulkerson(G, rG, s, t, n); track(G, rG, n); String textLog = "==============================\n" + "maxFlow = " + maxFlow; if (onRunListener != null) { onRunListener.onLog(textLog); } System.out.println(textLog); } void runStep(int s, int t, int step) { int G[][] = null, rG[][] = null; int n = arrMyPoint.size(); // System.out.println(size); G = new int[n][n]; rG = new int[n][n]; for (int i = 1; i < arrMyLine.size(); i++) { G[arrMyLine.get(i).getIndexPointA()][arrMyLine.get(i).getIndexPointB()] = arrMyLine.get(i).getCost(); } 42 int maxFlow = fordFulkersonStep(G, rG, s, t, n, step); System.out.println("maxFlow = " + maxFlow); track(G, rG, n); } interface OnRunListener { void onLoadEdeg(int u, int v, int f); void onLog(String textLog); void onPathStep(int path[], int sizePath); } private OnRunListener onRunListener; public void setOnRunListener(OnRunListener onRunListener) { this.onRunListener = onRunListener; } } 43 ... phân biệt thứ tự Đồ thị có hướng đồ thị mà u=(x, y) ε X cung [2] 1.2 Đồ thị con, đồ thị phận tính liên thơng đồ thị 1.2.1 Đồ thị con, đồ thị phận Cho đồ thị G = - Nếu đồ thị ta bỏ số đỉnh... phần lại đồ thị gọi đồ thị đồ thị G cho - Nếu đồ thị G ta bỏ số cạnh giữ ngun đỉnh phần lại đồ thị gọi đồ thị phận đồ thị G 1.2.2 Tính liên thơng đồ thị 1.2.2.1 Tính liên thông đồ thị vô hướng Định... TOÁN TRÊN ĐỒ THỊ 2.1 Thuật tốn tìm kiếm đồ thị 2.1.1 Tìm kiếm theo chiều sâu đồ thị Tìm kiếm ưu tiên chiều sâu hay tìm kiếm theo chiều sâu (DFS) thuật tốn duyệt tìm kiếm một đồ thị Thuật toán khởi

Ngày đăng: 02/01/2018, 09:47

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w