Bài giảng Phân tích thiết kế giải thuật - Chương 1: Dynamic Programming

Dynamic programming

giải 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.

(ở đây “programming” không có nghĩa là lập trình).

So sánh dynamic programming và “chia-và-trị” (divide-and-conquer)

Giải thuật chia-và-trị

chia bài toán thành các bài toán con độc lập ,

giải chúng bằng đệ quy,

kết hợp chúng để có lời giải cho bài toán ban đầu.

Giải thuật dynamic programming

các bài toán con không độc lập với nhau: chúng có chung các bài toán con nhỏ hơn.

giải mỗi bài toán con chỉ một lần, và ghi nhớ lời giải đó trong một bảng để truy cập khi cần đến.

 

ppt41 trang | Chuyên mục: Cấu Trúc Dữ Liệu & Giải Thuật | Chia sẻ: yen2110 | Lượt xem: 427 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng Phân tích thiết kế giải thuật - Chương 1: Dynamic Programming, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
mming 
Một lời giải không tối ưu 
 Giải thuật không ghi nhớ lời giải của các bài toán con. 
R ECURSIVE -M ATRIX -C HAIN ( p , i , j ) 
1	 if i = j 
2	 then return 0 
3	 m [ i , j ]   
4	 for k  i to j  1 
5	 do q  R ECURSIVE -M ATRIX -C HAIN ( p , i , k ) 
	 + R ECURSIVE -M ATRIX -C HAIN ( p , k + 1, j ) + p i 1 p k p j 
6	 if q < m [ i , j ] 
7	 then m [ i , j ]  q 
8	 return m [ i , j ] 
13.9.2004 
21 
Ch. 1: Dynamic Programming 
Phân tích R ECURSIVE -M ATRIX -C HAIN 
Gọi T ( n ) là thời gian chạy của R ECURSIVE -M ATRIX -C HAIN ( p , 1, n ), thì T ( n ) phải thỏa (xem code) 
Từ đó chứng minh được: T ( n ) = (2 n ). 
Tại sao R ECURSIVE -M ATRIX -C HAIN chạy trong thời gian (2 n ) còn M ATRIX -C HAIN -O RDER chỉ cần thời gian đa thức? Đó là vì 
R ECURSIVE -M ATRIX -C HAIN là giải thuật đệ quy từ trên xuống (top-down) và không tận dụng được tính chất “các bài toán con trùng nhau” (overlapping subproblems). 
M ATRIX -C HAIN -O RDER là giải thuật dynamic-programming từ dưới lên (bottom-up), tận dụng được tính chất “các bài toán con trùng nhau”. 
13.9.2004 
22 
Ch. 1: Dynamic Programming 
Cây đệ quy 
Cây đệ quy cho R ECURSIVE -M ATRIX -C HAIN ( p , 1, 4) 
1..4 
2..2 
1..1 
3..4 
2..3 
4..4 
2..2 
3..3 
1..2 
4..4 
1..1 
2..3 
3..3 
1..1 
2..4 
1..2 
3..4 
1..3 
4..4 
4..4 
3..3 
2..2 
3..3 
1..1 
2..2 
3..3 
2..2 
13.9.2004 
23 
Ch. 1: Dynamic Programming 
Một biến dạng của dynamic programming: memoization 
Memoization là phương pháp tận dụng tính chất “các bài toán con trùng nhau” để cải tiến giải thuật đệ quy từ trên xuống bằng cách 
sử dụng một bảng chung mà mỗi triệu gọi của giải thuật đệ quy có thể truy cập để 
ghi kết quả sau khi giải một bài toán con mới 
đọc kết quả của một bài toán con đã được giải rồi. 
13.9.2004 
24 
Ch. 1: Dynamic Programming 
Memoize giải thuật R ECURSIVE -M ATRIX -C HAIN 
Memoize giải thuật R ECURSIVE -M ATRIX -C HAIN bằng cách sử dụng bảng m [1.. n , 1.. n ]. 
M EMOIZED -M ATRIX -C HAIN có input là một chuỗi p = 
M EMOIZED -M ATRIX -C HAIN ( p ) 
1	 n  length [ p ]  1 
2	 for i  1 to n 
3	 do for j  i to n 
4	 do m [ i , j ]   
5	 return L OOKUP -C HAIN ( p , 1, n ) 
13.9.2004 
25 
Ch. 1: Dynamic Programming 
Memoization 
L OOKUP -C HAIN bao giờ cũng trả về m [ i , j ]. Nhưng nó chỉ tính m [ i , j ] khi nào đó là lần gọi đầu tiên với các tham số i và j . 
L OOKUP -C HAIN ( p , i , j ) 
1	 if m [ i , j ] <  
2	 then return m [ i , j ] 
3	 if i = j 
4 	 then m [ i , j ]  0 
5	 else for k  i to j  1 
6	 do q  L OOKUP -C HAIN ( p , i , k ) 
	 + L OOKUP -C HAIN ( p , k + 1, j ) + p i 1 p k p j 
