Tải bản đầy đủ (.ppt) (28 trang)

Bài toán đườ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 (511.06 KB, 28 trang )

TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

1.1 Giới thiệu bài toán
Cho đơn đồ thị liên thông, có trọng số dương G=(V,E).
Bài toán 1:
Tìm đường đi ngắn nhất từ một đỉnh u đến mỗi đỉnh v của đồ thị G.
Bài toán 2:
Tìm đường đi ngắn nhất giữa mỗi cặp đỉnh của đồ thị G.

B

1
A

5

D

Z

2

8

1

6


2

3
C

10
BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM

E


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

1.2 Thuật toán Dijkstra
Thuật toán tìm đường đi ngắn nhất từ đỉnh u đến mỗi đỉnh v của
đồ thị G, được nhà toán học người Hà Lan E. Dijkstra đề xuất vào
năm 1959.
Thuật toán thực hiện theo cách gán nhãn tại mỗi đỉnh.
Thuật ngữ:
w(x,y) : trọng số dương của cạnh (x,y);
w(x,y) là ∞ (vô cùng lớn) nếu hai đỉnh không kề nhau.
d(v) : độ dài đường đi từ đỉnh xuất phát tới đỉnh v.
p(v) : đỉnh đứng ngay trước đỉnh v trên đường đi từ đỉnh
xuất phát đến đỉnh v.
Nhãn của đỉnh v : gồm cặp (d(v), p(v))
T : Tập các nút mà đường đi ngắn nhất đã được xác định.
BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM



TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


