Chi tiết giải thuật OMST

Một phần của tài liệu Nghiên cứu vấn đề truyền bá thông tin giữa các tác tử di động trong mạng động (Trang 51)

Cũng giống như giải thuật GHS-83, các mảnh MST trong quá trình thực hiện giải thuật cũng liên tục tìm kiếm liên kết ngoài có trọng số tối thiểu qua thủ tục FIND. Sau ñó tiến hành ghép các mảnh lại với nhau qua các liên kết ñó. Quá trình này ñược lặp ñi lặp lại cho tới khi chỉ còn một mảnh duy nhất, chính là cây khung của hệ thống.

Trong giải thuật chính, ngoài việc tìm kiếm các liên kết ngoài tối thiểu qua thủ tục FIND, các nút còn phải thực hiện thủ tục UPDATE ñể cập nhật lại cấu trúc dữ liệu của mình. Thủ tục UPDATE ñược gọi khi có thay ñổi trong topo mạng hoặc trước khi chúng ta tiến hành ghép mảnh. Lưu ý, thủ tục UPDATE luôn ñược thực hiện trước thủ tục FIND nhằm ñảm bảo quá trình tìm kiếm diễn ra chính xác.

•Khi một liên kết trong cây khung bị mất:

Thực hiện thủ tục loại bỏ liên kết này tại hai ñầu của liên kết.

•Khi hai mảnh kết hợp với nhau hoặc topo mạng thay ñổi: Gọi thủ tục UPDATE, sau ñó gọi thủ tục FIND.

•Khi hai mảnh chọn chung một liên kết ngoài:

Hai mảnh thực hiện thủ tục UPDATE riêng rẽ. Kết hợp hai mảnh lại làm một qua liên kết ngoài ñó.

Hình 19. Chương trình chính

Thủ tục UPDATE là một trong hai thủ tục quan trọng nhất trong thuật toán. Nhiệm vụ của thủ tục này là cập nhật lại cấu trúc dữ liệu “rừng ảo” tại mỗi nút sao cho “rừng ảo” giống “rừng thật” (cây khung hiện tại) nhất có thể. Chúng ta có thể chứng minh ñược, sau khi thực hiện thủ tục UPDATE, ít nhất “cây ảo” của một nút sẽ giống hệt như mảnh MST chứa nút ñó. Nhờ vậy, thủ tục FIND có thể tìm ñược liên kết ngoài tối thiểu của mảnh.

Để giảm ñộ phức tạp thông báo trong thủ tục UPDATE, mỗi nút không chỉ lưu “rừng ảo” của nút mình, mà còn lưu một tập “rừng ảo” của tất cả các nút khác trong hệ

thống. Cụ thể, mỗi nút sẽ lưu lại một mảng Forest[] bao gồm toàn bộ các “rừng ảo” của các nút khác mà nó biết trong mạng. Forest[u] là một bản sao “rừng ảo” của nút u. Để

tránh nhầm lẫn, chúng ta dùng ký hiệu Forestv[u] là bản sao “rừng ảo” của nút u ñược lưu tại nút v. Như vậy, một “rừng ảo” của nút nào ñó có thểñược lưu ở toàn bộ các nút khác trên mạng. Các bản sao cục bộ này sẽñược ñiểu chỉnh cho khớp với nhau thông qua thủ

tục UPDATE.

Thủ tục UPDATE ñược xử dụng ñể thay ñổi “rừng ảo” tại mỗi nút cho khớp với “rừng thật”. Trong thủ tục này, mỗi nút sẽ tìm cách gửi các thông tin về “rừng thật” cho các nút lân cận của nó. Ví dụ, một nút thấy liên kết kề với mình vừa bịñứt, nó sẽ gửi một thông tin báo cho các nút lân cận về thay ñổi này. Các thông tin này sẽñược tính dựa vào các phiên bản “rừng ảo” lưu tại nút ñó.

