Tải bản đầy đủ (.docx) (57 trang)

Phân tích thiết kế thuật toán Các đường đi ngắn nhất từ một đỉnh nguồn

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 (1000.25 KB, 57 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆ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


Hà Nội, 1/2012


Chương 24: Các đường đi ngắn nhất từ một
đỉnh nguồn
Mục lục

Lý thuyết chung
1.Bài toán các đường đi ngắn nhất
Một số thuật ngữ:
• Cho một đồ thị có trọng số, có hướng G = (V, E ), với một hàm trọng số
w:E→R
• Trọng số của một đường đi p = (v0 , v1,…, vk )


w(p) = ∑i = 1…k w(vi −1 , vi )
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 :

3


Bài toán các đường đi ngắn nhất từ một nguồn duy nhất (Single-source shortestpaths problem) :



Đồ thị G = (V, E ) và một đỉnh nguồn s∈V
Tìm đường đi ngắn nhất từ s đến mọi đỉnh v∈V

Cạnh có trọng số âm :


Giả thiết: Trọng số của cạnh có thể âm
o Chu trình có thể có trọng số âm
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
4




Đồ thị G = (V, E )
o

Với mọi đỉnh v, đỉnh cha (predecessor) của v là một đỉnh khác hoặc là
NIL


o



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

Đồ 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
o

G không chứa chu trình trọng số âm đến được từ đỉnh nguồn s∈V
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)

5



2.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
• p = 〈v1 , v2 ,…, vk 〉 một đường đi ngắn nhất từ v1 đến vk
• Với mọi i, j mà 1 ≤i≤j≤k, gọi pij = 〈vi , vi + 1 ,…, vj 〉 là đường đi con (subpath) của
p từ vi đếnvj
⇒pijlà một đường đi ngắn nhất từ viđến vj
Hình minh họa :

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
6


đường đi ngắn nhất ta tìm được ban đầu, suy ra đó mới là đường đi ngắn nhất. Trái
vớ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 đi
ngắn nhất từ đỉnh v1 đến vk thì đường đi từ v1 đến vk đi qua p’ij mới là đường đi
ngắ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)
7


δ(s, v) = w(p)
= w(p’) + w(u, v)
= δ(s, u) + w(u, v)
Lemma 24.3 Bất đẳng thức tam giác
Đỉnh nguồn s
⇒ Với mọi cạnh (u, v) ∈E , ta có δ(s, v) ≤δ(s, u) + w(u, v)
3.Kỹ thuật rút ngắn
Kỹ thuật rút ngắn (“relaxation”)
• Duy trì cho mỗi đỉnh v một thuộc tính d[v] dùng làm chận trên lên trọng số của
một đường đi ngắn nhất từ s đến v.
• 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
INITIALIZE-SINGLE-SOURCE(G, s)
1

for each vertex v∈V[G]

2

dod[v] ¬ ∞
p[v] ¬ NIL

3
4


d[s] ¬ 0

Rút ngắn đường đi đến một đỉnh: kiểm tra xem một đường đi đến v thông qua cạnh
(u, v) có ngắn hơn một đường đi đến v hiện thời hay không. Nếu ngắn hơn thì cập
nhật d[v] và p[v]

8


RELAX(u, v, w)
1

ifd[v] >d[u] + w(u, v)

2

thend[v] ¬ d[u] + w(u, v)

3

p[v] ¬ u

Gọi RELAX lên một cạnh để tìm (trong hai đường đi đến một đỉnh) một đường đi
ngắn hơn.
3.1 . Thực thi rút ngắn lên một cạnh

Các giải thuật trong chương này gọi INITIALIZE-SINGLE-SOURCE và sau đó
gọi RELAX một số lần để rút ngắn đường đi nếu được
9






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

3.2.. Các tính chất của kỷ thuật rút ngắn
• Lemma 24.4
Cạnh (u, v) ∈E
⇒Sau khi gọi RELAX(u, v, w), ta có
d[v] ≤d[u] + w(u, v)
Ta có thể dễ dàng chứng minh tính chất này
• Lemma 24.5: Tính chất cận trên
Đỉnh nguồn s
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)
10


3.3. Cây các đường đi ngắn nhất


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
A.Lý thuyết
24.1.1. Giải thuật
Đồ thị có hướng G = (V, E )
Hàm trọng số w : E→R, có thể có cạnh có trọng số âm
Đỉnh nguồn s
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

11


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


12


24.1.4. Tính đúng đắn của giải thuật Bellman-Ford và các tính chất
Lemma 24.12
Đỉnh nguồn s


13


