Tải bản đầy đủ (.ppt) (19 trang)

Tiểu luận môn học THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN CÁC ĐƯỜNG ĐI NGẮN NHẤT MỌI CẶP (ALL-PAIRS SHORTEST PATHS)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (613.33 KB, 19 trang )


CÁC ĐƯỜNG ĐI NGẮN NHẤT MỌI CẶP
(ALL-PAIRS SHORTEST PATHS)
Giáo viên hướng dẫn: TS. Hoàng Quang
Học viên thực hiện (Nhóm 7):
Lê Thị Minh Hương
Lê Văn Thái Khương
Nguyễn Thanh Vinh
Lớp: Khoa học máy tính (2007)

I. Giới thiệu bài toán
II. Hạn chế của các thuật toán trước đây
III. Ưu điểm của thuật toán
Các đường đi ngắn nhất và phép nhân ma trận
IV. Cấu trúc của một đường đi ngắn nhất
V. Một giải pháp đệ quy cho bài toán
các đường đi ngắn nhất mọi cặp
VI. Tính toán các trọng số đường đi ngắn nhất dưới lên
VII. Cải thiện thời gian thực hiện
VIII. Chương trình Pascal
NỘI DUNG TRÌNH BÀY

I. Giới thiệu bài toán
Giả sử cho đồ thị trọng số, có hướng G = (V, E) có n đỉnh
V = {1, 2, …,n}, E = { (i,j) / i,j ∈ V } và ma trận trọng số W
nxn
= (ω
ij
).
Ví dụ:


Vấn đề đặt ra: tìm đường đi ngắn nhất giữa tất cả các cặp
đỉnh trong một đồ thị G=(V, E).
Output:
Kết quả của bài toán là một ma trận
L
nxn
= (l
ij
) chứa trọng số của các đường
đi ngắn nhất từ đỉnh i đến đỉnh j.
Input:
Ma trận trọng số W
nxn
= (ω
ij
) và số đỉnh
n chứa trong File như sau, (chú ý:
vocung(

):=50)
5
0 3 8 50 -4
50 0 50 1 7
50 4 0 50 50
2 50 -5 0 50
50 50 50 6 0
I. Giới thiệu bài toán

II. Hạn chế của các thuật toán trước đây
Chúng ta có thể giải quyết bài toán các đường đi ngắn nhất mọi cặp

bằng cách chạy một thuật toán các đường đi ngắn nhất nguồn đơn
n lần, mỗi lần cho một đỉnh làm nguồn.
* Nếu tất cả các trọng số là không âm, chúng ta có thể sử dụng thuật
toán Dijkstra.
1. Nếu dùng cách thực thi mảng tuyến tính của hàng đợi ưu tiên
thì độ phức tạp là O(V
3
+V.E)=O(V
3
).
2. Cách thực thi đống nhị phân của hàng đợi ưu tiên,
O(V.E.lgV), là một cải thiện nếu đồ thị thưa.
3. Một cách khác, chúng ta có thể thực thi hàng đợi ưu tiên với
đống Fibonacci, là O(V
2
.lgV+V.E).
* Nếu các trọng số cung âm được phép, thuật toán Dijkstra có
thể không còn được sử dụng. Thay vào đó, chúng ta phải chạy
thuật toán Bellman-Ford chậm hơn mỗi lần từ một đỉnh với độ phức
tạp là O(V
2
.E), mà trên một đồ thị trù mật là O(V
4
).

III. Ưu điểm của thuật toán trình bày
Các đường đi ngắn nhất và phép nhân ma trận
(Shortest paths and matrix multiplication)
Phần này trình bày một thuật toán quy hoạch động cho bài toán các
đường đi ngắn nhất mọi cặp trên một đồ thị có hướng G = (V, E).

