Tìm cây bao trùm nhỏ nhất từ một đồ thị liên thông có trọng số

22 297 1
Tìm cây bao trùm nhỏ nhất từ một đồ thị liên thông có trọng số

Đ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

Tìm cây bao trùm nhỏ nhất từ một đồ thị liên thông có trọng số

ĐẠI HỌC QUỐC GIA HÀ NỘI ĐẠI HỌC KHOA HỌC TỰ NHIÊN Khoa Toán - Cơ - Tin học BÀI TẬP LỚN Tìm bao trùm nhỏ từ đồ thị liên thơng có trọng số Sinh viên thực hiện: Lớp: Môn học: Giáo viên hướng dẫn: HÀ NỘI - 2012 Phan Anh Quân K61 - CNKHTN Toán Thực hành Tính tốn Nguyễn Hữu Điển 51 89/176-05 GD-05 Mã số: 8I092M5 Phan Anh Quân : K61 - CNKHTN Toán LỜI NĨI ĐẦU Bài tốn tìm bao trùm nhỏ toán tiếng lý thuyết đồ thị, có nhiều ứng dụng quan trọng việc thiết kế mạng lưới (điện thoại, TV, điện, internet, ), tìm thuật tốn xấp xỉ cho tốn độ khó NP, Để tìm bao trùm nhỏ ta áp dụng thuật toán Thuật toán Boruvka, Thuật tốn Prim, Thuật tốn Kruskal Trong viết này, ngồi việc ˚ giới thiệu phần mềm Maple số kiến thức cây, em xin trình bày hai thuật tốn Prim Kruskal viết chương trình Maple cho hai thuật tốn Nhân đây, em xin bày tỏ biết ơn sâu sắc tới PGS.TS Nguyễn Hữu Điển, người tận tình giúp đỡ để em hồn thành tập lớn Mọi đóng góp xin gửi địa chỉ: phananhquan_t61@hus.edu.vn Sinh viên: Phan Anh Quân Lớp học: K61 - CNKHTN Toán MỤC LỤC Mục lục Giới thiệu Maple 1.1 Maple gì? 1.2 Một số chức Maple 1.3 Cấu trúc Maple 4 Một số khái niệm 2.1 Cây 2.2 Cây bao trùm 2.3 Cây bao trùm nhỏ 6 Một số thuật tốn tìm bao trùm nhỏ 10 3.1 Thuật toán Kruskal 10 3.2 Thuật toán Prim 15 Tài liệu tham khảo 21 Giới thiệu Maple Giới thiệu Maple Trong phần điểm qua số thông tin liên quan đến phần mềm Maple 1.1 Maple gì? Maple phần mềm tính tốn chuyên dụng Đại học Tổng hợp Waterloo (Canada) trường Đại học Kỹ thuật Zurich (ETZ) xây dựng đưa vào thương mại năm 1985 Phần mềm trải qua nhiều lần cải tiến phát triển với nhiều phiên khác nhau, trở nên ngày hoàn thiện Maple chạy tất hệ điều hành, đòi hỏi cấu hình máy tính khơng lớn, thích hợp nhu cầu sử dụng nhiều loại đối tượng: học sinh, sinh viên, giáo viên, Từ phiên 7, Maple cung cấp nhiều công cụ trực quan, gọi lệnh tự học gắn liền với toán phổ thơng đại học Ưu điểm khiến ngày có nhiều nước giới lựa chọn sử dụng Maple dạy - học toán tương tác trước đòi hỏi thực tiễn phát triển giáo dục 1.2 Một số chức Maple • Thực tính tốn khối lượng lớn thời gian ngắn với độ xác cao, đáp ứng nhu cầu khắt khe nghiên cứu Khoa học kỹ thuật • Giải tốn cụ thể như: Giải tích (Tính giới hạn hàm số thực/phức, tính vi phân, nguyên hàm, tích phân, ), Đại số tuyến tính(sử dụng gói lệnh LinearAlgebra), Giải phương trình (Phương trình đại số, phương trình Diophantine, ODEs, PDEs, DAEs, DDEs), hình học (gói geometry), lý thuyết số (gói numtheory), • Thuận tiện việc minh họa hình học: Vẽ đồ thị (đồ thị chu tuyến, đồ thị điểm, ) tọa chiều Oxy, tọa độ Oxyz, tọa độ cực, ; cho phép thực phép biến đổi đồ thị (co giãn, tịnh tiến, quay, ), minh họa đồ thị động cho phép thấy biến thiên hàm số có tham số • Một cơng cụ hữu ích cho học sinh, sinh viên việc tự học • Một cơng cụ hữu ích cho giáo viên việc biên soạn giáo án giảng điện tử, thích hợp với lớp học tương tác trực tiếp • Ngơn ngữ lập trình đơn giản, mạnh mẽ, có khả tương tác với nhiều ngơn ngữ lập trình khác C, C#, Fortran, Java, JavaScript, Julia, Matlab, Perl, Python, R, Visual Basic • Có khả thúc đẩy tương tác người máy, cho phép người dùng phát triển module chuyên dụng, lập trình thư viện riêng phần mềm • Và nhiều tính khác 1.3 1.3 Cấu trúc Maple Cấu trúc Maple Maple dựa hạt nhân nhỏ, viết C, từ cung cấp ngơn ngữ lập trình Maple Hầu hết tính cung cấp thư viện chuyên dụng đến từ nhiều nguồn khác Hầu hết thư viện viết ngôn ngữ Maple, với mã nguồn xem Nhiều tính tốn số thực Thư viện số NAG thư viện ATLAS thư viện GMP Chức khác Maple đòi hỏi liệu số định dạng khác Các ký hiệu, biểu tượng lưu trữ nhớ dạng đồ thị có hướng khơng chu trình Giao diện chuẩn giao diện máy tính (calculator interface) Maple viết Java 2 Một số khái niệm Một số khái niệm Trong chương ta trình bày số khái niệm liên quan đến viết: cây, bao trùm 2.1 Cây Ta có số ví dụ sau: Hình 2.1: Gia đình Tốn học Bernoulli Hình 2.2: Các đồ thị (G1 , G2 ) (G3 , G4 ) 2.1 Cây Ta định nghĩa sau Định nghĩa 2.1 Một đồ thị vơ hướng, liên thơng khơng có chu trình Bởi khơng có chu trình, khơng thể chứa đa cạnh (qua hai đỉnh có nhiều cạnh) hay cạnh khuyên (cạnh có hai đầu mút trùng nhau) Vì vậy, phải đồ thị đơn Ví dụ 2.1 Trong Hình 2.2, đồ thị G1 , G2 chúng liên thơng khơng có chu trình đơn Trong đồ thị G3 khơng có chu trình ( a, b, c, d, a) Còn đồ thị G4 khơng liên thơng khơng Dưới ta nói qua số kiểu đặc biệt Định nghĩa 2.2 Một gọi có gốc đỉnh xác định gốc cạnh hướng từ gốc Ví dụ 2.2 Cây có gốc Hình 2.3: Một có gốc tạo cách đặt hai gốc khác Trong có gốc : • Với đỉnh v khác gốc, tồn đỉnh u cho có cạnh hướng (u, v) (tồn khơng có chu trình cây) u gọi đỉnh mẹ v, v gọi đỉnh u • Các đỉnh có đỉnh mẹ gọi anh em • Tổ tiên đỉnh v khác gốc đỉnh nằm đường từ gốc đến đinh v khác v (tức đỉnh mẹ, đỉnh mẹ đỉnh mẹ, tiếp tục gốc) • Hậu duệ đỉnh v tất đỉnh nhận v tổ tiên • Một đỉnh khơng có gọi Một đỉnh có gọi đỉnh • Nếu v đỉnh cây, gốc v đồ thị chứa v với tất hậu duệ v cạnh nối đến chúng 2.2 Cây bao trùm Định nghĩa 2.3 Một có gốc gọi m-phân đỉnh có khơng q m đỉnh Cây gọi m-phân đầy đủ đỉnh có xác m đỉnh Một m-phân với m = gọi nhị phân Ví dụ 2.3 Trong Hình 2.4 đây, T1 nhị phân đầy đủ, T2 3-phân đầy đủ, T3 5-phân đầy đủ, T4 3-phân Hình 2.4: Cây m-phân Để nhận biết đồ thị cây, ta có định lý sau Định lý 2.1 (Định lý cây) Cho G = (V, E) đồ thị vô hướng, mệnh đề sau tương đương: G G liên thông | E| = |V | − G khơng có chu trình, | E| = |V | − G liên thơng, xóa cạnh G khơng liên thơng G khơng có chu trình, thêm cạnh vào G có chu trình Giữa hai đỉnh G tồn đường 2.2 Cây bao trùm Định nghĩa 2.4 Cho G đồ thị đơn Một bao trùm (spanning tree) G đồ thị chứa tất đỉnh G Hình 2.5: Cây bao trùm (được tô đậm) đồ thị Ta có định lý đơn giản sau Định lý 2.2 Một đồ thị đơn liên thông chứa bao trùm 2.3 Cây bao trùm nhỏ 2.3 Cây bao trùm nhỏ Trước tiên ta nêu định nghĩa sau Định nghĩa 2.5 (Đồ thị có trọng số) Một đồ thị có trọng số (weighted graph) đồ thị mà cạnh gắn với số cụ thể Hằng số gọi trọng số (weight) cạnh Trên thực tế, đồ thị có trọng số xuất vơ phổ biến Ví dụ, đồ với điểm địa điểm riêng biệt cạnh đường nối hai điểm, trọng số cạnh độ dài đường giá tiền để đường Hay hệ thống dẫn nước, cạnh ống nước trọng số khả chịu tải lượng nước chảy qua tối đa ống nước Trong phần ta làm việc với đồ thị đơn liên thơng có trọng số Bài tốn tìm bao trùm nhỏ tốn tìm bao trùm đồ thị đơn liên thông có trọng số cho tổng trọng số cạnh bao trùm nhỏ Ví dụ 2.4 Một đồ thị có trọng số Hình 2.6: Độ dài đường thành phố (Nevada) Ví dụ 2.5 Một đồ thị có trọng số với bao trùm nhỏ Hình 2.7: Cây bao trùm nhỏ Một số thuật tốn tìm bao trùm nhỏ 10 Một số thuật toán tìm bao trùm nhỏ Trong phần này, tìm hiểu hai thuật tốn để tìm bao trùm nhỏ đồ thị đơn liên thơng có trọng số Thuật tốn thứ đề cập tới phần thuật toán Kruskal, đặt tên với nhà toán học người Mĩ Joseph B Kruskal Jr., người phát thuật toán vào năm 1956 Thuật toán thứ hai phát nhà toán học người Cộng hòa Séc Vojtˇech Jarník năm 1930 Thuật toán sau phát lại Robert C Prim vào năm 1957 Edsger W Dijkstra vào năm 1959 Thuật toán thường biết đến thuật tốn Prim (hay đơi thuật tốn Jarník, thuật tốn Prim-Jarník, thuật tốn Prim-Dijkstra hay thuật tốn DJP) 3.1 Thuật tốn Kruskal Ta mơ tả thuật tốn Kruskal Đầu vào Đồ thị G = (V, E, l ) với V tập đỉnh, E tập cạnh, l : E → R hàm trọng số Quá trình T := cạnh có trọng số nhỏ Thực liên tục n − lần trình sau: chọn e cạnh có trọng số nhỏ cho khơng nằm T khơng tạo thành chu trình thêm vào T T := T thêm vào e Đầu T bao trùm nhỏ G Hình 3.1: Thuật tốn Kruskal 3.1 Thuật tốn Kruskal 11 Ta viết chương trình cho thuật toán Kruskal sau: > with(networks): Kruskals_MST := module() option package; export Kruskals_Algorithm; Kruskals_Algorithm := proc (network_def::list, make_graph::truefalse) local edgelist :: list, edge :: list, cmp_weights, mst :: set, mst_edges :: posint, i :: posint, vertices :: set, vertex, vertex_count :: posint, C :: table, rep_target, rep_value, G, tot_cost :: posint; # Obtain list of edges sorted by weight cmp_weights := proc(a,b) return ( is(a[3] < b[3]) ) end proc: edgelist := sort(network_def, cmp_weights); # Obtain list of vertices vertices := {}: for edge in edgelist vertices := vertices union { edge[1], edge[2] } end do: vertex_count := nops(vertices); mst_edges := vertex_count - 1; # number of edges in MST = vertices - # Initialize cycle-detecting table C := table; for vertex in vertices C[vertex] := vertex end do; # printf("vertex_count = %d, edges = %d\n", vertex_count, nops(edgelist)); # Generate MST mst := {}; for i to nops(edgelist) while (nops(mst) < mst_edges) do; edge := edgelist[i]: if (C[edge[1]] C[edge[2]]) then mst := mst union { edge }; rep_target := C[edge[2]]; rep_value := C[edge[1]]; for vertex in vertices do; if (C[vertex]=rep_target) then C[vertex] := rep_value end if; end do; end if; end do: 3.1 Thuật toán Kruskal 12 # Sanity check if (nops(mst) mst_edges) then printf("*** Did not construct MST, %d %d ***\n", nops(mst), mst_edges); printf("*** Error in input? Not connected graph? ***\n"); return; end if; # At this point, shortest paths for graph is determined printf("\nMinimum Spanning Tree:\n\n"); tot_cost := 0; for edge in mst do; printf ("%A - %A (%d)\n", edge[1], edge[2], edge[3]); tot_cost := tot_cost + edge[3]; end; printf("Total cost = %d\n", tot_cost); printf("\n"); # create graph G if requested if (make_graph) then new(G): addvertex([seq(vertices[i],i=1 nops(vertices))],G); for edge in mst connect({edge[1]},{edge[2]},G) end do; return(draw(G)); end if; return mst; end proc: # Kruskals_Algorithm end module: # Kruskals_MST with(Kruskals_MST); Ví dụ áp dụng thuật tốn Ví dụ 3.1 >net := [ [1, 2, 1], # arc - from to 2, cost=1 [1, 3, 3],[2, 3, 2],[3, 2, 4],[2, 4, 5],[3, 4, 9] ]: Kruskals_Algorithm(net, false); # dont display graph Minimum Spanning Tree: 3.1 Thuật toán Kruskal 13 - (1) - (2) - (5) Total cost = {[1, 2, 1], [2, 3, 2], [2, 4, 5]} Một ví dụ phức tạp hơn, cho hình ảnh bao trùm Ví dụ 3.2 ># More complex network, show resulting graph net := [ [1,2,5], # arc from to 2, cost [1,3,9],[1,4,20],[1,5,4],[1,8,14],[1,9,15], [2,1,5],[2,3,6],[3,1,9],[3,2,6],[3,4,15], [3,5,10],[4,1,20],[4,3,15],[4,5,20],[4,6,7], [4,7,12],[5,1,4],[5,3,10],[5,4,20],[5,6,3], [5,7,5],[5,8,13],[5,9,6],[6,4,7],[6,5,3], [7,4,12],[7,5,5],[7,8,7],[8,1,14],[8,5,13], [8,7,7],[8,9,5],[9,1,15],[9,5,6],[9,8,5] ]: Kruskals_Algorithm(net, true); Minimum Spanning Tree: - (5) - (6) - (4) - (7) - (3) - (5) - (6) - (5) Total cost = 41 3.1 Thuật toán Kruskal Ví dụ 3.3 ># Network with city name labels net := [["Omaha","Chicago",5], ["Omaha","St Louis",6], ["St Louis","Chicago",5], ["St Louis","Cincinatti",6], ["Chicago","Boston",11], ["Chicago","New York",9], ["Chicago","Pittsburgh",7], ["Chicago","Cincinatti",5], ["Chicago","Memphis",6], ["Boston","New York",3], ["New York","Pittsburgh",5], ["New York","Washington DC",5], ["Pittsburgh","Washington DC",5], ["Pittsburgh","Atlanta",7], ["Pittsburgh","Cincinatti",4], ["Washington DC","Cincinatti",6], ["Washington DC","Atlanta",4], ["Washington DC","Miami",8], ["Cincinatti","Atlanta",6], ["Cincinatti","Memphis",6], ["Memphis","Atlanta",7], ["Memphis","New Orleans",4], ["New Orleans","Atlanta",6], ["Atlanta","Miami",6]]: Kruskals_Algorithm(net,true); 14 3.2 Thuật toán Prim 15 Minimum Spanning Tree: Omaha - Chicago (5) St Louis - Chicago (5) Chicago - Cincinatti (5) Boston - New York (3) New York - Washington DC (5) Pittsburgh - Washington DC (5) Pittsburgh - Cincinatti (4) Washington DC - Atlanta (4) Memphis - New Orleans (4) New Orleans - Atlanta (6) Atlanta - Miami (6) Total cost = 52 3.2 Thuật toán Prim Ta mơ tả thuật tốn Prim Đầu vào Đồ thị G = (V, E, l ) với V tập đỉnh, E tập cạnh, l : E → R hàm trọng số 3.2 Thuật toán Prim 16 Quá trình T := đỉnh Thực n − lần trình sau: Chọn e cạnh có trọng số nhỏ thỏa mãn e có chung đỉnh với đỉnh T thêm e vào T khơng tạo thành chu trình Khi T := T thêm vào e Đầu T bao trùm nhỏ G Hình 3.2: Thuật tốn Prim Ta viết chương trình cho thuật tốn Prim sau: >restart: with(GraphTheory): PrimMST := module() option package; 3.2 Thuật toán Prim export Prim; Prim := proc (G::Graph, stepByStep::truefalse := false, draw::truefalse := true, initial := {}) local H :: list, V :: set, E :: set, e :: list, g::Graph , a::list, discarded::set, initVert::set,total::int, uncheckedVerts::int: #variable initialization H:={}: #List of edges of the MST E:=Edges(G,weights): #backup of G’s edge list, used in destructive operations uncheckedVerts:=nops(Vertices(G))-1: #number of G’s vertices not yet reached by the MST > if initial {} then #determines initial vertex if initial in Vertices(G) then V:={initial}: #user-inputted initial vertex else printf("ERROR: initial vertex not in graph"); return "ERROR": #invalid initial vertex end if: else V:={E[1][1][1]}: #default initial vertex end if: if draw and stepByStep then printf("key: yellow = vertices, magenta = initial vertex, blue = original graph edges,\n\tgreen = MST edges, red = discarded edges.\n"); discarded:={}: #discarded edge set, used only when drawing the graph initVert:=V: #initial vertex backup, used only when drawing the graph end if: total:=0: #total weight of the edges in the MST while nops(E)>0 do; #continue while there are unprocessed edges e:={}: #assume no edge is added to the MST for a in E do: #for each edge if a[1][1] in V then if a[1][2] in V then E:=E minus {a}: #if it would cause a loop in the MST, discard the edge if stepByStep then #report discarded edge if the option is enabled printf("discarded edge (%a,%a) as it would cause a loop\n", a[1][1], a[1][2]): if draw then #draw resulting graph if the option is enabled 17 3.2 Thuật toán Prim discarded:=discarded union {a}: g:=Graph([op(V)], discarded): HighlightSubgraph(G, g, red, yellow): HighlightVertex(G,initVert,magenta): print(DrawGraph(G)); > end if: end if: else if e={} or a[2] them belongs to the MST, report an error printf("ERROR: unable to construct MST, graph may be disconnected"); return "ERROR": end if: end if: end do: if (draw) then #print MST if the option is enabled g:=Graph([op(V)],H): if stepByStep then printf("graph for the obtained MST:\n", a[1][1], a[1][2]): end if: print(DrawGraph(g)); printf("total weight of the MST: %a\n",total): #report total MST weight return g: #return graph for the MST else printf("total weight of the MST: %a\n",total): #report total MST weight return H; #return list of edges for the MST end if: end proc: end module: with (PrimMST); Ví dụ áp dụng thuật tốn Ví dụ 3.4 (In bao trùm, khơng làm bước) >vertices:=["a","b","c","d"]: edges:={[{"a", "b"}, 1],[{"a", "c"}, 3],[{"b", "c"}, 2],[ {"b", "d"}, 5],[{"c", "d"}, 9]}: g := Graph(vertices,edges): Prim(g); 19 3.2 Thuật tốn Prim Ví dụ 3.5 (làm bước, không in bao trùm) vertices:=[1,2,3,4,5,6]: edges:={[{1,2},6],[{1,3},2],[{1,4},5],[{2,3},6],[{2,4},4],[ {2,5},5],[{3,4},6],[{3,5},3],[{3,6},2],[{4,5},6],[{5,6},2]}: g := Graph(vertices,edges): Prim(g,true,false); added edge (1,3) with weight to the MST added edge (3,6) with weight to the MST added edge (5,6) with weight to the MST discarded edge (3,5) as it would cause a loop added edge (1,4) with weight to the MST discarded edge (3,4) as it would cause a loop discarded edge (4,5) as it would cause a loop added edge (2,4) with weight to the MST > (4.2.1) > Finished MST construction total weight of the MST: 15 {[{1,3},2],[{1,4},5],[{2,4},4],[{3,6},2],[{5,6},2]} 20 TÀI LIỆU 21 Tài liệu [1] Nguyễn Hữu Điển, Thực hành tính toán Maple, NXBĐHQGHN, 2015 [2] Nguyễn Hữu Điển Nguyễn Minh Tuấn, LATEX- Tra cứu soạn thảo, NXBĐHQGHN, 2001 [3] Nguyễn Hữu Điển, LATEX- Với gói lệnh phần mềm công cụ, NXBĐHQGHN, 2004 [4] Kenneth H Rosen, Discrete Mathematics and Its Application, 7th ed., McGraw-Hill Higher Education, 2012 [5] Thomas H Cormen, Charles E Leiserton, Ronald L Rivest, Clifford Stein, Introduction to Algorithms, 2nd ed., The MIT Press, 2001 [6] https://en.wikipedia.org/ [7] https://www.maplesoft.com/ ... 2.5 Một đồ thị có trọng số với bao trùm nhỏ Hình 2.7: Cây bao trùm nhỏ Một số thuật tốn tìm bao trùm nhỏ 10 Một số thuật tốn tìm bao trùm nhỏ Trong phần này, tìm hiểu hai thuật tốn để tìm bao trùm. .. thị đơn liên thơng có trọng số Bài tốn tìm bao trùm nhỏ tốn tìm bao trùm đồ thị đơn liên thơng có trọng số cho tổng trọng số cạnh bao trùm nhỏ Ví dụ 2.4 Một đồ thị có trọng số Hình 2.6: Độ dài... 2.5 (Đồ thị có trọng số) Một đồ thị có trọng số (weighted graph) đồ thị mà cạnh gắn với số cụ thể Hằng số gọi trọng số (weight) cạnh Trên thực tế, đồ thị có trọng số xuất vơ phổ biến Ví dụ, đồ

Ngày đăng: 25/01/2019, 16:28

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

Tài liệu liên quan