Lý thuyết đồ thị - Tìm đường đi ngắn nhất với Bellman

4 9 0
Lý thuyết đồ thị - Tìm đường đi ngắn nhất  với Bellman

Đang tải... (xem toàn văn)

Thông tin tài liệu

[r]

(1)

Lý thuy t đ ị

Tìm đường ng n nh t v i Bellman ấ ớ

Lý thuy tế

Khác v i thu t toán Dijkstra Floyd, Bellman gi i quy t đớ ậ ả ế ược c trả ường h p đ th cóợ ị

c nh âm Thu t tốn cịn phát hi n đạ ậ ệ ược c trả ường h p đ th có chu trình âm T m tợ ị ộ

đ nh x cho trỉ ước, thu t toán Bellman cho phép xác đ nh đậ ị ường ng n nh t đ n t t c cácắ ấ ế ấ ả

đ nh đ th ỉ ị

Nh n xét r ng đậ ằ ường ng n nh t (không ch a chu trình âm) t m t đ nh x đ n m t đ nhắ ấ ộ ỉ ế ộ ỉ

y m t đ th có n đ nh chi qua t i đa n đ nh Thu t toán Bellman ị ỉ ố ỉ ậ ước b t đ uắ ầ

v i gi thi t r ng t đ nh x, n u qua t i đa đ nh (k c đ nh xu t phát) ta s ch đ ả ế ằ ỉ ế ố ỉ ể ả ỉ ấ ẽ ỉ ế

được đ nh x v i chi phí Bỉ ước 1, n u qua t i đa đ nh, ta s đ n đế ố ỉ ẽ ế ược đ

trong bước đ nh i (sao cho có cung n i tr c ti p t m t đ nh j thu c bỉ ố ự ế ộ ỉ ộ ước đ n i)ế

Trong trình m r ng m i bở ộ ỗ ước, t i m i đ nh đ n đạ ỗ ỉ ế ược i đã, ta s l u l i đ nhẽ ỉ

cha th a mãn u ki n đỏ ề ệ ường ng n nh t đ n i Sau m t ví d minh h a choắ ấ ế ộ ụ ọ

thu t tốn Bellman.ậ

Tìm hi u qua ví d

Vd: cho đ th sau:ồ ị

Tìm đường ng n nh t t đ nh đ n t t c đ nh đ th ắ ấ ỉ ế ấ ả ỉ ị

Bước 0: kh i t oở

kh i t o đ nh v i chi phí hi n t i làở ỉ ệ

0, đ nh cha cha (ho c -1,ỉ ặ

đi u không quan tr ng) Các đ nh cònề ọ ỉ

l i đ u đạ ề ược gán chi phí ∞ Dưới b ng mô tả ả

mincost\step

0

1

2

3

1 Lê Th y Anhụ

0

1

3

6

2

0

1

3

6

2 mincost0 =

previous0 =

mincost0 = ∞

mincost0 = ∞

(2)

Lý thuy t đ ị

Bước 1: m r ng bở ộ ước

Ta phát hi n đ i v i đ nh s 0, có chi phíệ ố ỉ ố

hi n t i ∞, đệ ường ng n nh t (đi quaắ ấ

t i đa đ nh) đ n qua 1, có chi phíố ỉ ế

là 0+2=2 Tương t , đ i v i đ nh s 3, chiự ố ỉ ố

phí hi n t i ∞, đệ ường ng n nh tắ ấ

(cũng qua t i đa đ nh) đ n quaố ỉ ế

1, có chi phí 0+6=6

mincost\step

0

1 0

2 ∞ ∞

3

Bước 2:

Đ nh s có chi phí đỉ ố ược c p nh t l i điậ ậ

qua v i chi phí m i 2+3=5.ớ

Đ nh s có chi phí hi n t i ∞, c pỉ ố ệ ậ

nh t l i qua v i chi phí m i 6+2=8.ậ ớ

Chú ý: chi phí đ nh đỉ ược dùng đ tính làể

chi phí c a bủ ước (mincost1[3]=6)

mincost\step

0 ∞ 2

1 0

2 ∞ ∞

3

Bước 3:

Đ nh s có chi phí đỉ ố ược c p nh t l i điậ ậ

qua v i chi phí m i 5+2=7.ớ

mincost\step

0 ∞ 2

1 0 0

2 ∞ ∞

3 ∞ 5

Trình bày thu t tốn Bellman

Cho trước đ th có hồ ị ướng G (có th ch a c nh âm) Tìm để ứ ường xu t phát t đ nh xấ ỉ

đ n t t c đ nh đ th ế ấ ả ỉ ị

