1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

22 298 1

Đ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 22
Dung lượng 489,12 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

ĐẠ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

Trang 2

51

Trang 3

Phan Anh Quân : K61 - CNKHTN Toán 2

LỜI NÓI ĐẦU

Bài toán tìm cây bao trùm nhỏ nhất là một bài toán rất nổi tiếng trong lý thuyết

đồ thị, nó có rất nhiều ứng dụng quan trọng như trong việc thiết kế các mạng lưới(điện thoại, TV, điện, internet, ), tìm thuật toán xấp xỉ cho các bài toán độ khó NP,

Để tìm được cây bao trùm nhỏ nhất ta có thể áp dụng các thuật toán như Thuậttoán Bor ˚uvka, Thuật toán Prim, Thuật toán Kruskal Trong bài viết này, ngoài việcgiới thiệu về phần mềm Maple cũng như một số kiến thức cơ bản về cây, em xin đượctrình bày về hai thuật toán Prim và Kruskal và viết chương trình Maple cho hai thuậttoán trên

Nhân đây, em xin bày tỏ sự 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 có thể hoàn thành bài tập lớn

Mọi sự đóng góp xin gửi về địa chỉ: phananhquan_t61@hus.edu.vn

Sinh viên: Phan Anh Quân

Lớp học: K61 - CNKHTN Toán

Trang 4

MỤC LỤC 3

Mục lục

1.1 Maple là gì? 41.2 Một số chức năng chính của Maple 41.3 Cấu trúc của Maple 5

2.1 Cây 62.2 Cây bao trùm 82.3 Cây bao trùm nhỏ nhất 9

3.1 Thuật toán Kruskal 103.2 Thuật toán Prim 15

Trang 5

1 Giới thiệu về Maple 4

1 Giới thiệu về Maple

Trong phần này chúng ta sẽ điểm qua một số thông tin liên quan đến phần mềmMaple

1.1 Maple là gì?

Maple là một phần mềm tính toán chuyên dụng do Đại học Tổng hợp Waterloo(Canada) và trường Đại học Kỹ thuật Zurich (ETZ) xây dựng và đưa vào thươngmại đầu tiên năm 1985 Phần mềm đã trải qua nhiều lần cải tiến và phát triển vớinhiều phiên bản khác nhau, trở nên ngày càng hoàn thiện Maple chạy trên tất cả các

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 củanhiều loại đối tượng: học sinh, sinh viên, giáo viên, Từ phiên bản 7, Maple cung cấpcàng nhiều các công cụ trực quan, các gọi lệnh tự học gắn liền với toán phổ thông vàđại học Ưu điểm đó khiến ngày càng có nhiều nước trên thế giới lựa chọn sử dụngMaple trong dạy - học toán tương tác trước đòi hỏi của thực tiễn và sự phát triển củagiáo dục

1.2 Một số chức năng chính của Maple

• Thực hiện các tính toán khối lượng lớn trong thời gian ngắn với độ chính xáccao, đáp ứng nhu cầu khắt khe trong nghiên cứu Khoa học kỹ thuật

• Giải quyết các bài toán cụ thể như: Giải tích (Tính giới hạn các 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ụnggói lệnh LinearAlgebra), Giải phương trình (Phương trình đại số, phương trìnhDiophantine, ODEs, PDEs, DAEs, DDEs), hình học (gói geometry), lý thuyết số(gói numtheory),

• Thuận tiện trong việc minh họa hình học: Vẽ các đồ thị (đồ thị chu tuyến, đồthị điểm, ) trong các tọa 2 chiều Oxy, tọa độ Oxyz, tọa độ cực, ; cho phépthực hiện cá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 sự biến thiên của hàm số có tham số

• Một công cụ hữu ích cho học sinh, sinh viên trong việc tự học

• Một công cụ hữu ích cho giáo viên trong việc biên soạn giáo án và bài giảngđiện tử, thích hợp với các 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ả năng tương tác với nhiềungôn ngữ lập trình khác như C, C#, Fortran, Java, JavaScript, Julia, Matlab,Perl, Python, R, và Visual Basic