G 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[vi ] = δ (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
14



(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…kw(vi- 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[vi] ≤d[vi- 1 ] + w(vi- 1, vi ),
Từ trên, lấy tổng,

với mọi i = 1,…, k

∑i = 1…kd[vi] ≤∑i = 1…kd[vi- 1 ] + ∑i = 1…kw(vi- 1 , vi )


#


∑i = 1…kd[vi ] = ∑i = 1…kd[vi- 1 ], và
-∞(Lemma 24.13), nên cùng với # ta có
0 ≤∑i = 1…kw(vi - 1 , vi ),

mâu thuẫn với (*)
15



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 :
(x, t), (y, x), (y, z), (z, x),

(t, x), (t, y), (t, z),
(z, s), (s, t), (s, y)

Khởi tạo :
t

6

s

Sau lượt 1 :

x

5

2
3

8

Sau lượt 2 :


7

4

Sau lượt 3 :

2

7

Sau lượt 4 :

0

9

y

z

Bài24.1-2
Cho đồ thị G=(V,E) có trọng số, có hướng. Với mỗi v thuộc V , nếu tồn tại 1
đường đi từ đỉnh nguồn s tới v thì hiển nhiên thuật toán BELLMAN-FORD chạy
trên đồ thị G sẽ giới hạn được khoảng cách d[v] < ∞ do d[v] là tổng các trọng số
các cạnh trên đường đi từ s đến v mà các trọng
số này là các số thực xác định nên
t
x
5
d[v] cũng là số thực xác định.

5
Ngược lại khi chạy thuật toán BELLMAN-FORD
trên đồ thị G, 7với 1 đỉnh v bất
2 v. Ta chứng minh bằng
kỳ nào đó mà có d[v] < ∞ thì tồnstại 16đường đi từ s đến
3
phản chứng:
8
2

7

2

x khởi tạo ban 4đầu của thuật toán ta
Giả sử ko
tại 1 đường đi từ s3đến v. Theo
2
có d[v] = ∞.Vì không xác định được
đi nào từ s đến
v nên tồn tại tí nhất 1
4 đường
7
đỉnh nào đó không tới được từ 2s. Giảtsử đỉnh đó là v 1 , khi đó ta có d[v1] = ∞, từ đó
x
95
0
9
d[v]= ∞, trái với giả thiết. t
s

tồn

y

s

6
y

28

5
8

z

7
2
z

16
3
74
2

7


7
5

4

9

9

6

0

2

Bài24.1-3
Thuật toán đề xuất :

9

0

BELLMAN-FORD-(M+1)(G,w, s)
INITIALIZE-SINGLE-SOURCE(G, s)
changes = TRUE
while changes == TRUE
changes = FALSE
for each edge (u,v) thuộc G,E
RELAX-M ( u ,v,w)

RELAX-M ( u ,v, w)
If v.d > u.d + w(u,v)
v.d = u.d + w (u,v )

v.π = u
changes = TRUE
Bài24.1-4
Chỉnh sửa thuật toán BELLMAN-FORD để xét các d[v]= -∞ cho các đỉnh v có
chu trình có tổng các trọng số âm trên đường đi từ đỉnh nguồn từ s đến v .
BELLMAN-FORD(G, w, s)
1

INITIALIZE-SINGLE-SOURCE(G, s)

2

fori¬ 1 to |V [G ]| - 1

3
4

do for each edge (u, v) ∈E [G ]
do RELAX(u, v, w)

5

for each edge (u, v) ∈E [G ]

6

do ifd[v] >d[u] + w(u, v)

7


then d[v]= -∞

8

return FALSE
17


9

return TRUE

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
A.Lý thuyết
Bằng cách thực hiện việc rút ngắn cạnh của đồ thị có hướng có trọng số không
chứa chu trình theo thứ tự sắp xếp topo các đỉnh , chúng ta có thể tính toán đường
đ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 topo
như 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]

5


do RELAX(u, v, w)

Minh họa thực thi thuật toán bằng hình dưới đây :

6
r




s
5

1

t

0

2



3

x
7


4


y
-1



z
-2



2

(a)
18


6
r




s
5

1

t


0

2



x
7

3



y
-1



z
-2



2

4

(b)

6

r




s
5

t

0

2

2

x
7

3

6

y
-1



1


z
-2



2

4

(c )

6
r




s
5

1

t

0

2

2


3

x
7

6
4

y
-1

6

z
-2

4

2

(d)

19


6
r





s
5

1

t

0

2

2

x
7

3

6

y
-1




s
5


0

2

4

1

t
2

-2
2

4

6
r

5

z

x
7

3

6


y
-1

5

z
-2

3

2

4

(f)

6
r




s
5

1

t

0


2

2

3

x
7

6
4

y
-1

5

z
-2

3

2

(g)

Dễ 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-SINGLESOURCE(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)
20


Định lý 24.5
Nế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.

B.Phần bài tập .
Bài 24.2-1
Thực thi DAG-SHORTEST-PATHS với đỉnh nguồn là r .

6
r
0


s
5

1

t



2




x
7

3



y
-1



z
-2



2

4

(a)

6
r
0


s

5

1

t

5

2

3

x
7

3


4

y
-1



z
-2




2

(b)

21


22


6
r
0


s
5

1

t

5

2

x
7

3


3

111
1
4

y
-1



z
-2



2

(c)

6
r
0


s
5

1


t

5

2

x

3

7

3

101
1
4

y
-1

7

z
-2

5

2


(d)

6
r
0


s
5

1

t

5

2

3

3

x
7

10
4

y

-1

7

z
-2

5

2

(e)

23


6

1

r

s
5

0


t


5

2

3

x
7

3

10

y
-1

7

z
-2

5

2

4

(f)

6

r

s
5

0


1

t

5

2

3

3

x
7

10
4

y
-1

7


z
-2

5

2

(g)

24.3. Giải thuật Dijkstra .
A.Lý thuyết



o

Đồ thị G = (V, E ) có hướng

o

Hàm trọng số w : E→ℜ mà w(u, v) ≥ 0 cho mọi cạnh (u, v) ∈E

o

Đỉnh nguồn s

Giải thuật Dijkstra:
o


Dùng một priority queue Q với khóa là trị d[ ]

24


DIJKSTRA(G, w, s)
1

INITIALIZE-SINGLE-SOURCE(G, s)

2

S←∅

3

Q←V[G]

4

whileQ≠∅

5

dou← EXTRACT-MIN(Q)

6

S←S∪{u}


7

for each vertex v∈Adj[u]

8

do RELAX(u, v, w)

Phâ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 EXTRACT-MIN tốn O(V ) thời gian, vậy tất cả các EXTRACTMIN tốn O(V 2 )



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 EXTRACT-MIN tốn O(lg V ) thời gian, vậy tất cả các EXTRACTMIN tốn O(V lg V ) thời gian

25


×