24.1 Giải thuật Bellman-FordGiải thuật Bellman-Ford để giải quyết bài toán đường đi ngắn nhất nguồn đơn trong trường hợp tổng quát mà trong đó các cạnh có thể có trọng số âm.. Bài toán
Trang 1TÌM ĐƯỜNG ĐI NGẮN NHẤT
Giáo viên hướng dẫn: TS Hoàng Quang
Nhóm 1: Nguyễn Thanh Nam
Trần Văn Dũng Phan Nữ Anh Thư
Trang 2NỘI DUNG TRÌNH BÀY
24.1 Giải thuật Bellman-Ford
24.2 Đường đi ngắn nhất nguồn đơn trong đồ thị có hướng không có chu trình
24.3 Giải thuật Dijkstra
24.4 Giải thuật Bellman-Ford có thể được dùng để giải
quyết một trường hợp đặc biệt của " Quy hoạch tuyến tính."
Một số bài toán
Trang 324.1 Giải thuật Bellman-Ford
Giải thuật Bellman-Ford để giải quyết bài toán đường đi ngắn nhất nguồn đơn trong trường
hợp tổng quát mà trong đó các cạnh có thể có
trọng số âm
Bài toán:
Cho đồ thị có hướng có trọng số G=(V,E) với đỉnh nguồn s và hàm trọng số w : E → R , thuật toán trả
về giá trị kiểu Boolean cho biết từ đỉnh nguồn có thể đến được một trình âm hay không Nếu có thì thuật toán sẽ kết thúc mà không có lời giải
Trang 424.1 Giải thuật Bellman-Ford
Thuật toán:
Thuật toán sử dụng kỹ thuật giảm
bớt(Relaxation) bằng cách ngày càng giảm
chiều dài của đường đi ngắn nhất từ đỉnh s đến các đỉnh v thuộc V cho đến khi đạt được giá
trị ngắn nhất δ(s, v).
Thuật toán trả về giá trị TRUE khi và chỉ khi
từ đỉnh gốc không đi đến được chu trình âm.
Trang 524.1 Giải thuật Bellman-Ford
BELLMAN-FORD(G, w, s)
1 INITIALIZE-SINGLE-SOURCE(G,s)
2 for i ← 1 to |V[G]| - 1
3 do for each edge (u, v) E[G]
4 do RELAX(u, v, w)
5 for each edge (u, v) E[G]
6 do if d[v] > d[u] + w(u, v)
7 then return FALSE
8 return TRUE
Trang 624.1 Giải thuật Bellman-Ford
Trang 724.1 Giải thuật Bellman-Ford
Tính đúng đắn của thuật toán Bellman-Ford
Bellman-Ford thực hiện trên đồ thị có trọng số có hướng G(V,E) với nguồn s và hàm trọng số w : E R → R Nếu G chứa chu trình không âm có đường đi từ s thì giải thuật trả về giá trị đúng, chúng ta có d[v] = δ(s, v) với mọi đỉnh v V, đỉnh liền trước là đồ thị con Gπ là một cây đường đi nhỏ nhất có gốc tại s Nếu G chứa một chu trình âm có đường đi từ s thì thuật toán trả về giá trị False.
Trang 824.2 Đường đi ngắn nhất nguồn đơn trong
đồ thị có hướng không có chu trình
Thuật toán:
Bằng việc giảm bớt các cạnh của một đồ thị
có hướng không có chu trình(directed
acyclic graph) G(V,E) gọi là dag mà các
đỉnh sắp xếp tô pô Chúng ta có thể tính
đường đi ngắn nhất từ một nguồn đơn với
chi phí Θ(V + E).
Đường đi ngắn nhất luôn được xác định
trong đồ thị dag
Trang 924.2 Đường đi ngắn nhất nguồn đơn trong
đồ thị có hướng không có chu trình
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]
5 do RELAX(u, v, w)
Trang 1024.2 Đường đi ngắn nhất nguồn đơn trong
đồ thị có hướng không có chu trình
Trang 1124.3 Giải thuật Dijkstra
Giải thuật Dijkstra giải quyết những vấn đề về đường đi ngắn nhất nguồn đơn trên một đồ thị có trọng số, có hướng G = (V, E) cho trường hợp mà các cạnh có trọng số không âm Vì vậy, trong phần này chúng ta giả thiết rằng w (u,v) >= 0 cho mỗi cạnh (u,v) E Chúng ta sẽ thấy với một sự thực thi tốt, thời gian hoạt động của giải thuật của giải thuật Dijkstra thấp hơn giải thuật Bellman-Ford
Trang 1224.3 Giải thuật Dijkstra
Thuật toán:
Giải thuật Dijkstra xây dựng một tập đỉnh S chứa độ dài đường đi nhắn nhất từ đỉnh nguồn s đã được xác định Giải thuật này dựa trên các bước lặp đỉnh u V – S với ước lượng đường đi ngắn nhất, thêm đỉnh u vào tập S, bỏ qua tất cả các cạnh không chứa u
Trong giải thuật sau, chúng ta sử dụng một hàng đợi
ưu tiên cực tiểu các đỉnh Q, được gán bởi giá trị d
Trang 1324.3 Giải thuật Dijkstra
DIJKSTRA(G, w, s)
1 INITIALIZE-SINGLE-SOURCE(G,w,s)
2 S ← Ø
3 Q ← V[G]
4 while Q ≠ Ø
5 do u ← EXTRACT-MIN(Q)
6 S ← S U {u}
7 for each vertex v Adj[u]
8 do RELAX(u, v, w)
Trang 1424.3 Giải thuật Dijkstra
Trang 15Tính đúng đắn của giải thuật Dijkstra
Giải thuật Dijkstra thực hiện trên một đồ thị có
trọng số, có hướng G = (V, E) với hàm trọng số
không âm w và nguồn s, hoàn thành với d[u] = δ(s, v) với mọi đỉnh u thuộc V
Trang 16Một số bài toán
Sự cải tiến của Yen đối với thuật toán Bellman-Ford
Giả sử rằng chúng ta ra lệnh giảm bớt đỉnh trong một bước chạy của
thuật toán Bellman-Ford như sau Trước khi chạy lần đầu tiên,
chúng ta gán một thứ tự tuyến tính tùy ý v1, v2,…, v|v| cho các đỉnh của đồ thị đầu vào G=(V,E) Sau đó, chúng ta chia tập cạnh E thành Ef U Eb , với Ef = { ( vi,vj) ϵ E và Eb = {(vi, vj) ϵ E : i > j } ( Giả sử rằng G không chứa những vòng lặp tự động, do đó mọi cạnh thuộc trong hoặc Ef hoặc trong Eb ) Định nghĩa Gf = (V,Ef) và Gb
= ( V, Eb)
Chứng minh rằng Gf là phi chu trình với loại tôpô { v|v| ,
v|v|-1 , ,vv|v|-1 }
Lược đồ này có cải tiến được thời gian chạy tiệm cận của thuật
toán Bellman-Ford không ?
Trang 17Một số bài toán
Những hộp lồng
Một hộp d-chiều với những chiều ( x1,x2, …., x) lồng trong hộp khác với những chiều ( y1,y2… yd) nếu tồn tại một hoán vị trên { 1,2, …, d } như là x(1) < y1, x(2) <y2,…, x(d) <yd
Biện luận rằng quan hệ lồng nhau là bắc cầu
Mô tả một phương pháp hiệu quả để quyết định có một hộp d-chiều
lồng trong một hộp khác hay không
Giả sử rằng cho một tập của n {B1, B2… Bn } hộp d-chiều Mô tả
một thuật toán hiệu quả để quyết định một chuỗi dài nhất ( Bi1 , Bi2 , …., Bik ) của những hộp như là Bij lồng trong Bij+1, đối với
j = 1,2,…,k-1 Diển tả thời gian chạy của thuật toán với thuật ngữ n
và d
Trang 18Một số bài toán
Buôn chứng khoán
Buôn chứng khoán là việc dùng sự khác nhau trong tỉ lệ trao đổi tiền tệ
để chuyển đổi một đơn vị của tiền tệ thành nhiều hơn một đơn vị của cùng loại tiền Ví dụ, giả sử rằng 1 đô la đổi được 46.4 rupees Ấn Độ, 1 rupees
Ấn Độ đổi được 2.5 Yen Nhật, và 1 Yen Nhật đổi được 0.091 đô la Từ
đó, bằng việc chuyển đổi tiền tệ, một thương gia có thể bắt đầu với 1 đô la,
và mua 46.4 x 2.5 x 0.0091 = 1.0556 đô la, thì được lãi 5.56 phần trăm Giả sử rằng cho n loại tiền c1,c2,…,cn và một bảng n x n R giá trị chuyển đổi, như vậy một đơn vị tiền tệ ci mua R[i,j] đơn vị của loại tiền cj.
tiền ( ci1,ci2, …,cik) như là
gian chạy của thuật toán
Trang 19Một số bài toán
Thuật toán chia tỉ lệ của Gabow cho những
đường đi ngắn nhất nguồn đơn.
Thuật toán chu trình trọng số trung bình tối
thiểu Karp (Karp's minimum mean-weight cycle algorithm )
Bài toán đường ngắn nhất Bitonic