Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 128 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
128
Dung lượng
2,65 MB
Nội dung
THỰC HÀNH TOÁ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 biên soạn Giảng viên có đóng góp ý kiến: TS Hồng Lê Minh – Khưu Minh Cảnh – Lê Ngọc Thành – Phạm Trọng Nghĩa - Nguyễn Công Nhựt – Trần Ngọc Việt - Hoàng Thị Kiều Anh – Huỳnh Thái Học TP.HCM – Năm 2019 MỤC LỤC BÀI 1: CƠ SỞ LOGIC VÀ TẬP HỢP Các phép toán luận lý Python 1.1 Luận lý Python 1.2 Biểu thức điều kiện if 1.3 Thứ tự tính tốn Python Dữ liệu dạng tập hợp Python: Set Dữ liệu dạng tập hợp Sympy: FiniteSet 3.1 Xây dựng thao tác tập hợp 3.1.1 Xây dựng tập hợp 3.1.2 Kiểm tra số tập hợp 3.1.3 Tạo tập hợp rỗng 10 3.1.4 Tạo tập hợp từ List Tuple 10 3.1.5 Loại bỏ phần tử trùng thứ tự tập hợp 10 3.2 Tập (subset), tập cha (superset) tập tập (power set) 12 3.3 Các phép toán tập hợp 13 3.3.1 Union Intersection 14 3.3.2 Tích Descart – Cartesian Product 16 3.3.3 Áp dụng công thức cho tập nhiều biến 16 3.3.4 Ứng dụng: Tính tốn xác suất kiện A kiện B xảy 17 BÀI TẬP CHƯƠNG 18 BÀI 1: CƠ SỞ LOGIC VÀ TẬP HỢP Mục tiêu: - Nắm vững Python để viết đoạn lệnh xử lý về: mệnh đề, logic, đúng/sai - Sử dụng tốt công cụ xử lý tập hợp, bao gồm: định nghĩa phép tốn Nội dung chính: Các phép tốn luận lý Python 1.1 Luận lý Python Python có kiểu liệu luận lý True False cho phép xử lý == (so sánh bằng), != (so sánh khác), , is (là), is not phép toán liên quan là: and, or, not, ^ (XOR) Ví dụ: >>> a = True >>> b = False >>> a and b False >>> a or b True >>> a ^ b True 1.2 Biểu thức điều kiện if Trong Python, biểu thức điều kiện if else cấu trúc rẽ nhánh Cấu trúc lệnh if sau: >>> if (điều kiện 1): # khối lệnh xử lý điều kiện elif (điều kiện 2): # khối lệnh xử lý điều kiện elif (điều kiện 3…): # khối lệnh xử lý điều kiện 3… else: # trường hợp lại # khối lệnh xử lý trường hợp lại Việc sử dụng hiệu cấu trúc dẫn đến chương trình tinh gọn Sinh viên thực hành lệnh đây: >>> def kiemtra_nuocsoi(nhiet_do): if nhiet_do < 100: return "Nuoc chua soi!" else: return "Nuoc da soi!" >>> kiemtra_nuocsoi(100) ……….………………………………… …………………… sinh viên ghi kết >>> kiemtra_nuocsoi(99) ……….……………………………………… ……………… sinh viên ghi kết Sau đó, sinh viên thử cách viết hàm tinh gọn sau: Và thực kiểm tra: >>> kiemtra_nuocsoi1(100) ……….………………………………… …………………… sinh viên ghi kết >>> kiemtra_nuocsoi1(99) ……….………………………………… …………………… sinh viên ghi kết Hơn nữa, lệnh rẽ nhánh if sử dụng “thiết kế” danh sách giá trị Sinh viên thực lệnh sau: - Xây dựng danh sách gồm phần tử thỏa điều kiện >5: >>> for diem_so in range(10): if diem_so > 5: ds_dau.append(str(diem_so)) >>> ds_dau ……….………………………… …………………… sinh viên ghi kết Và đoạn code ngắn gọn: >>> ds_dau = [str(diem_so) for value in range(10) if diem_so > 5] >>> ds_dau ……….………………………… …………………… sinh viên ghi kết 1.3 Thứ tự tính tốn Python Bên cạnh đó, ngơn ngữ lập trình, trình biên dịch Python thường xử lý phép toán từ trái sang phải (left-to-right order) Theo đó, biểu thức logic bị ảnh hưởng thứ tự tính tốn Ví dụ: phép tốn AND, yếu tố khơng thỏa biểu thức mang giá trị False (sai), nhầm giảm thiểu tính tốn khơng cần thiết; với phép toán OR, biểu thức thỏa biểu thức phía sau khơng cần tính toán Sinh viên thực hành lệnh sau để hiểu thứ tự tính tốn Python: Kết câu lệnh if là: ………………………………………………………………… Sinh viên thực hành đoạn lệnh khác: Sinh viên ghi nhận kết đoạn lệnh giải thích ……….……….………………………………… …………………………………………… Dữ liệu dạng tập hợp Python: Set Python cung cấp cú pháp đơn giản để thể khái niệm liệu rời rạc tập hợp, … với kỹ thuật tính tốn đếm tổ hợp Cụ thể: Phép tốn tập hợp (set operators): Tập hợp phép toán tập khái niệm toán rời rạc Theo đó, Python hỗ trợ kiểu liệu list set đối tượng tập phép toán hai kiểu liệu Với list, tập đối tượng sửa đổi Ví dụ 1: Tập 20 số nguyên chẵn từ theo toán học định nghĩa là: = { | = ;0 ≤ ≤ 19} Python mô tả tập (kiểu list) theo định nghĩa là: S = [2*x for x in range(20)] Lệnh: >>> S = [2*x for x in range(20)] Sau đó, sinh viên điền kết với lệnh sau: >>> S ……………………………………………………………………………………………… Ví du 2: Bên cạnh list, Python hỗ trợ kiểu liệu set với phép toán so sánh tập Sinh viên thực tập: So sánh tập nghiệm phương trình = { | + − = 0} tập = {−3,2} >>> A = set([x for x in range(-50, 50) if x**2 + x - == 0]) >>> B = set([2, -3]) >>> A == B ………………………………… sinh viên ghi kết (gợi ý: True False) Câu hỏi cho sinh viên: khoảng (-50, 50) có ý nghĩa lệnh trên? Thay khoảng khác khơng? Lí do? Sinh viên trả lời: ………………………………………… …………………………………… Ví dụ 3: Xây dựng tập số nguyên tố nhỏ 40 Theo định nghĩa, số nguyên tố số chia hết cho Do vậy, Python, xây dựng hàm kiểm tra, trả False số không thỏa điều kiện định nghĩa số nguyên tố, ngược lại trả True >>> def isPrime(N): for i in [ x+1 for x in range(N) ]: if N % i == and (i!=1 and i!=N): return False return True Và sau đó, xây dựng tập hợp số nguyên tố: >>> S_prime = [isPrime(k) for k in range(1,40)] Kết là: Sinh viên thực hành: - Số 36 số nguyên tố nên S_prime[36] = True, ngược lại số S_prime[37] = False Sinh viên thay lệnh S_prime cách viết theo set sau: >>> S_prime = set([x for x in range(40) if (isPrime(x) == True and x>0)]) >>> S_prime ……………………………………………………………………… Sinh viên điền kết Ví dụ 4: Tạo tập tích từ hai tập (set product) Giả sử, cần lấy lần giá trị nghiệm, 20 lần giá trị nghiệm 200 lần giá trị nghiệm phương trình + − = Chúng ta viết lệnh sau: >>> Apro = set([2*x *y for x in range(-50,50) if x**2+x-6 == for y in [1, 10, 100]]) >>> Apro ……………………………………………………………………… sinh viên điền kết Ví dụ 5: Ý tưởng tương tự ví dụ tập tích tạo giữ hai nhóm giá trị từ tập nguồn: >>> AB = set([ (x, 2*y) for x in range(-50,50) if x**2+x-6 == for y in [1, 10, 100]]) >>> AB ……………………………………………………………………… sinh viên điền kết Dữ liệu dạng tập hợp Sympy: FiniteSet Trong kí hiệu tốn học, thể phần tử tập hợp nằm dấu {} (curly brackets) Ví dụ : {3,5,7} tập hợp thể phần là: 3, 5, 3.1 Xây dựng thao tác tập hợp 3.1.1 Xây dựng tập hợp Để tạo tập hợp gói sympy Python, sử dụng lớp FiniteSet từ gói sympy sau: >>> from sympy import FiniteSet >>> s = FiniteSet(3, 5, 7) >>> s {3, 5, 7} Trong đoạn lệnh trên, import lớp FiniteSet từ gói SymPy sau tạo đối tượng từ lớp việc chuyển phần tử tập hợp Chúng ta đặt tập hợp tên s Để lưu trữ loại số khác nhau, bao gồm số nguyên, số thực, phân số tập hợp sau: >>> from sympy import FiniteSet >>> from fractions import Fraction >>> s = FiniteSet(1, 1.5, Fraction(1, 5)) >>> s {1/5, 1, 1.5} Số lượng (cardinality) tập hợp số lượng phần tử tập hợp Hàm len() sử dụng để đếm số lượng phần tử: >>> s = FiniteSet(1, 1.5, Fraction(8, 2)) >>> s {1, 1.5, 4} >>> len(s) 3.1.2 Kiểm tra số tập hợp Để kiểm tra tồn số tập hợp, sử dụng toán tử in Toán tử trả giá trị chân trị True (nếu tồn tại) False (nếu không tồn tại) Ví dụ: kiểm tra giá trị có nằm tập s bên lệnh sau: >>> in s False >>> in s True 3.1.3 Tạo tập hợp rỗng Để tạo tập rỗng (empty set), nghĩa tập khơng có phần tử, tạo đối tượng FiniteObject mà không cần đưa thông số vào Lệnh sau: >>> from sympy import FiniteSet >>> s = FiniteSet() >>> s EmptySet() 3.1.4 Tạo tập hợp từ List Tuple Trong Python, tập hợp tạo từ List Tuple sau: >>> phantu = [2, 4, 6, 8, 10] >>> tap = FiniteSet(*phantu) >>> tap {2, 4, 6, 8, 10} Ở đây, ta thấy: thay chuyển danh sách phần tử trực tiếp vào tham số FiniteSet lưu trữ chúng danh sách phantu (kiểu list) Sau đó, chuyển danh sách vào FiniteSet cú pháp Python đặc biệt Bằng phương pháp này, sử dụng uyển chuyển viết chương trình phần tử tập hợp tính tốn chương trình 3.1.5 Loại bỏ phần tử trùng thứ tự tập hợp Kiểu tập hợp Python (như tập hợp toán học) loại bỏ phần tử trùng không quan tâm đến thứ tự phần tử tập hợp (nghĩa tập hợp xếp lại, khơng giữ thứ tự ban đầu) Ví dụ: tạo tập từ list có nhiều phần tử giống nhau, đó, số thêm vào tập hợp lần Xét ví dụ sau: >>> from sympy import FiniteSet >>> phantu = [6, 7, 8, 9, 6, 7] >>> taphop = FiniteSet(*phantu) >>> taphop {6, 7, 8, 9} Bộ môn Khoa học Dữ liệu W∗( ) Độ dài 0 ∞ (đỉ ℎi, độ 1à l) ∞ (i, m) ∞ ∞ Bước 2: = 2; W ∗ (2) = 1; [ ← {1,2,3,4,5}\{2} = {1,3,4,5} ∞ ∞ ∞ ∞ Bước 3: ∈ { â !ậ 2} ∩ [ = {1,4,5} ∩ {1,3,4,5} = {1,4,5} Thực gán lại: W ∗ (1) ← min{W ∗ (1), W(0) + Ghf } = min{7, + 4} = W ∗ (4) ← min{W ∗ (4), W(0) + Ghn } = min{∞, + 6} = W ∗( ) Độ dài W ∗ (5) ← min{W ∗ (5), W(0) + Ghp } = min{∞, + 2} = 0 … (0,7) (2,5) (0,1) (0,1) ∞ ∞ ∞ (2,7) ∞ (2,3) Sinh viên tự thực bước sau lặp lại đến thuật toán dừng: Bước 2:… Bước 3:… Bước 2:… Bước 3:… Thực hành Toán rời rạc Trang 10 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 Tố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à tố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 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ị 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 ... (sẽ học thực hành đại số tuyến tính) c So sánh thời gian thực thi chương trình vừa viết học Thực hành Toán rời rạc Trang 14 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... để nhiều điểm cộng vào điểm thi thực hành) Bộ môn Khoa học Dữ liệu THỰC HÀNH TOÁ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 biên soạn Giảng viên có đóng góp ý kiến: TS Hồng... Lang 0.4 1.5 0.3 0.3 0.3 0.6 Sinh viên suy nghĩ toán thực bước để giúp bạn Thành: Thực hành Tốn rời rạc Trang Bộ mơn Khoa học Dữ liệu 3.1 Xây dựng liệu đầu vào Như vậy, liệu đầu vào bao gồm: tập