[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ể ể