Mỗi vòng lặp chính của chương trình động sẽ thực hiện một phép
toán tương tự như phép nhân ma trận, vì vậy thuật toán trông
giống như phép nhân ma trận lặp lại.
Chúng ta sẽ bắt đầu bằng việc phát triển một thuật toán 0(V
4
) cho
bài toán các đường đi ngắn nhất mọi cặp và sau đó cải tiến đến
0(V
3
.lgV).
Các bước phát triển một thuật toán quy hoạch động của bài toán:
1. Cấu trúc của một giải pháp tối ưu.
2. Định nghĩa đệ quy giá trị của một giải pháp tối ưu.
3. Tính toán giá trị của một giải pháp tối ưu theo dạng dưới lên.

IV. Cấu trúc của một đường đi ngắn nhất
(The structure of a shortest path)
Với bài toán các đường đi ngắn nhất mọi cặp trên một đồ thị G=(V,E).
Chúng ta đã chứng minh rằng tất cả các đường đi con của một đường
đi ngắn nhất là các đường đi ngắn nhất.
ji
p
p chứa tối đa m cạnh
k
j
i
p’
ω
kj
p’ chứa tối đa m-1 cạnh

Giả sử rằng đồ thị được biểu thị bởi một ma trận kề W=(ω
ij
). Xét một đường
đi ngắn nhất p từ đỉnh i đến đỉnh j, và giả sử rằng p chứa tối đa m cạnh.
Giả sử không có các chu trình trọng số âm, m hữu hạn. Nếu i = j thì p có
trọng số 0 và không có các cạnh. Nếu đỉnh i ≠ j, chúng ta phân tích đường đi
p thành:
Do vậy, p’ là một đường đi ngắn nhất từ i đến k, và

Gọi là trọng số cực tiểu của đường đi nào đó từ đỉnh i
đến đỉnh j chứa tối đa m cạnh.
V. Một giải pháp đệ quy cho bài toán các đường đi
ngắn nhất mọi cặp
Với m=0:
Với m ≥ 1:
Đẳng thức (2) là đúng do ω
jj
= 0 với mọi
j .

Vấn đề: Trọng số đường đi ngắn nhất thực tế δ(i,j) là gì?
Vì vậy, nếu đồ thị không chứa các chu trình trọng số âm thì với mỗi
cặp đỉnh i và j sao cho δ(i,j) < ∞, có một đường đi ngắn nhất từ i
đến j chứa tối đa n–1 cạnh.
Một đường đi từ đỉnh i đến đỉnh j với hơn n–1 cạnh không thể có ít
trọng số hơn một đường đi ngắn nhất từ i đến j.
Chú ý: khái niệm chu trình trọng số âm, ví dụ đồ thị sau:
Đồ thị trên có chu trình trọng số âm là <e,f,e> nên các đường đi từ s
đến e có trọng số âm lớn tùy ý và δ(s,e)= - ∞.
Do đó, các trọng số đường đi ngắn nhất thực tế được đưa ra bởi


VI. Tính toán các trọng số đường đi ngắn nhất dưới lên
Cho trước ma trận W=(ω
ij
). Chúng ta có: trong đó
m = 1, 2, …, n–1
Bây giờ chúng ta tính toán một chuỗi các ma trận L
(1)
, L
(2)
, …, L
(n-1)
,,
Ma trận cuối cùng L
(n-1)
chứa các trọng số đường đi ngắn nhất thực tế.
Trọng tâm của thuật toán là thủ tục dưới đây, được đưa ra các ma
trận L
(m-1)
và W, trả về ma trận L
(m)
. Nghĩa là, nó mở rộng tính toán
đường đi ngắn nhất hơn một cạnh.
Thời gian thực hiện là 0(n
3
) do ba vòng lặp for lồng vào nhau
ENTEND-SHORTEST-PATHS(L, W)
1 n ← rows[L]
2 Cho L’ = (l’
ij

) là một ma trận n x n
3 for i ← 1 to n
4 do for j ← 1 to n
5 do l’
ij
← ∞
6 for k ← 1 to n
7 do l’
ij
← min(l’
ij
, l
ik
+ ω
kj
)
8 return L’