• Có khả năng thúc đẩy tương tác giữa người và máy, cho phép người dùng pháttriển các module chuyên dụng, lập trình hoặc thư viện riêng ngay trong phầnmềm

• Và nhiều tính năng khác

Trang 6

1.3 Cấu trúc của Maple 5

1.3 Cấu trúc của Maple

Maple dựa trên một hạt nhân nhỏ, được viết bằng C, từ đó cung cấp ngôn ngữ lậptrình Maple Hầu hết các tính năng được cung cấp bởi các thư viện chuyên dụng đến

từ nhiều nguồn khác nhau Hầu hết các thư viện được viết bằng ngôn ngữ Maple,với mã nguồn có thể xem được Nhiều các tính toán số được thực hiện bởi Thư viện

số NAG thư viện ATLAS hoặc thư viện GMP

Chức năng khác nhau trong Maple đòi hỏi dữ liệu số ở dưới các định dạng khácnhau Các ký hiệu, biểu tượng được lưu trữ trong bộ nhớ dưới dạng các đồ thị cóhướng không chu trình Giao diện chuẩn và giao diện máy tính (calculator interface)của Maple được viết bằng Java

Trang 7

2 Một số khái niệm cơ bản 6

2 Một số khái niệm cơ bản

Trong chương này ta sẽ trình bày một số khái niệm liên quan đến bài viết: cây,cây bao trùm

2.1 Cây

Ta có một số ví dụ về cây như sau:

Hình 2.1: Gia đình Toán học Bernoulli

Hình 2.2: Các đồ thị là cây (G1, G2) và không phải là cây (G3, G4)

Trang 8

2.1 Cây 7

Ta định nghĩa cây như sau

Định nghĩa 2.1. Một cây là một đồ thị vô hướng, liên thông và không có chu trình.Bởi vì một cây thì không có chu trình, nó không thể chứa các đa cạnh (qua haiđỉnh có nhiều hơn một cạnh) hay cạnh khuyên (cạnh có hai đầu mút trùng nhau) Vìvậy, một cây phải là một đồ thị đơn

Ví dụ 2.1. Trong Hình 2.2, các đồ thị G1, G2 là cây bởi vì chúng đều liên thông vàkhông có một chu trình đơn nào Trong khi đó đồ thị G3không là cây do nó có mộtchu trình là(a, b, c, d, a) Còn đồ thị G4thì không liên thông do đó nó cũng không làcây

Dưới đây ta sẽ nói qua một số kiểu cây đặc biệt

Định nghĩa 2.2. Một cây được gọi là cây có gốc nếu như một đỉnh của nó được xácđịnh là gốc và các cạnh đều được hướng ra từ gốc

gọi là đỉnh mẹ của v, v được gọi là đỉnh con của u.

• Các đỉnh có cùng một đỉnh mẹ được gọi là anh em

• Tổ tiên của một đỉnh v khác gốc là các đỉnh nằm trên đường đi từ gốc đến đinh

vkhác chính v (tức là đỉnh mẹ, đỉnh mẹ của đỉnh mẹ, tiếp tục cho đến gốc)

• Hậu duệ của một đỉnh v là tất cả các đỉnh nhận v là tổ tiên.

• Một đỉnh không có con được gọi là lá của cây Một đỉnh có con được gọi là một

đỉnh trongcủa cây

• Nếu v là một đỉnh trong cây, cây con gốc v là một đồ thị con chứa v cùng với

tất cả hậu duệ của v và các cạnh nối đến chúng

Trang 9

2.2 Cây bao trùm 8

Định nghĩa 2.3. Một cây có gốc được gọi là một cây m-phân nếu mỗi đỉnh trong cókhông quá m đỉnh con Cây này được gọi là m-phân đầy đủ nếu mỗi đỉnh có chínhxác m đỉnh con Một cây m-phân với m=2 được gọi là một cây nhị phân

