THUẬT TOÁN TÍNH ĐỘ TRUNG GIAN

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu độ đo trung gian và thuật toán phát hiện cộng đồng trên mạng xã hội (Trang 29 - 33)

Để tính độ trung gian của các đỉnh, cạnh thường phải thực hiện qua 2 bước:

1. Tính độ dài và số đường đi ngắn nhất giữa các cặp đỉnh 2. Tính tổng tất cả các độ trung gian của các cạnh.

Công việc chính của quá trình này là phát hiện tất cả các đường đi ngắn nhất từ đỉnh tới gốc. Định nghĩa tập tiền tố của đỉnh v trên các đường đi ngắn nhất từ s như sau:

𝑃𝑠(𝑣) = {𝑢 ∈ 𝑉: {𝑢, 𝑣} ∈ 𝐸, 𝑑𝐺(𝑠, 𝑢) = 𝑑𝐺(𝑠, 𝑢) + 𝑤(𝑢, 𝑣)}. (1.11)

Bổ đề 1.1 (Tổ hợp của đường đi ngắn nhất) For s v ∈ V

𝐶𝐵(𝑣) = ∑𝑠≠𝑣≠𝑡∈𝑉𝛿𝑠𝑡(𝑣) (1.12)

Chứng minh. Theo giả thiết tất cả các trọng số đều là số dương, cạnh cuối của

