• Qui hoạch động giải các bài toán “cháu” dùng chung này một lần và lưu lời giải của chúng trong một bảng và sau đó khỏi phải tính lại khi gặp lại bài toán cháu đó.. Khác với chia để trị
Trang 1CÁC CHIẾN LƯỢC
THIẾT KẾ GIẢI THUẬT
1
CHƯƠNG 5
Trang 2Nội dung
2
Trang 3Qui hoạch động
• Quy hoạch động (dynamic programming) giải các bài
toán bằng cách kết hợp các lời giải của các bài toán con của bài toán đang xét
• Phương pháp này khả dụng khi các bài toán con không độc lập đối với nhau, tức là khi các bài toán con có dùng chung những bài toán “cháu” (subsubproblem)
• Qui hoạch động giải các bài toán “cháu” dùng chung này một lần và lưu lời giải của chúng trong một bảng và sau đó khỏi phải tính lại khi gặp lại bài toán cháu đó
• Qui hoạch động được áp dụng cho những bài toán tối
ưu hóa (optimization problem)
Trang 4Khác với chia để trị:
Trong giải thuật chia để trị:
• Các bài toán con độc lập, sau đó các bài toán con này được giải một cách đệ quy
Trong giải thuật quy hoạch động:
• Các bài toán con là không độc lập với nhau, nghĩa là các bài toán con cùng có chung các bài toán con nhỏ hơn
Trang 5Ba giai đoạn của quy hoạch động
Phân rã: Chia bài toán cần giải thành những bài toán con nhỏ hơn có cùng dạng với bài toán ban đầu sao cho bài toán con kích thước nhỏ nhất có thể giải một cách trực tiếp Bài toán xuất phát có thể coi là bài toán con có kích thước lớn nhất
Giải các bài toán con và ghi nhận lời giải: Lưu trữ lời giải của các bài toán con vào một bảng để sử dụng lại nhiều lần do đó không phải giải lặp lại cùng một bài toán.
Tổng hợp lời giải: Lần lượt từ lời giải của các bài toán con kích thước nhỏ hơn xây dựng lời giải của bài toán kích thước lớn hơn, cho đến khi thu được lời giải của bài toán xuất phát (là bài toán con có kích thước lớn nhất)
Trang 6Lược đồ quy hoạch động
Phân rã
Giải và ghi nhận lời giải các bài toán con
Tổng hợp lời giải Bottom- Up
Kỹ thuật giải các bài
toán con của quy
hoạch động là quá
trình đi từ dưới lên
(bottom – up) là điểm
Trang 7Các yếu tố của một giải thuật quy hoạch động giải bài toán tối ưu
Cơ sở của quy hoạch động: Những trường hợp đơn giản
Trang 8Bốn bước của qui hoạch
động
1 Đặc trưng hóa cấu trúc của lời giải tối ưu
2 Định nghĩa giá trị của lời giải tối ưu một cách đệ quy
3 Tính trị của lời giải tối ưu theo kiểu từ dưới lên
4 Cấu tạo lời giải tối ưu từ những thông tin đã được tính toán
Trang 9Hiệu quả của quy hoạch động
Khi có các bài toán con lồng nhau, phương pháp chia để trị sẽ tỏ ra không hiệu quả, khi nó phải lặp đi lặp lại việc giải các bài toán con chung đó
Quy hoạch động sẽ giải mỗi bài toán con một lần và lời giải của các bài toán con sẽ được ghi nhận, để thoát khỏi việc giải lại bài toán con mỗi khi ta đòi hỏi lời giải của nó.
Quy hoạch động thường được áp dụng để giải các bài toán tối ưu Trong các bài toán tối ưu, ta có một tập các lời giải, và một hàm mục tiêu nhận giá trị số Ta cần tìm một lời giải để hàm mục tiêu đạt giá trị nhỏ nhất hoặc lớn nhất.
Trang 10Lược đồ thuật giải
Dynamic_Pro(A, x)
1 Chia bài toán cần giải thành nhiều bài toán con kích thước tăng dần
2 Sử dụng một bảng, lần lượt giải và lưu trữ lời giải x1,
…,xn của các bài toán con A1, …, An từ kích thước nhỏ đến lớn vào bảng sao cho việc giải các bài toán có thể
sử dụng kết quả các bài toán con trước đó
3 Lời giải bài toán đã cho A được tính toán cuối cùng là x=xn
Trang 11Ví dụ về bài toán con lồng nhau
Trang 12Tính theo đệ quy {top down}:
Function Fibonaci(n);
Begin
if (n<2)
return n else
Fibonaci(n)=Fibonaci(n-1)+Fibonaci(n-2);
End;
Ví dụ về bài toán con lồng nhau
Tính số Fibonaci thứ n
Trang 13So sánh hai giải thuật
Trang 15Dùng Qui hoạch động để tính số Fibonacy thứ n
Trang 16Thí dụ 2:
Một cặp thỏ khi được sinh ra sau 2 tháng thì bắt đầu sinh một cặp thỏ con , nhưng sau đó thì cứ
1 tháng thì chúng sinh thêm một cặp thỏ con
nữa Hỏi nếu bắt đầu từ tháng thứ nhất ta có một cặp thỏ thì sau n tháng ta có bao nhiêu cặp thỏ
Trang 17Thí dụ 2:
Gỉai: Gọi số cặp thỏ có được sau n tháng là f(n)
Các cặp thỏ được sinh ra ở tháng thứ n-1 không sinh, nhưng mỗi cặp thỏ ở tháng thứ n-2 đều sinh thêm một cặp
Vì vậy có hệ thức truy hồi
Trang 18Thí dụ2:
Trang 19Thí dụ 2:
Lời giải bằng kỹ thuật qui hoạch động để tính f(n)
F_Dynamic_Programming(n)
1 f[1] ←1 // tạo ra một bảng (danh sách) để lưu trữ
2 f[2] ←1 // kết quả các bài toán con
Trang 20Thí dụ 3:
Trang 21Dùng bảng hai chiều C[i,j] để lưu trữ các giá trị của các
tổ hợp Ci
j như là kết quả các bài toán con của c[k, n]
C[i,j] = 1 nếu i = 0 hoặc i = jC[i, j] = C[i, j-1] + C[i-1, j-1], nếu 0 < i <j, i ≤k, j ≤n
Trang 22Thí dụ 3:
Trang 24Các ví dụ áp dụng quy hoạch động
Bài toán nhân dãy ma trận
Bài toán Cái túi dạng 0-1
Bài toán dãy con chung dài nhất
và nhiều bài toán khác
Trang 25Nhân dãy ma trận
Trang 26Bài toán: Khi nhân hai ma trận A m,n và B n,p ta dùng ba vòng For
Trang 27Nhân xâu ma trận
Cho một chuỗi <A1, A2, …, An> gồm n ma trận, và ta muốn
tính tích các ma trận
A1 A2 … An
Tích của xâu ma trận này được gọi là
mở-đóng-ngoặc-đầy-đủ (fully parenthesized ) nếu nó là một ma trận đơn hoặc là
tích của hai xâu ma trận mở-đóng-ngoặc-đầy-đủ
Thí dụ: A1 A2 A3 A4 có thể được mở-đóng-ngoặc-đầy-đủ theo 5 cách:
(A1(A2(A3A4)))(A1((A2A3)A4)((A1A2)(A3A4))(A1(A2A3))A4)(((A1A2)A3)A4)
Trang 28Hai chi phí trên rất khác biệt nhau.
Nhân dãy ma trận
Trang 29 Thí dụ 2: Xét phép nhân 3 ma trận A 3,4 x B 4,5 x C 5,6
Có hai cách nhân
ABC=(AB)C và A(BC).
Tính tích AB cần 3*4*5= 60 phép nhân đựợc ma trận D cấp 3x5 Tính DC cần 3x5x6 = 180 phép nhân Do đó tính (AB)C cần 60+180 = 240 phép nhân
Tính tích (BC) cần 4*5*6= 120 phép nhân được ma trận
E cấp 4x6; tính AE cần 3x4x6=72 phép nhân Do đó tính A(BC) cần 120+72= 192 phép nhân.
Trang 30Bài toán nhân dãy ma trận
Xét phép nhân dãy ma trận
M 1 M 2 M n 1) Có bao nhiêu cách tổ chức thứ tự thực hiện phép nhân dãy ma trận này?
2) Nhân theo thứ tự nào để số phép nhân các số là ít nhất?
Trang 31Phát biểu bài toán nhân xâu ma trận
Bài toán tính tích xâu ma trận:
'‘Cho một chuỗi <M 1 , M 2 , …, M n > gồm n ma trận, với
mỗi i = 1, 2, …, n, ma trận M i có kích thước p i-1 × p i ,
ta mở-đóng-ngoặc tích này sao cho tối thiểu hóa
Đây là một bài toán tối ưu hóa thuộc loại khó.
Trang 32Số cách thực hiện dãy phép nhân n ma trận
Ký hiệu T (n) là số cách điền các dấu ngoặc vào biểu thức
tích của n ma trận Giả sử ta định đặt dấu ngoặc phân tách đầu tiên vào giữa ma trận thứ i và ma trận thứ (i + 1) trong biểu thức tích, tức là:
M = (M 1 M 2 … M i )(M i+1 M i+2 … M n )
Khi đó có T(i) cách đặt dấu ngoặc cho thừa số thứ nhất
(M 1 M 2 … M i ) và T(n - i) cách đặt dấu ngoặc cho thừa số
thứ hai (M i+1 M i+2 … M n ) và từ đó T(i)T(n-i) cách tính biểu thức (M 1 M 2 … M i )(M i+1 M i+2 … M n )
Trang 33Có bao nhiêu cách tính A1A2 An?
Công thức truy hồi
) (
) ( )
(
1 )
1
(
n i
i n
T i
T n
T
T //chỉ có 1 ma trận nên chỉ có một cách đóng mở
n=1
//nếu n>=2
Trang 35Cấu trúc của một cách mở đóng ngoặc tối ưu
Bước 1: Đặc trưng hóa cấu trúc của một lời giải tối ưu
• Dùng Ai j để ký hiệu ma trận kết quả của việc tính
Ai Ai+1…Aj
• Một sự mở đóng ngoặc tối ưu của tích xâu ma trận
A1.A2… An
• Tách xâu ngay tại vị trí nằm giữa Ak và Ak+1 với một trị
nguyên k, 1 ≤ k < n Nghĩa là, trước tiên ta tính các chuỗi ma trận A1 k and Ak+1 n và rồi nhân chúng với nhau
để cho ra A1.n
• Chi phí của sự mở đóng ngoặc tối ưu này = chi phí tính
Al k + chí phí tính Ak+1 n, + chi phí nhân chúng lại với nhau
Trang 36Diễn tả lời giải một cách đệ quy
• Ở đây, những bài toán con của ta là bài toán xác định chi phí tối ưu ứng với sự mở đóng ngoặc cho chuỗi
Ai.Ai+1… Aj với 1 ≤ i ≤ j ≤ n.
• Đặt m[i, j] là tổng số tối thiểu các phép nhân vô hướng được đòi hỏi để tính ma trận Ai j Chi phí của cách rẻ nhất để tính A1 n sẽ được ghi ở m[1, n]
• Giả sử rằng sự mở đóng ngoặc tối ưu tách đôi tích chuỗi
Ai Ai+l… Aj tại giữa Ak and Ak+l, với i ≤ k < j Thì m[i, j]
bằng với chí phí tối thiểu để tính Ai k và Ak+1 j, cộng với chi phí để nhân hai ma trận này lại với nhau
Trang 37
Bước 2: Lời giải đệ quy
• Mỗi ma trận Ai có kích cỡ là pi-1x pi, vì vậy tích của
Ai k,Ak+1 j cần pi-1pkpj phép toán vô hướng
• Như vậy, định nghĩa đệ quy cho chi phí tối thiểu của một
sự mở đóng ngoặc cho Ai Ai+l… Aj là như sau:
m[i, j] = min {m[i, k] + m[k + 1, j] + pi-1pkpj.} nếu i < j
• Để giúp theo dõi cách tạo một lời giải tối ưu, hãy định nghĩa:
• s[i, j]: trị của k tại đó chúng ta tách tích xâu ma trận
AiAi+1…Aj để đạt đến một sự mở đóng ngoặc tối ưu
(5.2)
Trang 38Một nhận xét quan trọng
Một nhận xét quan trọng là
' 'Sự mở đóng ngoặc của xâu con A 1 A 2 A k bên trong
Như vậy, một lời giải tối ưu cho bài tóan tích xâu ma trận chứa đựng trong nó những lời giải tối ưu của những bài toán con
Bước thứ hai của phương pháp qui hoạch động là định nghĩa trị của lời giải tối ưu một cách đệ quy theo những lời giải tối ưu của những bài toán con
Trang 39B3:Tính những chi phí tối ưu
• Thay vì tính lời giải dựa vào công thức cho ở (5.2) bằng một giải thuật đệ quy, chúng ta đi thực hiện Bước 3 của qui hoạch động: tính chi phí tối ưu bằng cách tiếp cận từ dưới lên
• Giả sử ma trận Ai có kích thước pi-1× pi với i = 1, 2 , , n
• Đầu vào là chuỗi trị số <p0, p1, …, pn> với length[p]=n+1
• Thủ tục dùng một bảng m[1 n, 1 n] để lưu các chi phí
m[i, j] và bảng s[1 n, 1 n] để lưu giá trị nào của vị trí k
mà thực hiện được chi phí tối ưu khi tính m[i, j] Bảng s dùng để lưu giá trị tối ưu
• Thủ tục MATRIX-CHAIN-ORDER trả về hai mảng m và s.
Trang 41Độ phức tạp tính toán
Các vòng lặp lồng nhau tới 3 cấp, chỉ số các vòng lặp (l, i, k) đều có nhiều nhất n-1 giá trị
Độ phức tạp của thuật giải là O(n 3 )
Trang 42Một thí dụ: Tính tích xâu ma
trận
Vì ta định nghĩa m[i, j] chỉ cho i < j, chỉ phần của bảng m ở
trên đường chéo chính mới được dùng
Cho các ma trận với kích thước như sau:
Trang 43Một thí dụ về tính tích xâu ma trân (tt.)
Số phép toán tối thiểu để nhân 6 ma trận là 15125
Trang 44Một thí dụ về tính tích xâu ma trân (tt.)
Trang 45Bước 4: Tạo một lời giải tối
ưu
• Ta dùng mảng s[1 n, 1 n] để xác định cách tốt nhất để
tính tích xâu ma trận Mỗi phần tử s[i, j] ghi trị của k
sao cho tại đó sự mở đóng ngoặc tối ưu tách đôi xâu
AiAi+1… Aj thành hai đoạn tại Ak và Ak+1
• Kết quả nhân cuối tối ưu là A1 s[1,n]As[1,n]+1 n Phép nhân
ma trận được tính một cách đệ qui vì s[1,s[1,n]] xác định phép nhân cuối của chuỗi A1 s[1,n] và s[s[1,n]+1,n] xác định phép nhân cuối của chuỗi As[1,n]+1,n
• Cho trước chuỗi ma trận A = <A1, A2…, An>, bảng s
và các chỉ số i và j, thủ tục đệ quy
Trang 48Với s = 2, p = (2, 5, 4, 3,
7).
Cần tính m 13 , m 24
m13 M1M2M3 (M1M2 )(M3) 64k=1 (M1)(M2 M3) m11 + m23 + p0 × p1 × p3=
Trang 53Bài toán cái túi (Knapsack)
'‘Một kẻ trộm đột nhập vào một cửa hiệu tìm thấy có n mặt hàng
có trọng lượng và giá trị khác nhau , nhưng y chỉ mang theo một cái túi có sức chứa về trọng lượng tối đa là M Bài toán cái túi là tìm một tổ hợp các mặt hàng mà kẻ trộm nên bỏ vào cái túi để đạt một giá trị cao nhất với những món hàng
mà y mang đi ”
Trang 54Bài toán cái túi (Knapsack)
•Gọi các chi phí (trọng lượng) là size1, , sizen và các giá trị tương ứng là val1, ., valn Ta cần cực đại hóa tổng giá trị với điều kiện tổng chi phí không vượt quá M Khi đó, với mỗi i ≤ M, đặt cost(i) là giá trị lớn nhất có thể đạt được với tổng chi phí không vượt quá i Rõ ràng, cost(M) là đáp số của bài toán.
•Định nghĩa cost(i) một cách đệ quy như sau:
cost(0) = 0
•Ở đây, giá trị lớn nhất của tập rỗng được lấy bằng 0 Tính
dần các kết quả từ cost(0) tới cost(M), ta sẽ được lời giải
•Do việc tính mỗi cost(i) đòi hỏi xem xét n đồ vật (tất cả các giá trị này đã được tính từ trước), và có M giá trị của các cost(i)
cần tính, nên thời gian chạy của lời giải quy hoạch động là
O(nM).
Trang 55Bài toán cái túi (Knapsack)
• Bài toán này có thể giải bằng qui hoạch động bằng
cách dùng hai bảng cost và best sau đây:
• cost[i] chứa giá trị tối đa mà có thể thực hiện được với một cái túi có sức chứa i
cost[i] = cost[i – size[j]] + val[j]
• best[i] chứa mặt hàng cuối cùng bỏ vào túi nhằm đạt
được giá trị tối đa
Trang 56Một thí dụ của bài toán cái túi
Trang 58Một thể hiện của cái túi
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 j=1
cost[i] 0 0 4 5 5 8 10 10 12 14 15 16 18 18 20 22 24
best[i] A B B A C B A C C A C C A C C j=4
cost[i] 0 0 4 5 5 8 10 11 12 14 15 16 18 20 21 22 24
best[i] A B B A C D A C C A C C D C C j=5
cost[i] 0 0 4 5 5 8 10 11 13 14 15 17 18 20 21 23 24
best[i] A B B A C D E C C E C C D E C
Hình 5.4 Các mảng cost và best của một thí dụ bài toán cái túi
Trang 59Ghi Chú:
• Bài toán cái túi có thể dễ dàng giải đưọc nếu M không lớn, nhưng khi M lớn thì thời gian chạy trở nên không thể chấp nhận được
• Phương pháp này không thể làm việc được khi M và trọng lượng/kích thước là những số thực thay vì số nguyên
Tính chất 4.1.1 Giải thuật qui hoạch động để giải bài toán cái túi có thời gian chạy tỉ lệ với NM
Bài toán cái túi (Knapsack)
Trang 60Những bài toán con trùng
lắp
• Khi một giải thuật đệ quy gặp lại cùng một bài toán con nhiều lần, ta bảo rằng bài toán tối ưu hóa có những bài toán con trùng lắp
• Giải thuật quy hoạch động lợi dụng những bài toán con trùng lắp bằng cách giải mỗi bài toán con một lần, cất lời giải vào trong một bảng mà bảng này sẽ được tham khảo đến khi cần
• Các giải thuật đệ quy làm việc từ trên xuống trong khi các giải thuật quy hoạch động làm việc từ dưới lên, Cách sau hữu
hiệu hơn
Trang 61Bài toán chuỗi con chung dài nhất
• Một chuỗi con (subsequence) của một chuỗi (sequence) là
chuỗi ấy sau khi bỏ đi một vài phần tử
• Thí dụ: Z = <B, C, D, B> là một chuỗi con của X = <A, B, C,
B, D, A, B> với chuỗi chỉ số <2, 3, 5, 7>
• Cho hai chuỗi X và Y, ta bảo Z là chuỗi con chung (common
subsequence) của X và Y nếu Z là một chuỗi con của cả hai
Trang 62Thí dụ 1: X = <A, B, C, B, D, A, B> và Y = <B, D, C, A, B, A> <B, D, A, B> là LCS của X and Y.
Câu hỏi:
1 Có chuỗi con chung nào có độ dài là 5 không?
2 Ngoài chuỗi <B, D, A, B> là LCS của X and Y, còn chuỗi con chung nào có độ dài là 4?
Chú ý: Chuỗi con có cùng thứ tự tăng nhưng không cần lên tục
Bài toán chuỗi con chung dài nhất
Trang 63B1:Tiểu cấu trúc tối ưu của bài toán chuỗi con chung dài nhất
Cho chuỗi X = <x1, x2, …, xm>, ta định nghĩa tiền tố thứ i của X,
Trang 64• Để tìm một LCS của X = <x1, x2, …, xm> và Y = <y1, y2, …, yn>
• Nếu xm = yn cần tìm LCS của Xm-1 và Yn-1 rồi bổ sung xm
= yn vào LCS vừa tìm để tạo LCS của X và Y
• Nếu xm # yn cần giải quyết hai bài toán con:
Tìm LCS của Xm-1 và Y và tìm LCS của X và Yn-1 LCS nào trong 2 LCS vừa tìm được dài hơn thì nó sẽ là LCS của X và Y
B2: Lời giải đệ quy