Bây giờ, chúng ta có thể thấy quan hệ với phép nhân ma trận. Giả sử
chúng ta muốn tính tích ma trận C = A.B của hai ma trận nxn A và B.
Như vậy, với i,j=1, 2, …, n, chúng ta tính toán
Nhận thấy nếu chúng ta thực hiện phép thay thế
Như vậy, nếu chúng ta thực hiện các thay đổi này đối với ENTEND-
SHORTEST-PATHS chúng ta có được thủ tục không phức tạp 0(n
3
)
cho phép nhân ma trận.
MATRIX-MULTIPLY(A, B)
1 n ← rows[A]
2 Cho C là một ma trận n x n

3 for i ← 1 to n
4 do for j ← 1 to n
5 do c
ij
← 0
6 for k ← 1 to n
7 do c
ij
← c
ij
+ a
ik
.b
kj

8 return C


Hình sau trình bày một đồ thị và ma trận L(m) được tính toán bởi thủ tục
SHOW-ALL-PAIRS-SHORTEST-PATHS.

VII. Cải thiện thời gian thực hiện
Mục tiêu của chúng ta là không tính toán tất cả các ma trận
L
(m)
: chúng ta chỉ quan tâm đến ma trận L
(n-1)
.
Chú ý: các trọng số đường đi ngắn nhất thực tế được đưa ra bởi
và L

(m)
= L
(n-1)
với tất cả các số nguyên m ≥ n – 1

Thủ tục dưới đây tính toán dãy ma trận ở trên bằng cách
dùng kỹ thuật bình phương lặp lại.
Thời gian thực hiện của FASTER–ALL–PAIRS–SHORTEST–PATHS
là 0(n
3
.lgn) bởi mỗi số lg(n – 1) tích ma trận mất 0(n
3
) thời gian.
Kết luận: Chúng ta đã phát triển một thuật toán 0(V
4
) cho bài toán
các đường đi ngắn nhất mọi cặp và cải tiến đến 0(V
3
.lgV).

VIII. Chương trình Pascal:
Program AllPairs;
Uses crt;
Const vocung=50;
Type Mang=array[1 10,1 10] of integer;
var
W,K:Mang;
L:array[1 10] of Mang;
n:integer;
Procedure Nhap;

var
f:Text;
i,j:byte;
Begin
assign(f,'AllPairs.txt');
reset(f);
readln(f,n);
fillchar(W,sizeof(W),0);
for i:=1 to n do
begin
for j:=1 to n do read(f,W[i,j]);
readln(f);
end;
close(f);
End;

Procedure SHORTESTPATHS(L,W:Mang;var K:Mang);
var i,j,h:byte;
Begin
for i:=1 to n do
for j:=1 to n do
begin
K[i,j]:=vocung;
for h:=1 to n do
if K[i,j] > (L[i,h]+W[h,j]) then K[i,j]:=L[i,h]+W[h,j];
end;
End;
Procedure FASTER(W:Mang);
var m:byte;
Begin

L[1]:=W;
m:=1;
while m<n-1 do
begin

SHORTESTPATHS(L[m],L[m],L[2*m]);
m:=2*m;
end;
End;

Procedure InKQ;
var i,j:byte;
Begin
Writeln('BAI TOAN TIM DUONG DI NGAN NHAT MOI CAP DINH CUA G=(V,E)');
writeln;
writeln('MA TRAN W CUA DO THI G LA:');
writeln('(Chu y: 50 duoc gan la gia tri vo cung lon)');
writeln;
for i:=1 to n do
begin
for j:=1 to n do write(W[i,j]:3);
writeln;
end;
writeln;
writeln('MA TRAN TRONG SO CUC TIEU');
writeln;
for i:=1 to n do
begin
for j:=1 to n do write(L[n-1][i,j]:3);
writeln;

end;
readln;
End;
BEGIN
clrscr;
Nhap;
FASTER(W);
InKQ;
END.

Trân trọng cám ơn
  

×