Tuy nhiên, vấn ñề phức tạp ở ñây là: khi hai nút kề nhau không “ñồng ý” về thông tin của “rừng ảo”, hay hai nút không biết thông tin của nút nào là chính xác hơn. Vấn ñề

này có thể giải quyết dựa vào khái niệm “phía” của một nút như sau:

Xét mt liên kết (u, v) trong mt mnh MST. Khi bỏ ñi liên kết này, sẽ ñược hai mnh MST phân bit, mt mnh cha u và mt mnh cha v. Ta ñịnh nghĩa mt nút hay mt liên kết trong mnh là “phía u” nếu nút hay liên kết này thuc mnh MST cha u. Ngược li, nó s là “phía v”.

Quay lại vấn ñề trên, khi hai nút u, v gửi thông tin về “rừng ảo” cho nhau, chúng sẽ

dựa vào “phía” ñể xác ñịnh xem thông tin nào là chính xác hơn. Các thông tin về liên kết phía u lưu tại u sẽ chính xác hơn những thông tin này khi lưu tại v. Hay những thông tin phía u bao giờ cũng ñến u trước rồi mới ñến v. Vì vậy, trong thủ tục UPDATE, một nút chỉ cần gửi thông tin về phía mỉnh cho các nút lân cận ñể cập nhật.

Thủ tục UPDATE sẽ ñược gọi tại nút gốc, khi ñó nút gốc sẽ gửi các yêu cầu UPDATE ñến lần lượt các nút khác trong mạng. Mỗi nút khi nhận ñược yêu cầu UPDATE từ nút cha, ngoài việc gửi yêu cầu này cho nút con, chúng sẽ gọi một thủ tục LOCAL_UPDATE ñể cập nhật thông tin cho các nút lân cận. Thủ tục này còn ñược gọi khi một nút nhận ñược các thông tin có ích từ nút khác. Chi tiết thủ tục LOCAL_UPDATE như sau:

Th tc LOCAL_UPDATE

•Với mọi k: (v, k) thuộc cây và Forestv(k) khác rỗng: Gửi thông báo DIFF(diff(k)) cho nút k

Forestv(k) = Forestv(k) + diff(k)

(Đoán trước vic sa “rng o” ti nút k, vì vy v sa luôn vào bn sao rng o ca nút k ca mình)

•Khi nhận ñược một thông báo DIFF (Add, Del) từ nút k Forestv(v) = Forestv(v) + Add - Del

Forestv(k) = Forestv(k) – treek(Forestv(k) – {v,k}) U treek(Forestv(v) – {v, k})

(Chnh li luôn Forestv(k) cho ging vi phiên bn “rng o” ca nút k)

Th tc diff(k)

(k: nút k cn ñược cp nht, tr li 2 thông tin Add, Del)

(Add: các liên kết cn phi ñược thêm vào “rng o” ca nút k, theo ý kiến ca nút v)

(Del: các liên kết cn phi ñược xóa khi “rng o” ca nút k, theo ý kiến ca nút v) (adsbygoogle = window.adsbygoogle || []).push({});

Add = (Forestv(v) – Forestv(k)) proj my-side(k) Del = (Forestv(k) – Forestv(v)) proj my-side(k) return(Add, Del)

Th tc my-side(k)

(tr li phn cây o còn li ca v sau khi loi b phn có cha k)

return treev(Forestv(v) – {v, k})

(treei(k): cây thuộc rừng ảo của k có chứa nút i)

Hình 21. Minh họa việc gửi thông báo DIFF

Trong hình trên, nút left gửi thông báo yêu cầu chèn thêm liên kết (u, s) vào “rừng

ảo” của nút right. Trong hình trên, nút left gửi thông báo yêu cầu chèn thêm liên kết (u, s) và xóa bỏ liên kết (u, f) trong “rừng ảo” của nút right. Các thông báo này ñược nút right

chấp nhận vì chúng ñều nằm phía nút left.

