c7 bfs tree, mst
DESCRIPTION
Copy!TRANSCRIPT
Cây khung (spanning tree)
Đồ thị vô hướng G = {V,E} Cây khung G’ của đồ thị G
Đồ thị con G’ = {V, E’} Phủ tất cả các đỉnh của G Liên thông |E’| = |V| - 1
Cây khung (spanning tree)
Ứng dụng Broadcast, convergecast, routing,…
Một số cây khung đặc biệt BFS DFS MST
Xây dựng cây khung
Giải thuật phân tán Input: định danh của các nút/tiến trình láng giềng trong
đồ thị kết nối Output: định danh của nút cha
Giải thuật Flooding
Giải thuật Flooding xây dựng cây khung Nút gốc phát tán thông tin (gửi thông điệp) tới các nút
còn lại Mỗi nút lần đầu tiên nhận được thông điệp sẽ xác định
nút cha là nút gửi thông điệp, sau đó lan truyền thông điệp nhận được tới các nút láng giềng còn lại
Sau lần nhận thông điệp đầu tiên, bỏ qua các thông điệp khác gửi đến
Giải thuật Flooding
Nhận xét Xây dựng được cây khung với điều kiện mạng kết nối là
liên thông Điều kiện dừng
Về nguyên tắc, mỗi nút có thể dừng ngay sau khi nhận được thông điệp đầu tiên và lan truyền nó tới các nút láng giềng
Tuy nhiên, nếu tiến trình dừng theo cách này thì có thể xảy ra tình huống các tiến trình láng giềng khác gửi thông điệp tới mà không có tiến trình nhận, trạng thái dừng toàn cục không được xác định
Giải pháp 1. Bỏ qua lỗi gửi thông điệp khi không có tiến trình nhận (trạng thái dừng toàn cục cũng chưa được xác định)
Giải pháp 2. Xác định điều kiện dừng toàn cục và lan truyền điều kiện dừng tới các nút trong mạng.
Giải thuật Flooding
Giải thuật sửa đổi Thiết kế theo cơ chế sự kiện
Trạng thái tiến trình status: {in, out} parent children N (số tiến trình đã trả lời)
Khởi tạo Nút gốc:
status = in, parent = pid, chidren = {}, n = 0 Gửi thông điệp CONNECT tới các tiến trình hàng xóm
Nút khác status = out, parent = nil, chidren = {}, n = 0
Giải thuật Flooding
Giải thuật sửa đổi Thiết kế theo cơ chế sự kiện
Khi nhận được thông điệp CONNECT từ tiến trình p Nếu status = in, gửi thông điệp REJECT đến p Nếu status = out
status = in, parent = p Gửi thông điệp CONNECT đến các tiến trình hàng xóm (trừ tiến trình p) Nếu không có tiến trình hàng xóm nào khác, gửi thông điệp ACCEPT đến tiến
trình p
Giải thuật Flooding
Giải thuật sửa đổi Thiết kế theo cơ chế sự kiện
Khi nhận được thông điệp ACCEPT/REJECT từ tiến trình p Nút gốc:
N = n + 1 Nếu n = số lượng hàng xóm, gửi thống điệp TERMINATE tới các children và
kết thúc Nút khác:
N = n + 1 Với thông điệp ACCEPT, thêm p vào children Nếu n = số lượng hàng xóm – 1, gửi thông điệp ACCEPT đến parent
Giải thuật Flooding
Giải thuật sửa đổi Thiết kế theo cơ chế sự kiện
Khi nhận được thông điệp TERMINATE từ tiến trình p Gửi thông điệp TERMINATE tới các chidren và kết thúc
Cây khung BFS
Là cây khung có một nút gốc xác định Các nút con của nút gốc là láng giềng của nút gốc Các nút cháu của nút gốc là láng giềng của láng
giềng của nút gốc V.v
Cây khung BFS
Giải thuật Flooding chỉ có thể tạo ra được cây khung BFS trong trường hợp mạng đồng bộ (quá trình gửi/nhận của từng nút được thực hiện trong từng pha đồng bộ)
Trong trường hợp mạng không đồng bộ, tính chất BFS có thể bị phá vỡ do độ trễ của quá trình truyền thông/xử lý
Cây khung BFS
Giải thuật BFS trên mạng không đồng bộ Ý tưởng: Việc xây dựng cây BFS có thể được thực hiện
theo nhiều bước. Bước thứ i kết nạp các nút có độ sâu i + 1 vào cây khung Dijkstra: kết nạp các nút “biên” Bellman-Ford: Cập nhật nút cha theo khoảng cách tối ưu
Cây khung BFS
Giải thuật BFS trên mạng không đồng bộ Ý tưởng: Việc xây dựng cây BFS có thể được thực hiện theo nhiều bước. Bước thứ i kết
nạp các nút có độ sâu i + 1 vào cây khung. Gọi cây Tk là cây được sử dụng ở bước thứ k. T1 là cây chỉ có nút gốc
Giải thuật Dijkstra Nút gốc khởi tạo pha p bằng cách quảng bá thông điệp “start p” tới các nút trong cây Tp Lá của cây Tp (các nút được phát hiện trong pha trước) gửi “start p+1” đến các nút láng giềng
chưa từng giao tiếp Nút v lần đầu nhận được thông điệp “start p+1” sẽ trở thành lá của cây Tp+1 (đánh dấu nút
cha), gửi thông điệp trả lời “ack” cho nút cha. Nếu đã nhận được thông điệp “start p+1” thì trả lời “nack”
Lá của cây Tp thu thập tất cả các thông điệp trả lời và gửi về nút gốc (convergecast) để có thể bắt đầu bước tiếp theo
Giải thuật kết thúc khi không có nút mới được kết nạp
Giải thuật BFS
Giải thuật Dijkstra Thiết kế theo cơ chế sự kiện
Trạng thái tiến trình status: {inner, leaf, outer} parent children N (số tiến trình đã trả lời)
Khởi tạo Nút gốc:
status = leaf, parent = pid, chidren = {}, n = 0 Gửi thông điệp START tới các tiến trình láng giềng
Nút khác status = outter, parent = nil, chidren = {}, n = 0
Giải thuật BFS
Giải thuật Dijkstra Khi nhận được thông điệp START từ tiến trình p
Nếu status = inner m = 0 // Đếm số tiến trình trả lời trong CONVERGE nl = 0 // Đếm số nút lá mới kết nạp gửi thông điệp START đến các tiến trình trong children
Nếu status = leaf n = 0 // đếm số nút trả lời Gửi thông điệp CONNECT đến các tiến trình hàng xóm (trừ tiến trình p) Nếu không có tiến trình hàng xóm nào khác, gửi thông điệp CONVERGE 0 đến
tiến trình p
Giải thuật BFS
Giải thuật Dijkstra Khi nhận được thông điệp CONNECT từ tiến trình p
Nếu status = outer status = leaf, parent = p Trả về thông điệp ACCEPT cho tiến trình p
Nếu status <> outer Trả về thông điệp REJECT cho tiến trình p
Giải thuật BFS
Giải thuật Dijkstra Khi nhận được thông điệp ACCEPT/REJECT từ tiến trình p
Nếu status = leaf n = n + 1 Nếu thông điệp là ACCEPT, bổ sung p vào danh sách children Nếu n = số láng giềng – 1 // đã nhận đủ phản hồi từ các láng giềng
status = inner gửi thông điệp CONVERGE m tới p với m là số tiến trình trong children
Giải thuật BFS
Giải thuật Dijkstra Khi nhận được thông điệp CONVERGE k từ tiến trình p
m = m + 1 nl = nl + k Nếu m = số tiến trình con trong children
Nếu là tiến trình gốc (id = parent) và nl = 0 Gửi thông điệp TERMINATE tới các tiến trình con trong children Kết thúc
Nếu là tiến trình gốc và nl <> 0 m = 0, nl = 0 Gửi thông điệp START đến các tiến trình con trong children
Nếu không phải tiến trình gốc gửi thông điệp CONVERGE nl tới parent
Giải thuật BFS
Giải thuật Dijkstra Khi nhận được thông điệp TERMINATE từ tiến trình p
Gửi thông điệp TERMINATE tới các tiến trình con trong children Kết thúc
Cây khung BFS
Giải thuật BFS trên mạng không đồng bộ Giải thuật Dijkstra
Độ phức tạp thời gian: O(D2) do chi phí của convergecast là O(D) với D là đường kính của đồ thị, có tối đa D pha
Độ phức tạp thông điệp: O(m+nD) với m là số cung, n là số nút Chi phí gửi thông điệp của convergecast là O(n) Với mỗi cung có tối đa hai thông điệp “start” và 1 thông điệp “ack/nack”
Cây khung BFS
Giải thuật BFS trên mạng không đồng bộ Giải thuật Bellman-Ford
Mỗi nút u lưu trữ một giá trị du là khoảng cách tới nút gốc. Ban đầu dr = 0 và du=∞ cho các nút còn lại
Gốc gửi thông điệp “1” tới các láng giềng Nếu một nút nhận được thông điệp “y” và y <du
du = y
Đổi nút cha Gửi “y+1” đến các láng giềng khác
Cây khung BFS
Giải thuật BFS trên mạng không đồng bộ Giải thuật Bellman-Ford
Độ phức tạp thời gian: O(D) – Tốt hơn so với giải thuật Dijkstra Độ phức tạp thông điệp O(mn) – Kém hơn so với giải thuật Dijkstra
Cây khung nhỏ nhất (MST)
Đồ thị có trọng số G = <V,E> trong đó mỗi cung e ϵ E có trọng số w(e)
1
92
14
8
6
310 115
7
164
15
13
12
6)( ew
17
18
Cây khung nhỏ nhất (MST)
Cây khung nhỏ nhất là cây khung có tổng trọng số của các cung là nhỏ nhất
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Cây khung nhỏ nhất (MST)
Mảnh (fragment) của cây khung là một cây con (liên thông) của cây khung
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Cây khung nhỏ nhất (MST)
Cung ra nhỏ nhất (minimum weight outgoing edge – MWOE) của một mảnh là cung kề với mảnh, không tạo thành chu trình và có trọng số nhỏ nhất
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Cây khung nhỏ nhất (MST)
Tính chất 1. Thêm một MWOE vào một mảnh của cây khung MST sẽ thu được một
mảnh của cây MST (có thể khác) Tính chất 2.
Nếu trọng số của các cung đều khác nhau thì chỉ có duy nhất 1 MST
Giải thuật PRIM (tuần tự)
Bắt đầu xây dựng cây khung với một mảnh là 1 nút nào đó Kết nạp dần các MWOE vào mảnh cho tới khi không thêm được nữa
Giải thuật PRIM (tuần tự)
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật PRIM (tuần tự)
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật PRIM (tuần tự)
1
92
14
8
6
310 115
4
15
13
12
18
7
16
Giải thuật PRIM (tuần tự)
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật PRIM (phân tán)
Bắt đầu với một mảnh là một nút gốc r Lần lượt kết nạp các MWOE
Nút gốc khởi động quá trình tìm kiếm MWOE Broadcast tới các nút lá Các nút lá tìm MWOE cục bộ trong các láng giềng Các nút lá convergecast về nút gốc để lựa chọn MWOE
Nút gốc thông báo việc bổ sung thêm MWOE vào mảnh
Giải thuật PRIM (phân tán)
Trạng thái status : {in, out} parent children mwoe : thông tin về mwoe cục bộ
next: nút kế tiếp dẫn đến mwoe cục bộ ưeight: trọng số của mwoe
Khởi tạo Nút gốc
status = in parent = root, children = {} mwoe.next = nil Nút gốc gửi thông điệp SEARCH đến chính nó
Nút khác status = out parent = nil, children = {}
Giải thuật PRIM (phân tán)
Nhận thông điệp SEARCH từ nút p Nếu status = in // Các nút trong mảnh
n = 0, mwoe .next = nil, mwoe.weight = INFINITY Gửi thông điệp SEARCH tới các nút hàng xóm (trừ nút cha) Nếu không có nút hàng xóm nào,
Nếu là nút gốc, kết thúc với một nút trong cây khung Nếu không phải là gốc, gửi thông điệp MWOE(INFINITY) tới nút cha
Nếu status = out // Nút ngoài mảnh Gửi thông điệp MWOE(w(p,id)) đến p
Giải thuật PRIM (phân tán)
Nhận thông điệp MWOE(w) từ nút p n = n +1 mwoe = min(mwoe, (p,w))
min(mwoe,(_,INFINITY)) = mwoe min((_,INFINITY),mwoe) = mwoe min((n1,w1),(n2,w2)) = (n1,w1) nếu w1 < w2 min((n1,w1),(n2,w2)) = (n2,w2) nếu w1 >= w2
Nếu n = số hàng xóm -1 Nếu là nút gốc và mwoe.next = nil
Gửi thông điệp TERMINATE tới các nút con trong children
Nếu là nút gốc và mwoe.next <> nil Gửi thông điệp CONNECT tới mwoe.next
Nếu không phải là gốc Gửi thông điệp MWOE (mwoe.weight) tới nút cha
Giải thuật PRIM (phân tán)
Nhận thông điệp CONNECT từ nút p Nếu status = out // Nút mới kết nạp
status = in, parent = p, children = {} Gửi thông điệp CONNECT ED tới p
Nếu status = in Gửi thông điệp CONNECT đến mwoe.next
Giải thuật PRIM (phân tán)
Nhận thông điệp CONNECTED từ nút p Thêm p vào danh sánh children (nếu chưa có) Nếu là nút gốc
Gửi thông điệp SEARCH đến chính nó
Nếu không phải nút gốc Gửi thông điệp CONNECTED đến nút cha
Giải thuật PRIM (phân tán)
Nhận thông điệp TERMINATE từ nút p Gửi thông điệp TERMINATE đến các nút con trong children Dừng tiến trình
Giải thuật PRIM (phân tán)
Độ phức tạp tính toán của giải thuật O(N2)
Giải thuật Kruskal (Tuần tự)
Ban đầu mỗi nút là một mảnh Hợp nhất các mảnh
Tìm MWOE nhỏ nhất của các mảnh Hợp nhất hai mảnh kề với MWOE
Giải thuật Kruskal (Tuần tự)
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật Kruskal (Tuần tự)
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật Kruskal (Tuần tự)
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật Kruskal (Tuần tự)
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật Kruskal (Tuần tự)
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật GHS(Gallagher, Humblet, Spira)
Ban đầu mỗi nút là một mảnh Hợp nhất các mảnh theo các bước đồng bộ
Mỗi mảnh tìm MWOE của mình (đồng bộ bởi gốc của từng mảnh) Các mảnh kề với MWOE được hợp nhất lại
Giải thuật GHS
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Pha 0: Khởi tạo – Mỗi nút là một mảnh
Giải thuật GHS
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Pha 1. Tìm kiếm MWOE cho mỗi mảnh
Giải thuật GHS
1
92
14
8
6
310 115
4
15
13
12
17
18
Root
RootRoot
Root
Asymmetric MWOE
Symmetric MWOE
Pha 1. Hợp nhất các mảnh kề với MWOE và chọn gốc mới
Giải thuật GHS
Pha 2. Tìm kiếm MWOE Cho mỗi mảnh
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật GHS
Pha 2. Hợp nhất các mảnh kề với MWOE và chọn gốc mới
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16Root
Root
Giải thuật GHS
Pha 3. Tìm kiếm MWOE Cho mỗi mảnh
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật GHS
Pha 3. Hợp nhất các mảnh kề với MWOE và chọn gốc mới
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Root
Giải thuật GHS
CÂY MST thu được
1
92
14
8
6
310 115
4
15
13
12
17
18
7
16
Giải thuật GHS(Gallagher, Humblet, Spira)
Nguyên lý hợp nhất các mảnh Các mảnh kề với MWOE được hợp nhất với nhau Một trong hai nút đầu của MWOE đối xứng sẽ được lựa chọn làm gốc của
mảnh mới
Cách thức thực hiện Mỗi mảnh có định danh là (core, level)
core định danh của nút gốc (khởi tạo là pid) level thể hiện mức ưu tiên của mảnh
Khi mảnh F1 phát hiện một cung MWOE đi tới mảnh F2 Nếu F1.level < F2.level, mảnh F1 sẽ hợp nhất với F2 (core và level của F1 sẽ thay bằng core và
level của F2) Nếu F1.level = F2.level, hai mảnh F1 và F2 sẽ hợp nhất với nhau để thành một mảnh mới với core
là định danh lớn nhất trong hai đầu mút của cung MWOE và level = F1.level + 1 Nếu F1.level > F2.level, F1 sẽ chờ đến khi một trong hai điều kiện trên thỏa mãn