Giải thuật GHS-83 do các tác giả R. G. GALLAGER, P. A. HUMBLET, and P. M. SPIRA ñề xuất trong tài liệu [16]. Giải thuật này dựa trên tử tưởng của giải thuật PRIM - giải thuật xây dựng cây khung trọng số tối thiểu trên ñồ thị bằng cách lần lượt bổ xung các cạnh ngoài có trọng số nhỏ nhất vào trong cây khung. Trong mô hình phân tán, các nút không biết ñược topo mạng của toàn bộ hệ thống, ñồng thời mỗi nút sẽ xử lý cây khung một cách riêng rẽ không ñồng bộ. Vì vậy, cần phải tìm một phương pháp ñể kết hợp các cạnh có trọng số nhỏ nhất vào cây khung tối thiểu.
Ta mô tả lại bài toán xây dựng cây khung phân tán tối thiểu như sau:
Đồ thị G = (V, E) mô hình một hệ phân tán, với V là tập gồm n bộ xử lý, E là tập gồm m liên kết. Mỗi liên kết của ñồ thị có một trọng số phân biệt w(e). Xây dựng một giải thuật phân tán cho các bộ xử lý ñể xây dựng một cây khung T sao cho tổng ∑
′ ∈E e ) e ( w nhỏ nhất.
Chúng ta sử dụng một số thuật ngữ sau ñây trong việc mô tả giải thuật:
• Mảnh MST: là một cây con thuộc cây MST hoàn chỉnh. Ban ñầu, mỗi mảnh MST chỉ bao gồm 1 nút. Chúng ta sẽ kết hợp các mảnh này lại theo một số quy tắc ñể tạo thành cây khung tối thiểu
• Liên kết ngoài: liên kết ngoài của một mảnh MST là liên kết có một nút bên trong mảnh, nút còn lại nằm bên ngoài.
• Gốc của mảnh: là một nút trong mảnh ñược quy ước và lấy ñịnh danh làm ñịnh danh của mảnh.
Tư tưởng của giải thuật dựa trên việc kết hợp dần các mảnh MST lại, cuối cùng
ñược cây MST hoàn chỉnh trong hệ thống. Do hệ thống là phân tán, một nút trên mạng không biết ñược cấu trúc toàn cục của hệ thống. Vì vậy, ñể việc kết hợp các mảnh riêng rẽ
lại sao cho vẫn thỏa mãn yêu cầu của bài toán, chúng ta dựa vào các ñịnh lý sau ñây:
Định lý 3.1. Cho một mảnh MST A, gọi e là một liên kết ngoài có trọng số tối thiểu trong mảnh A. Thì e là một cạnh trong cây MST hoàn chỉnh.
Chứng minh:
Giả sử e nối mảnh MST A với một mảnh MST B và e không nằm trong cây MST, như vậy phải tồn tại liên kết ngoài e’ của mảnh A nằm trên ñường ñi giữa mảnh A và mảnh B, và là một cạnh trong cây MST (nếu không mảnh A sẽ không liên thông với mảnh B). Theo giải thiết, w(e) < w(e’). Kết nạp e vào cây MST và bỏ cạnh e’, ta nhận ñược cây khung T’ có tổng trọng số của tất cả các cạch bé hơn cây khung MST ban ñầu, vô lý.
Định lý 3.2: Nếu tất cả các cạnh của một ñồ thị liên thông có các trọng số phân biệt, thì cây MST là duy nhất.
Chứng minh:
Giả sử tồn tại hai cây khung tối thiểu phân biệt. Ký hiệu cây A và cây B. Gọi e là
cạnh có trọng số nhỏ nhất nằm ở một trong hai cây, nhưng không nằm trong cả hai. Không mất tính tổng quát, giả sử e thuộc cây A. gọi T là tập các cạnh của cây A và T’ là
tập các cạnh của cây B. Tập cạnh {e} ∪ T ′ phải chứa một chu trình (tính chất của cây khung), và ít nhất một cạnh trong chu trình, gọi là e′, không nằm trong T (bởi vì T không
chứa chu trình). Vì các trọng số là phân biệt và e′ nằm trong T′ nhưng không nằm trong T
⇒ w(e) < w(e′). Vì vậy {e} ∪ T′ - {e′} là tập các cạnh của một cây khung có trọng số
nhỏ hơn T′, vô lý. e’ e e 5 4 8 3 1 7 2 6 4 5 8 3 1 7 2 6 e’ Hình 13: Minh họa chứng minh ñịnh lý 1
T e Hình 14: Minh họa chứng minh ñịnh lý 2 4 8 3 1 7 2 6 5 T’ 4 8 3 1 7 2 6 5 e’ 3.2.2. Giải thuật chi tiết Giải thuật bắt ñầu với các mảnh là một nút trong mạng. Áp dụng ñịnh lý 1 ñể mở
rộng các mảnh theo các liên kết ngoài trọng số tối thiểu. Định lý thứ 2 ñảm bảo việc mở
rộng một cách ñộc lập giữa các mảnh không bị xung ñột lẫn nhau.
Ở trạng thái khởi tạo ban ñầu, một mảnh MST chỉ bao gồm duy nhất một nút. Nút này cũng chính là gốc của mảnh. Quá trình mở rộng mảnh bao gồm các bước sau
•Tìm liên kết ngoài có trọng số tối thiểu: gốc của mỗi mảnh sẽ gửi thông báo yêu cầu các nút tìm liên kết ngoài cục bộ có trọng số tối thiểu. Khi tìm thấy, mỗi nút sẽ
gửi liên kết ngoài này ñến cho gốc của mảnh. Gốc của mảnh sẽ tập hợp kết quả và chọn ra liên kết ngoài tối thiểu của mảnh
•Kết hợp mảnh: khi tìm thấy liên kết ngoài tối thiểu, mảnh này sẽ cố gắng kết hợp với mảnh mà liên kết này dẫn ñến. Để thuật toán không có khóa chết, chúng ta sử
dụng một khái niệm là mức của mảnh. Ban ñầu, mỗi mảnh có mức là 0. Giả sử rằng mảnh F ở mức L có cạnh liên kết ngoài tối thiểu dẫn tới và mảnh F′ có mức L′. Mảnh F và F′ kết hợp với nhau chỉ khi thỏa mãn một trong hai ñiều kiện sau:
Nếu L < L′, thì mảnh F bị hấp thu bởi F′, mảnh mở rộng có mức là L′.
Nếu L = L′ và các mảnh F và F′ có cùng một cạnh ngoài trọng số tối thiểu, thì hai mảnh F và F′ kết hợp thành một mảnh mới có mức là L + 1.
Trong tất cả các trường hợp khác, mảnh F ñơn giản ñợi mảnh F′ ñạt ñến mức ñủ
lớn ñể kết hợp với F theo các luật ở trên.
Sử dụng khái niệm mức của mảnh, thuật toán sẽ tránh ñược các trạng thái khóa chết trong mô hình phân tán không ñồng bộ. Trong giải thuật, các nút và liên kết sẽ có một số
các trạng thái khác nhau. Mỗi nút có 3 trạng thái:
• sleeping: trạng thái khởi tạo ban ñầu của nút (khi chưa thực hiện thuật toán)
• find: trạng thái khi một nút ñang tiến hành tìm liên kết ngoài tối thiểu cục bộ
trong mảnh
• found: trạng thái khi nút ñã tim thấy liên kết ngoài tối thiểu cục bộ
•Mỗi liên kết cũng ñược phân biệt theo 3 trạng thái sau ñây:
• basic: trạng thái ban ñầu của mỗi liên kết
• branch: nếu liên kết ñược công nhận là một cạnh trong cây MST.
• rejected: liên kết không thuộc cây MST, nhưng nối 2 nút thuộc cùng một mảnh MST (hay thường gọi là liên kết trong)
Giải thuật GHS-83 chi tiết ñược mô tả như sau:
Khởi tạo: Tất cả các nút có trạng thái khởi tạo là sleeping. Tất cả các cạnh ở trạng thái basic. Ban ñầu mỗi mảnh là một nút và ở mức 0, nút này cũng chính là gốc của mảnh, ñịnh danh của gốc là ñịnh danh của mảnh. Thực hiện:
Tại trạng thái khởi tạo, một số nút gốc sẽ tự thức dậy từ trạng thái sleeping, và tiến hành thực hiện thuật toán.
MST duy nhất (chính là cây MST)
• Tìm liên kết ngoài tối thiểu: Gốc của một mảnh thay ñổi trạng thái của nó
thành find (nút gốc có thể tự thức dậy hoặc ñược ñánh thức bởi một thông báo từ nút khác) và gửi một thông báo khởi tạo initiate chứa ñịnh danh mảnh, số hiệu mức và trạng thái find tới tất cả các nút trong mảnh.
Khi nút i nhận thông báo initiate, nó cập nhật ñịnh danh mảnh và số
hiệu mức của nó. Nút i sau ñó thay ñổi trạng thái của nó thành find và
tìm liên kết ngoài có trọng số tối thiểu cục bộ. Mỗi nút i sắp xếp cạnh liên thuộc nó có trạng thái basic theo trọng số của chúng với thứ tự tăng dần trong danh sách unusedi. Nút i tìm cạnh liên kết ngoài trọng số tối thiểu cục bộ như sau:
Nút i chọn cạnh tiếp theo (i,j) từ unusedi và gửi một thông báo test với
ñịnh danh mảnh và số hiệu mức qua cạnh này.
Nút j nhận ñược một thông báo test từ i, nó hoạt ñộng như sau:
•Nếu ñịnh danh mảnh của j giống với ñịnh danh mảnh của i, thì i và j thuộc cùng một mảnh và bởi vậy, j xóa cạnh (i, j) từ danh sách unusedj, thay ñổi trạng thái cạnh này thành rejected và j trả lời i bằng thông báo reject. Khi nút i nhận thông báo reject từ j, nó xóa cạnh (i, j) từ danh sách unusedi, thay
ñổi trạng thái cạnh này thành rejected và tiếp tục bằng cách gửi thông báo
test qua cạnh tiếp theo trong danh sách của nó.
•Nếu các ñịnh danh mảnh của i và j là khác nhau:
Nếu Lj≥ Li, nút j gửi một thông báo accept tới i. nút i nhận ñược thông
báo accept sẽ lưu cạnh tốt nhất cục bộ của nó là (i,j), kết thúc quá trình tìm kiếm cạnh cục bộ tốt nhất tại nút i.
Ngược lại, j làm trễ sự trả lời cho ñến khi Lj≥ Li. /* Bởi khi hai mảnh sát nhập vào nhau, các nút trong các mảnh này (khác các gốc) không
ñược thông báo ngay tức thì ñịnh danh và mức của mảnh mới */ Khi một nút i ñã xác ñịnh cạnh tốt nhất cục bộ của nó là e:
Nếu i là nút lá, nó gửi một thông báo report với cạnh e ñến cha của nó và chuyển sang trạng thái found.
Ngược lại, i là nút trong, i ñợi cho ñến khi nó tìm ra cạnh tốt nhất cục bộ và nhận các thông báo report từ tất cả các con của nó. Sau ñó i
của nó và chuyển sang trạng thái found.
Nút gốc sau khi ñã tìm ra cạnh tốt nhất cục bộ của nó và nhận các thông báo từ tất cả các con của nó, nút gốc chọn cạnh có trọng số tối thiểu emin trong số các cạnh này.
Nếu chọn ñược emin, ñây chính là cạnh tốt nhất của mảnh, nó gửi
thông báo change-root, tới nút trong mảnh có emin là cạnh liên thuộc. Nút này trở thành gốc mới của mảnh, thay ñổi trạng thái của emin là
branch, và gửi một thông báo connect với số hiệu mức của nó qua
emin.
Ngược lại, không có cạnh ngoài nào ñược tìm thấy, kết thúc giải thuật, mảnh hiện thời chính là cây MST cần tìm.
• Kết hợp các mảnh với nhau: Cho nút j trong mảnh G ở mức lj, nhận một
thông báo connect từ nút i trong mảnh F ở mức li. Ta xét các trường hợp sau:
lj < li: Trước khi gửi một thông báo connect tới j, i sẽ phải gửi một
thông báo test tới j ñể xác ñịnh xem liệu rằng (i, j) có phải là một cạnh
ngoài. Vì j có số hiệu mức nhỏ hơn, nó sẽ làm trễ sự trả lời thông báo
test cho ñến khi số hiệu mức của nó trở thành ít nhất là li.
lj = li: Trong trường hợp này, nút j trì hoãn trả lời thông báo connect
cho ñến khi số hiệu mức của nó trở nên lớn hơn li (trong trường hợp này, nó hoạt ñộng như trong trường hợp 3) hoặc nhận ñược thông báo
change-root từ gốc của G, tức (i, j) là cạnh tốt nhất của G. Nếu (i,j) là
cạnh tốt nhất của G thì F và G ñược trộn vào nhau. Nếu j > i thì j trở
thành gốc của mảnh kết hợp. Nó tăng số hiệu mức của nó lên 1 và bắt
ñầu lần lặp mới bằng cách gửi một thông báo initiate tới các hàng xóm của nó. Ngược lại j gửi một thông báo connect tới i và i trở thành gốc mới của mảnh kết hợp, i tăng số hiệu mức của nó lên 1 và gửi thông báo
initiate cho các hàng xóm của nó ñể khởi tạo lần lặp mới cho mảnh kết hợp.
lj > li:
Nếu nút j ñã nhận ñược một thông báo initiate và chưa gửi thông
báo report, thì nó gửi một thông báo initiate với ñịnh danh của mảnh
G, số hiệu mức lj và trạng thái find tới i và ñợi một thông báo report
thái của cạnh (j,i) thành branch. Vì vậy, F ñược hấp thu vào G như là một phần của lần lặp hiện thời của G.
Nếu j ñã gửi thông báo report: Trong trường hợp này, nút j gửi
thông báo initiate với ñịnh danh của mảnh G, số hiệu mức lj và trạng
thái found tới i, ñồng thời j thay ñổi trạng thái của cạnh (j,i) thành
branch. Một nút nhận ñược một thông báo initiate với trạng thái
found thay ñổi trạng thái của nó thành found, cập nhật số hiệu mức và
ñịnh danh mảnh của nó và truyền thông báo tới các con của nó.
/* Khi j ñã gửi thông báo report, cạnh tốt nhất cục bộ của nó phải có trọng số nhỏ hơn trọng số của (i,j) (thật vậy, cạnh (i,j) không
thể là cạnh tốt nhất cục bộ của j bởi vì i sẽ không trả lời một thông
báo test từ j vì i ở trong mảnh có mức thấp hơn, dẫn ñến j không
thể gửi thông báo report). Do ñó cạnh tốt nhất cục bộ của j có
trọng số nhỏ hơn cạnh ngoài có trọng số tối thiểu của F. Bởi vậy, sự tham gia của F trong việc tìm kiếm cạnh tốt nhất của G là
không cần thiết. */
Hình 15: Giải thuật GHS-83 [1]
Chứng minh tính ñúng ñắn:
Ta thấy giải thuật chỉ tìm cạnh ngoài có trọng số tối thiểu từ các mảnh, thông báo
connect chỉ ñược gửi trên cạnh ngoài tối thiểu, giải thuật thỏa mãn các thuộc tính 1 và 2, do ñó chúng ta nhận ñược cây MST.
Để chỉ ra rằng khóa chết không tồn tại, ta xét tập các mảnh tồn tại trong bất kỳ thời
ñiểm nào. Ngoại trừ các mảnh có mức 0 bao gồm các nút trong trạng thái ngủ. Giả thiết rằng giải thuật ñã ñược bắt ñầu nhưng không kết thúc, tập các mảnh ở trên không rỗng và mỗi mảnh có một cạnh ngoài trọng số tối thiểu. Xét mảnh từ tập các mảnh có mức thấp nhất trong tập hợp với cạnh ngoài có trọng số nhỏ nhất trong tập ñó. Mọi thông báo kiểm thử test từ mảnh ñó hoặc sẽñánh thức mảnh ở trạng thái ngủ sleeping có mức không hoặc sẽ ñược phản hồi mà không cần ñợi. Tương tự, một thông báo connect từ mảnh ñó sẽ ñánh thức mảnh ở trạng thái ngủ có mức 0 hoặc sẽ chuyển ñến mảnh có mức cao hơn, hoặc sẽ chuyển ñến mảnh ñồng mức và có chung cạnh ngoài với trọng số tối thiểu, tất cả ñều dẫn ñến mảnh mới có mức cao hơn. Như vậy không có mảnh nào tồn tại vĩnh viễn ⇒ không tồn tại khóa chết.
Độ phức tạp thông báo:
Định lý 3.3. Độ phức tạp thông báo của giao thức là O(E + N log N).
Chứng minh:
Bởi vì số hiệu mức của một mảnh có thể nhiều nhất là log N và số hiệu mức tăng sau mỗi lần lặp, một nút có thể tham gia không quá log N lần lặp. Trong một lần lặp, mỗi nút trong một mảnh có thể nhận không quá một thông báo initiate và một thông báo accept.
Nó có thể chuyển nhiều nhất một thông báo report và một thông báo change-root hoặc
thông báo connect. Vì vậy, nếu chúng ta không quan tâm ñến các thông báo test và reject,
thì một nút có thể chỉ gửi O(N) thông báo trong mỗi lần lặp, do ñó sau log N lần lặp, số
thông báo sử dụng là O(N log N). Có nhiều nhất hai thông báo reject ñược gửi qua mỗi cạnh. Các thông báo này sẽ ñóng góp thành tổng O(E). Mỗi thông báo test ñược trả lời bởi một thông báo reject và một thông báo accept. Bởi vì có nhiều nhất O(E) thông báo
reject và nhiều nhất O(N log N) thông báo accept, có thể có nhiều nhất O(E + N log N) thông báo test. Như vậy, ñộ phức tạp thông báo của giao thức là O(E + N log N).
Độ phức tạp thời gian:
Định lý 3.4. Độ phức tạp thời gian của giải thuật GHS-83 là O(N log N).
Chứng minh:
Chúng ta sẽ chứng minh bằng qui nạp rằng mỗi nút cần 5lN – 3N ñơn vị thời gian ñể