3. Dữ liệu dạng tập hợp trong Sympy: FiniteSet
1.3. Cây khung và cây khung tối thiểu
Cây khung hay còn gọi là cây tối đại (cây bao trùm/chùm): Cho một đồ thị = ( , ), một đồ thị cây = ( , ) được gọi là cây khung của nếu là đồ thị con của đồ thị : có mọi đỉnh của đồ thị G và ⊂ .
Cây khung nhỏ nhất: Xét G có trọng số cạnh, khi đó, nếu tổng các cạnh của cây là nhỏ nhất thì đó là cây khung của đồ thị G. Cây khung nhỏ nhất được minh họa với các ứng dụng như: xây dựng mạng lưới ống nước/dây điện ngắn nhất tại các thành phố hoặc khu vực dân cư.
Thực hành Toán rời rạc Trang 4 Từ một đồ thị , hiện nay có nhiều thuật toán để xác định cây khung nhỏ nhất như: Prim, Kruskal, Boruvka. Trong đó, phổ biến là 2 thuật toán Prim và Kruskal như sau:
- Prim: tiếp cận chiều sâu (depth search) với ý tưởng bước đầu tiên chọn điểm vì và cạnh ngắn nhất từ đỉnh đó để “loang” rộng ra các đỉnh còn lại chưa được xét của đồ thị cùng với cạnh ngắn nhất 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 đầu tiên chọn cạnh ngắn nhất của đồ thị trước vì nhận định: cạnh ngắn nhất của đồ thị luôn nằm trong
Hình minh họa 2 thuật toán: [Giảng viên có thể giải thích thêm]
Thực hành Toán rời rạc Trang 5 Sinh viên có thể tham khảo tại đây:
https://networkx.github.io/documentation/latest/reference/algorithms/generated/networkx.algorithm s.tree.mst.maximum_spanning_tree.html Cụ thể xét đồ thị các tỉnh thành phố như 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 6 >>> g.remove_edge('Tien Giang', '29') # lệnh sẽ báo lỗi vì cạnh này đã được xóa trước đó. ……… # sinh viên ghi nhận exception
Để xem đồ thị, chúng ta có thể xem: các đỉnh: >>> g.nodes()
………. Tuy nhiên, chúng ta vẫn phải xóa đỉnh (node) ‘29’ do lệnh tạo ra:
>>> g.remove_node('29')
>>> g.nodes() # đã xóa đỉnh ‘29’
……….
Thể hiện dữ liệu các kết nối và có sắp xếp các cạnh nối theo tên cạnh của đồ 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 là ngắn nhất giữa các thành phố bên trên, chúng ta có thể xem xét xây dựng cây khung tối thiểu như sau:
>>> T = nx.maximum_spanning_tree(g)
Thể hiện dữ liệu và các kết nối của cây tối đại
>>> sorted(T.edges(data=True)) # tương tự thử nghiệm với lệnh >>> T.nodes() ………. ………. ………. Giảng viên cùng sinh viên vẽ đồ thị g ban đầu và đồ thị cây khung T được tạo thành. Tài liệu tham khảo: Sinh viên có thể 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 7