1.2 Thuật toán Dijkstra
Gán T = ø; p(v) = NULL với mọi đỉnh v
d(a)=0; /* a là đỉnh xuất phát
Với mỗi đỉnh v còn lại thì d(v) = ∞;
Repeat
u =(uT | d(u) là bé nhất);
T = T ∪ {u};
for ((v là đỉnh kề của u) và vT)
if d(v) > d(u) + w(u,v) then
d(v) = d(u) + w(u,v)
p(v) = u

Until (T=V)
BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM

Website:


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

1.2 Thuật toán Dijkstra
Ví dụ 1:

Tìm đường đi ngắn nhất từ A đến mỗi đỉnh khác của đồ thị G
dưới đây
B

1
A

D

5

Z

2

8

1

6

2

3
C

10

BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM


E


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

1.2 Thuật toán Dijkstra
Ví dụ 1:

d(D) =∞ = d(A)+w(A,D)=0+∞=∞
d(E) =∞ = d(A)+w(A,E)=0+∞=∞
d(Z) =∞ = d(A)+w(A,Z)=0+∞=∞

d(B) =∞ > d(A)+w(A,B)=0+1=1
d(C) =∞ > d(A)+w(A,C)=0+2=2

(∞,-)
(∞,-)

B

1
(0,-)

A

5


D

8

1

6

(∞,-)

10

E

3

A
(0,-)*

(∞,-)

BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM

B

1

(∞,-)

Z


2

2
C

(1,a)

(∞,-)

5

D

8

1

6 (∞,-)

(2,a)

10

Z

2

2
C


(∞,-)

(∞,-)

E
(∞,-)

3


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

1.2 Thuật toán Dijkstra
Ví dụ 1:

(∞,-)

B

1
A
(0,-)*

2

5


D

8

1
C
(2,a)

(1,a)*

(6,b)

(1,a)*

10

6 (∞,-)

E

1

Z

2
3

A
(0,-)*


(∞,-)

d(C) =2 = d(B)+w(B,C)=1+1=2
d(D) =∞ > d(B)+w(B,D)=1+5=6
d(E) =∞ = d(B)+w(B,E)=0+∞=∞
d(Z) =∞ = d(B)+w(B,Z)=0+∞=∞
BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM

B

(6,b)

5

D

8

1

6 (∞,-)

2
C

Z

2
E


10 (12,c)
(2,a)*

3
(∞,-)

d(D) =6 > d(C)+w(C,D)=2+8=10
d(E) =∞ > d(C)+w(C,E)=2+10=12
d(Z) =∞ = d(C)+w(C,Z)=0+∞=∞


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

1.2 Thuật toán Dijkstra
Ví dụ 1:
(1,a)*
B

1
A

5

D

8


1

6

10
(2,a)*

Z

E
(8,d)

3

B

1

(12,d)

2

(0,-)* 2

C

(1,a)*

(6,b)*


A

8

1

(0,-)*2

C

(12,c)

d(E) =12 > d(D)+w(D,E)=6+2=8
d(Z) =∞ = d(D)+w(D,Z)=6+6=12
BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM

5

10
(2,a)*

(6,b)* (12,d)

D

(11,e)

6


Z

2
E

3
(8,d)*

d(Z) =12 >d(E)+w(E,Z)=8+3=11


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

1.2 Thuật toán Dijkstra
Ví dụ 1:

(1,a)*
B

1
A
(0,-)*

(6,b)*

8


1

D

5

2
C
(2,a)*

BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM

10

(11,e)*

6

Z

2
E
(8,d)*

3


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE



Website:

1.2 Thuật toán Dijkstra
Ví dụ 1: Lập bảng để giải bài toán tìm đường đi ngắn nhất
Bước

Tập T

a

b

d

c

e

z

0

ø

(0,-)

(,-)

(,-)


(,-)

(,-)

(,-)

1

a (0,-)*

(1,a)

(,-)

(2,a)

(,-)

(,-)

2

ba

-

(1,a)*

(6,b)


(2,a)

(,-)

(,-)

3

cba

-

-

(6,b)

(2,a) *

(12,c)

(,-)

4

dcba

-

-


(6,b)*

-

(8,d)

(12,d)

5

edcba

-

-

-

-

(8,d)*

(11,e)

6

zedcba

-


-

-

-

-

(11,e)*

BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

1.2 Thuật toán Dijkstra
Ví dụ 1: Nhận xét bảng kết quả đã thu được.

1/. Độ dài đường đi ngắn nhất từ A đến các đỉnh là
->B: 1
->C: 2
->D: 6
->E: 8
->Z: 11
2/. Để vẽ đường đi ngắn nhất từ A đến đỉnh Z, chúng ta sử dụng
cách đi ngược từ Z về A. Cụ thể là Z <- E <- D <- B <- A.
3/. Đường đi ngắn nhất từ A đến Z không đi qua C. Vậy đường đi

ngắn nhất không đi qua tất cả các đỉnh của đồ thị.

BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

2.2 Thuật toán Dijkstra
Ví dụ 2:
Tìm đường đi ngắn nhất giữa A và W trong đồ thị G
dưới đây
5
2

3

v

a

2

w

3

BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM


1

z

1

1
x

5

y

2


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

1.2 Thuật toán Dijkstra
Ví dụ 2:
Do bài toán chỉ cần tìm đường đi ngắn nhất từ A đến W trong đồ thị
G nên chúng ta đổi điều kiện kết thúc thuật toán Dijkstra như sau:
...
Repeat
u =(uT | d(u) là bé nhất);
T = T ∪ {u};

for ((v là đỉnh kề của u) và vT)
if d(v) > d(u) + w(u,v) then
d(v) = d(u) + w(u,v)
p(v) = u
Until ( đỉnh đích chứa trong tập T)

BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

1.2 Thuật toán Dijkstra
Ví dụ 2:
Tìm đường đi ngắn nhất giữa A và W trong đồ thị G
Bước

Tập T

a

v

x

y

w


z

0

ø

(0.-)

(,-)

(,-)

(,-)

(,-)

(,-)

1

a (0,-)*

(2,a)

(1,a)

(,-)

(5,a)


(,-)

2

xa

-

(2,a)

(1,a)*

(2,x)

(4,x)

(,-)

3

yxa

-

(2,a)

-

(2,x)*


(3,y)

(4,y)

4

vyxa

-

(2,a)*

-

-

(3,y)

(4,y)

5

wvyxa

-

-

-


-

(3,y)*

(4,y)

6

Kết thúc vì đỉnh đến w chứa trong tập T

BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:

2. Thuật toán Floyd
2.1 Giới thiệu
Để tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh của đồ
thị G=(V,E), chúng ta sử dụng thuật toán Floyd được công
bố năm 1962.
Việc tìm đường đi ngắn nhất dựa trên nguyên tắc sau:
" Nếu k là đỉnh nằm trên đường đi ngắn nhất từ i đến j thì
đoạn đường từ i đến k và từ k đến j cũng ngắn nhất"

Ak[i,j]=min(Ak-1[i,j], Ak-1[i,k]+Ak-1[k,j])


BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


2.2 Thuật toán Floyd
BEGIN
for i := 1 to n do
for j := 1 to n do
begin D[i,j] := C[i,j] ; P[i,j] := 0 end ;
for k := 1 to n do
for i := 1 to n do
for j := 1 to n do
if D[i,k] + D[k,j] < D[i,j] then
begin
D[i,j] := D[i,k] + D[k,j] ;
P[i,j] := k
end
END.
BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM

Website:


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


Website:


Bài toán đường đi ngắn nhất

2.2 Thuật toán Floyd
Ví dụ:
W=D =
0

5

1

4

2
2

1

2

3

1

0

4

5


2

2

0



3



3

0

1

2

3

1

0

0

0


2

0

0

0

3

0

0

0

3

3
P=


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


1

4

5

3

2
2

D1 =

P=

D0 =

3

Website:

1

2

3

1

0

4

5

2


2

0



3



3

0

1

2

3

1

0

4

5

2


2

0

7

3



3

0

1

2

3

1

0

0

0

2


0

0

1

3

0

0

0

k=1

D1[2,3] = min( D0[2,3], D0[2,1]+D0[1,3] )
= min (, 7)
=7
P[2,3]=1

D1[3,2] = min( D0[3,2], D0[3,1]+D0[1,2] )
= min (3,)
=3


TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE



1

4

5
2

2

D =
2

P=

Website:

1

2

3

D1 = 1

0

4

5


2

2

0

7

3



3

0

3

3
1

2

3

1

0

4


5

2

2

0

7

3

5

3

0

1

2

3

1

0

0


0

2

0

0

1

3

2

0

0

k=2

D2[1,3] = min( D1[1,3], D1[1,2]+D1[2,3] )
= min (5, 4+7)
=5

D2[3,1] = min( D1[3,1], D1[3,2]+D1[2,1] )
= min (, 3+2)
=5
P[3,1] = 2



TRƯỜNG CAO ĐẲNG NGHỀ CNTT iSPACE


2. Bài

Website:

toán đường đi ngắn nhất

Bài
toán đường đi ngắn nhất
1
2
3
1
5

4

3

2

D2 =

3

2


D =
3

P=

1

1

0

4

5

2

2

0

7

3

5

3

0


1

2

3

0

4

5

2

2

0

7

3

5

3

0

1


2

3

1

0

0

0

2

0

0

1

3

2

0

0

BIỂU DIỄN ĐỒ THỊ VÀ CÁC THUẬT TOÁN TÌM KIẾM


k=3

D3[1,2] = min(D2[1,2], D2[1,3]+D2[3,2] )
= min (4, 5+3))
=4

D3[2,1] = min(D2[2,1], D2[2,3]+D2[3,1] )
= min (2, 7+ 5)
=2


Bài toán đường đi ngắn nhất
3. Thuật toán Ford - Bellman

1

5

2

7

Điều kiện để bài toán có lời giải:
-3
6
• Phải tồn tại đường đi từ s đến t:
2
8
• Đồ thị vô hướng liên thông

• Đồ thị có hướng liên thông mạnh
1
4
5
• Đồ thị vô hướng, s và t nằm trong cùng một thành phần liên
thông
• Đồ thị có hướng, có tồn tại đường đi từ s đến t
• Trong đồ thị không tồn tại chu trình âm
• Đồ thị có hướng: không tồn tại chu trình âm.
• Đồ thị vô hướng: không tồn tại cạnh âm.

3

6


Đường đi ngắn nhất xuất phát từ 1 đỉnh
• Nhận xét:
• Nếu v là đỉnh trung gian trên đường đi ngắn nhất từ s

đến t thì đường đi từ s đến v phải là ngắn nhất và
đường đi từ v đến t cũng phải là ngắn nhất.

s


X


v




t

• Do đó, để tối ưu, người ta mở rộng bài toán tìm đường

đi ngắn nhất từ một đỉnh đến tất cả các đỉnh còn lại
của đồ thị.


Đường đi ngắn nhất xuất phát từ 1 đỉnh
• Ý tưởng chung của các thuật toán tìm đường đi ngắn

nhất.
• Dò tìm bằng cách thử đi qua các đỉnh trung gian
• Nếu phát hiện đường đi qua đỉnh trung gian ngắn hơn
đường đi hiện tại thì sẽ cập nhật đường đi mới, đồng
thời chỉnh sửa các thông tin liên quan.
• Sử dụng hai mảng để lưu trữ tạm thời:
• Mảng d[v]: Lưu trữ độ dài đường đi ngắn nhất hiện tại
từ s đến v.
• Mảng T[v]: Lưu trữ đỉnh nằm trước v trên đường đi
ngắn nhất hiện tại.


Đường đi ngắn nhất xuất phát từ 1 đỉnh
• Ý tưởng chung của các thuật toán tìm đường đi ngắn

nhất:


Truoc[v]

d[v]


X


s

d[u]

v
u

if d[v] > d[u] + c[u,v] then
{

d[v] = d[u] + c[u,v];
Truoc[v] = u;

}

c[u,v]


Thuật toán Ford-Bellman
(* Khởi tạo *)
for v  V do

Begin
d[v]:=c[s,v];
Truoc[v]:=s;
End;
(* Bắt đầu *)
d[s]:=0;
for k:=1 to n-2 do
for v  V\{ s} do
for u  V do
if d[v] > d[u] +a[u,v] then
Begin
d[v]:=d[u]+c[u,v];
Truoc[v]:=u;
End;

k

1

2

3

4

5

0,1 1,1  ,1  ,1 3,1
1 0,1 1,1


4,2

4,2 -1,3

2 0,1 1,1

4,2

3,5 -1,3

3 0,1 1,1

4,2

3,5 -1,3


Thuật toán Ford-Bellman
• Cây kết quả:

1
2
3
5
4

k

1


2

3

4

5

0,1 1,1  ,1  ,1 3,1
1 0,1 1,1

4,2

4,2 -1,3

2 0,1 1,1

4,2

3,5 -1,3

3 0,1 1,1

4,2

3,5 -1,3


×