Mục lục Lý thuyết chung 2 1. Bài toán các đường đi ngắn nhất 2 2. Biểu diễn các đường đi ngắn nhất 3 3. Kỹ thuật rút ngắn 7 24.1. Giải thuật BellmanFord 10 A. Lý thuyết 10 B. Phần bài tập 14 24.2. Đường đi ngắn nhất từ một đỉnh nguồn trong đồ thị có hướng không có chu trình 18 A. Lý thuyết 18 B. Phần bài tập . 21 24.3. Giải thuật Dijkstra . 23 A. Lý thuyết 23 B. Phần bài tập 28 24.4. Vấn đề đường đi ngắn nhất và các ràng buộc khác nhau 36 A. Lý thuyết 36 B. Phần bài tập 39 Solved problems 44 Problem 241: Yens improvement to BellmanFord 44 Problem 242 45 Problem 243. 45 Problem 244 47 Problem 246 48 Problems 5.1, 5.2, 11.1 50 Problem 5.1 50 Problem 5.2 51 Problem 11.1 55
Trang 1VIỆN ĐÀO TẠO SAU ĐẠI HỌC
-O0O -BÀI TẬP LỚN MÔN PHÂN TÍCH VÀ
THIẾT KẾ THUẬT TOÁN
Đề tài:
CÁC ĐƯỜNG ĐI NGẮN NHẤT TỪ MỘT
ĐỈNH NGUỒN
Trang 2Hà Nội, 1/2012
Trang 3Chương 24: Các đường đi ngắn nhất từ một đỉnh nguồn
• Trọng số của đường đi ngắn nhất (shortest path weight) từ u đến v
Một đường đi ngắn nhất từ u đến v là bất kỳ đường đi p nào từ u đến v sao cho
w(p) = d(u, v).
Ví dụ về đồ thị có trọng số , có hướng được cho như hình dưới đây :
Trang 4Bài toán các đường đi ngắn nhất từ một nguồn duy nhất (Single-source
o Nếu tồn tại một chu trình có trọng số âm đến được (reachable) từ s thì trọng
số của đường đi ngắn nhất được định nghĩa?
o Không đường đi nào từ s đến một đỉnh nằm trên chu trình có thể là đường đi
ngắn nhất
o Nếu tồn tại một chu trình có trọng số âm trên một đường đi từ s đến v, ta viết d(s, v) = - ∞
o Trong ví dụ sau, các đỉnh h, i, j không đến được từ s nên có trọng số đường
đi ngắn nhất là ∞ , chứ không là -∞ mặc dù chúng nằm trên một chu trình cótrọng số âm
Giá trị trong mỗi đỉnh là trọng số đường đi ngắn nhất từ đỉnh nguồn s
• Khử mọi chu trình có trọng số 0 (nếu có) khỏi một đường đi sẽ tạo một đường
đi có cùng trọng số
2 Biểu diễn các đường đi ngắn nhất
2.1 Biểu diễn đường đi
Trang 5o Với mọi đỉnh v, đỉnh cha (predecessor) của v là một đỉnh khác hoặc là
NIL
Duy trì trường p[v], trữ con trỏ đến đỉnh cha của v Sẽ dùng p
để suy ra đường đi ngắn nhất từ s đến v
o Đồ thị các đỉnh cha Gp = (Vp , Ep) (predecessor subgraph)
Vp = {v∈V : p[v] ≠ NIL} ∪ {s}
Ep = {(p[v], v) ∈E : v ∈Vp − {s}}
• G = (V, E ) là một đồ thị có hướng, có trọng số
o G không chứa chu trình trọng số âm đến được từ đỉnh nguồn s∈V
o Cây các đường đi ngắn nhất với gốc tạis là một đồ thị có hướng G’ =
(V’, E’), với V’ ⊆V và E’ ⊆E sao cho
V’ là tập các đỉnh đến được (reachable) từ s trong G
G’ là cây có gốc với gốc là s, chứa một đường đi ngắn nhất đến
mọi đỉnh đến được từ s
Với mọi v∈V’, đường đi từ s đến v trong G’ là một đường đi
ngắn nhất từ s đến v trong G
Ví dụ : Cây các đường đi ngắn nhất có gốc tại đỉnh nguồn s:
Trong (b) và (c) là hai cây các đường đi ngắn nhất có gốc tại đỉnh nguồn s của đồ
thị trong (a)
Trang 62.2 Cấu trúc của đường đi ngắn nhất
Lemma 24.1 Đường đi con của một đường đi ngắn nhất cũng là một đường đi ngắn nhất
Dễ dàng chứng minh điều này bằng phương pháp phản chứng:
Giả sử tồn tại một đường đi con ngắn nhất không thuộc đường đi ngắn nhất , khi
đó ta dễ thấy đường đi mới đi qua đường đi con ngắn nhất có trọng số nhỏ hơn
Trang 7với giả thiết.
Như trên hình vẽ ta thấy nếu p’ij là đường đi con ngắn nhất không thuộc đường đingắn nhất từ đỉnh v1 đến vk thì đường đi từ v1 đến vk đi qua p’ij mới là đường đingắn nhất, trái với giả thiết
Lemma 24.2:
p là đường đi ngắn nhất từ s đến v, và có thể được phân thành
⇒ Trọng số của đường đi ngắn nhất từ s đến v là
δ(s, v) = δ(s, u) + w(u, v
Chứng minh
Đường đi con p’ của đường đi ngắn nhất p cũng là đường đi ngắn nhất (Lemma
24.1)
Trang 8• Biến d[v] được gọi là ước lượng đường đi ngắn nhất (shortest path estimate)
• Khởi động ước lượng đường đi ngắn nhất và trường predecessor bằng thủ tục
Trang 91 ifd[v] >d[u] + w(u, v)
2 thend[v] ¬ d[u] + w(u, v)
Trang 10• Kỹ thuật rút ngắn là cách duy nhất được dùng để thay đổi các ước lượng đường
đi ngắn nhất và các đỉnh cha (predecessor)
• Các giải thuật khác nhau ở thứ tự và số lần gọi RELAX lên các cạnh
G được khởi động bởi INITIALIZE-SINGLE-SOURCE(G, s)
⇒Với mọi v ∈V, d[v] ≥d(s, v), bất biến này được duy trì đối với mọi chuỗi các bước rút ngắn lên các cạnh của G
Một khi d[v] đạt đến cận dưới d(s, v) của nó thì nó sẽ không bao giờ thay đỗi
• Lemma 24.6: Tính chất không có đường đi
Đỉnh nguồn s
Không có đường đi từ s đến một đỉnh vV
⇒Sau khi G được khởi động bởi INITIALIZE-SINGLE-SOURCE(G, s), ta có
d[v] = d(s, v) = ∞
Đẳng thức này bất biến đối với mọi chuỗi các bước rút ngắn lên các cạnh của G
• Lemma 24.7: Tính chất hội tụ
Đỉnh nguồn s
s u→v là một đường đi ngắn nhất với các đỉnh nào đó u, vV
G được khởi động bỡi INITIALIZE-SINGLE-SOURCE(G, s), sau đó một chuỗi
các bước rút ngắn được thực thi lên các cạnh của G trong đó có cạnh (u, v)
⇒Nếu d[u] = d(s, u) vào một lúc bất kỳ trước khi gọi RELAX(u, v, w), thì sau khi gọi luôn luôn có d[v] = d(s, v)
Nhận xét: cha của v không nhất thiết phải là u, nghĩa là d[v] đã bằng d(s, v)
Trang 11• Lemma 24.8
Đỉnh nguồn s∈V
G không chứa chu trình có trọng số âm đến được từ s
⇒Sau khi khởi động G bởi INITIALIZE-SINGLE-SOURCE(G, s), ta có đồ thị
Gp là cây có gốc s [chưa phải là cây các đường đi ngắn nhất]
Mọi chuỗi các bước rút ngắn lên các cạnh của G duy trì tính chất trên thành một
bất biến
• Lemma 24.9: Tính chất đồ thị các đỉnh cha
Đỉnh nguồn s∈V
G không chứa chu trình có trọng số âm đến được từ s
Khởi động G bằng INITIALIZE-SINGLE-SOURCE(G, s) và thực thi chuổi bất
kỳ các bước rút ngắn lên các cạnh của G sao cho d[v] = δ(s, v) với mọi đỉnh v∈V
⇒Đồ thị các đỉnh cha Gp là một cây các đường đi ngắn nhất có gốc tại s
24.1 Giải thuật Bellman-Ford
Giải thuật BELLMAN-FORD trả về
• TRUE, nếu không tồn tại chu trình trọng số âm đến được từ s, cùng với các
đường đi ngắn nhất
• FALSE, nếu tồn tại chu trình trọng số âm đến được từ s
Trang 1224.1.2 Phân tích giải thuật Bellman-Ford
Thời gian chạy:
Khởi tạo: Θ(V ) thời gian
|V| - 1 lượt (dòng 2), mỗi lượt O(E ) thời gian
vòng lặp for dòng 5-7: O(E ) thời gian
⇒ Thời gian chạy tổng cộng: O(V.E )
24.1.3 Thực thi giải thuật Bellman-Ford
Đỉnh nguồn là đỉnh z.
Giả sử trong mỗi lượt (dòng 2), thứ tự relax các cạnh là:
(u, v) (u, x) (u, y) (v, u) (x, v) (x, y) (y, v) (y, z) (z, u) (z, x)
Cạnh (u, v) được sơn xám nếu π[v] = u
Trang 13• Lemma 24.12
Đỉnh nguồn s
Trang 14G không chứa chu trình có trọng số âm đến được từ s
⇒Khi giải thuật BELLMAN-FORD thực thi xong thì d[v] = d(s,v) cho mọi đỉnh v đến được từ s
Chứng minh
Gọi v là một đỉnh đến được từ s Tồn tại một đường đi ngắn nhất p = 〈v0 , , vk〉 từ
v0 = s đến vk = v Vì p là đường đi đơn nên k≤ |V | - 1
Sẽ chứng minh: d[vi ] =δ (s, vi ) sau lượt rút ngắn thứ i, với i = 1, , k, và đẳng thức
được duy trì sau đó
Dùng quy nạp:
Cơ bản: d[v0 ] = 0 = δ(s, v0) (vì v0 = s)
Giả thiết quy nạp: d[vi - 1 ] = δ (s, vi - 1) sau lượt rút ngắn thứ i- 1
Bước quy nạp: trong các cạnh được gọi rút ngắn ở lượt thứ i có cạnh (vi - 1 , vi ),
nên do tính chất hội tụ (Lemma 24.7) ta có
d[v i ] = δ (s, vi ) sau lượt i, và tại mọi thời điểm sau đó.
Vì k≤ |V | - 1 nên số lượt rút ngắn, |V | - 1, là đủ.
• Lemma 24.13
Đỉnh nguồn s
⇒Với mọi đỉnh v∈V, tồn tại đường đi từ s đến v nếu và chỉ nếu BELLMAN-FORD
hoàn tất với d[v] <∞khi nó thực thi trên G
Chứng minh: Tương tự CM Lemma 24.12
• Lemma 24.14: Tính đúng đắn của giải thuật Bellman-Ford
Thực thi BELLMAN-FORD lên đồ thị có hướng G = (V, E )
Hàm trọng số w : E→ R
Đỉnh nguồn s
Trang 15(i) Nếu G không chứa chu trình có trọng số âm đến được từ s, thì
(1) giải thuật trả về TRUE
(2) d[v] = d(s,v) cho mọi đỉnh v ∈V
(3) đồ thị Gp là cây các đường đi ngắn nhất có gốc tại s
(ii) Nếu G chứa một chu trình có trọng số âm đến được từ s, thì giải
thuật trả về FALSE
Chứng minh
(i) Giả sử G không chứa chu trình có trọng số âm đến được từ s
• Nếu v đến được từ s thì Lemma 24.12 chứng minh (2)
o Nếu v không đến được từ s thì có (2) từ tính chất không có đường đi (Hệ
luận 24.6)
• Tính chất đồ thị các đỉnh cha (Lemma 24.9) cùng với (2) chứng minh (3)
• Khi giải thuật hoàn tất, ta có với mọi cạnh (u, v):
d[v] = d(s,v) ≤ d(s,u) + w(u, v) bất đẳng thức tam giác (Lemma 24.3)
= d[u] + w(u, v),
Vậy các test dòng 6 khiến giải thuật trả về TRUE, chứng minh (1)
(ii) Giả sử G chứa chu trình có trọng số âm đến được từ s là
c = (v0 ,…,vk) với v0 = vk
Vậy∑i = 1…k w(v i- 1, vi ) < 0 (*)
Chứng minh bằng phản chứng:
• Giả sử BELLMAN-FORD trả về TRUE (thay vì FALSE), thì (dòng 5-8)
d[v i] ≤d[v i- 1 ] + w(vi- 1, vi ), với mọi i = 1,…, k
Từ trên, lấy tổng,
∑i = 1…k d[v i] ≤∑i = 1…k d[v i- 1 ] + ∑i = 1…k w(v i- 1 , vi ) #
• Vì
∑i = 1…k d[v i ] = ∑i = 1…k d[v i- 1 ], và -∞<d[vi ] <∞ (Lemma 24.13), nên cùng với # ta có
0 ≤∑i = 1…k w(v i - 1 , vi ), mâu thuẫn với (*)
Trang 163 4 2
7
2 6
5
7 8
3 4
0 9
2 6
5
7
9
8 7
3 4 2
5
7 8
5
7 8
B.Phần bài tập
Bài 24.1-1
Thực thi thuật toán Bellman- ford trên đồ thị
Thứ tự relax các cạnh : (t, x), (t, y), (t, z),(x, t), (y, x), (y, z), (z, x), (z, s), (s, t), (s, y)Khởi tạo :
Ngược lại khi chạy thuật toán BELLMAN-FORD trên đồ thị G, với 1 đỉnh v bất
kỳ nào đó mà có d[v] < ∞ thì tồn tại 1 đường đi từ s đến v Ta chứng minh bằngphản chứng:
Giả sử ko tồn tại 1 đường đi từ s đến v Theo khởi tạo ban đầu của thuật toán ta
có d[v] = ∞.Vì không xác định được đường đi nào từ s đến v nên tồn tại tí nhất 1đỉnh nào đó không tới được từ s Giả sử đỉnh đó là v1 , khi đó ta có d[v1] = ∞, từ đód[v]= ∞, trái với giả thiết
16
Trang 170 9
0 9
2
9
0 9
5 for each edge (u, v) ∈E [G ]
6 do ifd[v] >d[u] + w(u, v)
7 then d[v]= -∞
8 return FALSE
Trang 18đi ngắn nhất từ một đỉnh nguồn đơn trong thời gian Θ(V + E)
Thuật toán tìm đường đi ngắn nhất với điều kiện các đỉnh đã được sắp xếp toponhư sau :
DAG-SHORTEST-PATHS(G, w, s)
1 topologically sort the vertices of G
2 INITIALIZE-SINGLE-SOURCE(G, s)
3 for each vertex u, taken in topologically sorted order
4 do for each vertex v Adj[u]
Trang 20Dễ dàng đánh giá được thời gian chạy của thuật toán Thuật toán sắp xếp topo ở
dòng 1 thực thi trong khoảng thời gian Θ(V + E) Việc gọi
INITIALIZE-SINGLE-SOURCE(G, s) ở dòng 2 mất Θ(V) thời gian Tại đây có 1 vòng lặp cho 1 đỉnh
trong vòng lặp for Có tổng số |E| lần lặp trong bản thân vòng lặp ở dòng 4-5 Vì mỗi lần lặp trong vòng for mất Θ(1) thời gian, lên tổng thời gian chạy là Θ(V + E)
Trang 21Nếu một đồ thị có hướng,có trọng số G = (V,E) có một đỉnh nguồn s và không cóchu trình, khi thủ tục DAG-SHORTEST-PATHS thực hiện xong thì ta có d[v] =δ(s, v) với tất cả các đỉnh v thuộc V và các đồ thị con Gπ là cây đường đi ngắn nhất.
Trang 232
101 1
Trang 24• Giải thuật Dijkstra:
o Dùng một priority queue Q với khóa là trị d[ ]
Trang 25Phân tích giải thuật Dijkstra:
• Thời gian chạy phụ thuộc vào hiện thực của priority queue Q:
o Linear array
Mỗi MIN tốn O(V ) thời gian, vậy tất cả các MIN tốn O(V 2 )
EXTRACT- Tất cả các lần gọi RELAX tốn O(E ) thời gian vì mỗi DECREASE-KEY
để hiện thực RELAX tốn O(1) thời gian
⇒ Thời gian chạy tổng cộng: O(V 2 + E ) = O(V 2 )
o Binary heap
Tạo heap tốn O(V ) thời gian
Mỗi MIN tốn O(lg V ) thời gian, vậy tất cả các MIN tốn O(V lg V ) thời gian
Trang 26EXTRACT- Tất cả các lần gọi RELAX tốn O(E lg V ) thời gian, vì mỗi KEY để hiện thực RELAX tốn O(lg V ) thời gian
DECREASE-⇒ Thời gian chạy tổng cộng: O((V + E )lg V )
o Fibonacci heap
Tạo Fib-heap với |V | phần tử tốn O(V ) thời gian
Mỗi EXTRACT-MIN tốn O(lg V ) phí tổn khấu hao, vậy tất cả các EXTRACT-MIN tốn O(V lg V ) thời gian
Tất cả các lần gọi RELAX tốn O(E ) thời gian, vì mỗi DECREASE-KEY
để hiện thực RELAX tốn O(1) phí tổn khấu hao
⇒ Thời gian chạy tổng cộng: O(V lg V + E )
Thực thi giải thuật Dijkstra:
- Đỉnh màu đen là đỉnh trong S
- Đỉnh màu xám là đỉnh có khóa nhỏ nhất trong queue Q
(do đó sẽ được đem vào S trong lần lặp tới)
Trang 27• Định lý 24.10:Tính đúng đắn của giải thuật Dijkstra
o Thực thi giải thuật Dijkstra lên đồ thị có hướng G = (V, E )
hàm trọng số w : E→ℜ không âm
đỉnh nguồn s
⇒
o Khi giải thuật thực thi xong,
d[u] = d(s, u) cho mọi đỉnh u ∈V
Chứng minh
Trang 28Sẽ chứng minh: ∀u ∈V, d[u] = d(s, u) khi u được đưa vào tập S và sau đó đẳng
thức luôn được duy trì
Chứng minh bằng phản chứng:
(*) Giả sử u là đỉnh đầu tiên rời hàng đợi Q và vào tập S mà d[u] ≠δ (s,u)
o Phải có một đường đi từ s đến u Vì nếu không thì d[u] = δ (s, u) = ∞ do tínhchất không có đường đi (Hệ luận 25.6), mâu thuẫn!
o Vì trọng số dương nên có đường đi ngắn nhất p từ s đến u, với s ∈S và
u∈V−S Gọi y là đỉnh đầu tiên dọc p kể từ s sao cho y∈V −S Đặt x là
predecessor của y
o Chứng tỏ d[y] = δ (s, y) khi u được đưa vào tập S: theo (*) ta phải có d[x] = δ
(s, x) khi x được đưa vào S Khi đó được rút ngắn lên cạnh (x, y) nên d[y] = d(s, y) do tính chất hội tụ (Lemma 25.7)
o Vì y trước u trên đường đi ngắn nhất từ s đến u và mọi trọng số đều dương
nên δ (s, y) ≤δ (s, u)
o Vậy
o d[y] = δ (s, y)
≤δ (s, u) ≤d[u] do tính chất cận trên (Lemma 25.5)
o Khi u được chọn bởi EXTRACT-MIN thì y còn trong Q nên
d[u] ≤d[y], do đó hai bất đẳng thức trên trở thành các đẳng thức sau:
Trang 29Vậy d[u] = δ (s, u) khi u được đưa vào S
Do tính chất cận trên (Lemma 25.5) nên đẳng thức trên luôn đúng sau đó
Trang 30Với đỉnh nguồn là z:
Trang 3124.6
Trang 32Figure 24.6
0 d[s] = 0, d[x] = ∞,
d[y] = ∞, d[z] = ∞,d[t] = ∞
π[s] = nil, π[x] =nil, π[y] = nil, π[z]
= nil, π[t] = nil
{}
1 d[s] = 0, d[x] = ∞,
d[y] = 5, d[z] = ∞,d[t] = 10
π[s] = nil, π[x] =nil, π[y] = s, π[z] =nil, π[t] = s
{s}
2 d[s] = 0, d[x] = 14,
d[y] = 5, d[z] = 7,d[t] = 8
π[s] = nil, π[x] = y,π[y] = s, π[z] = y,π[t] = y
{s, y}
3 d[s] = 0, d[x] = 13,
d[y] = 5, d[z] = 7,d[t] = 8
π[s] = nil, π[x] = z,π[y] = s, π[z] = y,π[t] = y
{s, y, z}
4 d[s] = 0, d[x] =9,
d[y] = 5, d[z] = 7,d[t] = 8
π[s] = nil, π[x] = t,π[y] = s, π[z] = y,π[t] = y
{s, y, z, t}
5 d[s] = 0, d[x] =9,
d[y] = 5, d[z] = 7,d[t] = 8
π[s] = nil, π[x] = t,π[y] = s, π[z] = y,π[t] = y
{s, y, z, t, x}
Bài 24.3-2
Ví dụ về đồ thị có hướng với cạnh trọng số âm làm cho thuật toán Dijkstra bị sai:
Trang 333 Tuy nhiên, đường đi ngắn nhất từ s đến t phải là s đến y sau đó đến t = 0 + 4 – 3
= 1
Thuật toán Dijkstra chỉ đúng khi các cạnh là dương vì mỗi vòng lặp chỉ lấy ra phần
tử nhỏ nhất trong queue tại thời điểm đó và duyệt nó nên khi gặp cạnh có trọng số
âm giá trị giá trị tại đỉnh đã duyệt có thể bị giảm hơn nữa nên thuật toán có thể bịsai trong trường hợp cạnh có trọng số âm
Bài 24.3-4
Để tìm đường đi tin cậy nhất giữa s và t, ta chạy giải thuật Dijkstra với trọng sốcạnh w(u,v) = -lg r (u,v) để tìm đường đi ngắn nhất từ s trong thời gian O(E+V
Trang 34lgV) Đường đi tin cậy nhất là đường đi ngắn nhất từ s đến t và độ tin cậy của đoạnđường tích trọng số của độ tin cậy của các cạnh trên đường đi đó.
Bởi vì các xác suất là độc lập, xác suất tin cậy của một đường đi bằng tích xác xuấttin cậy của các cạnh của nó.Chúng ta muốn tìm đường đi từ s đến t để tích r(u,v) làmax Điều này tương đương với việc cực đại hóa:
Việc này tương đương với tối thiểu hóa
(Chú ý: r(u,v) có thể bằng 0 và lg0 không xác định Vì thế trong thuật toán này tađịnh nghĩa lg0 = - ∞)
Vì thế nếu ta gán w(u,v) = - lgr(u,v), ta có bài toán đường đi ngắn nhất
Vì lg1 = 0, lgx < 0 với mọi 0 < x < 1, và ta định nghĩa lg0 = - ∞, tất cả các cạnh làkhông âm và ta có thể sử dụng thuật toán Dijkstra để tìm đường đi ngắn nhất từ strong thời gian O(E + VlgV)
Bài 24.3-6
Quan sát rằng nếu đánh giá đường đi ngắn nhất là khác vô cùng thì nó là (|V| -1)W
Để có d[v] < vô cùng, ta phải biến thiên cạnh (u,v) với d[u] < vô cùng Theo quynạp, ta có thể chỉ ra là nếu biến thiên (u,v) thì d[v] chính là số cạnh của đoạnđường từ s đến v lần trọng số cạnh lớn nhất vì mỗi đoạn đường không có chu kỳ
có ít nhất |V| -1 cạnh và trọng số cạnh lớn nhất là W, nên ta thấy rằng d[v] <= (|V|-1)W chú ý là d[v] phải là số nguyên trừ khi nó là vô cùng
Quan sát trong giải thuật dijkstra, giá trị trả về của lần gọi hàm Extract_min là tăngmột cách đơn điệu Vì sau khởi tạo |V| việc chèn, chúng ta không làm j nữa cáchduy nhất mà giá trị khóa có thể thay đổi là bởi hoạt động Decrease-key (giảmkhóa) Vì trọng số cạnh là không âm, khi ta biến thiên cạnh (u,v) chúng ta có d[u]
< d[v] vì u là vector nhỏ nhất mà ta có thể lấy, ta biết rằng khi lấy bất kỳ vectornào khác thì giá trị khóa của vector đó đều ít nhất là d[u]
Khi các khóa được xác định là số nguyên thuộc khoảng 0-k và giá trị khóa lấy đc làtăng một cách đơn điẹu ta có thể thực thi hàng đợi giá trị nhỏ nhất để bất kỳ chuỗi