BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC LẠC HỒNG
***
Đặng Như Tồn
Song song hố thuật tốn tìm đường đi ngắn nhất
trên nguồn dữ liệu lớn dùng MPI
Luận văn Thạc sỹ Công nghệ thông tin
Đồng Nai - năm 2011
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC LẠC HỒNG
***
Đặng Như Tồn
Song song hố thuật tốn tìm đường đi ngắn nhất
trên nguồn dữ liệu lớn dùng MPI
Chuyên ngành: Công nghệ thông tin
Mã số: 604805
Luận văn Thạc sỹ Công nghệ thông tin
Người hướng dẫn khoa học
PGS.TS Trần Văn Lăng
Đồng Nai - năm 2011
LỜI CẢM ƠN
Được sự định hướng của thầy PGS. TS Trần Văn Lăng, em đã lựa chọn đề tài
“Song song hố thuật tốn tìm kiếm đường đi ngắn nhất với MPI”.
Được sự giúp đỡ và hướng dẫn tận tình của thầy PGS. TS Trần Văn Lăng và một
số đồng nghiệp, đến nay em đã hồn thành luận văn của mình. Mặc dù đã cố
gắng, nhưng do thời gian có hạn và hạn chế của bản thân nên khơng tránh khỏi
có những thiếu sót. Em rất mong nhận được ý kiến đóng góp của các Thầy Cơ và
các bạn đồng nghiệp để luận văn được hoàn thiện hơn.
Tác giả
Đặng Như Toàn
MỤC LỤC
Trang
LỜI CẢM ƠN .......................................................................................................iii
MỤC LỤC ............................................................................................................. iv
Danh mục các thuật ngữ ....................................................................................... vii
Danh mục các hình vẽ, bảng biểu .......................................................................viii
MỞ ĐẦU ................................................................................................................ 1
1. Đặt vấn đề ........................................................................................................ 1
2. Mục đích của luận văn..................................................................................... 1
3. Nội dung của luận văn ..................................................................................... 1
4. Phương pháp nghiên cứu ................................................................................. 2
CHƯƠNG 1 - MỘT SỐ KỸ THUẬT TÌM KIẾM ĐƯỜNG ĐI NGẮN NHẤT .. 3
1.1. Bài tốn tìm kiếm đường đi ngắn nhất ......................................................... 3
1.2. Các thuật toán ............................................................................................... 4
1.2.1. Thuật toán Dijkstra ................................................................................. 4
1.2.2. Thuật toán A star .................................................................................... 6
1.2.3. Thuật toán di truyền ............................................................................... 9
CHƯƠNG 2 - LẬP TRÌNH SONG SONG VỚI MPI ......................................... 16
2.1. Tổng quan về lập trình song song với MPI ................................................ 16
2.1.1. Giới thiệu .............................................................................................. 16
2.1.2 Một số đặc điểm của lập trình MPI ....................................................... 17
2.2. Lập trình song song với MPI...................................................................... 19
2.2.1. Giới thiệu .............................................................................................. 19
2.2.2. Một số vấn đề về hiệu năng .................................................................. 21
2.2.2.1 Năng lực tính tốn ........................................................................... 21
2.2.2.2 Cân bằng tải ..................................................................................... 23
2.2.2.3 Sự bế tắc .......................................................................................... 25
CHƯƠNG 3 - MPI TRONG THUẬT TỐN DIJKSTRA CHO BÀI TỐN TÌM
KIẾM ĐƯỜNG ĐI NGẮN NHẤT ...................................................................... 27
3.1. Yêu cầu đặt ra cho bài tốn tìm kiếm đường đi ngắn nhất theo giải thuật
Dijksta................................................................................................................ 27
3.2. Xây dựng hàm tìm kiếm đường đi ngắn nhất............................................. 27
3.2.1 Xây dựng thuật toán Dijkstra tuần tự cho bài toán ............................... 27
3.2.2 Thực hiện song song hoá ....................................................................... 28
3.2.3 Thuật toán song song............................................................................. 29
3.2.4 Lựa chọn hàm MPI cho thuật tốn song song ....................................... 30
3.2.5 Cơng thức song song ............................................................................. 35
3.3. Chi phí thời gian ......................................................................................... 38
CHƯƠNG 4 - KẾT QUẢ THỬ NGHIỆM .......................................................... 39
4.1. Các kết quả thử nghiệm .............................................................................. 39
4.1.1. Kết quả thử nghiệm giải thuật Dijkstra cổ điển ................................... 39
4.1.2. Kết quả thử nghiệm tìm kiếm bằng giải thuật Dijkstra song song....... 40
4.2. Đánh giá kết quả ......................................................................................... 41
KẾT LUẬN .......................................................................................................... 44
TÀI LIỆU THAM KHẢO .................................................................................... 45
Danh mục các thuật ngữ
LIS – Language Independent Specifications
MIMD – Multiple Instruction Multiple Data
MPI – Message Passing Interface
OSI – Open Systems Interconnection
PVM – Parallel Vitual Machine
TCP – Transmission Control Protocol
TTDT – Thuật toán di truyền
Danh mục các hình vẽ, bảng biểu
Hình 1.1 – Kỹ thuật quay bánh xe
Hình 2.1 – Khả năng tăng tốc độ tính tốn, trường hợp lý tưởng
Hình 2.2 – Khả năng tăng tốc độ tính tốn, trường hợp thực tế
Hình 3.1 – Sơ đồ khối thuật toán Dijkstra song song
Bảng 4.1 – Thời gian thực hiện thuật toán Dijkstra cổ điển
Bảng 4.2 – Thời gian thực hiện thuật toán Dijkstra song song
Bảng 4.3: Thời gian thực hiện thuật toán Dijkstra song song với nhiều tiến trình
Hình 4.4: So sánh kết quả thử nghiệm thuật tốn Dijksta
Hình 4.5: So sánh kết quả thử nghiệm thuật tốn Dijksta với nhiều tiến trình
1
MỞ ĐẦU
1. Đặt vấn đề
Tim kiếm đường đi ngắn nhất là một bài toán kinh điển đã được nghiên cứu rất
nhiều và ứng dụng trong những hệ thống chuyên biệt. Rất nhiều nghiên cứu đã
cải tiến những thuật toán và tối ưu thuật tốn về khơng gian tìm kiếm, thời gian
tìm kiếm.
Tuy nhiên, với sự bùng nổ thơng tin và sự phát triển của cơng nghệ thơng tin,
những thuật tốn tìm kiếm đường đi ngắn nhất kinh điển khơng thể đáp ứng
được thời gian tìm kiếm tốt nhất trên lượng dữ liệu lớn.
Bài toán đặt ra là làm thế nào để giải quyết vấn đề tìm kiếm đường đi ngắn nhất
với nguồn dữ liệu lớn và phân tán, đáp ứng được mục tiêu rút ngắn thời gian tìm
kiếm.
2. Mục đích của luận văn
Nghiên cứu và song song hoá thuật toán Dijkstra cho bài tốn tìm đường đi ngắn
nhất trên nguồn dữ liệu lớn và phân tán; từ đó nâng cao hiệu quả của việc xử lý
dữ liệu.
3. Nội dung của luận văn
Trong luận văn này gồm có 3 nội dung:
- Nội dung 1: Nghiên cứu về bài tốn tìm kiếm đường đi ngắn nhất. Đánh giá
ưu điểm, nhược điểm của từng thuật toán.
2
- Nội dung 2: Cải tiến thuật toán Dijkstra cho bài tốn tìm kiếm đường đi
ngắn nhất bằng cách song song hóa thuật tốn để tối ưu về thời gian tìm kiếm
trên nguồn dữ liệu lớn.
- Nội dung 3: Tiến hành thử nghiệm, đánh giá thuật toán cải tiến.
4. Phương pháp nghiên cứu
Để thực hiện những nội dung đã nêu ở trên, tác giả đã sử dụng một số phương
pháp cho từng nội dung như sau:
- Nội dung 1: sử dụng phương pháp phân tích, so sánh và đánh giá các thuật
tốn tìm kiếm đường đi ngắn nhất.
- Nội dung 2: sử dụng phương pháp phân tích khả năng song song hóa thuật
tốn Dijkstra.
- Nội dung 3: sử dụng phương pháp đối sánh để đánh giá kết quả thử nghiệm
của thuật toán đã cải tiến.
3
CHƯƠNG 1 - MỘT SỐ KỸ THUẬT TÌM KIẾM ĐƯỜNG ĐI NGẮN
NHẤT
1.1. Bài tốn tìm kiếm đường đi ngắn nhất
Trong lý thuyết đồ thị, bài toán đường đi ngắn nhất nguồn đơn là bài tốn tìm
một đường đi giữa hai đỉnh sao cho tổng các trọng số của các cạnh tạo nên
đường đi đó là nhỏ nhất.
Định nghĩa một cách hình thức, cho trước một đồ thị có trọng số (nghĩa là một
tập đỉnh V, một tập cạnh E, và một hàm trong số có giá trị thực f: E → R), cho
trước một đỉnh v thuộc V, tìm một đường đi P từ v tới mỗi đỉnh v' thuộc V sao
cho:
f ( p) là nhỏ nhất trong tất cả các đường nối từ v tới v'.
pP
Các thuật toán quan trọng nhất giải quyết bài toán này là:
- Thuật toán Dijkstra: giải bài toán nguồn đơn nếu tất cả các trọng số đều
khơng âm. Thuật tốn này có thể tính tốn tất cả các đường đi ngắn nhất từ một
đỉnh xuất phát cho trước s tới mọi đỉnh khác mà khơng làm tăng thời gian chạy.
- Thuật tốn Bellman-Ford: giải bài tốn nguồn đơn trong trường hợp trọng
số có thể có giá trị âm.
- Thuật tốn tìm kiếm A*: giải bài toán nguồn đơn sử dụng heuristics để tăng
tốc độ tìm kiếm.
- Thuật tốn Floyd-Warshall: giải bài tốn đường đi ngắn nhất cho mọi cặp
đỉnh.
4
- Thuật toán Johnson: giải bài toán đường đi ngắn nhất cho mọi cặp đỉnh, có
thể nhanh hơn thuật tốn Floyd-Warshall trên các đồ thị thưa.
Lý thuyết nhiễu (Perturbation theory): tìm đường đi ngắn nhất địa phương (trong
trường hợp xấu nhất).
1.2. Các thuật toán
1.2.1. Thuật toán Dijkstra
Thuật toán Dijkstra [2], mang tên của nhà khoa học máy tính người Hà
Lan Edsger Dijkstra, là một thuật toán giải quyết bài toán đường đi ngắn
nhất nguồn đơn trong một đồ thị có hướng khơng có cạnh mang trọng số âm.
Bài tốn: Cho đơn đồ thị liên thơng, có trọng số G=(V,E). Tìm khoảng cách
d(u0,v) từ một đỉnh u0 cho trước đến một đỉnh v bất kỳ của G và tìm đường đi
ngắn nhất từ u0 đến v.
Phương pháp của thuật toán Dijkstra là: xác định tuần tự đỉnh có khoảng cách
đến u0 từ nhỏ đến lớn.
Trước tiên, đỉnh có khoảng cách đến a nhỏ nhất chính là a, với d(u 0,u0)=0. Trong
các đỉnh v u0, tìm đỉnh có khoảng cách k1 đến u0 là nhỏ nhất. Đỉnh này phải là
một trong các đỉnh kề với u0. Giả sử đó là u1:
d(u0,u1) = k1.
Trong các đỉnh v u0 và v u1, tìm đỉnh có khoảng cách k2 đến u0 là nhỏ nhất.
Đỉnh này phải là một trong các đỉnh kề với u0 hoặc với u1. Giả sử đó là u2:
d(u0,u2) = k2.
5
Tiếp tục như trên, cho đến bao giờ tìm được khoảng cách từ u 0 đến mọi đỉnh v
của G. Nếu V={u0, u1, ..., un} thì:
0 = d(u0,u0) < d(u0,u1) < d(u0,u2) < ... < d(u0,un).
Thuật toán Dijkstra:
Procedure Dijkstra (G=(V,E) là đơn đồ thị liên thơng, có trọng số với trọng số
dương)
{G có các đỉnh a=u0, u1, ..., un=z và trọng số m(ui,uj), với
m(ui,uj) =
nếu (ui,uj) không là một cạnh trong G}
for i:= 1 to n
L(ui):=
L(a):= 0
S:= V \ {a}
u:= a
while S
begin
for tất cả các đỉnh v thuộc S
if L(u) +m(u,v) < L(v) then L(v) := L(u)+m(u,v)
u:= đỉnh thuộc S có nhãn L(u) nhỏ nhất
{L(u): độ dài đường đi ngắn nhất từ a
đến u}
6
S:= S \ {u}
end
End Pro
Độ phức tạp của thuật toán Dijkstra: Thuật tốn dùng khơng q n1 bước lặp.
Trong mỗi bước lặp, dùng không hơn 2(n1) phép cộng và phép so sánh để sửa
đổi nhãn của các đỉnh. Ngoài ra, một đỉnh thuộc Sk có nhãn nhỏ nhất nhờ khơng
q n1 phép so sánh. Do đó thuật tốn có độ phức tạp O(n2).
1.2.2. Thuật toán A star
Thuật toán A* [1] được mô tả lần đầu vào năm 1968 bởi Peter Hart, Nils
Nilsson, và Bertram Raphael. Trong bài báo của họ, thuật toán được gọi là thuật
toán A; khi sử dụng thuật tốn này với một đánh giá heuristic thích hợp sẽ thu
được hoạt động tối ưu, do đó mà có tên A*.
Thuật tốn này tìm một đường đi từ một nút khởi đầu tới một nút đích cho trước
(hoặc tới một nút thỏa mãn một điều kiện đích). Thuật tốn này sử dụng một
"đánh giá heuristic" để xếp loại từng nút theo ước lượng về tuyến đường tốt nhất
đi qua nút đó. Thuật tốn này duyệt các nút theo thứ tự của đánh giá heuristic
này. Do đó, thuật tốn A* là một ví dụ của tìm kiếm theo lựa chọn tốt nhất (bestfirst search).
Bài toán: Giả sử u là một trạng thái đạt tới (có đường đi từ trạng thái ban đầu u0
tới u). Xác định hai hàm đánh giá sau:
- g(u) là đánh giá độ dài đường đi ngắn nhất từ u0 tới u (Đường đi từ u0 tới
trạng thái u khơng phải là trạng thái đích được gọi là đường đi một phần, để phân
biệt với đường đi đầy đủ, là đường đi từ u0 tới trạng thái đích).
7
- h(u) là đánh giá độ dài đường đi ngắn nhất từ u tới trạng thái đích.
Hàm h(u) được gọi là chấp nhận được (hoặc đánh giá thấp) nếu với mọi trạng
thái u, h(u) độ dài đường đi ngắn nhất thực tế từ u tới trạng thái đích. Chẳng
hạn trong bài tốn tìm đường đi ngắn nhất trên bản đồ giao thơng, có thể xác
định h(u) là độ dài đường chim bay từ u tới đích.
Có thể sử dụng kỹ thuật tìm kiếm leo đồi với hàm đánh giá h(u). Tất nhiên
phương pháp này chỉ cho phép tìm được đường đi tương đối tốt, chưa chắc đã là
đường đi tối ưu.
Ngồi ra, cũng có thể sử dụng kỹ thuật tìm kiếm tốt nhất đầu tiên với hàm đánh
giá g(u). Phương pháp này sẽ tìm ra đường đi ngắn nhất, tuy nhiên nó có thể kém
hiệu quả.
Để tăng hiệu quả tìm kiếm, có thể sử dụng hàm đánh giá mới:
f(u) = g(u) + h(u)
Tức là, f(u) là đánh giá độ dài đường đi ngắn nhất qua u từ trạng thái ban đầu tới
trạng thái kết thúc.
Thuật toán A* là thuật tốn sử dụng kỹ thuật tìm kiếm tốt nhất đầu tiên với hàm
đánh giá f(u).
Thuật toán A*:
begin
1. Khởi tạo danh sách L chỉ chứa trạng thái ban đầu;
2. loop do
2.1 if L rỗng then
8
{thông báo thất bại; stop};
2.2 Loại trạng thái u ở đầu danh sách L;
2.3 if u là trạng thái đích then
{thông báo thành công; stop}
2.4 for mỗi trạng thái v kề u do
{g(v) g(u) + k(u,v);
f(v) g(v) + h(v);
Đặt v vào danh sách L;}
2.5 Sắp xếp L theo thứ tự tăng dần của hàm f sao cho
trạng thái có giá trị của hàm f nhỏ nhất
ở đầu danh sách;
end;
Độ phức tạp của thuật toán A*: Độ phức tạp thời gian của A* phụ thuộc vào
đánh giá heuristic. Trong trường hợp xấu nhất, số nút được mở rộng theo hàm
mũ của độ dài lời giải, nhưng nó sẽ là hàm đa thức khi hàm heuristic hthỏa mãn
điều kiện sau:
|h(x) – h*(x)| ≤ O(log h*(x))
Trong đó h * là heuristic tối ưu, nghĩa là hàm cho kết quả là chi phí chính xác để
đi từ x tới đích. Nói cách khác, sai số của h không nên tăng nhanh
hơn lôgarit của "heuristic hoàn hảo" h * - hàm trả về khoảng cách thực từ x tới
đích.
9
Vấn đề sử dụng bộ nhớ của A* còn rắc rối hơn độ phức tạp thời gian. Trong
trường hợp xấu nhất, A* phải ghi nhớ số lượng nút tăng theo hàm mũ.
1.2.3. Thuật toán di truyền
Thuật toán di truyền (TTDT) là thuật toán bắt chước sự chọn lọc tự nhiên và di
truyền. Trong tự nhiên, các cá thể khỏe, có khả năng thích nghi tốt với mơi
trường sẽ được tái sinh và nhân bản ở các thế hệ sau. Mỗi cá thể có cấu trúc gien
đặc trưng cho phẩm chất của cá thể đó. Trong q trình sinh sản, các cá thể con
có thể thừa hưởng các phẩm chất của cả cha và mẹ, cấu trúc gien của nó mang
một phần cấu trúc gien của cha và mẹ. Ngoài ra, trong q trình tiến hóa, có thể
xảy ra hiện tượng đột biến, cấu trúc gien của cá thể con có thể chứa các gien mà
cả cha và mẹ đều không có.
Trong TTDT, mỗi cá thể được mã hóa bởi một cấu trúc dữ liệu mô tả cấu trúc
gien của cá thể đó, ta sẽ gọi nó là nhiễm sắc thể (chroniosome). Mỗi nhiễm sắc
thể được tạo thành từ các đơn vị được gọi là gien. Chẳng hạn, trong các TTDT
cổ điển, các nhiễm sắc thể là các chuỗi nhị phân, tức là mỗi cá thể được biểu
diễn bởi một chuỗi nhị phân.
TTDT sẽ làm việc trên các quần thể gồm nhiều cá thể. Một quần thể ứng với một
giai đoạn phát triển sẽ được gọi là một thế hệ. Từ thế hệ ban đầu được tạo ra,
TTDT bắt chước chọn lọc tự nhiên và di truyền để biến đổi các thế hệ. TTDT sử
dụng các toán tử cơ bản sau đây để biến đổi các thế hệ:
- Toán tử tái sinh (reproduction) (cịn được gọi là tốn tử chọn lọc
(selection)): Các cá thể tốt được chọn lọc để đưa vào thế hệ sau. Sự lựa chọn này
được thực hiện dựa vào độ thích nghi với mơi trường của mỗi cá thể. Ta sẽ gọi
hàm ứng mỗi cá thể với độ thích nghi của nó là hàm thích nghi (fitness function).
10
- Toán tử lai ghép (crossover): Hai cá thể cha và mẹ trao đổi các gien để tạo
ra hai cá thể con.
- Toán tử đột biến (mutation): Một cá thể thay đổi một số gien để tạo thành
cá thể mới.
Tất cả các toán tử trên khi thực hiện đều mang tính ngẫu nhiên. Cấu trúc cơ bản
của TTDT là như sau:
procedure Genetic_Algorithm;
begin
t 0;
Khởi tạo thế hệ ban đầu P(t);
Đánh giá P(t) (theo hàm thích nghi);
repeat
t t + 1;
Sinh ra thế hệ mới P(t) từ P(t-1) bởi
Chọn lọc
Lai ghép
Đột biến;
Đánh giá P(t);
until điều kiện kết thúc được thỏa mãn;
end;
11
Trong thủ tục trên, điều kiện kết thúc vòng lặp có thể là một số thế hệ đủ lớn nào
đó, hoặc độ thích nghi của các cá thể tốt nhất trong các thế hệ kế tiếp nhau khác
nhau không đáng kể. Khi thuật toán dừng, cá thể tốt nhất trong thế hệ cuối cùng
được chọn làm nghiệm cần tìm.
Xét chi tiết hơn toán tử chọn lọc và các toán tử di truyền (lai ghép, đột biến)
trong các TTDT cổ điển:
Chọn lọc:
Việc chọn lọc các cá thể từ một quần thể dựa trên độ thích nghi của mỗi cá thể.
Các cá thể có độ thích nghi cao có nhiều khả năng được chọn. Cần nhấn mạnh
rằng, hàm thích nghi chỉ cần là một hàm thực dương, nó có thể khơng tuyến tính,
khơng liên tục, khơng khả vi. Q trình chọn lọc được thực hiện theo kỹ thuật
quay bánh xe.
Giả sử thế hệ hiện thời P(t) gồm có n cá thể {x1,..,xn}. Số n được gọi là cỡ của
quần thể. Với mỗi cá thể xi, tính độ thích nghi của nó f(xi). Tính tổng các độ
thích nghi của tất cả các cá thể trong quần thể:
n
F f(xi)
i 1
Mỗi lần chọn lọc, thực hiện hai bước sau:
- Sinh ra một số thực ngẫu nhiên q trong khoảng (0, F);
- xk là cá thể được chọn, nếu k là số nhỏ nhất sao cho
k
f ( xi) 4
i 1
12
Việc chọn lọc theo hai bước trên có thể minh họa như sau: Có một bánh xe được
chia thành n phần, mỗi phần ứng với độ thích nghi của một cá thể (hình 1). Một
mũi tên chỉ vào bánh xe. Quay bánh xe, khi bánh xe dừng, mũi tên chỉ vào phần
nào, cá thể ứng với phần đó được chọn.
Hình 1.1: Kỹ thuật quay bánh xe
Rõ ràng là với cách chọn này, các cá thể có thể có độ thích nghi càng cao càng
có khả năng được chọn. Các cá thể có độ thích nghi cao có thể có một hay nhiều
bản sao, các cá thể có độ thích nghi thấp có thể khơng có mặt ở thế hệ sau (nó bị
chết đi).
Lai ghép:
Trên cá thể được chọn lọc, tíến hành tốn tử lai ghép. Đầu tiên cần đưa ra xác
suất lai ghép pc. xác suất này cho hy vọng có pc.n cá thể được lai ghép (n là cỡ
của quần thể).
Với mỗi cá thể ta thực hiện hai bước sau:
- Sinh ra số thực ngẫu nhiên r trong đoạn [0, 1];
- Nếu r < pc thì cá thể đó được chọn để lai ghép
Từ các cá thể được chọn để lai ghép, người ta cặp đôi chúng một cách ngẫu
nhiên. Trong trường hợp các nhiễm sắc thể là các chuỗi nhị phân có độ dài cố
định m, ta có thể thực hiện lai ghép như sau: Với mỗi cặp, sinh ra một số nguyên