Thực hành Toán rời rạc - Chương 8: Đồ thị dạng cây. Chương này cung cấp cho học viên những nội dung về: đồ thị cây (Tree); một số tham khảo về hỗ trợ của gói Networkx để xử lý mạng đồ thị và cây; bài toán ứng dụng 2 - bài toán tích lũy dòng chảy – câu chuyện ngập khi mưa tại đô thị;... Mời các bạn cùng tham khảo!
Bộ mơn Khoa học Dữ liệu THỰC HÀNH TỐN RỜI RẠC TÀI LIỆU PHỤC VỤ SINH VIÊN NGÀNH KHOA HỌC DỮ LIỆU Nhóm Giảng viên biên soạn: TS Hồng Lê Minh – Khưu Minh Cảnh – Hoàng Thị Kiều Anh – Lê Ngọc Thành – Phạm Trọng Nghĩa –Nguyễn Công Nhựt – Trần Ngọc Việt – Đỗ Đình Thủ – Nguyễn Hữu Trí Nhật – Lê Cơng Hiếu – Nguyễn Thị Thanh Bình – Nguyễn Thái Hải – Huỳnh Thái Học Giảng viên khác TP.HCM – Năm 2020 Thực hành Tốn rời rạc Trang Bộ mơn Khoa học Dữ liệu MỤC LỤC CHƯƠNG 8: ĐỒ THỊ DẠNG CÂY Đồ thị (Tree) 1.1 Định nghĩa, tính chất 1.2 Định lý 1.3 Cây khung khung tối thiểu Một số tham khảo hỗ trợ gói Networkx để xử lý mạng đồ thị cây: Bài tốn ứng dụng 2: Bài tốn tích lũy dịng chảy – Câu chuyện ngập mưa đô thị 3.1 Giới thiệu mơ hình tích lũy dịng chảy đơn dịng (single flow), thuật tốn D8 3.2 Bước chuẩn bị cho việc xử lý 10 3.3 [Đọc thêm] Cài đặt thuật toán D8 11 Thực hành Toán rời rạc Trang Bộ môn Khoa học Dữ liệu CHƯƠNG 8: ĐỒ THỊ DẠNG CÂY Mục tiêu: - Tìm hiểu đồ thị cây: định nghĩa, tính chất, loại cây, thuộc tính - Các thuật tốn xử lý cây: duyệt cây, khung khung tối thiểu - Giới thiệu ứng dụng thực tiễn xử lý Python - Các thao tác lệnh bổ sung với gói NetworkX Nội dung chính: Đồ thị (Tree) Bài giới thiệu loại đồ thị đặc biệt, Cây dạng đồ thị đặc biệt nên nhìn chung áp dụng tất thuật toán xử lý đồ thị tìm đường ngắn nhất,… Ngồi ra, có riêng tính chất tốn riêng 1.1 - Định nghĩa, tính chất Cây (tree): đồ thị liên thơng khơng có chu trình Rừng (forest): rừng có Mỗi đồ thị liên thơng, đó, rừng đồ thị có thành phần liên thơng Mỗi thành phần liên thơng Cây có hướng đồ thị có hướng Trong có hướng, đỉnh gọi rễ (root) từ có đường đến đến đỉnh lại 1.2 Định lý Những điều sau tương đương: i ii iii iv v vi G Giữa cặp đỉnh có dây chuyền nối chúng với G liên thông tối tiểu, nghĩa xóa cạnh G khơng cịn liên thơng Thêm cạnh vào đỉnh khơng kề ta có chu trình sơ cấp G liên thơng có n-1 cạnh G khơng có chu trình có n-1 cạnh 1.3 Cây khung khung tối thiểu Cây khung hay gọi tối đại (cây bao trùm/chùm): Cho đồ thị = ( , ), đồ thị = ( , ) gọi khung đồ thị đồ thị : có đỉnh đồ thị G ⊂ Cây khung nhỏ nhất: Xét G có trọng số cạnh, đó, tổng cạnh nhỏ khung đồ thị G Cây khung nhỏ minh họa với ứng dụng như: xây dựng mạng lưới ống nước/dây điện ngắn thành phố khu vực dân cư Thực hành Toán rời rạc Trang Bộ môn Khoa học Dữ liệu Từ đồ thị , có nhiều thuật tốn để xác định khung nhỏ như: Prim, Kruskal, Boruvka Trong đó, phổ biến thuật tốn Prim Kruskal sau: - - Prim: tiếp cận chiều sâu (depth search) với ý tưởng bước chọn điểm cạnh ngắn từ đỉnh để “loang” rộng đỉnh lại chưa xét đồ thị với cạnh ngắn mà không lặp thành vòng Kruskal: tiếp cận chiều rộng (width search) với ý tưởng bước chọn cạnh ngắn đồ thị trước nhận định: cạnh ngắn đồ thị ln nằm Hình minh họa thuật tốn: [Giảng viên giải thích thêm] Gói networkx hỗ trợ việc tính khung/cây cực đại tối thiểu sau: Thực hành Toán rời rạc Trang Bộ mơn Khoa học Dữ liệu Sinh viên tham khảo đây: https://networkx.github.io/documentation/latest/reference/algorithms/generated/networkx.algorithm s.tree.mst.maximum_spanning_tree.html Cụ thể xét đồ thị tỉnh thành phố sau: >>> import networkx as nx >>> g = nx.Graph() >>> g.add_node('TP.HCM') >>> g.add_node('Dong Nai') >>> g.add_node('Ba Ria Vung Tau') >>> g.add_node('Lam Dong') >>> g.add_node('Can Tho') >>> g.add_node('Long An') >>> g.add_node('Tien Giang') >>> g.add_edge('TP.HCM', 'Dong Nai', weight = 50) >>> g.add_edge('TP.HCM', 'Ba Ria Vung Tau', weight = 120) >>> g.add_edge('TP.HCM', 'Long An', weight = 40) >>> g.add_edge('Dong Nai', 'Lam Dong', weight = 230) >>> g.add_edge('Dong Nai', 'Ba Ria Vung Tau', weight = 60) >>> g.add_edge('Tien Giang', '29') # lệnh gõ nhầm >>> g.remove_edge('Tien Giang', '29') # xóa lệnh gõ nhầm >>> g.add_edge('Tien Giang', 'Long An') #lệnh gõ thiếu chiều dài (trọng số, weight) >>> g.remove_edge('Tien Giang', 'Long An') # xóa lệnh gõ thiếu chiều dài >>> g.add_edge('Tien Giang', 'Long An', weight = 29) >>> g.add_edge('Tien Giang', 'Can Tho', weight = 200) >>> g.add_edge('Long An', 'Dong Nai', weight = 70) Thực hành Toán rời rạc Trang Bộ môn Khoa học Dữ liệu >>> g.remove_edge('Tien Giang', '29') # lệnh báo lỗi cạnh xóa trước ………………………………………………… # sinh viên ghi nhận exception Để xem đồ thị, xem: đỉnh: >>> g.nodes() ……………………………………………………………………………………… Tuy nhiên, phải xóa đỉnh (node) ‘29’ lệnh tạo ra: >>> g.remove_node('29') >>> g.nodes() # xóa đỉnh ‘29’ ……………………………………………………………………………………… Thể liệu kết nối có xếp cạnh nối theo tên cạnh đồ thị g ban đầu: >>> sorted(g.edges(data=True)) ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… Giả sử, cần xây dựng đường truyền Internet với số lượng dây ngắn thành phố bên trên, xem xét xây dựng khung tối thiểu sau: >>> T = nx.maximum_spanning_tree(g) Thể liệu kết nối tối đại >>> sorted(T.edges(data=True)) # tương tự thử nghiệm với lệnh >>> T.nodes() ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… Giảng viên sinh viên vẽ đồ thị g ban đầu đồ thị khung T tạo thành Tài liệu tham khảo: Sinh viên tham khảo thêm tại: https://networkx.github.io/documentation/latest/reference/algorithms/generated/networkx.algorithm s.tree.mst.maximum_spanning_tree.html Thực hành Toán rời rạc Trang Bộ môn Khoa học Dữ liệu Một số tham khảo hỗ trợ gói Networkx để xử lý mạng đồ thị cây: Đứng góc độ chuyên gia khoa học liệu, bên cạnh việc tìm hiểu u cầu tốn thuật tốn xử lý, khai thác cơng cụ phần mềm cần thiết yêu cầu kỹ Theo đó, gói networkx thư viện với nhiều cài đặt để xử lý toán mà sinh viên cần nắm rõ sử dụng Dưới liệt kê số toán đồ thị xử lý gói networkx: Phân tích Pagerank (chỉ số kết nối): Giả định sinh viên tìm hiểu phân tích pagerank (trong Thực hành đại số tuyến tính ứng dụng trị riêng/vector riêng) Sinh viên sử dụng hàm gói thư viện networkx để phân tích với giả định liên kết liên kết để “xếp hạng” Lưu ý: đồ thị xét bên đồ thị vô hướng (xem liên kết chiều) >>> nx.pagerank(g, 0.85) {'TP.HCM': 0.13445880738149718, 'Dong Nai': 0.2351507400853221, 'Ba Ria Vung Tau': 0.11598739208998513, 'Lam Dong': 0.13355497428234894, 'Can Tho': 0.13462563996889287, 'Long An': 0.09373705822226845, 'Tien Giang': 0.15248538796968533} Tham khảo: https://networkx.github.io/documentation/latest/reference/algorithms/link_analysis.html Và toán khác như: [giảng viên cung cấp thông tin thêm] Đồ thị hai hướng (bipartite) – giải tốn “ghép đơi” Tham khảo: https://networkx.github.io/documentation/latest/reference/algorithms/bipartite.html Bài tốn tìm phủ ngắn (covering) – ý tưởng toán tập hợp phủ (set covering) Lệnh sau để phân vùng gần nhau: >>> nx.min_edge_cover(g) {('Can Tho', 'Tien Giang'), ('Ba Ria Vung Tau', 'TP.HCM'), ('Long An', 'TP.HCM'), ('TP.HCM', 'Long An'), ('Dong Nai', 'Lam Dong')} Tham khảo: https://networkx.github.io/documentation/latest/reference/algorithms/covering.html Các tốn đường đi/chu trình (tournament) Bài toán đường Hamilton: Thực hành Toán rời rạc Trang Bộ môn Khoa học Dữ liệu Tham khảo: https://networkx.github.io/documentation/latest/reference/algorithms/tournament.html … Bài toán ứng dụng 2: Bài toán tích lũy dịng chảy – Câu chuyện ngập mưa đô thị Dưới ứng dụng đồ thị việc tính tốn tích lũy dịng chảy 3.1 Giới thiệu mơ hình tích lũy dịng chảy đơn dịng (single flow), thuật tốn D8 Các khái niệm bản: Hệ thống thoát nước bề mặt: Bao gồm: - - Các lưu vực (watershed): vùng nước chảy độc lập TP Hồ Chí Minh phân thành nhiều lưu vực lớn khác như: Tân Hóa – Lò Gốm, Bắc Nhiêu Lộc, Nam Nhiêu Lộc,… Và lưu vực lớn bao gồm nhiều lưu vực nhỏ Các biên giới lưu vực (watershed boudaries) Những điểm tiếp nhận nước (pour points) Giả định quy luật dòng chảy là: dòng chảy chảy từ nơi cao sang nơi thấp khơng có trường hợp chảy ngược lại từ nơi thấp sang nơi cao Thực hành Tốn rời rạc Trang Bộ mơn Khoa học Dữ liệu Quy trình tính tốn: Để tính tốn dịng chảy nước, bước CHÍNH xử lý: - Bước 1: Hướng dịng chảy (FLOW DIRECTION): tính tốn hướng di chuyển dòng (nước) điểm (vị trí địa lý) Bước 2: Tích lũy dịng chảy (FLOW ACCUMULATION): tính giá trị tích lũy điểm Lưu ý: Các bước xử lý chuyên ngành mơ tả giảng khác Tính tốn hướng dịng chảy tích lũy dịng chảy (với mơ hình đơn dịng): Có nhiều thuật tốn tính tốn hướng dịng chảy Ở đây, ta xét mơ hình D8, mơ hình dịng chảy đơn dịng, nghĩa vị trí chảy đến vị trí lân cận có độ dốc thấp Ví dụ: Lưu ý: - Elevation DEM: độ cao địa hình thực tế Flow Direction hướng dịng chảy mã hóa theo mã hướng (direction coding) Tại vị trí có vị trí ứng cử viên để dịng chảy đến Thực hành Tốn rời rạc Trang Bộ môn Khoa học Dữ liệu Cụ thể tính tốn bảng trên: Từ bảng độ cao (elevation) hay cịn gọi mơ hình độ cao số (DEM – digital elevation model), ta tính tốn bảng Flow Direction với quy luật: Tìm hướng có độ dốc cao Ví dụ: cuối mang giá trị 12 có xung quanh 16, 19 11 Như vậy, độ dốc cao trường hợp 11 Vì có tính tốn sau: Xét 11: độ dốc từ ô 12 đổ là: = 1, với k khoảng cách ô (thẳng hàng nhau) Xét ô 16 19: chắn khơng có dịng ngược từ độ cao 12 sang 16 hay ô 19 Để thuyết phục, ta thực tính tốn: √ < 0, giả định k khoảng cách ô Ở ô 16 chéo nên có √2 Từ đó, lập hướng dịng chảy theo quy định hướng bảng mã hướng Kết sau: Từ xây dựng dòng chảy 3.2 Bước chuẩn bị cho việc xử lý Các bước thực hiện: - Giảng viên hướng dẫn sinh viên đọc liệu từ ma trận tập tin Excel Thực hành Toán rời rạc Trang 10 Bộ môn Khoa học Dữ liệu - Xây dựng hàm tạo đồ thị theo đỉnh Giả định độ cao đỉnh cho số thực Nếu giá trị độ cao -9999 khơng xét hướng cho điểm vị trí Xây dựng hàm tính tốn hướng chảy dịng đỉnh Xây dựng (đồ thị) theo hướng dòng chảy đỉnh Tính tốn lượng tích trữ dịng đỉnh cách đếm số node cha đỉnh/node 3.3 [Đọc thêm] Cài đặt thuật toán D8 Dưới thực cho thuật tốn D8 mà hàm tính tích lũy khơng phải dạng đồ thị Sinh viên đọc hiểu điều chỉnh theo hướng xây dựng đồ thị với mục đích tính tốn tích lũy dịng vị trí import math import numpy as np def tinh_huong(dem, m_dong, n_cot, vitri): huong = np.zeros((m_dong, n_cot)) for dong in range(m_dong): for cot in range(n_cot): xx, yy, mymax = 0, 0, for i in range(-1,2): for j in range(-1,2): if (i*i+j*j>0) and \ (dong+i>=0) and (dong+i=0) and (cot+j0) and \ (p+i>=0) and (p+i=0) and (q+j>> dem array([[78, 72, 69, 71, 58, 49], [74, 67, 56, 49, 46, 50], [69, 53, 44, 37, 38, 48], [64, 58, 55, 22, 31, 24], [68, 61, 47, 21, 16, 19], [74, 53, 34, 12, 11, 12]]) Thực hành Tốn rời rạc Trang 13 Bộ mơn Khoa học Dữ liệu >>> huong array([[ 2., 2., 2., 4., 4., 8.], [ 2., 2., 2., 4., 8., 8.], [ 1., 1., 2., 4., 8., 4.], [128., 128., 1., 2., 4., 8.], [ 2., 2., 1., 4., 4., 8.], [ 1., 1., 1., 1., 0., 16.]]) >>> tichluy array([[ 0., 0., 0., 0., 0., 0.], [ 0., 1., 1., 2., 2., 0.], [ 0., 3., 7., 8., 1., 0.], [ 0., 0., 0., 20., 0., 1.], [ 0., 0., 0., 1., 24., 0.], [ 0., 2., 4., 7., 35., 0.]]) Gợi ý: ma trận dem có m dịng n cột phải xây dựng đồ thị có hướng có mxn đỉnh Những đỉnh liên kết với theo giá trị hướng dòng chảy Sau đó, việc tìm dịng tích lũy thuật tốn tìm tổng số node cha node Thực hành Toán rời rạc Trang 14 ... toán D8 11 Thực hành Tốn rời rạc Trang Bộ mơn Khoa học Dữ liệu CHƯƠNG 8: ĐỒ THỊ DẠNG CÂY Mục tiêu: - Tìm hiểu đồ thị cây: định nghĩa, tính chất, loại cây, thuộc tính - Các thuật toán. .. n-1 cạnh G khơng có chu trình có n-1 cạnh 1.3 Cây khung khung tối thiểu Cây khung hay gọi tối đại (cây bao trùm/chùm): Cho đồ thị = ( , ), đồ thị = ( , ) gọi khung đồ thị đồ thị : có đỉnh đồ thị. .. biệt, Cây dạng đồ thị đặc biệt nên nhìn chung áp dụng tất thuật tốn xử lý đồ thị tìm đường ngắn nhất,… Ngồi ra, có riêng tính chất tốn riêng 1.1 - Định nghĩa, tính chất Cây (tree): đồ thị liên