quy hoach dong
Trong ngành khoa h c máy tính, quy ho ch đ ng là m t ph ng pháp gi m th i gian ươ
ch y c a các thu t toán th hi n các tính ch t c a các bài toán con g i nhau
(overlapping subproblem) và c u trúc con t i u (optimal substructure). ư
Nhà toán h c Richard Bellman đã phát minh ph ng pháp quy ho ch đ ng vào năm ươ
1953. Ngành này đã đ c thành l p nh là m t ch đ v k ngh và phân tích hượ ư
th ng đã đ c t ch c IEEE th a nh n. ượ
M c l c [ n]
1 T ng quan
2 Ví d
2.1 Dãy Fibonacci
2.2 Bàn c
3 Các thu t toán s d ng quy ho ch đ ng
4 Liên k t ngoài ế
5 Tham kh o
[s a] T ng quan
Hình 1. Tìm đ ng đi ng n nh t s d ng c u trúc con t i u; m t đ ng l n sóngườ ư ườ ượ
đ i di n cho m t đ ng đi ng n nh t gi a hai đ nh mà nó n iC u trúc con t i u có ườ ư
nghĩa là các l i gi i t i u cho các bài toán con có th đ c s d ng đ tìm các l i ư ượ
gi i t i u cho bài toán toàn c c. Ví d , đ ng đi ng n nh t t i m t đ nh trong m t ư ườ
đ th có th đ c tìm th y b ng cách: tr c h t tính đ ng đi ng n nh t t i đích t ượ ướ ế ườ
t t c các đ nh k nó, r i dùng k t qu này đ ch n đ ng đi toàn c c t t nh t, nh ế ườ ư
trong hình 1. Nói chung, ta có th gi i m t bài toán v i c u trúc con t i u b ng m t ư
quy trình ba b c: ướ
Chia bài toán thành các bài toán con nh h n. ơ
Gi i các bài toán này m t cách t i u b ng cách s d ng đ quy quy trình ba b c ư ướ
này.
S d ng các k t qu t i u đó đ xây d ng m t l i gi i t i u cho bài toán ban đ u. ế ư ư
Các bài toán con đ c gi i b ng cách chia chúng thành các bài toán nh h n, và cượ ơ
ti p t c nh th , cho đ n khi ta đ n đ c tr ng h p đ n gi n d tìm l i gi i. ế ư ế ế ế ượ ườ ơ
Hình 2. Đ th bài toán con cho dãy Fibonacci. Đây không ph i là m t c u trúc cây mà
là m t đ th có h ng phi chu trình mô t quan h gi a các bài toán con g i nhau.Nói ướ
r ng m t bài toán có các bài toán con trùng nhau có nghĩa là m i bài toán con đó đ c ượ
s d ng đ gi i nhi u bài toán l n h n khác nhau. Ví d , trong dãy Fibonacci, F3 = F1 ơ
+ F2 and F4 = F2 + F3 - khi tính m i s đ u ph i tính F2. Vì tính F5 c n đ n c F3 và ế
F4, m t cách tính F5 m t cách ngây th có th s ph i tính F2 hai l n ho c nhi u h n. ơ ơ
Đi u này áp d ng m i khi có m t các bài toán con g i nhau: m t cách ti p c n ngây ế
th có th t n th i gian tính toán l i l i gi i t i u cho các bài toán con mà nó đã gi i. ơ ư
Đ tránh vi c đó, ta l u tr l i gi i c a các bài toán con đã gi i. Do v y, n u sau này ư ế
ta c n gi i l i chính bài toán đó, ta có th l y và s d ng k t qu đã đ c tính toán. ế ượ
H ng ti p c n này đ c g i là l u tr (trong ti ng Anh đ c g i là memoization,ướ ế ượ ư ế ượ
không ph i memorization, dù t này cũng h p nghĩa). N u ta ch c ch n r ng m t l i ế
gi i nào đó không còn c n thi t n a, ta có th xóa nó đi đ ti t ki m không gian b ế ế
nh . Trong m t s tr ng h p, ta còn có th tính l i gi i cho các bài toán con mà ta ườ
bi t tr c r ng s c n đ n. ế ướ ế
Tóm l i, quy ho ch đ ng s d ng:
Các bài toán con g i nhau
C u trúc con t i u ư
Memoization
Quy ho ch đ ng th ng dùng m t trong hai cách ti p c n: ườ ế
top-down (T trên xu ng): Bài toán đ c chia thành các bài toán con, các bài toán con ượ
này đ c gi i và l i gi i đ c ghi nh đ phòng tr ng h p c n dùng l i chúng. Đâyượ ượ ườ
là đ quy và l u tr đ c k t h p v i nhau. ư ượ ế
bottom-up (T d i lên): T t c các bài toán con có th c n đ n đ u đ c gi i tr c, ướ ế ượ ướ
sau đó đ c dùng đ xây d ng l i gi i cho các bài toán l n h n. Cách ti p c n này h iượ ơ ế ơ
t t h n v không gian b nh dùng cho ngăn x p và s l i g i hàm. Tuy nhiên, đôi khi ơ ế
vi c xác đ nh t t c các bài toán con c n thi t cho vi c gi i quy t bài toán cho tr c ế ế ướ
không đ c tr c giác l m. ượ
M t s ngôn ng l p trình hàm, n i ti ng nh t là Haskell, có th t đ ng l u tr k t ế ư ế
qu c a m t l i g i hàm v i m t t p đ i s (argument) c th , đ tăng t c cách đánh
giá call-by-name (c ch này đ c g i là call-by-need). Vi c này ch có th đ i v i cácơ ế ượ
hàm không có hi u ng ph , tính ch t này luôn luôn đúng trong ngôn ng Haskell
nh ng ít khi đúng trong các ngôn ng l p trình m nh l nh, ch ng h n Pascal, C, C++,ư
Java...
[s a] Ví d
[s a] Dãy Fibonacci
M t cài đ t đ n gi n c a m t hàm tính ph n t th n c a dãy Fibonacci, tr c ti p d a ơ ế
theo đ nh nghĩa toán h c. Cài đ t này th c hi n r t nhi u tính toán th a.:
function fib(n)
if n = 0 or n = 1
return n
else
return fib(n − 1) + fib(n − 2)
L u ý r ng n u ta g i, ch ng h n, fib(5), ta s t o ra m t cây các l i g i hàm, trongư ế
đó các hàm c a cùng m t giá tr đ c g i nhi u l n: ượ
fib(5)
fib(4) + fib(3)
(fib(3) + fib(2)) + (fib(2) + fib(1))
((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
(((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
C th , fib(2) đ c tính hai l n. Trong các ví d l n h n, s có nhi u giá tr c a fib, ượ ơ
hay các bài toán con đ c tính l i, d n đ n m t thu t toán có th i gian lũy th a. ượ ế
Bây gi , gi s ta có m t đ i t ng ánh x đ n gi n, nó ánh x m i giá tr c a fib đã ượ ơ
đ c tính t i k t qu c a giá tr đó. Ta s a đ i hàm trên nh sau đ s d ng và c pượ ế ư
nh t ánh x trên. Hàm thu đ c ch đòi h i th i gian ch y O(n) thay vì th i gian ch y ượ
lũy th a:
var m := map(0 → 1, 1 → 1)
function fib(n)
if n not in keys(m)
m[n] := fib(n − 1) + fib(n − 2)
return m[n]
Đây là cách ti p c n t trên xu ng, do tr c h t ta chia bài toán thành các bài toán nhế ướ ế
h n, r i gi i chúng và l u tr các k t qu . Trong tr ng h p này, ta cũng có th gi mơ ư ế ườ
t ch hàm s d ng không gian tuy n tính (O(n)) xu ng ch còn s d ng không gian ế
h ng b ng cách s d ng cách ti p c n t d i lên. Cách này tính các giá tr nh h n ế ướ ơ
c a fib tr c, r i t đó xây d ng các giá tr l n h n: ướ ơ
function fib(n)
var previousFib := 1, currentFib := 1
repeat n − 1 times
var newFib := previousFib + currentFib
previousFib := currentFib
currentFib := newFib
return currentFib
Phiên b n bottom-up này g n v i vòng l p m nh l nh đ n gi n dùng cho vi c tính ơ
hàm Fibonacci có trong môn h c nh p môn khoa h c máy tính.
Trong c hai ví d trên, ta ch tính fib(2) m t l n, r i s d ng nó đ tính c fib(4) và
fib(3), thay vì tính nó m i l n c n tính fib(4) hay fib(3).
[s a] Bàn c
Xét m t bàn c hình vuông n × n và m t hàm chi phí c(i, j) tr v chi phí liên quan đ n ế
ô i,j (i là ch s hàng, j là ch s c t). Ví d : bàn c 5 × 5 :
+---+---+---+---+---+
5 | 6 | 7 | 4 | 7 | 8 |
+---|---|---|---|---+
4 | 7 | 6 | 1 | 1 | 4 |
+---|---|---|---|---+
3 | 3 | 5 | 7 | 8 | 2 |
+---|---|---|---|---+
2 | 2 | 6 | 7 | 0 | 2 |
+---|---|---|---|---+
1 | 7 | 3 | 5 | 6 | 1 |
+---+---+---+---+---+
1 2 3 4 5
Trong ví d , ta có ch ng h n c(1, 3) = 5
Gi s ta có m t quân c có th xu t phát t i m t ô b t kỳ t i hàng đ u tiên (hàng 1),
và ta c n tìm đ ng đi ng n nh t (t ng chi phí c a các ô đi qua là nh nh t) đ t i ườ
đ c hàng cu i cùng (hàng n), v i đi u ki n quân c ch có th ti n th ng ho c ti nượ ế ế
theo đ ng chéo sang trái ho c sang ph i. Nghĩa là, m t quân c t i ô (1,3) có thườ
nh y sang đ c m t trong ba ô (2,2), (2,3) và (2,4). ượ
+---+---+---+---+---+
5 | | | | | |
+---|---|---|---|---+
4 | | | | | |
+---|---|---|---|---+
3 | | | | | |
+---|---|---|---|---+
2 | | x | x | x | |
+---|---|---|---|---+
1 | | | O | | |
+---+---+---+---+---+
1 2 3 4 5
Bài toán này th hi n tính ch t c u trúc con t i u. Nghĩa là, l i gi i cho bài toán l n ư
ph thu c vào l i gi i cho các bài toán con. Ta đ nh nghĩa hàm q(i, j) nh sau: ư
q(i, j) = chi phí t i thi u đ đ n đ c ô (i, j) ế ượ
N u ta có th tìm đ c giá tr c a hàm này t i t t c các ô n m trên hàng n, ta s ch nế ượ
l y giá tr nh nh t và l n ng c con đ ng đó đ có đ c đ ng đi ng n nh t. ượ ườ ượ ườ
D th y r ng q(i, j) b ng chi phí t i thi u đ đ n ô b t kỳ trong ba ô n m d i nó (do ế ướ
ch có th đ n đ c (i,j) t các ô này) c ng thêm c(i, j). Ví d : ế ượ
+---+---+---+---+---+
5 | | | | | |
+---|---|---|---|---+
4 | | | A | | |
+---|---|---|---|---+
3 | | B | C | D | |
+---|---|---|---|---+
2 | | | | | |
+---|---|---|---|---+
1 | | | | | |
+---+---+---+---+---+
1 2 3 4 5
Bây gi , ta đ nh nghĩa q(i, j) m t cách chính th c h n: ơ
Ph ng trình trên r t d hi u. Dòng đ u tiên là các tr ng h p đ c bi t, dòng này cóươ ườ
m c đích d n d p cho tính ch t đ quy. Dòng th hai mô t nh ng gì x y ra t i hàng
đ u tiên, đ ta có xu t phát đi m. Dòng th ba, ph n đ quy, là ph n quan tr ng nh t.
V c b n, nó gi ng v i ví d A,B,C,D. ơ
T đ nh nghĩa này, ta có th d dàng t o m t đo n mã đ quy đ tính q(i, j). Trong
đo n mã gi sau, n là kích th c c a bàn c , c(i, j) là hàm chi phí, và min() tr v giá ướ
tr nh nh t c a các giá tr n m trong ngo c:
function minCost(i, j)
if j = 0 or j = n + 1
return infinity
else if i = 1
return c(i, j)
else
return min( minCost(i-1, j-1), minCost(i-1, j), minCost(i-1, j+1) ) + c(i, j)
C n l u ý r ng hàm này ch tính chi phí c a đ ng đi ch không ph i đ ng đi đích ư ườ ườ
th c. Ta s nói đ n ph n đó sau. ế
Cũng nh ví d v dãy Fibonacci, hàm trên ch y r t r t lâu do nó ph i t n hàng núiư
th i gian đ tính đi tính l i các đ ng đi ng n nh t. Tuy nhiên, ta có th tính nhanh ườ
h n r t nhi u n u hàm trên th c hi n công vi c l u tr các giá tr đã đ c tính (trongơ ế ư ượ
m t m ng). Ho c, ta còn có th nhanh h n n a n u tính toán theo ki u t d i lên ơ ế ướ
m t m ng hai chi u q[i, j]. T i sao? Đ n gi n là vì khi đó ta tính toán m i đ ng đi ơ ườ
ch m t l n, và ta có th ch n cái gì c n tính toán tr c. ướ
Ta còn c n bi t đ ng đi th c s nh th nào. V n đ đó có th đ c gi i quy t ế ườ ư ế ượ ế
b ng cách s d ng m t m ng n a: "m ng nút đ ng tr c" p[i, j]. M ng này l u các ướ ư
d u v t v chuy n các đ ng đi t h ng nào t i. Xét đo n mã sau: ế ườ ướ
function computeShortestPathArrays()
for x from 1 to n
q[1, x] := c(1, x)
for y from 1 to n
q[y, 0] := infinity
q[y, n + 1] := infinity
for y from 2 to n
for x from 1 to n