7	 if q < m [ i , j ] 
8	 then m [ i , j ]  q 
9	 return m [ i , j ] 
13.9.2004 
26 
Ch. 1: Dynamic Programming 
Phân tích M EMOIZED -M ATRIX -C HAIN 
M EMOIZED -M ATRIX -C HAIN chạy trong thời gian O ( n 3 ). 
Nhận xét : 
M EMOIZED -M ATRIX -C HAIN tận dụng được tính chất “các bài toán con trùng nhau”, 
còn R ECURSIVE -M ATRIX -C HAIN chạy trong thời gian (2 n ) vì nó luôn luôn giải các bài toán con mà không để ý xem bài toán con đã được giải rồi hay chưa. 
13.9.2004 
27 
Ch. 1: Dynamic Programming 
Phân tam giác 
Đa giác 
Đa giác đơn (“simple”) 
Đa giác lồi 
Phân tam giác (triangulation) 
13.9.2004 
28 
Ch. 1: Dynamic Programming 
Các khái niệm cơ bản 
Cạnh , đỉnh , biên của một đa giác 
Ta biểu diễn một đa giác lồi P bằng danh sách các đỉnh theo thứ tự ngược chiều kim đồng hồ: P =  v 0 , v 1 ,..., v n 1  
Cung (“chord”) của một đa giác 
Một phân tam giác của một đa giác là một tập hợp các cung của đa giác chia đa giác thành các tam giác rời nhau. 
13.9.2004 
29 
Ch. 1: Dynamic Programming 
Bài toán phân tam giác tối ưu 
Cho: 
Một đa giác lồi P =  v 0 , v 1 ,..., v n 1  
Một h àm trọng số w (“weight function”) được định nghĩa trên các tam giác tạo bởi cạnh và cung của P . 
Bài toán : Tìm một phân tam giác cho P sao cho tổng các trọng số của các tam giác trong phân tam giác này là nhỏ nhất. 
Ví dụ một hàm trọng số: 
w (một tam giác) = tổng các chiều dài của các cạnh của tam giác. 
13.9.2004 
30 
Ch. 1: Dynamic Programming 
Parse tree của một biễu thức 
Biễu thức (expression) 
Ví dụ một biễu thức: tích của một chuỗi ma trận đã được đóng ngoặc hoàn toàn (( A 1 ( A 2 A 3 ))( A 4 ( A 5 A 6 ))) 
Parse tree . 
Ví dụ: parse tree của biễu thức (( A 1 ( A 2 A 3 ))( A 4 ( A 5 A 6 ))) là 
A 1 
A 2 
A 3 
A 4 
A 5 
A 6 
13.9.2004 
31 
Ch. 1: Dynamic Programming 
Parse tree của một biễu thức 
Định nghĩa: parse tree của một biễu thức là một cây mà 
Lá : có nhản là một trong các nguyên tử (“atomic element”, ví dụ: A 1 ) tạo nên biễu thức. 
Nếu gốc của một cây con của parse tree có cây con bên trái tượng trưng biễu thức E l và có cây con bên phải tượng trưng biễu thức E r , thì cây con này tượng trưng biễu thức ( E l E r ). 
13.9.2004 
32 
Ch. 1: Dynamic Programming 
Từ phân tam giác sinh ra parse tree 
Ví dụ: Parse tree cho đa giác P =  v 0 , v 1 ,, v 6  sau. 
A 1 
A 2 
A 3 
A 4 
A 5 
A 6 
v 0 
v 1 
v 2 
v 3 
v 4 
v 6 
v 5 
13.9.2004 
33 
Ch. 1: Dynamic Programming 
Từ parse tree sinh ra phân tam giác 
Cho parse tree biểu diễn bởi ((( A 1 ( A 2 A 3 )) A 4 )( A 5 A 6 )). Phân tam giác tương ứng: 
A 1 
A 2 
A 3 
A 4 
A 5 
A 6 
v 0 
v 1 
v 2 
v 3 
v 4 
v 6 
v 5 
A 1 
A 2 
A 3 
A 5 
A 6 
A 4 
13.9.2004 
34 
Ch. 1: Dynamic Programming 
Tương ứng giữa parse tree và phân chia tam giác 
Tương ứng giữa parse trees và các phân chia tam giác là tương ứng một-đối-một : 
Mỗi phân tam giác của một đa giác lồi có n + 1 cạnh tương ứng với parse tree cho một biễu thức gồm n nguyên tử. 
Mỗi parse tree có n lá tương ứng với phân tam giác của một đa giác lồi có n + 1 cạnh. 
13.9.2004 
35 
Ch. 1: Dynamic Programming 
Tương ứng giữa đóng ngoặc hoàn toàn của tích của n ma trận và phân chia tam giác 
Đóng ngoặc hoàn toàn của tích của n ma trận tương ứng với phân tam giác của một đa giác lồi có n + 1 đỉnh. 
Mỗi ma trận A i trong tích A 1 A 2  A n tương ứng với cạnh v i - 1 v i của đa giác lồi. 
Cung v i v j , với i < j , tương ứng với ma trận A i + 1.. j . 
13.9.2004 
36 
Ch. 1: Dynamic Programming 
Nhân chuỗi ma trận và phân tam giác tối ưu 
Bài toán nhân chuỗi ma trận là một trường hợp đặc biệt của bài toán phân tam giác tối ưu. 
Tính tích A 1 A 2  A n thông qua một bài toán phân tam giác tối ưu: 
Định nghĩa một đa giác lồi có n + 1 đỉnh P =  v 0 , v 1 ,, v n  
Nếu ma trận A i có dimension p i  1  p i , với i = 1, 2,..., n , định nghĩa hàm trọng số w cho phân tam giác là 
w (  v i v j v k ) = p i p j p k 
Một phân tam giác tối ưu của P cho ta parse tree của một đóng ngoặc tối ưu của A 1 A 2  A n . 
13.9.2004 
37 
Ch. 1: Dynamic Programming 
Nhân chuỗi ma trận và phân tam giác tối ưu (tiếp) 
Ngược lại là không đúng: bài toán phân tam giác tối ưu không là trường hợp đặc biệt của bài toán nhân chuỗi ma trận. 
Mặc dù vậy, có thể chỉnh lại M ATRIX -C HAIN -O RDER để giải bài toán phân tam giác tối ưu cho một đa giác có n + 1 đỉnh như sau 
Thay chuỗi p = của các chiều của ma trận bằng chuỗi  v 0 , v 1 ,..., v n  của các đỉnh. 
Thay các truy cập đến p bằng các truy cập đến v và thay dòng 9 bởi 
9	 do q  m [ i , k ] + m [ k + 1, j ] + w ( D v i 1 v k v j ) 
Khi giải thuật thực thi xong, m [1, n ] chứa trọng số của một phân tam giác tối ưu. 
Phần sau cho thấy tại sao làm được như vậy. 
13.9.2004 
38 
Ch. 1: Dynamic Programming 
Bước 1: Cấu trúc con của một phân tam giác tối ưu 
Cho T là một phân tam giác tối ưu của một đa giác P =  v 0 , v 1 ,, v n  , T chứa tam giác D v 0 v k v n với k nào đó, 1  k  n  1. 
Trọng số của T là tổng của các trọng số của tam giác D v 0 v k v n và các tam giác chứa trong phân tam giác của hai đa giác con  v 0 , v 1 ,, v k  và  v k , v k + 1 ,, v n . Một đa giác con suy thoái có trọng số là 0. 
Do đó các phân tam giác (xác định bởi T ) của các đa giác con trên cũng phải là tối ưu. (Chứng minh bằng phản chứng.) 
v 0 
v 1 
v k 
v n 
v 2 
13.9.2004 
39 
Ch. 1: Dynamic Programming 
Bước 2: Lời giải đệ quy 
Định nghĩa t [ i , j ] là trọng số của một phân tam giác tối ưu của đa giác  v i 1 , v i ,, v j . Như vậy trọng số của một phân tam giác tối ưu của đa giác P là t [1, n ]. 
Xác định t [  ,  ] 
nếu đa giác chỉ có 2 đỉnh (đa giác suy thoái) 
t [ i , i ] = 0	cho i = 1,..., n 
nếu đa giác có ít nhất 3 đỉnh, i < j 
t [ i , j ] = t [ i , k ] + t [ k + 1, j ] + w (  v i 1 v k v j ) . 
Nhưng trị của k ? 
13.9.2004 
40 
Ch. 1: Dynamic Programming 
Bước 2: Lời giải đệ quy (tiếp) 
Bằng cách duyệt qua tất cả các trị của k , i  k  j - 1, ta nhận được 
t [ i , i ] = 0,	 i = 1,..., n 
t [ i , j ] = min i  k  j 1 { t [ i , k ] + t [ k + 1, j ] + w (  v i 1 v k v j ) }	nếu i < j . 
Hàm đệ quy này tương tự hàm đệ quy m [  ,  ] cho số phép nhân vô hướng tối thiểu để tính A i A i+ 1  A j . Do đó có thể chỉnh lại thủ tục M ATRIX -C HAIN -O RDER (như đã nói) để tính trọng số của một phân tam giác tối ưu. 
Vậy thủ tục phân tam giác tối ưu chạy trong thời gian O ( n 3 ) và cần bộ nhớ ( n 2 ). 
13.9.2004 
41 
Ch. 1: Dynamic Programming 

File đính kèm:

  • pptbai_giang_giai_thuat_chuong_1_dynamic_programming.ppt