C7 bfs tree, mst

Preview:

DESCRIPTION

Copy!

Citation preview

TÍNH TOÁN PHÂN TÁN

Nguyễn Hữu Đức (ducnh@soict.hust.edu.vn)Bộ môn HTTT, Viện CNTT & TT

Xây dựng cây khung

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