14/04/2008
1
BÀI TOÁN QUY HOẠCH ĐỘNG
BÀI
TOÁN
QUY
HOẠCH
ĐỘNG
(DYNAMIC PROGRAMMING)
Phạm Thế Bảo
Khoa Toán – Tin học
Trường Đại học Khoa học Tự nhiên Tp.HCM
Nội dung
• Kỹ thuậtchiađể trị thường dẫntớigiảithuật
đệ
quy
Æ
có
giải
thuật
có
thời
gian
mũ
và
giải
đệ
quy
Æ
có
giải
thuật
có
thời
gian
mũ
và
giải
bài toán con nhiềulần.
• Để tránh giải bài toán con nhiềulần Æ tạomột
bảng lưutrữ kếtquả các bài toán con để khi
cầnsẽ sử dụng lạikếtquả.
Lấ
đầ
kế
ả
á
bài
á
h
l ậ
•
Lấ
p
đầ
y
kế
tqu
ả
c
á
c
bài
to
á
ncont
h
eo quy
l
u
ậ
t
nào đó để có kếtquả củabàitoánbanđầu Æ
quy hoạch động
Phạm Thế Bảo
14/04/2008
2
Thuật giải
1. Tạobảng bằng cách:
ố
a. Gán giá trị mộ
t
s
ố
ô nào đó.
b. Gán giá trị cho các ô khác nhờ vào giá trị của các
ôtrước.
2. Tra bảng và xác định kếtquả của bài toán ban
đầu
Phạm Thế Bảo
Đánh giá
• Ưu điểm
–
Chương
trình
thực
thi
nhanh
do
không
tốn
thời
gian
Chương
trình
thực
thi
nhanh
do
không
tốn
thời
gian
giảilại bài toán con.
– Vậndụng để giải các bài toán tối ưu, có công thứctruy
hồi
• Nhược điểm
– Không tìm được công thứctruyhồi.
–
Số
lượng
bài
toán
con
cần
giải
và
lưu
trữ
kết
quả
rất
Số
lượng
bài
toán
con
cần
giải
và
lưu
trữ
kết
quả
rất
lớn.
– Việckếthợplờigiảicủa các bài toán con chưachắc
cho lờigiảicủa bài toán ban đầu.
Phạm Thế Bảo
14/04/2008
3
Bài toán tính số tổ hợp
• Tính C
n
k
bằng công thứctruyhồi.
0
n
e
á
u
k=
0
h
ay
k=n
k
⎧
⎨
Thuậtgiải:
long Comb(int n, int k){
1
0
k-1
n-1
eu 0 ay
C neáu 0<k<n
k
n
k
n
C
C
−
⎧
=
⎨
+
⎩
}
Phạm Thế Bảo
Đánh giá
• Gọi T(n) là thời gian tính C
n
k
,
ta có T
(
1
)
=C
1
và T
(
n
)
=
()
1
(
)
giải ta có T(n)=O( )
Æ bài toán con đượcgiải nhiềulần
Comb(4,2)
Phạm Thế Bảo
Comb(2,0)
Comb(3,2)
Comb(3,1)
Comb(2,2)Comb(2,1)Comb(2,1)
14/04/2008
4
Dùng quy hoạch động
• Xây dựng mộtbảng có (n+1) dòng từ 0 đếnnvà
(n+1) cộttừ 0 đếnn.Điền các giá trị ô(i,j) theo
ê
tắ
nguy
ê
n
tắ
csau:
– ô(0,0)=1 ô(i,i)=1 với0<i≤n
– ô(i,0)=1 ô(i,j)=ô(i-1,j-1)+ô(i-1,j) với 0<j<i≤n
• Ví dụ n=4
01234
0
1
Phạm Thế Bảo
0
1
1 11
2 11
3 11
4 11
Tamgiác Pascal
• Thuậtgiảimới:
int ** Comb(int n, int k){
C[0,0]=1;
for i=1 to n do
C[i,0]=1;
C[i,i]=1;
for j=1 to i-1 do
C[i,j]=C[i-1,j-1]+C[i-1,j];
endfor
return C;
}
}
• Vòng lặp for j thựchiệni-1 lần. Vòng lặpilặp
n lần Æ
Phạm Thế Bảo
14/04/2008
5
Bài toán cái ba lô
• Giả sử X[k,V] là số lượng đồ vậtkđượcchọn,
F[
kV
]
tổng
giá
trị
k
đồ
vật
được
chọn
và
V
là
F[
k
,
V
]
tổng
giá
trị
k
đồ
vật
được
chọn
và
V
là
trọng lượng còn lạicủabalô,k=1 nvà
V=1 W.
• Trường hợp đơngiảnnhất: chỉ có một đồ vật,
ta tính X[1,V] và F[1,V] với V=1 W như sau:
X[
1
V] V
di
à
F[
1
V] X[
1
V]*
–
X[
1
,
V]
=
V
di
vg
1
v
à
F[
1
,
V]
=
X[
1
,
V]*
v
1
– Vớig
1
là trọng lượng đồ vật1vàv
1
là giá trịđồ
vật1
Phạm Thế Bảo
• Giả sử tính được F[k-1,V], khi có thêm đồ vậtthứ
k, ta sẽ tính đượcF[k,V]như sau: nếuchọnx
k
đồ
vậtloạik,thìtrọng lượng còn lạicủabalôdành
cho k-1 đồ vậttừ 1 đếnk-1làU=V-x
k
*g
k
và tổng
giá
trị
k
loại
đồ
vật
đã
được
chọn
là
F[
kV
]
=
F[k
-
giá
trị
k
loại
đồ
vật
đã
được
chọn
là
F[
k
,
V
]F[k
1,U]+x
k
*v
kvới
x
k
từ 0 đếny
k
=V div g
k
và ta sẽ
chọnx
k
sao cho F[k,V] lớnnhất.
• Công thứctruyhồi:
– X[1,V]=V div g
1
và F[1,V]=X[1,V]*v
1
F[
kV
]=max{F[k
1
V
x
*
g
]+
x
*
v
}
với
x
chạy
từ
0
–
F[
k
,
V
]=max{F[k
-
1
,
V
-
x
k
*
g
k
]+
x
k
*
v
k
}
với
x
k
chạy
từ
0
đến(Vdivg
k
)
– Sau khi xác định được F[k,V] thì X[k,V] là x
k
Phạm Thế Bảo
14/04/2008
6
• Để lưucácgiátrị trung gian trong quá trình tính
F[k,V],tadùngmộtbảng có n dòng (từ 1 đếnn)–
dòng thứ k ứng vớiloại đồ vậtk,vàW+1cột(từ
0 đếnW),cộtthứ V ứng vớitrọng lượng V, mỗi
ồ
cộtVvg
ồ
m02cộtnhỏ:cột
b
ên trái lưuF[k,V],
cộtbênphảilưu X[k,V].
• Ví dụ:có05lọai đồ vậtnhư bảng,balôcótrọng
lượng W=9.
Đồ vậtTrọng lượng(g
i
) Giá trị(v
i
)
13 3
Phạm Thế Bảo
24 5
35 6
42 3
51 1
0123456 7 8 9
1 000000 1414182 2 8 2 123
2 00000040515180 9 1 10212 0
3 00000040506180 9 0 10 0 120
4 0000314062719310 2 12 413 3
v
k
5 0011304060709010 0 12 013 0
Đồ vậtg
i
v
i
133
245
356
4
2
3
• Cách tính:
– Dòng thứ nhất, dùng công thức X[1,V]=V div g
1
và F[1,V]=X[1,V]*v
1
– Từ dòng 2 đến dòng 5 dùng công thứctruyhồi F[k,V]=max{F[k-1, V-
x
k
*g
k
]+x
k
*v
k
} vớix
k
chạytừ 0 đến (V div g
k
).
– Ví dụ: tính F[2,7] ,
có x
k
={0 div 4, 1 div 4, 2 div 4, 3 div 4, 4 div 4, 5 div 4, 6 div 4, 7 div
Phạm Thế Bảo
4
2
3
511
4}= {0,1}.
F[2,7] =Max{F[2-1,7-0*4]+0*5, F[2-1,7-1*4]+1*5}
=Max{F[1,7], F[1,3]+5} = Max{8,4+5}
=
VậyX[2,7]=1
14/04/2008
7
• Vấn đề tra bảng như thế nào để có kếtquả?
– Khởi đầutrọng lượng ba lô V=W.
– Xét các đồ vậttừ n đến1,mỗi đồ vậtkứng vớitrọng
lượng còn lạiVcủabalô,nếu X[k,V]>0 thì chọn
X[k,V] đồ vậtloại k, tính lại V=V-X[k,V]*g
k
.
• Ví dụ: V=W=9
– Xét k=5, có X[5,9]=0 Æ không chọn
– Xét k=4, có X[4,9]=3 Æ chọn3đồ vậtloại 4, tính lại
V=9-3*2=3.
– Xét k=3, có X[3,3]=0 Æ không chọn
– Xét k=2, có X[2,3]=0 Æ không chọn
– Xét k=1, có X[1,3]=1 Æ chọn1đồ vậtloại 1, tính lại
V=3-1*3=0
– Tổng trọng lượng các vật trong ba lô=
– Tổng giá trị các vật trong ba lô =
Phạm Thế Bảo
Bài tập: cài đặtchương trình
Bài toán ngườigiaohàng
• Chúng ta cũng có thể dùng quy hoạch động để
iải
ết
g
iải
quy
ết
:
– ĐặtS={x
1
,x
2
,…,x
k
}làtập con các cạnh của đồ thị
G=(V,E). Ta nói một đường đitừ v đếnwphủ lên S
nếuP={v,x
1
,x
2
,…,x
k
, w}, trong đóx
i
xuấthiện ở vị
trí bấtkỳ,chỉ mộtlần.
ế
–
Ví dụ: đường đitừ a đ
ế
nfphủ lên {c,d,e,g}
Phạm Thế Bảo
a
c
f
e
g
d
14/04/2008
8
– Ta định nghĩa d(v,w,S) là tổng độ dài đường đitừ v
đếnwphủ lên S. Nếu không có đường đinhư vậythì
đặt d(v,w,S)=∞.
– Một chu trình Hamilton nhỏ nhấtH
min
củaGphảicó
tổn
g
đ
ộ
dài là d
(
H
min
)
=d
(
o
,
o
,
V-
{
o
}),
vớiolàm
ột
đỉnh
g
ộ
(
min
)(
,,
{}),
ộ
nào đó trong V.
– Ta tìm H
min
như sau:
• Nếu |V |=1 (G chỉ có 1 đỉnh) thì d(H
min
)=0
• Ngượclại:
o d(v,w,{})=d(v,w)
o d(v,w,S)=min {d(v,x)+d(x,w,S-{x})}, vớimọix∈S
ố
ế
ồ
o d(v,w) là độ dài cạnh n
ố
ihaiđỉnhvvàw,n
ế
u không t
ồ
ntạithì
d(v,w)= ∞
• Bằng cách lưutrữ các đỉnh x theo công thức đệ quy trên,
chúng ta sẽ có một chu trình Hamilton tốithiểu.
Phạm Thế Bảo