Bước 0: step = Đ có th l u l i để ể ường đi, ng nắ

nh t, ta c n thêm m ng previousấ ầ ả

2 Lê Th y Anhụ

0 mincost1 =

previous =

mincost1 = previous

1 =

mincost1 = previous1 =

mincost1 = ∞

0

mincost2 = previous

2 =

mincost2 = previous

2 =

mincost2 = previous2 =

mincost

2 =

previous2 =

0

mincost3 = previous

3 =

mincost3 = previous

3 =

mincost3 = previous3 =

mincost

3 =

(3)

Lý thuy t đ ị

mincost[step][i] = ∞, ∀i ≠ x

mincost[step][x] = đ l u l i để ường

previous[step][x] = x (b ngằ

chính nó)

Bước 2: step++;

n u ế step ≥ n d ngừ thu t tốn(*)ậ

mincost[step][i] = min( mincost[step-1][i],

min({mincost[step-1][j]+a[j][i]}) ), ∀i,j

V i a[j][i] == ∞ n u khơng có cung n iớ ế ố

previous[step][i] =:

• j n u đế ường ng n nh tắ ấ

đi qua trung gian j r i đ nồ ế

i

• i n u đế ường đ n i đãế

t i uố

Bước 3: N uế

mincost[step][i] == mincost[step-1][i], ∀i

m i đọ ường đượ ố ưc t i u, d ng thu t toán.ừ ậ

Ngượ ạc l i, quay l i bạ ước

(*): N u nh qua đ n đ nh nh ng v n ch a t i u đế ủ ỉ ẫ ố ược đường đi, ta

k t lu n đế ậ ược đ th có chu trình âm.ồ ị

Cài đ t Bellman – Hàm kh i t o (b ở ạ ước 0)

Không nh cài đ t thu t toán Dijkstra, Floy, Bellman ch p nh n c nh âm, vi cư ặ ậ ấ ậ ệ

s d ng tr -1 khơng cịn n a T m th i, ta có th s d ng tr MAXINT (32767) choử ụ ị ữ ể ụ ị

giá tr VOCUC, n u nh chi phí đ t đ n ngị ế ế ưỡng này, có th xem nh tràn s ể ố

step = 0; for (i…) {

mincost[step][i] = VOCUC; (dùng 32767 cho tr vô c c)ị ự

previous[step][i] = i; }

mincost[step][x] = 0;

Cài đ t hàm Bellman

Chú ý r ng đ có th k t lu n đằ ể ể ế ậ ược đ th có chu trình âm hay không, ta c n ch y đ nồ ị ầ ế

bước th n (nghĩa qua t i đa n+1 đ nh) Do đó, c u trúc d li u đ l u c n l u ýứ ố ỉ ấ ữ ệ ể ầ

khi khai báo

bSuccess = false;

for (step=1; step<=n; step++) // (dùng <=n thay <n)

{

for (i…) {

mincost[step][i] = mincost[step-1][i] previous[step][i] = previous[step-1][i]

// tìm đ nh j có đỉ ường n i t j > iố

// chi phí bước step-1 c a j khác ủ

for (j…) if (… && …) {

// c p nh t l i n u chi phí bậ ế ước step c a i ủ // ho c chi phí qua j: mincost[step-1][j]+a[j][i]ặ

// t i u h nố ư ơ

if (… || …) {

// c p nh t l i chi phí l u đ nh chaậ ư

(4)

Lý thuy t đ ị

… }

} }

// so sánh mincost[step] v i mincost[step-1], n u b ng nhauớ ế

// k t thúc thành côngế

int bSame = true; for (i…)

if (mincost[step][i] != mincost[step-1][i])

{ bSame = false; break; }

// gi ng nhau, đố ường t i uố ư

if (bSame) break; }

C u trúc d li u ữ ệ

int mincost[MAX+1][MAX]; // ý MAX+1

int previous[MAX+1][MAX];

Hàm in k t quế

N u nStep == n+1, ta k t lu n đ th có chu trình âm.ế ế ậ ị

Ngượ ạc l i, ta s dị chi phí ngẽ ượ ước t b c nStep-1 đ n bế ước (Do bước nStep có giá tr gi ng bị ố ước nStep-1)

k = y;

for (i=nStep-1; i>0; i ) // (ch a l i bừ ước cu i)ố

{

printf(“%d < ”, k);

k = previous[i][k]; // đ nh trỉ ước k

}

printf(“%d\n”, k); // có th thêm ki m tra k == xể

Ngày đăng: 09/03/2021, 05:20

Tài liệu cùng người dùng

Tài liệu liên quan