0
Tải bản đầy đủ (.pdf) (118 trang)

Giải thuật SB95

Một phần của tài liệu TRUYỀN BÁ THÔNG TIN PHÂN TÁN GIỮA CÁC TÁC TỬ DI ĐỘNG (Trang 38 -38 )

Giải thuật này được đề xuất bởi Singh và Bernstein [8], giải thuật là một sự cải biến của GHS83 để đạt được tốc độ hội tụ nhanh, tức có độ phức tạp tuyến tính về thời gian.

Trong giải thuật GHS83, để giữ độ phức tạp thông báo thấp, khi một mảnh F ở mức cao hơn gửi yêu cầu nối với mảnh có mức thấp hơn F, thì mảnh F đợi mảnh có mức thấp hơn F phát triển đến thời điểm mà tại đó số hiệu mức của nó bằng hoặc lớn hơn số hiệu mức của F. Chính vì vậy GHS83 có độ phức tạp thời gian trên tuyến tính

N log N.

Awerbuch đề xuất giải thuật Awe87 có độ phức tạp tuyến tính về mặt thời gian [3]. Tuy nhiên, giải thuật yêu cầu giai đoạn đếm tổng số nút trong mạng, và áp dụng giải thuật GHS83 cho đến khi tất cả các mảnh trong mạng đạt đến kích thước là

N/ log N, sau đó mới áp dụng phương pháp của ông.

Các giải thuật GHS83 và Awe87 yêu cầu sự phát triển cân bằng của các mảnh. Với giải thuật SB95, một mảnh không đợi mảnh khác đạt đến một mức cụ thể trước khi chúng có thể kết hợp với nhau. Chính vì vậy, giải thuật có tốc độ hội tụ nhanh, đạt được độ phức tạp tuyến tính về thời gian là O(N). Tuy nhiên giải thuật không tối ưu về độ phức tạp thông báo, giải thuật có độ phức tạp thông báo trong trường hợp xấu nhất là O(N2), giải thuật sẽ đạt được độ phức tạp thông báo O(E + N log N) sau khi tất cả các mảnh đã đạt đến kích thước N / log N.

Giải thuật SB95 không sử dụng số hiệu mức như GHS83. Do đó, việc trả lời thông báo test tại mỗi nút để kiểm tra liên kết ngoài, không cần phải trì hoãn dựa trên số hiệu mức như GHS83. Trong GHS83, số hiệu mức được sử dụng để đảm bảo rằng, các cạnh ngoài được nhận biết một cách đúng đắn. Giải thuật SB95 đảm bảo việc nhận biết đúng đắn các cạnh ngoài bằng cách chia mỗi lần lặp tại mỗi mảnh làm hai đợt.

Đợt đầu tiên, định danh của mảnh (định danh của gốc) được truyền bá tới tất cả các nút trong mảnh, đợt đầu tiên kết thúc khi tất cả các nút trong mảnh đã cập nhật định danh mới của mảnh. Đợt thứ hai, nút gốc sẽ phát tỏa thông báo yêu cầu đến tất cả các nút trong mảnh tìm kiếm cạnh liên kết ngoài cục bộ tối thiểu tại mỗi nút, sau đó tại mỗi nút có sự tổng hợp kết quả tìm kiếm cạnh ngoài tối thiểu tại mỗi nút con gửi đến và của chính nó, cuối cùng nút gốc sẽ có kết quả tìm kiếm cạnh ngoài tối thiểu của toàn mảnh, mảnh sẽ trộn với mảnh khác qua cạnh ngoài tối thiểu này.

Ý tưởng:

Ban đầu tất cả các nút ở trạng thái ngủ (sleeping), giải thuật bắt đầu tại một số nút trong mạng, các nút khác được đánh thức bằng bất kỳ một thông báo nào gửi đến bởi các nút kề cận. Mảnh ban đầu chỉ là một nút đơn, các mảnh sẽ được trộn với nhau qua cạnh ngoài có trọng số tối thiểu trong mỗi lần lặp.

