CHƢƠNG 3 GIẢI MỘT SỐ BÀI TỐN ĐỒ THỊ TRÊN MƠI TRƢỜNG LƢỚI
3.2 Thuật tốn Dijkstra
Bài tốn: Cho đồ thị cĩ hướng G = (V, E, w), với tập đỉnh V, tập cạnh E và w(i,j) > 0,
(i,j) E.
Cần tính tốn được đường đi ngắn nhất từ đỉnh i đến j. Quy ước:
T: mảng lưu đỉnh chưa xét
L: ma trận trọng số ; LP: ma trận trọng số phân rã Length: mảng lưu nhãn của các đỉnh
Last: mảng lưu đường đi.
3.2.1 Thuật tốn tuần tự
Với thuật tốn tuần tự ta cĩ:
Bƣớc 1: Khởi tạo T, Length, Last
Bƣớc 2: Chọn đỉnh cĩ nhãn nhỏ nhất, loại đỉnh đĩ ra khỏi T
Bƣớc 3: Kiểm tra, nếu là đỉnh đang chọn là đỉnh đích hoặc cĩ nhãn mang giá trị
vơ cùng. Kết thúc.
Bƣớc 4: Thực hiện gán nhãn:
Length[k] = Min (Length[k], Length[v] + Lvk) với k T, Lvk ≠ 0 Quay lại bước 2.
3.2.2 Song song thuật tốn Dijkstra trên lưới
Thuật tốn Dijkstra tuần tự cĩ nhiều điểm cĩ thể song song hố. Do đĩ thuật tốn này đã được các nhà lập trình song song hĩa rất nhiều. Cụ thể sau đây là cách song song hĩa của thuật tốn Dijkstra tuần tự.
Lúc này chúng ta nghĩ rằng khơng phải thực thi thuật tốn trên một đơn vị xử lý (một đơn vị xử lý là một nút trên mơi trường lưới) nữa mà phân phối các cơng việc
64
khác nhau cho mỗi đơn vị xử lý khác nhau thực hiện. Mỗi đơn vị xử lý sẽ đảm nhận một số đỉnh của đồ thị cùng với ma trận mơ tả quan hệ của các đỉnh đĩ với các đỉnh cịn lại.
Triển khai thuật tốn
Bƣớc 1: Khởi tạo T, Length, Last
Phân rã ma trận trọng số và gửi đến Pi , i = 1 . . m-1.
Mỗi Pi sẽ giữ ma trận con LPi, quản lý Vi = N/m số đỉnh của đồ thị.
Bƣớc 2: Đơn vị xử lý chính gửi đỉnh i và Length[i] đến Pi, i = 1 . . m-1. Bƣớc 3: Xử lý ở đơn vị xử lý con.
Gọi đỉnh được truyền đi là s, và nhãn của đỉnh đĩ là w.
Cập nhật: Length[k] = Min (Length[k], w + LP[s][k]) k Vi.
Gửi Min (Length[k]) và đỉnh tương ứng cho đơn vị xử lý chính.
Bƣớc 4: Đơn vị xử lý chính chọn đỉnh cĩ nhãn nhỏ nhất, loại đỉnh đĩ ra khỏi T,
gán cho s và w. Nếu s là đỉnh đích hoặc w = ∞ thì ngừng truyền, kết thúc. Lặp bước 3.
3.2.3 Thực nghiệm chương trình
Hệ điều hành sử dụng :Windows
Các máy tính kết nối mạng LAN, máy server kết nối Internet. Ngơn ngữ lập trình sử dụng Java.
Trong quá trình thực nghiệm chương trình luận văn gặp phải một số khĩ khăn trong việc cài đặt thử nghiệm bộ cơng cụ Globus Toolkit trên Windows với cụm máy tính song song. Nên tác giả đã tận dụng cơ chế tính tốn đa luồng trong Java. Tức là mơ phỏng trong mơi trường thơng qua cơ chế đa luồng của Java cụ thể là mỗi luồng thực hiện trên một nút của lưới (một luồng đại diện cho một nút).
65
Đơn vị xử lý chính
Hình 3.5 Giao diện chương trình trên máy server - thuật tốn Dijkstra
Hƣớng dẫn sử dụng các chức năng chính
Hình 3.6 Hướng dẫn sử dụng các chức năng chính
Kết nối vào CSDL, tạo các luồng chờ client kết nối
Lấy 2 đỉnh từ trong input A, input B và tính tốn tìm đường đi Lưu các dữ liệu về
đường đi vào database
Gọi form chỉnh sửa input và sửa Số máy muốn chạy
song song Nhập Port đê client kết
66
Đơn vị xử lý con
Hình 3.7 Giao diện chương trình trên client - thuật tốn Dijkstra 3.2.3.2 Kết quả
Đánh giá thời gian chạy thuật Dijkstra:
Đỉnh Tuần
Tự(s)
Song Song(s)
2 Client 5 Client 10 Client
600 20.6 16.5 13.4 10.3 400 13.2 8.2 5.2 2.1 200 3.2 1.3 0.9 0.3 100 1.5 0.7 0.2 0.1