CHƯƠNG 4 TRUYỀN BÁ THÔNG TIN PHÂN TÁN
4.5. Các giải thuật cho MAGP
4.5.1. Mạng bất kỳ
Chúng ta giả thiết mạng là một đồ thị liên thông vô hướng, giải thuật được chia làm hai đợt, đợt bầu thủ lĩnh và đợt truyền bá thông tin. Đợt bầu chọn dựa vào ý tưởng của giải thuật GHS83 [19]. Ở truyền bá thông tin, tác tử thủ lĩnh duyệt toàn mạng để thu thập và phân phát thông tin cho tất cả các tác tử khác trong mạng.
Ý tưởng của đợt bầu chọn như sau: mỗi tác tử đầu tiên xây dựng vùng của nó bởi giải thuật DFS (Depth First Search). Mỗi tác tử thu nạp các nút vào vùng của nó theo luật đến trước - thu nạp trước, các vùng mà mỗi tác tử xây dựng không có nút chung. Gọi Ti là vùng của pi. Và sau đó mỗi tác tử trộn vùng của nó với các vùng của các tác tử khác. Khi các vùng của pi và pj được trộn vào nhau, pi hoặc pj trở thành chủ của vùng trộn. Cuối cùng, tác tử thu nạp tất cả các nút của mạng vào vùng của nó trở thành thủ lĩnh.
Nhãn (min{id(u), id(v)}, max{id(u), id(v)}) được gán cho mỗi liên kết euv là trọng số, trong đó id(u) là định danh của nút u. Hai nhãn (u1, v1) và (u2, v2) được so sánh theo tứ tự từ điển, đó là, (u1, v1) < (u2, v2) u1 < u2 (u1 = u2 v1 < v2).
Một liên kết ngoài tối thiểu của vùng Ti là liên kết có trọng số bé nhất kết nối một nút trong Ti và một nút trong vùng khác. Ký hiệu MOLi (Minimum Outgoing Link) là liên kết ngoài tối thiểu của vùng Ti.
Mỗi vùng Ti có một số hiệu mức Li (mức khởi tạo của mỗi vùng là 0), số hiệu mức nhằm đảm bảo tính đúng đắn của giải thuật bầu tác tử thủ lĩnh ở đợt bầu chọn.
Bảng trắng của mỗi nút trong vùng Ti lưu các thông tin sau: (1) Định danh id(pi) của tác tử pi.
(2) Mức Li của vùng Ti.
Mỗi tác tử pi có thông in riêng Ii và một vùng nhớ để lưu thông tin của các tác tử khác. Giải thuật 4.5.1-1 được đề xuất bởi Tomoko Suzuki và đồng sự chỉ mới ở mức sơ thảo.
Khởi tạo vùng:
Xây dựng vùng Ti của tác tử pi: mỗi tác tử pi duyệt DFS để thu nạp các nút vào vùng của nó theo luật đến trước - thu nạp trước, các vùng mà mỗi tác tử xây dựng không có nút chung.
Khởi tạo mức của vùng Ti là Li = 0.
Bảng trắng của mỗi nút trong vùng Ti được pi ghi các thông tin sau: - Định danh id(pi) của tác tử.
- Mức Li = 0 của Ti.
Đợt bầu chọn thủ lĩnh:
Với mỗi vùng Ti, pi thực hiện duyệt DFS toàn bộ vùng Ti để tìm cạnh có trọng số bé nhất MOLi.
Khi pi tìm thấy liên kết euv là MOLi, trong đó v, u là các nút của vùng Ti và Tj (i
j) tương ứng, pi di chuyển sang nút u và đọc mức Lj ghi trên bảng trắng của u. Xảy ra hai trường hợp:
(1) Li < Lj, vùng Ti trộn với vùng Tj, mức của vùng sát nhập chính là Lj, tác tử pi sẽ duyệt toàn bộ vùng Ti để ghi định danh id(pj) và mức Lj lên bảng trắng của mỗi nút. Mức của Ti không thay đổi, tức là việc tìm kiếm MOLi không được khởi động trong Ti.
(2) Li = Lj và MOLi = MOLj: vùng Ti trộn với vùng Tj, mức của Ti và Tj là Li
+ 1, tức là việc tìm kiếm MOLi được thực hiện trong vùng sát nhập, tác tử có định danh lớn hơn là chủ của vùng sát nhập. Giả sử id(pi) > id(pj), ta có pi là chủ của vùng sát nhập, pj ở lại vùng Tj, tác tử pi duyệt DFS toàn bộ các vùng Ti và Tj ghi định danh id(pi) và mức Li + 1 lên bảng trắng của mỗi nút.
Nếu pi không tìm thấy liên kết ngoài nào hay pi đã thu nạp tất cả các nút trong mạng vào cây khung Ti của nó, thì pi trở thành thủ lĩnh.
Đợt truyền bá thông tin:
Tác tử thủ lĩnh duyệt DFS trên vùng của nó để thu thập và duyệt một lần nữa để truyền bá thông tin cho tất cả các tác tử khác.
Giải thuật 4.5.1-1 chỉ mới ở mức ý tưởng, tác giả luận văn đề xuất một giải thuật được mô tả chi tiết hơn, có thể vận dụng ngay được vào ứng dụng cụ thể. Ngoài việc cụ thể hóa ở mỗi bước trình bày trong giải thuật gốc, giải thuật còn đưa ra một số cải tiến nhằm cải tiến độ phức tạp bước di chuyển.
Giải thuật chi tiết được đề xuất bởi tác giả luận văn:
Ý tưởng giải thuật: Ban đầu, các tác tử sẽ duyệt DFS (Depth First Search) để xây dựng cây khung với gốc là nút nhà của tác tử. Mỗi tác tử thu nạp các nút vào cây khung của nó theo luật đến trước - thu nạp trước, các cây khung mà mỗi tác tử xây dựng không có nút chung. Trong quá trình xây dựng cây khung, mỗi tác tử thiết lập trạng thái các cạnh liên thuộc ở mỗi nút ở một trong ba trạng thái là branch, rejected,
basic, trong đó, trạng thái branch cho biết cạnh thuộc cây khung, rejected cho biết cạnh không thuộc cây khung, basic cho biết cạnh chưa xác định được có thuộc cây khung hay không. Mỗi tác tử ghi nhớ hình trạng cây khung của nó, để có thể di chuyển đến nút bất kỳ mà không cần phải duyệt toàn bộ trong cây khung.
Mỗi liên kết euv được gắn trọng số (min{id(u), id(v)}, max{id(u), id(v)}), trong đó id(u) là định danh của nút u, trọng số được so sánh theo thứ tự từ điển. Cây khung của tác tử pi là Ti, mỗi tác tử pi sẽ tìm kiếm liên kết ngoài có trọng số tối thiểu trên cây
khung của nó, gọi là MOLi (Minimum Outgoing Link), và tiến hành sát nhập cây khung của nó với cây khung của tác tử khác qua liên kết ngoài này.
Để tìm MOLi, tác tử pi từ nút gốc duyệt DFS cây khung của nó, tại mỗi nút v, pi
tìm kiếm cạnh liên kết ngoài có trọng số tối thiểu cục bộ tại v, khi tác tử pi di chuyển về nút gốc, nó sẽ có thông tin về MOLi. Để tìm cạnh liên kết ngoài có trọng số tối thiểu cục bộ tại mỗi nút v, ta duy trì một danh sách unusedv lưu cạnh liên thuộc v có trạng thái basic được sắp xếp theo thứ tự trọng số tăng dần, pi chỉ việc kiểm tra lần lượt các phần tử trong danh sách, nếu tìm thấy phần tử là liên kết ngoài, phần tử này chính là liên kết ngoài có trọng số tối thiểu cục bộ tại v, pi sẽ cập nhật lại biến MOLi của nó (bằng giá trị nhỏ nhất giữa giá trị MOLi hiện thời của pi với giá trị MOL cục bộ tại v) và di chuyển đến nút tiếp theo, tiếp tục quá trình tìm kiếm cạnh ngoài tại nút này.
Khi pi đã tìm thấy MOLi trên cây khung Ti của nó, giả sử MOLi dẫn tới cây khung Tj của tác tử pj, việc trộn cây khung Ti vào Tj dựa trên số hiệu mức. Tại thời điểm ban đầu cây khung Ti tạo bởi tác tử pi, mức của Ti là Li = 0. Nếu MOLi = MOLj và
Li = Lj, thì Ti trộn với Tj tạo thành cây mới Ti (giả sử id(pi) > id(pj)) có mức mới là
Li + 1 và pi là chủ của cây khung mới Ti, nếu Li < Lj, thì cây khung Ti bị hấp thu bởi cây khung Tj. Nếu Li > Lj, tác tử pi phải đợi cho đến khi mức của cây khung Tj là Lj
Li.
Quá trình tìm kiếm liên kết ngoài có trọng số tối thiểu ở mỗi cây khung, và trộn các cây khung vào nhau, diễn ra cho đến khi trên mạng chỉ còn một cây khung duy nhất, tác tử làm chủ cây khung này chính là thủ lĩnh.
Tác tử thủ lĩnh sẽ duyệt trên cây khung của nó để thu thập và truyền bá thông tin cho các tác tử khác.
Ý nghĩa của việc dùng số hiệu mức để sát nhập các cây khung vào nhau là nhằm đảm bảo tính đúng đắn của giải thuật, vì khi hai cây khung sát nhập vào nhau, số hiệu mức của cây khung mới sẽ tăng so với hai cây khung ban đầu, việc cập nhật lại thông tin tại các nút trong cây khung mới, sẽ được thực hiện lần lượt theo bước duyệt của các tác tử, nên sẽ có nút chưa cập nhật thông tin kịp về cây khung mới. Việc sát nhập cây khung Ti với cây khung có số hiệu mức lớn hơn hoặc bằng Tj, luôn đảm bảo rằng, tác tử pi xác định chính xác liên kết MOLi dẫn tới cây khung Tj.
Cấu trúc dữ liệu: Để vận dụng ý tưởng của giải thuật xây dựng cây khung tối thiểu GHS83, cấu trúc dữ liệu được thiết kế như sau:
+ Ban đầu, mỗi tác tử pi duyệt DFS để thu nạp các nút vào cây khung của nó dựa theo luật đến trước - thu nạp trước, các cây khung mà mỗi tác tử xây dựng không có nút chung. Gọi Ti là cây khung của pi.
+ Nhãn (min{id(u), id(v)}, max{id(u), id(v)}) được gán cho mỗi liên kết euv là trọng số, trong đó id(u) là định danh của nút u. Hai nhãn (u1, v1) và (u2, v2) được so sánh theo tứ tự từ điển, đó là, (u1, v1) < (u2, v2) u1 < u2 (u1 = u2 v1 < v2).
+ Một liên kết ngoài tối thiểu của cây khung Ti là liên kết có trọng số bé nhất kết nối một nút trong Ti và một nút trong cây khung khác. Ký hiệu MOLi (Minimum Outgoing Link) là liên kết ngoài tối thiểu của cây khung Ti.
+ Li là mức của cây khung Ti, khi tác tử pi khởi tạo cây khung Ti của nó, Li được khởi tạo bằng 0, Li sẽ được xác định qua việc trộn cây khung Ti với cây khung Tj khác theo luật được trình bày chi tiết trong giải thuật 4.5.1-2.
+ Bảng trắng của mỗi nút v trong cây khung Ti lưu các thông tin sau:
Định danh id(pi) của tác tử ứng viên pi là chủ cây khung Ti (chính là định danh của cây khung Ti).
Mức Li của cây khung Ti.
Bảng mô tả các liên kết kề cận của nút là phần tử dạng (link, weight, state), state nhận một trong ba giá trị là: branch, rejected, basic.
Cạnh ngoài có trọng số tối thiểu MOLi của cây khung Ti.
Biến unusedv lưu danh sách các liên kết liên thuộc v có trạng thái basic
được sắp theo thứ tự tăng dần.
+ Mỗi tác tử pi có thông in riêng infoi, có vùng nhớ lưu thông tin của các tác tử khác trong mạng, vùng nhớ lưu thông tin thao tác trong giải thuật, id(pi) ghi định danh của nó, Li ghi mức của cây khung Ti, MOLi ghi cạnh liên kết ngoài có trọng số tối thiểu của cây khung Ti, root_nodei là gốc của cây khung Ti, biến subtreei lưu cây khung Ti.
Giải thuật: Giải thuật được chia làm ba đợt (giải thuật 4.5.1-2). Đợt đầu tiên, mỗi tác tử duyệt DFS để xây dựng cây khung cho nó, tác tử thu nạp các nút vào cây khung của nó theo luật đến trước thu nạp trước. Tiếp theo là đợt bầu chọn tác tử thủ lĩnh, đợt này vận dụng ý tưởng giải thuật xây dựng cây khung phân tán GHS83. Cuối cùng là đợt truyền bá thông tin, tác tử thủ lĩnh duyệt cây khung của nó để thu thập và phát tán thông tin cho tất cả các tác tử còn lại.
Khởi tạo cây khung:
+ Xây dựng cây khung Ti của tác tử pi: mỗi tác tử pi duyệt DFS để thu nạp các nút vào cây khung của nó dựa theo luật đến trước - thu nạp trước, các cây khung mà mỗi tác tử xây dựng không có nút chung. Gốc root_nodei của cây khung Ti được khởi tạo là là nút nhà của tác tử pi. Trong quá trình pi di chuyển để xây dựng cây khung Ti, ban
đầu tác tử pi khởi tạo thông tin vào bảng trắng của nút gốc root_nodei, khi pi di chuyển từ nút u sang nút v, nó thiết lập trạng thái các liên kết (u,v) thuộc tập liên kết kề v theo quy tắc sau:
- Nếu uTi, định danh cây khung trên v là NULL, pi khởi tạo thông tin trên bảng trắng của v, thiết lập trạng thái cạnh (v, u) trên v là branch, tức (u, v) là một cạnh thuộc cây khung, subtreei = subtreei (v, u).
- Nếu u,v Ti, và (u, v) subtreei, pi thiết lập trạng thái cạnh (v, u) trên v là
branch.
- Nếu u,v Ti, và (u, v) subtreei, pi thiết lập trạng thái cạnh (v, u) trên v là
rejected.
- Nếu uTi, vTi, pi không làm gì trên v. - Nếu uTi, vTi, pi không làm gì trên v. + Khởi tạo mức của vùng Ti là Li = 0
+ Bảng trắng của mỗi nút v trong vùng Ti được pi ghi các thông tin sau: - Định danh id(pi) của tác tử (chính là định danh của cây khung Ti) - Mức Li = 0 của Ti.
- Bảng mô tả các liên kết kề cận của mỗi nút trong cây khung Ti. - Cạnh ngoài có trọng số tối thiểu MOLi = NULL của cây khung Ti.
Đợt bầu chọn thủ lĩnh:
Lặp đến khi chỉ còn một cây khung duy nhất:
+ Tác tử pi tìm cạnh có trọng số bé nhất MOLi trong cây khung Ti: - Khởi tạo MOLi của pi là NULL, subtreei = root_nodei.
- Tác tử pi duyệt DFS toàn bộ cây khung Ti, tác tử pi từ u chọn (u, v) có trạng thái
branch, thực hiện di chuyển tới v, nếu (u, v) subtreei, thì subtreei = subtreei (u, v).
- Đến mỗi nút v, pi ghi định danh id(pi), mức Li, cạnh ngoài MOLi = NULL lên bảng trắng của nút v. Tác tử pi tìm cạnh ngoài có trọng số bé nhất cục bộ của v như sau:
Tác tử pi chọn cạnh tiếp theo (v, u) từ unusedv và di chuyển đến nút u. Khi di chuyển đến hàng xóm u của v, pi đọc định danh và mức ghi trên bảng trắng của u. Xảy ra các trường hợp sau:
Nếu định danh cây của v bằng định danh cây của u, u và v cùng thuộc
Ti, pi thiết lập trạng thái euv là rejected trên u, xóa cạnh euv khỏi danh sách unusedu, sau đó pi sẽ quay trở về v, nó thay đổi trạng thái euv trên bảng trắng của v là rejected, đồng thời xóa evu từ danh sách unusedv.
Ngược lại, nếu định danh cây của v khác với định danh cây của u, giả sử uTj.
1. Nếu Lj Li, euv là liên kết ngoài có trọng số tối thiểu cục bộ của v. Khi pi trở về v, nếu MOLi = NULL, pi thiết lập biết
MOLi = euv, ngược lại nếu trọng số của euv bé hơn MOLi, pi
thiết lập MOLi = euv , kết thúc quá trình tìm kiếm liên kết ngoài có trọng số tối thiểu tại v.
2. Nếu ngược lại, pi đợi tại nút u cho đến khi LjLi. - Tác tử pi quay trở về nút gốc root_nodei, xảy ra các trường hợp sau:
MOLi = NULL, tác tử pi không tìm được MOLi, chứng tỏ Ti là cây khung còn lại duy nhất bao trùm tất cả các nút trong mạng, pi chính là tác tử thủ lĩnh cần tìm, kết thúc đợt bầu chọn.
MOLi NULL, tác tử pi tìm thấy liên kết euv là MOLi, trong đó v, u là các nút của cây khung Ti và Tj (i j) tương ứng, v chính là gốc mới của cây khung Ti, pi thiết lập root_nodei = v, pi xác định đường đi tới v thông qua
subtreei, pi di chuyển đến v, cập nhật trên bảng trắng của v MOLi = euv, pi
thực hiện bước di chuyển đến u. + Kết hợp các cây khung với nhau:
- Khi pi tìm thấy liên kết euv là MOLi, trong đó v, u là các nút của cây khung Ti và
Tj (i j) tương ứng, pi thiết lập liên kết evu là branch trên bảng trắng của v, pi di chuyển từ v đến u và đọc mức Lj, MOLj ghi trên bảng trắng của u, pi thiết lập liên kết euv là branch trên bảng trắng của u. Xảy ra các trường hợp sau:
Nếu Li < Lj, cây khung Tj sẽ nuốt cây Ti và trở thành cây khung mới Tj, cây khung mới có tác tử chủ pj và mức Lj. Tác tử pi sẽ duyệt toàn bộ cây khung
Ti để ghi định danh id(pj), và mức Lj lên bảng trắng của mỗi nút.
Nếu Li = Lj và MOLi = MOLj, khi đó Ti và Tj được trộn vào nhau. Không mất tính tổng quát, giả sử id(pi) id(pj), pi là chủ của cây khung mới Ti (Ti
đã nuốt Tj), tự cập nhật số hiệu mức lên Li + 1 và khởi tạo lần lặp mới trên cây khung mới Ti, tác tử pj duyệt cây khung mới và cập nhật id(pi), Li + 1