Đợt đầu tiên, định danh của mảnh (định danh của gốc) được truyền bá tới tất cả các nút trong mảnh, đợt đầu tiên kết thúc khi tất cả các nút trong mảnh đã gửi thông báo finish tới gốc, tức tất cả các nút đã cập nhật định danh mới của mảnh. Đợt thứ hai, nút gốc của mảnh sẽ phát tỏa thông báo mang trạng thái find, yêu cầu tất cả các nút trong mảnh tìm liên kết ngoài có trọng số tối thiểu cục bộ, sau đó sẽ gửi thông báo

report hướng đến nút gốc. Nếu là nút lá, thông báo report sẽ được gửi đến nút cha; nếu là nút trong, nút này tìm kiếm xong liên kết ngoài có trọng số tối thiểu của nó, và đợi nhận hết các thông báo report gửi đến từ nút con của nó, sau đó chọn cạnh ngoài có trọng số tối thiểu để gửi đến nút cha của nó; cuối cùng, nút gốc sẽ nhận được kết quả cạnh liên kết ngoài có trọng số tối thiểu của mảnh (cạnh tốt nhất của mảnh). Khi mảnh tìm thấy cạnh tốt nhất của nó, gốc sẽ gửi một thông báo change-root tới nút trong mảnh có cạnh tốt nhất này là cạnh liên thuộc. Nút này trở thành gốc mới của mảnh và gửi một thông báo connect qua cạnh tốt nhất để yêu cầu kết nối tới mảnh mà cạnh tốt nhất này dẫn đến.

Giải thuật 3.3-1 trình bày chi tiết giải thuật SB95.

Trạng thái nút và cạnh:

- Mỗi nút có ba trạng thái

o sleeping: trạng thái khởi tạo của nút.

o update: khi nút nhận thông báo initiate1 và cập nhật định danh của mảnh.

o finish: khi nút cập nhật xong định danh của mảnh và gửi thông báo

o find: khi nút tham gia vào việc tìm kiếm cạnh ngoài có trọng số tối thiểu trong mảnh chứa nó.

o found: khi đã tìm thấy cạnh tốt nhất của mảnh.

- Mỗi nút phân loại mỗi cạnh liền kề nó ở một trong ba trạng thái:

o branch: nếu cạnh là một nhánh trong mảnh hiện tại, nói cách khác đây

chính là một cạnh của cây MST.

o rejected: nếu cạnh nằm bên trong mảnh, nhưng không thuộc cây MST.

o basic: chưa được phân loại, có thể là cạnh trong hoặc ngoài mảnh.

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, 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.

- Một nút thức dậy tự phát và phát tỏa thông báo wake_up đánh thức tất cả các nút khác trong mạng, các nút thức dậy sẽ bắt đầu thực hiện giải thuật.

Lặp cho đến khi nào chỉ còn một mảnh: Đợt đầu tiên:

+ Gốc của một mảnh khởi tạo đợt đầu tiên bằng việc gửi một thông báo

initiate1 chứa định danh mảnh tới các con của nó.

- Khi nhận được thông báo initiate1, một nút thay đổi trạng thái thành update, cập nhật định danh mảnh và truyền bá thông báo

initiate1 tới các con của nó.

- Một nút lá sau khi đã cập nhật xong định danh mảnh sẽ thay đổi trạng thái của nó thành finish và gửi một thông báo finish tới cha của nó.

- Một nút trong đợi một thông báo finish đến từ tất cả các con trước khi gửi một thông báo finish tới cha của nó.

- Khi gốc nhận được thông báo finish từ tất cả các con của nó, nó biết rằng tất cả các nút trong mảnh biết định danh hiện thời của mảnh. Gốc bắt đầu khởi tạo đợt hai.

Đợt thứ hai:

+ Gốc của mảnh bắt đầu đợt thứ hai bằng việc gửi thông báo initiate2 tới các con của nó.

+ Tìm cạnh ngoài có trọng số tối thiểu của mảnh:

- Khi nhận thông báo initiate2, nút i 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 j thuộc cùng một mảnh, j xóa cạnh (i, j) từ danh sách unusedj, thay đổi trạng thái cạnh này thành

rejectedj trả lời i bằng thông báo reject.