Ví dụ 2.3. Trong Hình 2.4 dưới đây, T1 là một cây nhị phân đầy đủ, T2 là một cây3-phân đầy đủ, T3là một cây 5-phân đầy đủ, T4là một cây 3-phân

Hình 2.4:Cây m-phân

Để nhận biết khi nào đồ thị là một cây, ta có định lý sau

Định lý 2.1(Định lý cơ bản về cây) Cho G = (V, E) là một đồ thị vô hướng, các mệnh

đề sau là tương đương:

1 G là cây

2 G liên thông và|E| = |V| −1

3 G không có chu trình,|E| = |V| −1

4 G liên thông, nhưng nếu xóa đi một cạnh bất kỳ thì G không còn liên thông nữa

5 G không có chu trình, nhưng nếu thêm một cạnh vào thì G sẽ có chu trình

6 Giữa hai đỉnh bất kỳ của G luôn tồn tại duy nhất một đường đi

2.2 Cây bao trùm

Định nghĩa 2.4. Cho G là một đồ thị đơn Một cây bao trùm (spanning tree) của G

là một đồ thị con là cây chứa tất cả các đỉnh của G

Hình 2.5:Cây bao trùm (được tô đậm) của một đồ thị

Ta có một định lý đơn giản sau đây

Định lý 2.2 Một đồ thị đơn là liên thông khi và chỉ khi nó chứa một cây bao trùm

Trang 10

2.3 Cây bao trùm nhỏ nhất 9

2.3 Cây bao trùm nhỏ nhất

Trước tiên ta sẽ 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) là một

đồ thị mà mỗi cạnh của nó được gắn với một hằng số cụ thể Hằng số đó được gọi làtrọng số (weight) của cạnh đó

Trên thực tế, một đồ thị có trọng số xuất hiện vô cùng phổ biến Ví dụ, trong mộtbản đồ với mỗi điểm là các địa điểm riêng biệt và các cạnh là các đường đi nối haiđiểm, trọng số của mỗi cạnh sẽ là độ dài của đường đi đó hoặc giá tiền để đi trênđường đi đó Hay trong một hệ thống dẫn nước, các cạnh sẽ là các ống nước và trọng

số sẽ là khả năng chịu tải lượng nước chảy qua tối đa của mỗi ống nước

Trong phần này ta sẽ làm việc với các đồ thị đơn liên thông có trọng số Bài toántìm cây bao trùm nhỏ nhất là bài toán tìm một cây bao trùm của một đồ thị đơn liênthông có trọng số sao cho tổng trọng số các cạnh trong cây bao trùm đó là nhỏ nhất

Ví dụ 2.4. Một đồ thị có trọng số

Hình 2.6:Độ dài đường đi giữa các thành phố (Nevada)

Ví dụ 2.5. Một đồ thị có trọng số với một cây bao trùm nhỏ nhất của nó

Hình 2.7:Cây bao trùm nhỏ nhất

Trang 11

3 Một số thuật toán tìm cây bao trùm nhỏ nhất 10

3 Một số thuật toán tìm cây bao trùm nhỏ nhất

Trong phần này, chúng ta sẽ tìm hiểu về hai thuật toán để tìm cây bao trùm nhỏnhất của một đồ thị đơn liên thông có trọng số

Thuật toán thứ nhất chúng ta sẽ đề cập tới trong phần này là thuật toán Kruskal,được đặt cùng tên với nhà toán học người Mĩ Joseph B Kruskal Jr., người đã pháthiện ra thuật toán này vào năm 1956

Thuật toán thứ hai được phát hiện ra đầu tiên bởi nhà toán học người Cộng hòaSéc Vojtˇech Jarník năm 1930 Thuật toán này về sau được phát hiện lại bởi Robert C.Prim vào năm 1957 và Edsger W Dijkstra vào năm 1959 Thuật toán này thường đượcbiết đến là thuật toán Prim (hay đôi khi là thuật toán Jarník, thuật toán Prim-Jarník,thuật toán Prim-Dijkstra hay thuật toán DJP)