Thủ tục FIND ñược nút gốc gọi nhằm tìm kiếm liên kết ngoài tối thiểu trong mảnh. Mỗi nút sau khi nhận ñược yêu cầu tìm kiếm, nó sẽ gửi yêu cầu này cho các nút con và thực hiện việc tìm kiếm liên kết ngoài cục bộ của mình. Quá trình tìm kiếm sẽ sử dụng dữ

liệu “rừng ảo”, vì vậy nút tìm kiếm không cần phải gửi thông báo cho các nút khác. Các liên kết ngoài tối thiểu tìm kiếm ñược sẽ ñược tập hợp từ dưới lên trên theo cây khung. Một nút cha chỉ khi nhận ñược hết thông báo trả lời của các nút con mới lọc ra liên kết ngoài tốt nhất và gửi lên nút bên trên.

Th tc FIND

(Th tc FIND ñược gi bi nút gc hoc khi nhn ñược yêu cu tìm kiếm t

nút cha)

Gửi yêu cầu tìm kiếm cho tất cả các nút con

Thực hiện việc tìm kiếm liên kết ngoài tối thiểu cục bộ Đợi thông báo trả lời của các nút con

Khi nhận ñủ thông báo, lọc ra liên kết ngoài tối thiểu và gửi lại nút cha

Hình 23. Thủ tục FIND

Sau khi thực hiện xong thủ tục FIND và tìm ñược liên kết ngoài có trọng số tối thiểu, nút gốc sẽ tiến hành thủ tục CHANGE_ROOT ñể chuyển gốc về nút kề với liên kết này.

Th tc CHANGE_ROOT

(Th tc CHANGE_ROOT ñược gi bi nút gc hoc sau khi nhn ñược yêu cu chuyn gc t nút cha)

Khi nhận ñược yêu cầu chuyển gốc, tựñánh dấu mình là nút gốc Nếu là nút kề với liên kết ngoài tối thiểu, thủ tục dừng lại

Tìm nút con trên ñường ñến liên kết ngoài tối thiểu, gửi yêu cầu chuyển gốc cho nút này

Bỏñánh ñấu mình là gốc

Hình 24. Thủ tục CHANGE_ROOT

Thủ tục MERGE_TREE ñược sử dụng ñể kết hợp hai mảnh thông qua liên kết ngoài tối thiểu. Thủ tục ñược nút gốc của mảnh có ID nhỏ hơn thực hiện trước. Nút gốc sẽ

yêu cầu kết hợp mảnh qua thông báo Request, khi nhận ñược thông báo Accept từ mảnh bên kia, quá trình kết hợp mảnh sẽñược thực hiện.

Th tc MERGE_TREE

(Th tc MERGE_TREE ñược gi bi nút gc ca mnh có ID nh hơn) Nếu chưa nhn ñược thông báo Request:

Gửi thông báo Request cho mảnh bên kia qua liên kết ngoài tối thiểu (adsbygoogle = window.adsbygoogle || []).push({});

Đợi thông báo Accept

Khi nhận ñược thông báo Alert (có thay ñổi trong topo mạng), xét các trường hợp sau:

Nếu ñã nhận ñược Accept, bỏ qua Alert và kết hợp mảnh bình thường

Chưa nhận ñược Accept, gửi thông báo Cancel sang bên mảnh kia, nếu nhận

ñược Canceled thì hủy bỏ quá trình kết hợp mảnh

Mt ñã nhn ñược thông báo Request t mnh bên kia qua cùng liên kết ngoài ti thiu:

Gửi thông báo Accept qua liên kết này Khi nhận ñược thông báo Cancel:

Chưa gửi Accept, gửi lại thông báo Canceled và hủy bỏ quá trình kết hợp mảnh.

Nếu ñã gửi Accpet, bỏ qua thông báo Cancel.

Hình 25. Thủ tục MERGE_TREE

Một phần của tài liệu Nghiên cứu vấn đề truyền bá thông tin giữa các tác tử di động trong mạng động (Trang 51)