Bài toán cây khung nhỏ nhất

Một phần của tài liệu Xử lý song song áp dụng đối với một số bài toán trong lý thuyết đồ thị (Trang 34 - 69)

Bài toán cây khung nhỏ nhất của đồ thị là một trong số những bài toán tối ưu trên đồ thị tìm được ứng dụng trong nhiều lĩnh vực khác nhau trong đời sống. Trong mục này chúng ta sẽ trình bày những thuật toán cơ bản để giải bài toán này. Trước hết chúng ta phát biểu nội dung của bài toán.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

Cho G = (V, E) là một đồ thị vô hướng liên thông. Với V= {1,2,.., n } và tập cạnh E gồm m cạnh. Với mỗi cạnh e của đồ thị được gán với một số không âm. c(e)

gọi là độ dài của nó. Giả sử H=(V, T) là cây khung của đồ thị G (T tập cạnh nhỏ nhất của cây khung). Ta gọi độ dài C(H) của cây khung H là tổng độ dài của các cạnh của nó: C(H) = 

T e

e c( )

Bài toán đặt ra là trong số tất cả các cây khung của đồ thị G hãy tìm cây khung với độ dài nhỏ nhất. Cây khung như vậy gọi là cây khung nhỏ nhất của đồ thị và bài toán đặt ra được gọi là bài toán cây khung nhỏ nhất

Trước khi tìm hiểu về các thuật toán chúng ta xét một số bài toán thực tế sau:

Bài toán xây dựng hệ thống đường sắt:

Cần xây dựng một hệ thống đường sắt nối n thành phố sao cho hành khách có thể đi từ bất kỳ một thành phố nào đến bất kỳ một trong các thành phố còn lại. Mục tiêu là phải xây dựng sao cho chi phí xây dựng hệ thống đường sắt là nhỏ nhất.

Bài toán nối mạng máy tính:

Cần nối mạng một hệ thống mạng truyền thông nối n trung tâm máy tính với nhau. Bất kỳ hai trung tâm nào cũng có thể được kết nối với nhau bằng điện thoại. Cần phải kết nối như thế nào để đảm bảo giữa hai trung tâm máy tính bất kỳ luôn có đường truyền thông sao cho tổng số tiền thuê bao của toàn mạng là tối thiểu?

Ta có thể mô hình bài toán này bằng một đồ thị trọng số, trong đó mỗi đỉnh là một trung tâm máy tính, mỗi cạnh là một đường truyền thông được thuê bao, còn trọng số của mỗi cạnh là tiền thuê bao hàng tháng của đường truyền thông được biểu thị bằng cạnh đó. Ta có thể giải bài toán này bằng cách tìm cây khung sao cho tổng các trọng số của các cạnh của cây đạt cực tiểu. đây chính là cây khung nhỏ nhất của đồ thị.

Do tính chất của cây, nên nếu đồ thị G có n đỉnh thì cây khung có đúng n-1 cạnh.

2.2.1.1. Thuật toán Kruskal

Thuật toán KRUSKAL: + Input: Đồ thị G=(V,E);

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

+ Bước 1: Sắp xếp các cạnh của đồ thị G theo thứ tự tăng dần của trọng số Ci,j + Bước 2: Xuất phát từ T=

+ Bước 3: Kết nạp dần các cạnh vào T theo nguyên tắc:

Duyệt trong danh sách cạnh đã sắp xếp, từ cạnh có độ dài nhỏ đến cạnh có độ dài lớn, tìm ra cạnh mà việc bổ sung nó vào tập T không tạo thành chu trình trong tập này. Thuật toán sẽ dừng khi T chứa đúng n-1 cạnh.

Procedure Kruskal Begin Sắp xếp Ci,j; T=; While |T| <(n-1) and (E  ) Do Begin Chọn e là cạnh có độ dài nhỏ nhất trong E; E:=E\ e  ;

If (T ekhông chứa chu trình ) then T:=Te;

End;

If |T| <(n-1) then Đồ thị không liên thông

End.

Nhận xét:

- Mỗi bài toán có thể tồn tại nhiều cây khung nhỏ nhất, điều nảy xảy ra nếu các cạnh có cùng trọng số với nhau.

- Bài toán tìm cây khung lớn nhất có thể đưa về bài toán tìm cây khung nhỏ nhất bằng cách đổi dấu tất cả các trọng số của Cij, hoặc có thể cài đặt một cách độc lập bằng cách kết nạp dần vào cây từ cạnh lớn đến cạnh nhỏ nhất .

- Trong thuật toán việc khó nhất là kiểm tra xem có tạo thành chu trình hay không? - Khối lượng tính toán nhiều nhất của thuật toán là ở bước sắp xếp các cạnh, vì vậy độ phức tạp tính toán của thuật toán là ( )2

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

2.2.1.2 Thuật toán Prim (adsbygoogle = window.adsbygoogle || []).push({});