3.1 Thuật toán Kruskal

Ta sẽ mô tả thuật toán Kruskal

Đầu vào Đồ thị G= (V, E, l)với V là tập đỉnh, E là tập cạnh, l : E→R là hàm trọng

số

Quá trình T :=cạnh có trọng số nhỏ nhất Thực hiện liên tục n−2 lần quá trìnhsau: chọn e là một cạnh có trọng số nhỏ nhất sao cho nó không nằm trong T vàkhông tạo thành chu trình nếu thêm vào T T := Tthêm vào e

Đầu ra Tsẽ là cây bao trùm nhỏ nhất của G

Hình 3.1:Thuật toán Kruskal

Trang 12

3.1 Thuật toán Kruskal 11

Ta sẽ viết chương trình cho thuật toán Kruskal như 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 do vertices := vertices union { edge[1], edge[2] } end do:vertex_count := nops(vertices);

mst_edges := vertex_count - 1; # number of edges in MST = vertices - 1

# Initialize cycle-detecting table

C := table;

for vertex in vertices do C[vertex] := vertex end do;

# printf("vertex_count = %d, edges = %d\n", vertex_count, nops(edgelist));

end do;

end if;

end do:

Trang 13

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 proc: # Kruskals_Algorithm

end module: # Kruskals_MST

Kruskals_Algorithm(net, false); # dont display graph

Minimum Spanning Tree:

Trang 14

3.1 Thuật toán Kruskal 13

1 - 2 (1)

2 - 3 (2)

2 - 4 (5)Total cost = 8{[1, 2, 1], [2, 3, 2], [2, 4, 5]}

Một ví dụ phức tạp hơn, và cho hình ảnh cây bao trùm

Trang 15

3.1 Thuật toán Kruskal 14

Ví dụ 3.3 ># Network with city name labels

Trang 16

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 sẽ mô tả thuật toán Prim

Đầu vào Đồ thị G = (V, E, l)với V là tập đỉnh, E là tập cạnh, l : E→R là hàm trọng

số

Trang 17

3.2 Thuật toán Prim 16

Quá trình T := đỉnh bất kỳ Thực hiện n−1 lần quá trình sau: Chọn e là cạnh cótrọng số nhỏ nhất thỏa mãn e có chung đỉnh với một đỉnh của T và thêm e vào

Tsẽ không tạo thành chu trình Khi đó T :=Tthêm vào e

Đầu ra Tsẽ là cây bao trùm nhỏ nhất của G

Hình 3.2:Thuật toán Prim

Ta sẽ viết chương trình cho thuật toán Prim như sau:

>restart:

with(GraphTheory):

PrimMST := module()

option package;

Trang 18

3.2 Thuật toán Prim 17

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

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

Trang 19

3.2 Thuật toán Prim 18

discarded:=discarded union {a}:

if e={} or a[2]<e[2] then #if no loop is formed, take the

minimum weight edge

Trang 20

3.2 Thuật toán Prim 19

if(E<>{})then #if there are unprocessed edges, but none of

>

>

them belongs to the MST, report an error

printf("ERROR: unable to construct MST, graph may be

Trang 21

3.2 Thuật toán Prim 20

Ví dụ 3.5 (làm từng bước, nhưng không in cây bao trùm).

added edge (1,3) with weight 2 to the MST

added edge (3,6) with weight 2 to the MST

added edge (5,6) with weight 2 to the MST

discarded edge (3,5) as it would cause a loop

added edge (1,4) with weight 5 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 4 to the MST

Trang 22

[3] Nguyễn Hữu Điển, L A TEX- Với gói lệnh và 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,

Intro-duction to Algorithms, 2nd ed., The MIT Press, 2001

[6] https://en.wikipedia.org/

[7] https://www.maplesoft.com/

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

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w