o 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 ij là khác nhau, 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. /*

Việc trả lời thông báo kiểm tra test không được trì hoãn, bởi nếu nút nhận là ở trong cùng một mảnh, thì nó phải biết định danh thật sự của mảnh vì đợt đầu tiên của lần lặp đã hoàn thành.

*/

- 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 chứa 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 gửi thông báo report với cạnh nhỏ nhất trong số các cạnh này tới cha 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 eminbranch, 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:

- Khi một thông báo connect từ một nút i trong mảnh F tới nút j, trong mảnh G. Xảy ra các trường hợp sau:

 Nếu j đã nhận được thông báo initiate1 và chưa gửi thông báo

finish, thì j coi (i,j) như là một cạnh của mảnh và gửi thông báo

initiate1 tới i. Nút j đợi một thông báo finish từ i trước khi gửi thông báo finish của nó. Trong trường hợp này, các nút trong 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 finish của nó thì sự trả lời thông báo

connect được trì hoãn.

1. Nếu (i,j) cũng là cạnh tốt nhất của G thì G sẽ gửi một thông báo connect qua cạnh này và F, G sẽ trộn vào nhau khi kết thúc lần lặp. Nút với định danh lớn hơn trong số hai nút đầu cuối cạnh tốt nhất sẽ trở thành gốc mới của mảnh kết hợp và khởi tạo lần lặp tiếp theo.

2. Ngược lại, khi j nhận thông báo initiate1 trong đợt đầu tiên của lần lặp tiếp theo, nó sẽ gửi một thông báo initiate1 tới i. Nút j đợi một thông báo finish từ i trước khi gửi thông báo

finish của nó. Trong trường hợp này, các nút trong 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. /*

Mảnh G chứa j thực hiện đợt hai của lần lặp hiện thời và cho kết quả (i,j) không phải là cạnh tốt nhất của G. Nút j làm trễ trả lời thông báo connect đến từ nút i cho đến khi G khởi tạo lần lặp tiếp theo.

*/

Nhận xét: Các mảnh chỉ được hấp thu khi một nút đang thực hiện đợt đầu tiên. Không có các nút mới được bổ sung vào một mảnh khi nó đang thực hiện đợt thứ hai.

Ví dụ thực hiện:

Mạng ban đầu bao gồm 7 nút và 11 cạnh, mỗi cạnh được gắn trọng số như trong hình 3.3-1.a, tất cả các nút ở trạng thái sleeping và tất cả các cạnh ở trạng thái basic.

Nút 1 thức dậy và phát tỏa thông báo wake_up đánh thức tất cả các nút còn lại trong mạng. Các nút thức dậy sẽ bắt đầu thực hiện giải thuật (hình 3.3-1.b).

Ban đầu, mỗi nút được coi như một mảnh, các mảnh bắt đầu việc tìm kiếm cạnh liên kết ngoài có trọng số tối thiểu. Gọi Fi là mảnh có định danh nút gốc là i. F1 tìm thấy MOE1 = (1,3), nút 1 gửi thông báo connect tới nút 3; F3 tìm thấy MOE3 = MOE1 = (1,3), vậy F1 trộn với F3 tạo thành mảnh mới F3 với gốc mới là nút 3, nút 3 phát tỏa thông báo initiate1 bắt đầu lần lặp tiếp theo trên mảnh mới F3. Tương tự mảnh F5 trộn với F7 tạo thành mảnh mới F7 với gốc mới là nút 7. Mảnh F2 tìm thấy MOE2 = (1,2), nút 2 gửi thông báo connect đến nút 1. Mảnh F4 tìm thấy MOE4 = (3,4), nút 4 gửi thông báo connect tới nút 3. Mảnh F6 tìm thấy MOE6 = (6,7), nút 6 gửi thông báo

connect tới nút 7 (hình 3.3-1.c).

Mảnh F7 đang thực hiện đợt đầu tiên của lần lặp thứ 1, nút 7 nhật được thông báo connect từ nút 6, vậy F7 hấp thu mảnh F6, tạo thành mảnh mới F7, với gốc mới là nút 7. Tương tự, mảnh F3 hấp thu mảnh F2F4, tạo thành mảnh mới F3 với gốc mới là nút 3 (hình 3.3-1.d).

