8. Bố cục của luận án
2.3.1.5. Ví dụ minh họa
Tìm luồng cực đại của mạng G như trong Hình 2.3.
Ghi chú. Tại mỗi đỉnh v ta có hai tham số v(h(v), e(v)), trong đó h(v) là độ cao của
v và e(v) là độ lệch luồng của v. Ở giữa mỗi cung có hai tham số ci, j, fi, jtrong đó ci, j
là khả năng thông qua của cung (i, j), fi, jlà luồng của cung (i, j) được biểu diễn như trong Hình 2.4.
Thứ tự các đỉnh là a, b, c, d, e, z.
Bước 1: Khởi tạo
Hình 2.3. Mạng đồ thị G a b d e c z 3 5 4 4 2 2 2 Hình 2.4.Mạng đồ thị khởi tạo a(3, -8) b(2, 3) d(2, 5 e (1, 0) c(1, 0) z(0, 0) 3, 3 5, 5 4, 0 4, 0 2, 0 2, 0 2, 0
28
- Luồng trướ c xuất phát với các cung đi từ đỉnh nguồn có luồng bằng khả năng thông qua, còn các cung khác có luồng bằng 0. Tất cả các tham số này được biểu diễn trên mạng đồ thị khởi tạo như trong Hình 2.4.
- Hàng đợi Q: b|d (Q sẽ chứa các đỉnh có độ lệch luồng dương theo thứ tự các đỉnh).
Bước 2: Kiểm tra tiêu chuẩn dừng vì Q ∅,nên sang bước 3.
Bước 3: Lấy đỉnh lệch b từ hàng đợi Q để xử lý (cân bằng b) vòng lặp 1.
- Việc cân bằng b được thực hiện như sau: đẩy trên cung (b, c)Ef một luồng có giá trị min{delta, cf(b, c)}=min{3, 2}=2. Đỉnh c là đỉnh lệch mới nên đẩy
c vào hàng đợi Q, đỉnh b có e(b)=1 nên đỉnh b vẫn còn lệch và chỉ có duy nhất một cung (b, a)Ef, nhưng nó không phải cung ưu tiên. Vì vậy, ta phải tăng độ cao của đỉnh b theo công thức:
h(b)=1+ min{d(a) | (b, a)Ef} =1 + d(a)=1 + 3 =4. Đẩy b vào Q.
- Các tham số vừa tính được ở bước 3 được biểu diễn như trong Hình 2.5. - Hàng đợi Q: b |d | c | b.
Quay lại bước 2.
Bước 2: Kiểm tra tiêu chuẩn dừng vì Q ∅, nên sang bước 3.
Bước 3: Lấy đỉnh lệch d từ hàng đợi Q để xử lý (cân bằng d) vòng lặp 2.
- Đẩy trên cung (d, c) và (d, e)Ef một luồng có giá trị min{delta, cf(d, c)}= min{4, 2}=2. Suy ra fd, c=2, fd, e=2.
- Đỉnh e là đỉnh lệch mới nên đẩy e vào hàng đợi Q, đỉnh d có e(d)=1 nên đỉnh d vẫn còn lệch và chỉ có duy nhất một cung (d, a) Ef, nhưng nó không phải cung ưu tiên. Vì vậy ta phải tăng độ cao của đỉnh d theo công thức.
h(b)=1 + min{d(a)|(d, a)Ef} =1 + d(a) =1 + 3 =4. - Đẩy d vào Q.
- Các tham số vừa tính được ở bước 3 của vòng lặp thứ 1 và 2 được biểu diễn như trong Hình 2.5. Hàng đợi Q bây giờ là Q: b | d | c | b | e | d.
Quay lại bước 2.
29
Bước 3: Lấy đỉnh lệch c từ hàng đợi Q để xử lý (cân bằng c) vòng lặp 3.
- Đẩy trên cung (c, z)Ef luồng có giá trị min{delta, cf(c, z)}= min{4, 4}= 4. - Hàng đợi Q mới bây giờ là Q: b | d | c | b | e | d. Quay lại bước 2.
Bước 2: Kiểm tra tiêu chuẩn dừng vì Q ∅, nên sang bước 3.
Bước 3: Lấy đỉnh lệch b từ hàng đợi Q để xử lý (cân bằng b) vòng lặp 4.
- Theo vai trò của hàm độ cao thì do độ cao của đỉnh lệch b lớn hơn độ cao đỉnh nguồn a nên ta đẩy ngược về hướng đỉnh nguồn a suy ra ta đẩy ngược trên cung (a, b)Ef một luồng có giá trị min{delta, cf(a, b)} = min{1, 3}=1. - Các tham số vừa tính được ở bước 3 của vòng lặp thứ 3và thứ 4 được biểu diễn như trong Hình 2.6.
Hàng đợi Q mới bây giờ là Q: b |d | c | b | e | d.
Quay lại bước 2.
Bước 2: Kiểm tra tiêu chuẩn dừng vì Q ∅, nên sang bước 3.
Bước 3: Lấy đỉnh lệch e từ hàng đợi Q để xử lý (cân bằng e) vòng lặp 5.
- Đẩy trên cung (e, z)Ef một luồng bằng min{delta, cf(e, z)}=min{2, 4}=2. - Hàng đợi Q mới bây giờ là Q: b | d | c | b | e | d.
a(3, -8) b(4, 1) d(4, 1) e(1, 2) c(1, 4) z(0, 0) 3, 3 5, 5 4, 0 4, 0 2, 2 2, 2 2, 2 Hình 2.5. Mạngđồ thị cân bằng b, d a(3, -7) b(4, 0) d(4, 1) e(1, 2) c(1, 0) z(0, 4) 3, 2 5, 5 4, 4 4, 0 2, 2 2, 2 2, 2 Hình 2.6.Mạng đồ thị cân bằng c, b
30 Quay lại bước 2
Bước 2: Kiểm tra tiêu chuẩn dừng vì Q ∅, nên sang bước 3.
Bước 3: - Lấy đỉnh lệch d từ hàng đợi Q để xử lý (cân bằng d) vòng lặp 6.
- Theo vai trò của hàm độ cao thì do độ cao của đỉnh lệch d lớn hơn độ cao đỉnh nguồn a nên ta đẩy ngược về hướng đỉnh nguồn a. Suy ra, ta đẩy ngược trên cung (a, d)Ef một luồng có giá trị min{delta, cf(a, d)} = min{1, 5} =1. - Các tham số vừa tính được ở bước 3của vòng lặp thứ 5 và 6 được biểu diễn như trong Hình 2.7.
- Hàng đợi Q mới bây giờ là Q: b | d | c | b | e | d. Quay lại bước 2.
Bước 2: Kiểm tra Q =∅, Kết thúc và luồng cuối cùng là luồng cực đại với giá trị luồng là 6.
2.3.2. Thuật toán song song
2.3.2.1. Giới thiệu
Các công trình nghiên cứu về thuật toán song song bằng thuật toán đẩy luồng trước được công bố trong [58], [59], [60]. Năm 2010, Zhengyu He, Bo Hong [61] đã xây dựng thuật toán song song đẩy luồng trước trên môi trường CUDA. Tuy nhiên, các công trình trên còn hạn chế là: dữ liệu của bài được chia cho các bộ xử lý như thế nào, các bước thực hiện song song rất khó lập trình và việc phân tích độ phức tạp thời gian chưa được đề cập đến. Trong phần này, chúng tôi sẽ tối ưu thuật toán song song trong [61] bằng cách trình bày từng bước cụ thể hơn, chia dữ liệu cho các bộ xử lý thực hiện, có ví dụ để minh họa cho các bước của thuật toán. Đồng thời, thuật toán sẽ xây dựng tổng quát cho tất cả các hệ thống tính toán song song khác
a(3, -6) b(4, 0) d(4, 0) e(1, 0) c(1, 0) z(0, 6) 3, 2 5, 4 4, 4 4, 2 2, 2 2, 2 2, 2 Hình 2.7.Mạng đồ thị cân bằng e, d
31
nhau và phân tích thời gian tính toán của thuật toán song song. Vì vậy, sự cải tiến của thuật toán được đề xuất so với [61] là đề xuất sự phân chia dữ liệu, các bộ xử lý gửi và nhận dữ liệu được thực hiện rõ ràng và có phân tích độ phức tạp trong các trường hợp tổng quát. Dữ liệu thử nghiệm của thuật toán được tạo ngẫu nhiên.
Nội dung chính trong mục này, chúng tôi đã đăng trong chuyên san Công nghệ thông tin và được liệt kê ở tài liệu [3] trong danh mục các công trình của tác gỉa đã công bố liên quan đến luận án.
2.3.2.2. Ý tưởng của thuật toán song song
Chúng tôi xây dựng thuật toán song song trên m bộ xử lý. Trong m bộ xử lý sẽ có một bộ xử lý chính đóng vai trò quản lý dữ liệu, đồng thời gửi và nhận dữ liệu từ các bộ xử lý phụ.
Các bộ xử lý phụ đẩy và đổi nhãn, rồi chuyển kết quả về bộ xử lý chính. Bộ xử lý chính sau khi nhận các kết quả mà các bộ xử lý phụ gửi đến sẽ thực hiện đổi các nhãn cho đến khi tìm được luồng cực đại.
Trong thuật toán song song, điều kiện dừng của thuật toán là không còn đỉnh lệch trên mạng đồ thị (trừ đỉnh a, z). Từ thuật toán tuần tự trên, ta nhận thấy rằng khi thuật toán kết thúc thì tổng độ lệch luồng của các đỉnh bằng 0. Giá trị e(z) là giá trị luồng cực đại cần tìm.
2.3.2.3. Xây dựng thuật toán song song
- Đầu vào: Mạng G =(V, E, c) với nguồn a, đích z, khả năng thông qua
c={ci, j|(i, j)E} (15) và m bộ xử lý (P0, P1, …, Pm-1), trong đó P0là bộ xử lý chính.
- Đầu ra: Luồng cực đại
f ={fi, j|(i, j)E} (16)
- Các bước:
Bước 1: Bộ xử lý chính P0 thực hiện.
(1.1). Khởi tạo: e: độ lệch luồng của các đỉnh trên mạng đồ thị G, h: độ cao của các đỉnh trên mạng đồ thị G, f: luồng trên các cung của mạng đồ thị G, c:
32
dư Gf, Q: tập các đỉnh hoạt động (không kể đỉnh a và z) là các đỉnh có độ lệch luồng dương. Việc khởi tạo giống như khởi tạo ở thuật toán tuần tự. (1.2). Chia tập đỉnh V thành m-1 tập con Vi cho các bộ xử lý phụ tương ứng
Pi(i=1, 2, …, m-1) sao cho:
𝑉𝑖 ∩ 𝑉𝑗 = ∅, 𝑖 ≠ 𝑗
𝑉1 ∪ 𝑉2 ∪ … ∪ 𝑉𝑚−1 = 𝑉 (17) Cách chia cụ thể theo thuật toán sau:
Giả sử ta có n đỉnh và m-1 bộ xử lý phụ P1,…, Pm-1.Gọi nilà số đỉnh tương ứng của bộ xử lý phụ Pi(i=1,…, m-1).
- Nếu n chia hết cho m-1 thì:
For i=1 to m-1 do
- Nếu n không chia hết cho m-1 thì:
For i=1 to m-2 do 𝑛𝑖 = 𝑛 𝑚 −1 ; (18) 𝑛𝑚 −1 = 𝑛 − 𝑚 − 2 . 𝑛 𝑚 −1 ; (19) Bước 2: Bộ xử lý phụ Pinhận Vi(i= 1,…, m-1).
Bước 3: Bộ xử lý chính kiểm tra nếu tập các đỉnh hoạt động mà rỗng thì kết thúc, luồng trước f trở thành luồng cực đại.
Ngược lại sang bước 4.
Bước 4: Bộ xử lý chính chuyển e, h, f, c, cf tương ứng với các đỉnhđến các bộ xử lý phụ.
Bước 5: m-1 bộ xử lý phụ thực hiện.
(5.1) Nhận các tham số e, h, f, c, cftương ứng cho các đỉnh trên các bộ xử lý phụ mà bộ xử lý chính gửi đến ở bước 4.
(5.2) Xử lý đỉnh lệch (đẩy và đổi nhãn) như trong bước 3 của thuật toán tuần tự. Tức là nếu tồn tại cung ưu tiên (u, v)Ef thì đẩy trên cung (u, v) một luồng có giá tri ̣ min{delta, cf(u, v)}, trong đó delta là độ lệch luồng của đỉnh
); 1 /(
n m
33
u. Nếu không tồn tại cung ưu tiên đi từ u, thì ta tăng độ cao của đỉnh u như sau:
h(u)= 1 + min{h(v)|(u, v)Ef}.
(5.3) Gửi e, h, f, cf về bộ xử lý chính.
Bước 6: Bộ xử lý chính thực hiện một số công việc khác.
(6.1) Nhận e, h, f, cf, từ bộ xử lý phụ gửi về từ bước 5.3, Thay đổi tham số của các cung, các đỉnh mà hai đỉnh của các cung đó không nằm trên cùng một bộ xử lý.
(6.2) Đây là bước khác biệt so với thuật toán tuần tự để đồng bộ hóa dữ liệu, sau khi nhận dữ liệu ở (6.1) thì bộ xử lý chính kiểm tra nếu với mọi cung (u, v)E, nếu h(u)>h(v)+1 thì bộ xử lý chính sẽ đổi nhãn cho u, v như sau:
f(u, v)= f(u, v)+min{delta, cf(u, v); //delta là độ lệch luồng của đỉnh u
e(u)= e(u)–cf(u, v); e(v)= e(v)+cf(u, v). Đưa đỉnh lệch mới vào tập Q.
(6.3) Nếu uVmà e(u)=0 thì loại u ra khỏi tập Q. Quay lại bước 3.
2.3.2.4. Ví dụ minh họa
Tìm luồng cực đại của mạng G như trong Hình 2.8 trên ba bộ xử lý. Trong đó, có một bộ xử lý chính gọi là P0 và hai bộ xử lý phụ gọi là P1, P2.
Các pha của ba bộ xử lý được thể hiện như sau:
Bước 1: Bộ xử lý chính P0 thực hiện.
(1.1) Bộ xử lý chính P0khởi tạo các biến như ở Hình 2.8 và tập Q={b, d}. (1.2) Bộ xử lý chính chia ba đỉnh a, b, d cho P1 và ba đỉnh c, e, z cho P2 Bước 2: Bộ xử lý phụ P1 nhận V1={a, b, d}.
Bộ xử lý P2 nhận V2={c, e, z}.
Bước 3: Bộ xử lý chính P0 kiểm tra tập Q ∅, sang bước 4.
Bước 4:Bộ xử lý chính P0 gửi e, cf, h đến hai bộ xử lý phụ P1, P2.
Bước 5: Hai bộ xử lý phụ P1, P2 thực hiện.
34
(5.2) - bộ xử lý P1thực hiện: do không tồn tại cung ưu tiên đi từ b, d nên ta tăng đô ̣ cao của đỉnh b và d như sau: h(b)=h(a)+1=4 và h(d)= h(a)+1=4. - Bộ xử lý phụ P2 thực hiện: vì các đỉnh trên bộ xử lý P2 có độ lệch luồng bằng 0 nên không thực hiện.
(5.3) Gửi các tham số tính được ở (5.2) về P0.
Tại thời điểm này các tham số trên hai bộ xử lý được biển diễn như trong Hình2.8.
Bước 6: Bộ xử lý chính P0 thực hiện.
(6.1) Nhận dữ liệu gửi về từ bước (5.3).
(6.2) Bộ xử lý chính thực hiện thay thế trên toàn bộ các đỉnh u, v thỏa yêu cầu: tất các cạnh (u, v)E mà có h(u)>h(v)+1.
Việc thay thế như sau: ta có h(b)>h(c)+1 và h(d) > h(c)+1, h(d) > h(e) + 1, nên fb, c = min{3, 2}=2 .
Tương tự như vậy ta có fd, c= min{5, 2}=2, fd, e= min{5-2, 2} =2 và độ lệch luồng của các đỉnh b, c, d, e được tính lại như sau: e(b) = e(b) - cf(b, c)=3- 2=1, e(c)= e(c) + cf(b, c) + cf(d, c) =0 + 2 + 2 = 4, e(e) = e(e) + cf(d, e) =0 + 2 = 2.
Các tham số tính được trên bộ xử lý chính được biểu diễn như trong Hình 2.9 dưới đây P1 tính đỉnh a, b, d P2 tính đỉnh c, e, z a(3, -8) b(4, 3) d(4, 5) e(1, 0) c(1, 0) z(0, 0) 3, 3 5, 5 4, 0 4, 0 2, 0 2, 0 2, 0
35
Đưa đỉnh lệch mới c, e vào tập Q. Suy ra Q={b, d, c, e}.
(6.3) Không loại đỉnh nào ra khỏi tập Q. Quay lại bước 3.
Bước 3: Bộ xử lý chính P0 kiểm tra tập Q ∅, sang bước 4.
Bước 4:Bộ xử lý chính P0 gửi e, cf, h đến hai bộ xử lý phụ P1, P2.
Bước 5: Hai bộ xử lý phụ P1, P2 thực hiện.
(5.1) - Bộ xử lý phụ P1, P2 nhận các tham số e, cf, h cho các đỉnh tương ứng. (5.2) - Bộ xử lý P1 thực hiện: cân bằng hai đỉnh b, d ta có:
+ Theo vai trò của hàm độ cao thì độ cao của đỉnh lệch b lớn hơn độ cao đỉnh nguồn a nên ta đẩy ngược về hướng đỉnh nguồn a,Suy ra, ta đẩy ngược trên cung (a, b)Ef một luồng có giá trị min{delta, cf(a, b)}=min{1, 3}=1, fa, b =3- 1=2 và độ lệch luồng của b, a là:
e(b)= e(b) - cf(a, b)=1-1=0, e(a)=e(a)+cf(a, b)=-8+1=-7.
+ Theo vai trò của hàm độ cao thì do độ cao của đỉnh lệch d lớn hơn độ cao đỉnh nguồn a nên ta đẩy ngược về hướng đỉnh nguồn a. Suy ra, ta đẩy ngược trên cung (a, d)Ef một luồng có giá trị min{delta, cf(a, d)}=min{1, 5}=1, fa, d=5-1=4và độ lệch luồng của d, a là:
e(d)=e(d)-cf(a, d)=1-1=0, e(a)=e(a)+cf(a, d)=-7+1=-6.
- Bộ xử lý phụ P2thực hiện: cân bằng hai đỉnh c, e.
+ Cân bằng c: đẩy trên cung (c, z)Ef một luồng có giá trị:
min{delta, cf(c, z)}=min{4, 4}=4. Suy ra fc, z=4 và độ lệch luồng của c, z là:
e(c)=e(c)-cf(c, z)=4-4=0, e(z)=e(z)+cf(c, z)=0+4=4. a(3, -8) b(4, 1) d(4, 1) e(1, 2) c(1, 4) z(0, 0) 3, 3 5, 5 4, 0 4, 0 2, 2 2, 2 2, 2
36
+ Cân bằng e: đẩy trên cung (e, z)Ef một luồng có giá trị:
min{delta, cf(e, z)} =min{2, 4}=2.Suy ra fe, z=2. Độ lệch luồng của e, z là:
e(e)=e(e)-cf(e, z)=2-2=0, e(z)=e(z)+cf(e, z)=4+2=6. (5.3) Gửi các tham số tính được ở (5.2) về P0.
Tại thời điểm này các tham số trên hai bộ xử lý được biển diễn như trong Hình 2.10
Bước 6: Bộ xử lý chính P0 thực hiện.
(6.1) Nhận dữ liệu gửi về từ bước 5.3.
(6.2) Không có cạnh (u, v) E mà có h(u)>h(v)+1 và e(u)≠0. Nên không thay thế. Vì không có đỉnh lệch mới nên không có đỉnh nào được đẩy vào tập Q.
(6.3) Bộ xử lý chính kiểm tra các đỉnh b, d, c, e đều có độ lệch luồng bằng 0, loại b, d, c, e ra khỏi Q. Suy ra Q=∅.
Quay lại bước 3.
Bước 3: Bộ xử lý chính kiểm tra Q=∅. Kết luận luồng cực đại có giá trị là 6.
2.3.2.5. Phân tích độ phức tạp thời gian
Độ phức tạp của thuật toán tuần tự là O(|V|2|E|). Khi thực hiện song song thì thời gian tính toán trên m-1 bộ xử lý phụ sẽ có độ phức tạp tính toán bằng thời gian tuần tự chia cho m-1 như công thức (20).
(20)
Từ cách xây dựng thuật toán song song và ví dụ thực nghiệm, ta nhận thấy ) 1 | | . | | ( 2 m E V O P1 tính đỉnh a, b, d P2 tính đỉnh c, e, z a(3, -6) b(4, 0) d(4, 0) e(1, 0) c(1, 0) z(0, 6) 3, 2 5, 4 4, 4 4, 2 2, 2 2, 2 2, 2
37
rằng độ phức tạp thời gian của thuật toán song song sẽ giảm đi đáng kể so với độ phức tạp của thuật toán tuần tự. Trong trường hợp tổng quát thời gian của thuật toán song song theo công thức (21).
1 2 2 ) 1 | | . | | ( t t m E V O (21) Trong đó ) 1 | | . | | ( 2 m