Lời nói đầuTrong phần này, chúng ta xét bài toán tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh trong một đồ thị.. Thay vào đó, chúng ta phải chạy thuật toán Bellman-Ford chậm hơn Chúng
Trang 1ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KHOA HỌC KHOA CÔNG NGHỆ THÔNG TIN
TIỂU LUẬN
Môn học: Thiết kế và phân tích thuật toán
(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 (2014)
Trang 2Huế, 03 – 2014
MỤC LỤC
Lời nói đầu 2
Khái quát 3
1 Các đường đi ngắn nhất và phép nhân ma trận 4
1.1 Cấu trúc của một đường đi ngắn nhất 4
1.2 Một giải pháp đệ quy cho bài toán các đường đi ngắn nhất mọi cặp 5
1.3 Tính toán các trọng số đường đi ngắn nhất dưới lên 5
1.4 Cải thiện thời gian thực hiện 8
1.5 Bài tập 9
2 Thuật toán Floyd-Warshall 10
2.1 Cấu trúc của một đường đi ngắn nhất 10
2.2 Một giải pháp đệ quy cho bài toán các đường đi ngắn nhất mọi cặp 11
2.3 Tính toán các trọng số đường đi ngắn nhất dưới lên 12
2.4 Thiết lập một đường đi ngắn nhất 13
2.5 Bao đóng bắc cầu của một đồ thị có hướng 14
2.6 Bài Tập 16
3 Thuật toán Johnson cho đồ thị thưa 17
3.1 Duy trì các đường đi ngắn nhất bằng cách tái trọng số 18
3.2 Sinh các trọng số không âm bằng cách tái trọng số 19
3.3 Tính toán các đường đi ngắn nhất mọi cặp 20
3.4 Bài tập 21
4 Các bài toán 22
4.1 Bao đóng bắc cầu của một đồ thị động 22
4.2 Các đường đi ngắn nhất trong đồ thị trù mật ε 23
Trang 3Lời nói đầu
Trong phần này, chúng ta xét bài toán tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh trong một đồ thị Bài toán này phát sinh trong khi lập một bảng các khoảng cách giữa tất cả các cặp thành phố cho một bản đồ đường Chúng ta đưa ra một
một đường đi ngắn nhất (trọng số ít nhất) từ u đến v, ở đó trọng số của đường đi
là tổng các trọng số của các cung cấu thành nó Chúng ta muốn đưa ra một dạng bảng biểu: tại hàng u và cột v sẽ là trọng số của một đường đi ngắn nhất từ u đến v
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
đỉ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 Nếu chúng ta dùng cách thực thi mảng tuyến tính của hàng
phân của hàng đợi ưu tiên có thời gian thực hiện là O(VElgV), là một cải thiện nếu đồ thị thưa Một cách khác, chúng ta có thể thực thi hàng đợi ưu tiên với
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
Chúng ta cũng nghiên cứu quan hệ của bài toán các đường đi ngắn nhất mọi cặp với phép nhân ma trận và nghiên cứu cấu trúc đại số của nó
Khác với các thuật toán nguồn đơn, giả sử một phép biểu diễn danh sách kề của
đồ thị, hầu hết các thuật toán trong phần này đều sử dụng phép biểu diễn ma trận
kề (Thuật toán Johnson cho đồ thị thưa sử dụng các danh sách kề.) Để thuận
ma trận n x n W biểu thị các trọng số cạnh của một đồ thị có hướng n đỉnh
Trang 4Bảng kết quả của thuật toán đường đi ngắn nhất mọi cặp được trình bày trong
Để giải quyết bài toán các đường đi ngắn nhất mọi cặp đỉnh trên một ma trận kề cho trước, chúng ta cần tính toán không chỉ các trọng số đường đi ngắn nhất mà
tử trước (predecessor) nào đó của j trên một đường đi ngắn nhất từ i Cũng như
đồ thị con đã được xét trước đây (predecessor subgraph) Gπ trong chương 24 là một cây các đường đi ngắn nhất đối với một đỉnh nguồn đã cho, đồ thị con được
Vπ,i = { j ∈ V: πij ≠ NIL } ∪{ i } và Eπ,i = { (πij , j ): j ∈ Vπ,i – { i }}
bản đã thay đổi của thủ tục PRINT-PATH trong chương 22, in một đường đi ngắn nhất từ đỉnh i đến đỉnh j
Để nêu bật các tính năng chủ yếu của các thuật toán mọi cặp trong phần này,
trước đây (predecessor matrix) nhiều như trường hợp các đồ thị con đã được xét trước đây (predecessor subgraph) trong chương 24 Những điểm cơ bản được đề cập bởi một số bài tập
Khái quát
Đoạn 1 trình bày một thuật toán quy hoạch động dựa trên phép nhân ma trận để giải quyết bài toán các đường đi ngắn nhất mọi cặp Sử dụng kỹ thuật “bình
toán quy hoạch động khác, thuật toán Floyd-Warshall, được đưa ra trong đoạn 2
toán tìm bao đóng bắc cầu của một đồ thị có hướng, liên quan đến bài toán các
Trang 5đường đi ngắn nhất mọi cặp Cuối cùng, đoạn 3 trình bày thuật toán Jonhson Không như các thuật toán khác trong phần này, thuật toán Jonhson sử dụng biểu diễn danh sách kề của một đồ thị Nó giải quyết bài toán các đường đi ngắn nhất
thị thưa, lớn
Trước khi tiến hành, chúng ta cần thiết lập một số quy ước cho các phép biểu diễn ma trận kề Thứ nhất, chúng ta sẽ giả sử chung rằng cho trước đồ thị
các ma trận bằng các chữ cái hoa, như W, L hoặc D, và các phần tử riêng lẻ của
các lần lặp lại Cuối cùng, với một ma trận đã cho n x n A, chúng ta sẽ giả sử rằng giá trị của n được lưu trữ trong thuộc tính rows[A]
1 Các đường đi ngắn nhất và phép nhân ma trận
(Shortest paths and matrix multiplication)
Đoạ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
Trước khi tiến hành, chúng ta hãy tóm tắt ngắn gọn lại các bước đã nêu trong chương 15 cho việc phát triển một thuật toán quy hoạch động
1 Đặc điểm 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
(Bước thứ tư, kiến tạo một giải pháp tối ưu từ thông tin đã tính toán, sẽ dành cho các bài tập.)
1.1 Cấu trúc của một đường đi ngắn nhất
(The structure of a shortest path)
Chúng ta bắt đầu bằng việc chỉ ra đặc điểm cấu trúc của một giải pháp tối ưu 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 (Bổ đề 24.1) 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 Giả sử rằng đồ thị được biểu thị bởi một ma trận
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
Trang 6i = j thì p có trọng số 0 và không có các cạnh Nếu đỉnh i và đỉnh j phân biệt,
tối đa m – 1 cạnh Theo bổ đề 24.1, p’ là một đường đi ngắn nhất từ i đến k, và
1.2 Một giải pháp đệ quy cho bài toán các đường đi ngắn nhất mọi cặp
(A recursive solution to the all-pairs shortest-paths problem)
chứa tối đa m cạnh Khi m=0, đó là một đường đi ngắn nhất từ i đến j mà không
có cạnh nào nếu và chỉ nếu i = j Như vậy,
đường đi ngắn nhất từ i đến j bao gồm tối đa m–1 cạnh) và trọng số cực tiểu của đường đi bất kỳ từ i đến j bao gồm tối đa m cạnh, có được bằng cách xem xét tất
cả các phần tử trước có thể (possible predecessor) k của j Như vậy, chúng ta định nghĩa theo đệ quy
lij(m) = min (lij(m – 1), min{lik(m – 1) + ωkj} )
ngắn nhất từ i đến j là đơn giản và như vậy 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 Do đó, các trọng số đường đi ngắn nhất thực tế được đưa ra bởi
1.3 Tính toán các trọng số đường đi ngắn nhất dưới lên
(Computing the shortest-path weights bottom up)
Trang 7viết mà không có các chỉ số trên để các ma trận đầu vào và đầu ra của nó độc lập
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 n x n A và B Như vậy, với i,j=1, 2, …, n, chúng ta tính toán
Trang 8L(1) = L(0) W = W,
0 5 2
0 4
7 1 0
4 8
3 0
2 0 5 1 2
11 5 0 4
7 1 4 0 3
4 2 8 3 0
2 0 5 1 2
11 5 0 4 7
1 1 4 0 3
4 2 3 3 0
2 0 5 1 2
3 5 0 4 7
1 1 4 0 3
4 2 3 3 0
1
Trang 91.4 Cải thiện thời gian thực hiện
(Improving the running time)
vì vậy phép nhân ma trận được xác định bởi thủ tục ENTEND-SHORTEST -
Trong mỗi lần lặp lại của vòng lặp while của các dòng 4 – 6, chúng ta tính toán
kiểm tra thất bại, và thủ tục trả về ma trận cuối mà nó đã tính toán
Thời gian thực hiện của FASTER–ALL–PAIRS–SHORTEST–PATHS là
mã là chặt, không chứa các cấu trúc dữ liệu phức tạp, và do đó hằng ẩn trong ký
lg(n – 1) lg(n – 1) lg(n – 1) - 1 lg(n – 1) - 1
lg(n – 1) lg(n – 1)
Trang 10Hình 2 Một đồ thị có hướng, trọng số dùng trong các bài tập 1-1, 2-1, và 3-1.
1-6
Giả sử chúng ta muốn tính toán các đỉnh trên đường đi ngắn nhất trong các thuật
–1
7 10
Trang 11Các đỉnh trên các đường đi ngắn nhất cũng có thể được tính toán cùng thời gian
trước của đỉnh j trên bất kỳ đường đi trọng số cực tiểu từ i đến j chứa tối đa m cạnh Thay đổi ENTEND-SHORTEST-PATHS và SHOW-ALL-PAIRS-
1-8
Thủ tục FASTER-ALL-PAIRS-SHORTEST-PATHS, như được viết, yêu cầu
Nêu một thuật toán hiệu quả để tìm chiều dài (số cạnh) của một chu trình trọng
số âm có chiều dài cực tiểu trong một đồ thị
2 Thuật toán Floyd-Warshall
(The Floy-Warshall algorithm)
Trong đoạn này, chúng ta sẽ dùng công thức quy hoạch động khác để giải quyết bài toán đường đi ngắn nhất mọi cặp trên một đồ thị có hướng G=(V,E) Kết quả
các cạnh trọng số âm có thể hiển thị, nhưng chúng ta giả định rằng không có chu trình trọng số âm Trong đoạn 25.1, theo tiến trình xử lý quy hoạch động để giải quyết thuật toán Sau khi xem xét kết quả thuật toán, chúng ta đưa ra một phương thức tương tự để tìm bao đóng bắc cầu của một đồ thị có hướng
2.1 Cấu trúc của một đường đi ngắn nhất
(The structure of a shortest path)
Trong thuật toán Floyd-Warshall, chúng ta dùng một mô tả đặc điểm khác về cấu trúc của một đường đi ngắn nhất hơn cách dùng thuật toán mọi cặp trong nền tảng phép nhân ma trận Thuật toán xét các đỉnh “trung gian” của một
đường đi ngắn nhất, trong đó một đỉnh trung gian của một đường đi đơn giản
Trang 12Thuật toán Floyd-Warshall được dựa trên quan sát dưới đây Dựa vào các giả định của chúng ta là các đỉnh của G là V={1,2,…,n}, xét một tập con {1,2,…,k}
j mà các đỉnh trung gian lấy từ {1,2,…,k}, và cho p là một đường đi trọng số cực tiểu trong số chúng (Đường đi p là đơn giản.) Thuật toán Floyd-Warshall xem xét mối quan hệ giữa đường đi p và các đường đi ngắn nhất từ i đến j với tất cả các đỉnh trung gian trong tập hợp {1,2,…, k-1} Mối quan hệ tùy thuộc vào việc
k có là một đỉnh trung gian của đường đi p không
gian của đường đi p nằm trong tập {1,2,…,k-1} Như vậy, một đường đi ngắn nhất từ đỉnh i đến đỉnh j với tất các đỉnh trung gian trong tập {1,2,…,k-1} cũng
là một đường đi ngắn nhất từ i đến j với tất cả các đỉnh trung gian trong tập {1,2,
…,k}
ngắn nhất từ i đến k với tất cả các đỉnh trung gian trong tập {1,2,…,k} Bởi vì
một đường đi ngắn nhất từ i đến k với các đỉnh trung gian trong tập {1,2, ,k-1}
p: tất cả các đỉnh trung gian trong tập {1,2,…,k}
Hình 3 Đường đi p là một đường đi ngắn nhất từ đỉnh i đến đỉnh j và k là đỉnh trung gian được đánh số cao nhất của p Đường đi p 1 , một phần của đường đi p từ đỉnh i đến đỉnh k, có tất cả các đỉnh
trung gian trong tập hợp {1,2,…,k-1} Tương tự đường đi p 2 từ đỉnh k đến đỉnh j.
2.2 Một giải pháp đệ quy cho bài toán các đường đi ngắn nhất mọi cặp
(A recursive solution to the all-pairs shortest-path problem)
Dựa vào các nhận xét ở trên, chúng ta định nghĩa một một công thức đệ quy ước
đi ngắn nhất từ đỉnh i đến đỉnh j mà tất cả các đỉnh trung gian trong tập {1,2,
…,k} Khi k=0, một đường đi từ đỉnh i đến đỉnh j mà không có đỉnh trung gian nào được đánh số lớn hơn 0 thì không tồn tại đỉnh trung gian Như vậy đường đi
0
Trang 13( ) 1
0 ,
if
d d
k ij ij k
Với mọi đường đi, tất cả các đỉnh trung gian là trong tập {1,2,…,n}, ma trận
D(n) =(d( )n
2.3 Tính toán các trọng số đường đi ngắn nhất dưới lên
(Computing the shortest-path weights bottom up)
Dựa vào phép truy toán (5), có thể dùng thủ tục dưới lên sau để tính các giá trị
( )
d k
k ij
k ij
) 1 ( ) 1 ( ) 1 ( )
0 5 2
0 4
7 1 0
4 8
3 0
nil nil
nil nil nil
nil nil nil nil
nil nil nil
nil nil
5
4 4
3
2 2
1 1
2 0 5 5 2
0 4
7 1 0
4 8
3 0
nil nil
nil
nil nil nil nil
nil nil nil
nil nil
5
1 4
1 4 3
2 2
1 1
2 0 5 5 2
11 5 0 4
7 1 0
4 4 8 3 0
nil nil
nil
nil nil
nil nil nil nil
5
1 4
1 4
2 2 3
2 2
1 2 1 1
Trang 142 0 5 1 2
11 5 0 4
7 1 0
4 4 8 3 0
nil nil
nil
nil nil
nil nil nil nil
5
1 4
3 4
2 2 3
2 2
1 2 1 1
2 0 5 1 2
3 5 0 4 7
1 1 4 0 3
4 4 1 3 0
5 4 3 4
1 4
3 4
1 2 3
4
1 2 4 4
1 2 4 1
2 0 5 1 2
3 5 0 4 7
1 1 4 0 3
4 2 3 1 0
5 4 3 4
1 4
3 4
1 2 3
4
1 2 4 4
1 5 4 3
Hình 4 Dãy các ma trận D (k) và Π (k) được tính bởi thuật toán Floyd-Warshall
với đồ thị trong hình 1.
trong hình 1
Thời gian thực hiện của thuật toán Floyd-Warshall được xác định bởi các vòng
for lồng nhau của các dòng 3-6 Do mỗi phép tính của dòng 6 có Ο(1) thời gian,
đoạn 1, đoạn mã là chặt, các cấu trúc dữ liệu không phức tạp và do đó hằng số
hết ngay cả các đồ thị đầu vào có kích cỡ vừa
2.4 Thiết lập một đường đi ngắn nhất
(Constructing a shortest path)
Có một số phương pháp khác nhau để thiết lập các đường đi ngắn nhất trong thuật toán Floyd-Warshall Có một cách là tính ma trận D của các trọng số
PRINT-ALL-PAIRS-SHORTEST-PATH có thể dùng để in các đỉnh trên một đường đi ngắn nhất đã cho
Trang 15Π(0), Π(1),…, Π(n), trong đó Π=Π(n) và π(k)
đỉnh j trên đường đi ngắn nhất từ đỉnh i với tất cả các đỉnh trung gian trong tập {1, 2,…, k}
nhất từ đỉnh i đến j không có các đỉnh trung gian Do đó
j i
i if
if i
mà chúng ta chọn là trùng với phần tử trước của j mà chúng ta chọn trên một đường đi ngắn nhất từ k với tất cả các đỉnh trung gian trong tập {1,2,…,k-1} Mặt khác, chúng ta chọn cùng phần tử trước của j mà chúng ta chọn trong đường
đi ngắn nhất từ i với tất cả các đỉnh trung gian trong tập {1,2,…,k-1} Chính thức, để k≥1,
d
d d
d d
d
k kj
k kj k
ik
k ik k
ij
k ij k
kj
k ij k
if
) 1 (
) 1 ( ) 1 (
) 1 ( ) 1 (
) 1 ( )
1 (
) 1 ( )
được xét trước đây Gπ,i là một cây các đường đi ngắn nhất với gốc i Có một cách khác để thiết lập các đường đi ngắn nhất được cho trong bài tập 2-7
2.5 Bao đóng bắc cầu của một đồ thị có hướng
(Transitive closure of a directed graph)
Cho một đồ thị có hướng G=(V,E) với tập đỉnh V={1,2,…,n}, chúng ta có thể mong ước tìm ra một đường đi trong G từ đỉnh i đến đỉnh j cho tất cả các cặp
gán trọng số 1 cho mỗi cạnh của E và chạy thuật toán Floyd-Warshall Nếu có
gian mà có thể tiết kiệm thời gian và không gian trong thực hành Phương pháp này bao hàm thay thế các toán tử logic V (OR) and Λ (AND) cho các toán tử số học min và + trong thuật toán Floyd-Warshall Với i,j,k=1,2,…,n ta định nghĩa
Trang 16trong tập {1,2,…,k} và bằng 0 nếu ngược lại Chúng ta thiết lập bao đóng bắc
E
E j i
j i or
and j
j i
i if
) , ( 1
k ij
k
ij
) 1 ( ) 1 ( ) 1 ( − ∨ − ∧ −
k ij
k ij
) 1 ( ) 1 ( ) 1 ( − ∨ − ∧ −
←
trên một đồ thị ví dụ Thủ tục TRANSITIVE-CLOSURE, giống thuật toán
giá trị toán tử logic một bit đơn xử lý nhanh hơn các toán tử số học trong dữ liệu
số nguyên Hơn nữa, do thuật toán bao đóng bắc cầu trực tiếp chỉ dùng các giá trị boolean đúng hơn là các giá trị số nguyên, sự đòi hỏi không gian nhớ là ít hơn thuật toán Floyd-Warshall bởi hệ số tương ứng kích thước của một từ lưu trữ máy tính
Trang 170 1 1 0
1 1 1 0
0 0 0 1
0 1 1 0
1 1 1 0
0 0 0 1
) 1 (
1 1 1 0
1 1 1 0
0 0 0 1
) 2 (
1 1 1 0
1 1 1 0
0 0 0 1
1 1 1 1
1 1 1 1
0 0 0 1
) 4 (
T
Hình 5 Một đồ thị có hướng và các ma trận T (k) được tính toán bởi thuật toán bao đóng bắc cầu.
2.6 Bài Tập
2-1
Thực hiện thuật toán Floyd-Warshall trên đồ thị trọng số có hướng của hình 2
2-2
Hãy trình bày, làm thế nào để tính bao đóng bắc cầu sử dụng kỹ thuật ở đoạn 1
2-3
xét trước đây GΠi, là một cây đường đi ngắn nhất với gốc là i (Chỉ dẫn: trình
k il
k
ij( ) ≥ ( ) +
2-4
Theo những điều được trình bày ở trên, thuật toán Floyd-Warshall yêu cầu
ij
) (
for i,j,k=1.2,…,n Hãy chỉ ra thủ tục dưới đây, mà đơn giản là bỏ tất cả các chỉ số trên, là đúng, và như vậy chỉ cần