đường đi ngắn nhất đi từ s tới v là cạnh (u, v) ∈ E sao cho dG(s, u <dG(s, v). Từ Bổ đề 1.1 suy ra, số đường đi ngắn nhất đi từ s tới v kết thúc bằng cạnh này đúng bằng số đường đi ngắn nhất đi từ s tới u.

Sự phụ thuộc của s ∈ V vào một đỉnh v ∈ V , được định nghĩa như sau: 𝛿𝑠(𝑣) = ∑ 𝛿𝑠𝑡(𝑣)

𝑡∈𝑉

Bổ đề 1.2 Nếu tồn tại đúng một đường đi ngắn nhất đi từ s ∈ V tới mọi đỉnh t

∈ V, thì sự phụ thuộc của s vào v ∈ V sẽ là

Để thực hiện thuật toán tính độ đo trung gian của các đỉnh trên đồ thị một cách hiệu quả, người ta thường sử dụng phương pháp duyệt theo chiều rộng BFS (Breadth-First Search) [11].

Thuật toán duyệt theo chiều rộng tìm kiếm các đường đi ngắn nhất từ đỉnh gốc qua các cạnh tới tất cả các đỉnh khác trong đồ thị. Các cạnh giữa các mức của quá trình duyệt BFS bắt đầu từ đỉnh gốc X sẽ tạo thành đồ thị định hướng, phi chu trình, được gọi DAGX. Brandes đề xuất thuật toán duyệt theo chiều rộng [21] bắt đầu từ mỗi đỉnh x  V và tính độ đo trung gian của các cạnh trên đồ thị DAGx. Với mỗi đỉnh v trên DAGx, khoảng cách của đỉnh v đến gốc x, được ký hiệu là dv, là số các cạnh trên đường đường đi ngắn nhất từ x đến v. Thuật toán nhanh xác định trung tâm của độ trung gian FABC (Faster Algorithm for Betweenness Centrality) trên đồ thị không có trọng số [5] được thực hiện như sau.

Thuật toán FABC: Thuật toán thực hiện 4 bước.

Bước 1 – Khởi tạo giá trị biến chung

CB[r] ← 0, r ∈ V ; for r ∈ V do{

Bước 2 – Khởi tạo biến cục bộ

S ← empty stack; Q ← empty queue; P [w] ← empty list, w ∈ V ;

σ[t] ← 0, t ∈ V ; σ[r] ← 1; d[t] ← ∞, t ∈ V ; d[r] ← ∞; enqueue r → Q;

Bước 3 – Duyệt theo BFS

while Q not empty do{ dequeue v ← Q;

push v → S;

for all neighbor w of v do{ // w được tìm thấy lần đầu

if d[w] = ∞ then { enqueue w → Q; d[w] ← d[v] + 1;} if d[w] = d[v] + 1 then { σ[w] ← σ[w] + σ[v]; append v → P [w]; } }

Bước 4 – Tích lũy vào CB

δ[v] ← 0, v ∈ V ; while S not empty do

pop w ← S;

for all v ∈ P [w] do {

δ[v] ← δ[v] +σ[v]/σ[w](1 + δ[w]); if w != r then

}

Sau phần khởi tạo các giá trị cho mảng CB[v], v  V, stack S, và 3 mảng bổ sung. Mảng σ xác định số đường đi ngắn nhất từ mỗi đỉnh tới gốc r của cây các đường đi ngắn nhất, mảng d đo khoảng cách của mỗi đỉnh từ gốc cây BFS. Đối với đồ thị không có trọng số, đây chính là số cạnh cực tiểu giữa mỗi đỉnh và gốc của cây. Ban đầu, khoảng cách của các đỉnh và gốc đều gán bằng ∞. Mảng P, là danh sách liên kết, mỗi đỉnh v là một danh sách liên kết P[v], chứa tất cả các đỉnh đứng trước v trong cây duyệt theo chiều rộng BFS. Bước 3 và Bước 4 là các thành phần chính của thuật toán.

Bước 3 duyệt theo chiều rộng BFS từ gốc cho trước để tìm đường đi ngắn nhất tới tất cả các đỉnh khác. Trong bước này, mỗi phần tử được đặt vào một hàng đợi khi nó được tìm thấy. Khi duyệt theo chiều rộng, khoảng cách từ gốc s tới từng đỉnh v được tính. Với mỗi đỉnh v được tìm thấy trong lần duyệt BFS sẽ tương ứng với một danh sách các đỉnh cha, những đỉnh gần gốc hơn. Tất cả những đường đi ngắn nhất đi qua đỉnh cha của các đỉnh v và những đỉnh này được tích lũy vào σ[v].

Ở công thức (1.7), σst(v) xác định số đường đi ngắn nhất đi từ s đến t mà có qua v và σst là số đường đi ngắn nhất đi từ s đến t. Nếu không có đường đi ngắn nhất đi từ s đến t và qua v thì σst(v) = 0.

Bước 4 tính độ trung gian CB (betweenness centrality) kỹ thuật tích lũy phụ thuộc (dependency accumulation technique) của Brandes [5].

Trong [5] đã chứng minh được quan hệ sau: 𝛿𝑠(𝑣) = ∑ 𝜎𝑠𝑣

𝜎𝑠𝑤

Từ đó suy ra rằng không cần thiết phải tính lâu hơn tổng của tất cả các phụ thuộc cặp như quan hệ đệ qui. Ngoài ra ở đây có thể tính δs(w), thông qua thuật toán tìm đường đi ngắn nhất từ gốc s đến một đỉnh còn lại của đồ thị.

Phân tích độ phức tạp

Kích thước bộ nhớ của stack, queue và các mảng σ và d là O(|V| ), nghĩa là cỡ của các cấu trúc bổ sung được giới hạn bằng số đỉnh V của đồ thị. Bộ nhớ cần thiết cho mảng liên kết được giới hạn bởi số cạnh E, đó là O(|E|). Bởi mỗi lần duyệt BFS được tính độc lập, chỉ cần duy trì một bản copy của những cấu trúc này, Bước 2 thực hiện duyệt cây BFS qua O(|V| + |E|) bước tính toán. Không gian bộ nhớ của mảng CBcủa thuật toán là O(|V| + |E|). Do vậy, độ phức tạp tính toán của việc duyệt cây BFS là O(|V| + |E|) và của việc tích lũy sự phụ thuộc (dependency accumulation) cũng vào khoảng O(|V| + |E|), số các bước cực đại được xác định bởi số đỉnh cha là O(|E|), và số đỉnh con tương ứng là O(|V|). Vậy, độ phức tạp của thuật toán sẽ là O(|V|2 +|V| * |E|). Trong trường hợp |E|>|V|, thì độ phức tạp của thuật toán sẽ là O(|V| * |E|).

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu độ đo trung gian và thuật toán phát hiện cộng đồng trên mạng xã hội (Trang 29 - 33)