Giải thuật đa cây BFS xây dựng cho mỗi nút trong mạng một cây BFS cả có gốc tại nút đó. Một đồ thị có thể có nhiều hơn một cây BFS có gốc tại cùng một nút. Cây BFS cả tại gốc P là cây BFS có gốc tại P mà mỗi nút Q tại khoảng cách j+1 đến P, có nhiều hơn một láng giềng có khoảng cách j đến P, chọn láng giềng có định danh lớn nhất trong số
dụng cây BFS út thay cho cây BFS cả.
Thực hiện hợp lệ là thực hiện mà mọi cấu hình trong nó đều tạo cho mỗi nút P cây BFS cả có gốc tại P trong thành phần liên thông chứa P. Nhiệm vụ của giải thuật BFS được xác định bởi tập các thực hiện hợp lệ LR.
Mỗi nút P sử dụng tabP[1:N], mỗi phần tử của tabP[1:N] có dạng <id, dis, f>, trong đó id và f nhận một trong các giá trị {0, …, 2k}, dis nhận một trong các giá trị {0, …, N}. Khi hệ thống ổn định, với mọi i, 1 i N:
tabP[i].id – Định danh của một nút, gọi là U
tabP[i].dis – Khoảng cách từ P đến U
tabP[i].f – Nút cha của P trên cây BFS cả có gốc tại U.
Để lưu bảng định tuyến nhận được lần cuối cùng từ láng giềng Q, P sử dụng
internal_tabPQ[1:N], có cấu trúc như tabP.
Giải thuật (cho nút P):
Mỗi bộ xử lý P xây dựng cây BFS cả được định danh bằng idP.
Khi P nhận được một thông báo từ láng giềng Q chứa tabQ, với mỗi bộ <id, dis, f> thuộc tabQ, P lưu một bộ <id, min(dis+1, N), idQ> vào internal_tabPQ.
Khi thực hiện bước phát tỏa nguyên tử, P xây dựng tabP rồi gửi tabP đến các láng giềng. tabP được xây dựng như sau:
a) tabP[1] = <idP, 0, 0>.
b) Gọi internal_tabP là tập tất cả các bộ thuộc internal_tabP* có id khác idP. Với mỗi định danh idQ, trong số các bộ thuộc internal_tabP có id bằng idQ, những bộ có dis nhỏ nhất được xem xét và giữ lại bộ có f lớn nhất.
c) Nếu số bộ trong internal_tabP sau khi thực hiện loại bỏ ở bước b) nhỏ hơn hoặc bằng N-1, P chọn tất cả các bộ thuộc internal_tabP để đưa vào tabP[2:N]. Ngược lại, P sắp xếp các bộ thuộc internal_tabP theo thứ tự không giảm dis rồi chọn N-1 bộ đầu tiên.
d) Nếu số bộ được chọn qua ba bước a), b) và c) còn nhỏ hơn N, P đưa các bộ trống (0,N,0) vào các phần tử cuối của tabP.
Chi tiết giải thuật được cho trong Hình 4.
Khi nhận được tabQ từ nút láng giềng Q:
For i := 1 to N
internal _tabPQ[i].id := tabQ[i].id
internal _tabPQ[i].dis := min(tabQ[i].dis + 1, N) internal _tabPQ[i].f := idQ
Khi thực hiện phát tỏa:
tabP[1] := <idP, 0, 0>
internal_tabP := {e: e internal_tabP*, e.id idP} Với mỗi t1, t2 internal_tabP mà t1.id = t2.id Nếu t1.dis > t2.dis thì loại bỏ t1
Ngược lại, nếu t1.dis < t2.dis thì loại bỏ t2 Ngược lại (t1.dis = t2.dis)
Nếu t1.f > t2.f thì loại bỏ t2
Ngược lại (t1.f < t2.f) thì loại bỏ t1
Nếu | internal_tabP| N
Sắp xếp các phần tử trong internal_tabP theo thứ tự không giảm dis For i := 1 to N-1
tabP[i+1] := internal_tabP[i] Ngược lại
For i := 1 to | internal_tabP|
tabP[i+1] := internal_tabP[i] For i := | internal_tabP| + 2 to N
tabP[i] := <0, N, 0> Gửi tabP cho tất cả láng giềng.
Hình 4. Giải thuật đa cây BFS của Shlomi Dolev.
Chúng ta sẽ chứng minh giải thuật đạt đến cấu hình an toàn sau 2d+1 vòng, trong đó d là đường kính thực sự của mạng. Chúng ta sử dụng các khái niệm của tự ổn định đã được giới thiệu trong Chương 2.
(1)tabP[1] = <idP, 0, 0>
(2)j, 2 ≤ j ≤ N, và với mọi láng giềng Q, internal_tabPQ[j].dis > 0.
Chứng minh. Khẳng định thứ nhất của bổ đề rõ ràng đúng vì P gán tabP[1] = <idP,0,0)> tại mọi bước phát tỏa nguyên tử. Khẳng định thứ hai cũng đúng vì dis không âm và được tăng một khi thực hiện gán vào internal_tabP* trên P. ■
Gọi định danh trôi trong một số cấu hình c là định danh xuất hiện trong các bộ thuộc
internal_tab** hoặc trong các bộ thuộc thông báo đang gửi mà không có bộ xử lý có định danh như vậy trong cùng thành phần liên thông. Gọi bộ trôi là những bộ chứa định danh trôi.
Để chứng minh hệ thống ổn định sau O(d) vòng, đầu tiên chúng ta chứng minh giá trị
dis nhỏ nhất của các bộ trôi tăng sau mỗi vòng.
Bổ đề 4.2. Trong mọi thực hiện, sau d+1 vòng đầu tiên, mọi bộ trôi có dis không nhỏ hơn d.
Chứng minh. Gọi idF(c) là định danh trôi trong cấu hình đầu tiên c. Xét thành phần liên thông tại đó idF(c) là định danh trôi. Mọi bộ có định danh idF(c) đều là bộ trôi.
Gọi disF(c) là dis nhỏ nhất trong bộ có định danh idF(c) trong c.
Mọi bộ với idF(c) nhận được trong vòng đầu tiên và được lưu vào trong internal_tab
với dis disF(c) + 1. Ngoài ra, mọi bộ được gửi đi trong vòng đầu tiên có dis disF(c). Vòng đầu tiên kết thúc khi có ít nhất một thông báo được gửi trên mỗi liên kết và được chuyển đến đích. Do vậy, cuối vòng thứ nhất, mọi bộ với idF(c) trong một intermal_tab
có dis disF(c) + 1. Mọi bộ được gửi trong vòng thứ hai có dis disF(c) + 1. Do vậy, cuối vòng thứ hai, mọi bộ với idF(c) trong một intermal_tab có dis disF(c) + 2. Tổng quát, mọi bộ được gửi trong vòng thứ i có dis disF(c) + i-1. Do vậy, cuối vòng thứ i, mọi bộ với idF(c) trong một intermal_tab có disdisF(c) + i. ■
Bổ đề 4.3. Gọi R’ là hậu tố của thực hiện R sau d+1 vòng đầu tiên. Với mọi i 1, sau i+1 vòng đầu tiên của R’, với mọi bộ xử lý P và Q, chúng ta có:
(a) Nếu Q ở khoảng cách lớn hơn i từ P, thì mọi bộ thuộc internal_tabQ* với idP có dis lớn hơn i.
(b) Nếu Q ở khoảng cách nhỏ hơn hoặc bằng i từ P, thì tồn tại bộ <idP, dis, f> trong internal_tabQ* thỏa mãn:
1. dis là khoảng cách từ Q đến P và
2. f là định danh của cha của Q trên cây BFS cả gốc tại P, và 3. Trong mọi phát tỏa tại Q, Q chọn bộ này để bao gồm vào tabQ.
Chứng minh. Chúng ta chứng minh theo quy nạp với i ≤ d, khoảng cách đến P.
Bước cơ sở, i = 1: Theo Bổ đề 4.1, các bộ có dis = 0 được truyền trong suốt vòng thứ hai chỉ có thể là các bộ với định danh là một láng giềng trực tiếp. Vì vòng thứ hai kết thúc sau khi ít nhất một thông báo được truyền đến đích qua mỗi liên kết, khẳng định (a) đúng với i = 1. Để chứng minh khẳng định (b), chú ý rằng bộ xử lý Q nhận một thông báo với
dis = 0 và định danh idP chỉ từ láng giềng P của nó.
Bước quy nạp: Giả sử sau i+1 vòng đầu tiên của R’, khẳng định (a) và (b) đúng với i. Chúng ta chứng minh rằng sau một vòng nữa, khẳng định (a) và (b) đúng với i+1.
Theo khẳng định (a) của giả thiết quy nạp, sau i+1vòng đầu tiên của R’, nếu Q, ở khoảng cách ít nhất i+1 từ P, gửi một bộ với idP thì dis của bộ đó ít nhất bằng i+1. Bộ xử lý U ở khoảng cách ít nhất i+2 từ P chỉ có các láng giềng ở khoảng cách ít nhất i+1 từ P. Ít nhất một thông báo được gửi trong vòng thứ i+2 đến U thông qua một liên kết liền kề. Do vậy, kết thúc vòng thứ i+2, mọi bộ thuộc internal_tabX* với idP có dis lớn hơn i+1. Lập luận tương tự cho vòng tiếp theo, ta có khẳng định (a) đúng với i+1.
Theo giả thiết quy nạp, sau i+1 vòng đầu tiên của R’, mọi bộ xử lý Q ở khoảng cách i hoặc nhỏ hơn từ P có một bộ trong internal_tabQ* có idP và dis bằng khoảng cách từ Q đến P. Hơn nữa, mọi bộ xử lý U trong khoảng cách i+1 hoặc lớn hơn nếu có bộ có idP
trong internal_tabU* thì có dis lớn hơn i.
Gọi U là một bộ xử lý bất kỳ ở khoảng cách i+1 đến P, Q là láng giềng của U, ở khoảng cách i đến P và có định danh lớn nhất. Trong vòng thứ i+2, U nhận được N bộ từ tất cả các láng giềng của nó. Cụ thể, U nhận được các bộ với idP và dis = i từ mọi láng giềng ở khoảng cách i, trong đó có Q. Theo giả thiết quy nạp, mọi bộ khác nhận được với
idP có dis i+1. Do vậy, U phải chọn bộ (idP, i+1, idQ) để đưa vào tabU. Để hoàn thành chứng minh, chúng ta cần phải chỉ ra rằng tabU có chỗ cho bộ (idP, i+1, idQ). Có nhiều
suốt R’, mọi bộ trôi có dis lớn hơn d. Do vậy, vì i+1 ≤ d, (idP, i+1, idQ) chắc chắn được U chọn để đưa vào tabU.
Có thể lập luận tương tự cho vòng tiếp theo, do vậy khẳng định (b) đúng. ■ Từ Bổ đề 4.3, chúng ta dễ dàng có hệ quả sau.
Hệ quả 4.1.Trong mọi cấu hình đạt được sau 2d+1 vòng, mỗi nút có cây BFS cả của mình.