Ư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.. 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.. Output: Kết quả của bài toán là một ma trận
Trang 1CÁ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)
Trang 2I 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
Trang 3I 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ụ:
Trang 4Vấ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
Lnxn = (lij) 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ố Wnxn = (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
Trang 5II 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(V3+V.E)=O(V3)
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(V2.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(V2.E), mà trên một đồ thị trù mật là O(V4)
Trang 6III Ư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.
Trang 7IV 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
j
p chứa tối đa m cạnh
i
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à
Trang 8Gọ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
Trang 9Vấ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
Trang 10VI 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)
Trang 11Bâ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
8 return C
Trang 13Hì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.
Trang 14VII 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
Trang 15Thủ 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(n3.lgn) bởi mỗi số lg(n – 1) tích ma trận mất 0(n3) thời gian
các đường đi ngắn nhất mọi cặp và cải tiến đến 0(V3.lgV).
Trang 16VIII 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;
Trang 17Procedure 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;
Trang 18Procedure 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.
Trang 19Trân trọng cám ơn