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 TÌM ĐƯỜNG ĐI NGẮN NHẤT

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 (718.4 KB, 19 trang )

TÌM ĐƯỜNG ĐI NGẮN NHẤT
TÌ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ư
NỘI DUNG TRÌNH BÀY
NỘ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
24.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.
24.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.
24.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



24.1 Giải thuật Bellman-Ford



24.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. 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.
24.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
24.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)
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
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

24.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.
24.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)
24.3 Giải thuật Dijkstra
24.3 Giải thuật Dijkstra
Tí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
Mộ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
, ,v1 }

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 ?
Mộ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.
Mộ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.

Đưa ra một thuật toán hiệu quả để quyết định có tồn tại một chuỗi các loại tiền
( ci1,ci2, …,cik) như là

R[i1,i2] . R[i2,i3] R[ik-1,ik] . R[ik,i1] > 1.

Phân tích thời gian chạy thuật toán của bạn.

Cho một thuật toán hiệu quả để in ra một chuỗi nếu nó tồn tại. Phân tích thời gian
chạy của thuật toán.
Mộ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

×