Hình 3.3-1.a. Mạng ban đầu

4 3 7 2 12 8 6 5 9 10 15 4 6 3 2 1 5 7 Hình 3.3-1.b. Nút 1 đánh thức các nút khác 4 4 3 7 2 12 8 6 5 9 10 15 6 3 2 1 5 7

Mảnh F3 thực hiện xong đợt đầu tiền của lần lặp thứ 1, nó hấp thu mảnh F2

F4, mảnh F3 tiếp tục đợt tìm kiếm MOE3, kết thúc đợt tìm kiếm này, F3 tìm thấy MOE3

= (3,6), nút 3 gửi thông báo connect tới nút 6. Tương tự mảnh F7 tìm thấy MOE7 = (3,6), nút 6 gửi thông báo connect tới nút 3, ta có MOE3 = MOE7 = (3,6), vậy mảnh F3

trộn với F7 tạo thành mảnh mới F7 với gốc mới là nút 7 (hình 3.3-1.e).

Mảnh mới F7 sẽ thực hiện đợt đầu tiên của lần lặp thứ 2, kết thúc đợt đầu tiên, mảnh mới F7 tìm kiếm MOE7 và kết quả là không tìm được, có nghĩa F7 là một mảnh duy nhất còn tồn tại trong mạng, F7 chính là cây khung tối thiểu MST cần tìm (hình 3.3-1.f). Hình 3.3-1.c. Đợt trộn mảnh đầu tiên F3 F7 4 4 3 7 2 12 8 6 5 9 10 15 6 3 2 1 5 7 Hình 3.3-1.d. Mảnh F3, F7 hấp thu mảnh khác F3 F7 4 4 3 7 2 12 8 6 5 9 10 15 6 3 2 1 5 7 Hình 3.3-1.e. Mảnh F3, F7 tìm MOE F3 F7 4 4 3 7 2 12 8 6 5 9 10 15 6 3 2 1 5 7 Hình 3.3-1.f. F7 chính là cây khung MST F7 4 4 3 7 2 12 8 6 5 9 10 15 6 3 2 1 5 7

Phân tích độ phức tạp thời gian và thông báo:

Chúng ta định nghĩa số hiệu mức của một mảnh F là log |F|, trong đó |F| là số các nút nhận thông báo initiate1 trong đợt đầu tiên. Số hiệu mức của một mảnh không thay đổi trong đợt thứ hai, bởi vì không có các nút mới được bổ sung trong đợt này. Một mảnh có thể là một trong các trạng thái sau: active, hoặc inactive (các trạng thái này được đưa ra cho mục đích phân tích độ phức tạp và một mảnh không biết trạng thái bên trong nó). Ban đầu, tất cả các mảnh là active. Một mảnh F active trở thành

inactive khi thông báo connect gửi bởi một nút trong F tới đích của nó. Một mảnh

active mới F được tạo thành khi gốc của F được tìm thấy và nó khởi tạo lần lặp mới.

Chú ý rằng số hiệu mức của một mảnh được xác định chỉ khi đợt đầu tiên của nó hoàn thành. Chúng ta nói rằng một mảnh active F có mức l tại thời điểm t (dù nó đang thực hiện đợt đầu tiên của nó tại thời điểm t) nếu l = log |F| ở thời điểm kết thúc đợt đầu tiên gần nhất.

Bổ đề 3.3-1. Cho F là một mảnh với số hiệu mức l. Thì nó mất nhiều nhất 7.(2l + 1 – 1)

đơn vị thời gian để thực hiện xong lần lặp hiện thời.

Chứng minh. Có thể có nhiều nhất 2l + 1 – 1 nút trong F. Sẽ mất nhiều nhất 2l + 1 – 1 đơn vị thời gian để thông báo initiate1 tới được tất cả các nút và nhiều nhất

Một phần của tài liệu TRUYỀN BÁ THÔNG TIN PHÂN TÁN GIỮA CÁC TÁC TỬ DI ĐỘNG (Trang 38 -38 )

×