Thuật toán Kruskal làm việc kém hiệu quả đối với những đồ thị dày (đồ thị có số cạnh là 1

2

n

n - . Trong trường hợp đó người ta xây dựng một thuật toán hiệu quả hơn đó là thuật toán Prim. Thuật toán Prim còn được gọi là phương pháp lân cận gần nhất. Trong phương pháp này, bắt đầu từ một đỉnh tuỳ ý của đồ thị s, bắt đầu ta nối s với đỉnh lân cận gần nó nhất, chẳng hạn là t, nghĩa là trong số các cạnh kề của s thì cạnh (s,t) có độ dài ngắn nhất. Tiếp theo trong số những cạnh kề với hai đỉnh s, t ta lại tìm cạnh có độ dài nhỏ nhất. Cạnh này dẫn đến một đỉnh thứ 3 là z, và ta thu được bộ phận gồm 3 đỉnh và 2 cạnh. Quá trình này sẽ tiếp tục cho đến khi ta thu được bộ cây gồm n đỉnh và n-1 cạnh sẽ chính là cây khung nhỏ nhất cần tìm.

Giả sử đồ thị cho bởi ma trận C  i, ji, j = 1...n. Trong quá trình thực hiện thuật toán, ở mỗi bước để có thể nhanh chóng chọn đỉnh và cạnh cần bổ sung vào cây khung thì các đỉnh của đồ thị sẽ được gán cho các nhãn. Nhãn của đỉnh v sẽ gồm hai phần: [d[v],near[v]], trong đó d[v] dùng để ghi nhận độ dài của các cạnh có độ dài nhỏ nhất trong số các cạnh nối đỉnh v với các đỉnh của cây khung đang xây dựng. Còn near[v] ghi nhận của cây khung gần v nhất.

Thuật toán Prim được mô tả bằng thủ tục sau:

Procedure Prim(G: Đơn đồ thị liên thông n đỉnh, có trọng số);

Input: Đồ thị liên thông n đỉnh có trọng số dương. Output: Cây khung nhỏ nhất T của đồ thị.

BEGIN

1. Xuất phát từ uV bất kỳ;

VT:= {u};{VT: Là tập các đỉnh của khung cây} ET:= ; {ET: Tập các cạnh của khung cây} D[u]:= 0; near[u]:= u;

{gán nhãn cho đỉnh đầu tiên u[0,u]}

{D[u]: Trọng số nhỏ nhất của các cạnh tới u} {near[u]: Đỉnh gần u nhất}

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn For v V – VT do Begin D[v]:= C[u,v]; Near[v]:= u: End; 2. (Bước lặp) Stop:=False; While not Stop Do

Begin

- Tìm s V – VT thỏa mãn D[s]:=min{D[v]: v V–VT} - VT:= VT{s}; ET:=ET{(s, near[s])}; - If | ET |:= (n -1) Then Begin T:=(VT, ET) là khung cây nhỏ nhất Stop:= True; End; Else For v V – VT do If D[v] > C[s,v] Then Begin D[v]:= C[s,v]; near[v]:=s; End; End; END;

Trong thực hành tính toán, ta thường xây dựng bảng để thay đổi nhãn của tất cả các đỉnh. Kí hiệu VT là tập các đỉnh của cây khung, ET là tập các cạnh của cây khung. Khi đó theo thủ tục trên nhãn của mọi đỉnh được xác định như sau:

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn 0 33 17 33 0 18 20 17 0 16 4 20 16 0 9 8 4 9 0 14 8 14 0 C æ ¥ ¥ ¥ ÷ö ç ÷ ç ÷ ç ¥ ¥ ÷ ç ÷ ç ÷ ç ÷ ç ¥ ÷÷ ç ÷ ç = çç¥ ÷÷ ÷ ç ÷ ç ÷ ç¥ ¥ ÷ ç ÷÷ ç ÷ ç ÷ ç¥ ¥ ¥ ÷ çè ø

Kết quả xác đinh cây khung nhỏ nhất cho bởi bảng

Bước lặp 1 2 3 4 5 6 VT ET Khởi tạo [0,1] [13,1] [17,1]* [¥ ,1] [¥ ,1] [¥ ,1] 1 Æ 1 - [18,3] - [16,3] [4,3]* [¥ ,1] 1,3 (3,1) 2 - [18,3] - [9,5]* - [14,5] 1,3,5 (3,1),(5,3) 3 - [18,3] - - - [8,4]* 1,3,5,4 (3,1),(5,3), (4,5) 4 - [18,3]* - - - - 1,3,5,4,6 (3,1),(5,3), (4,5),(6,4) 5 - - - - - - 1,3,5,4,6,2 (3,1),(5,3), (4,5),(6,4),(2,3)

Một phần của tài liệu Xử lý song song áp dụng đối với một số bài toán trong lý thuyết đồ thị (Trang 34 - 69)