Bài giảng Cơ sở lập trình nâng cao - Chương 8: Phương pháp thiết kế thuật toán Quy hoạch động - Tôn Quang Toại

Nội dung

Giới thiệu

Quy hoạch động và Chia để trị

Quy hoạch động và Bài toán tối ưu

Nguyên lý tối ưu của Bellman

Sơ đồ cài đặt

Các ví dụ

 

pptx 38 trang phuongnguyen 8940
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cơ sở lập trình nâng cao - Chương 8: Phương pháp thiết kế thuật toán Quy hoạch động - Tôn Quang Toại", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Cơ sở lập trình nâng cao - Chương 8: Phương pháp thiết kế thuật toán Quy hoạch động - Tôn Quang Toại

Bài giảng Cơ sở lập trình nâng cao - Chương 8: Phương pháp thiết kế thuật toán Quy hoạch động - Tôn Quang Toại
CƠ SỞ LẬP TRÌNH NÂNG CAO 
Biên soạn: Ths.Tôn Quang Toại 
TonQuangToai@yahoo.com 
TPHCM, NĂM 2013 
TRƯỜNG ĐẠI HỌC NGOẠI NGỮ - TIN HỌC TP.HCM 
KHOA CÔNG NGHỆ THÔNG TIN 
PHƯƠNG PHÁP THIẾT KẾ THUẬT TOÁN − QUY HOẠCH ĐỘNG − 
Chương 8 
Nội dung 
Giới thiệu 
Quy hoạch động và Chia để trị 
Quy hoạch động và Bài toán tối ưu 
Nguyên lý tối ưu của Bellman 
Sơ đồ cài đặt 
Các ví dụ 
Hình ảnh 
Giới thiệu 
Quy hoạch động – Dynamic Programming do nhà toán học người Mĩ Richard Bellman (1920 – 1984) phát minh vào năm 1957 
Quy hoạch động – Dynamic Programming là phương pháp để giải quyết một lớp lớn các bài toán tối ưu thỏa theo nguyên lý tối ưu Bellman 
Giới thiệu 
Dựa trên phương pháp Quy hoạch động, nhiều thuật toán nổi tiếng đã ra đời: Một số thuật toán nổi tiếng dựa trên phương pháp Quy hoạch động 
Thuật toán Dijkstra 
Thuật toán Ford – Bellman 
Thuật toán Floyd 
Thuật toán Viterbi 
Thuật toán huấn luyện Adaptive Critic 
Thuật toán Cocke – Younger – Kasami 
Quy hoạch động và Chia để trị 
Bài toán con trùng lắp(Overlapping subproblems) 
Phương pháp 
Phương pháp Quy hoạch động gần giống với phương pháp Chia để trị. 
Cả hai phương pháp dùng để giải quyết 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. 
Phương pháp 
Phương pháp Chia để trị: Là phương pháp từ trên xuống dưới (top – down) với ý tưởng: 
[Divide] Chia bài toán lớn thành những bài toán nhỏ hơn và độc lập nhau 
[Solve] Giải quyết các bài toán nhỏ 
[Combine] Kết hợp các lời giải bài toán nhỏ để hình thành lời giải bài toán lớn 
Phương pháp 
Hạn chế của phương pháp Chia để trị: 
Khi dùng phương pháp chia để trị để chia 1 bài toán lớn thành các bài toán con, các bài toán con lại chia nhỏ thành nhiều bài toán con nhỏ hơn nữa,  	 Đôi khi một bài toán con được yêu cầu giải nhiều lần 	 Chương trình chạy chậm 
Phương pháp 
Phương pháp Quy hoạch động: Là phương pháp giải quyết bài toán bằng cách: 
[Solve & Restore] Giải quyết các bài toán nhỏ nhất, rồi lưu kết quả lại 
[Combine & Restore] Kết hợp các lời giải của bài toán nhỏ để hình thành lời giải của bài toán lớn, rồi lưu kết quả lại 
2 Tiếp cận cài đặt Quy hoạch động 
Tiếp cận từ Dưới lên (Bottom Up): 
Toàn bộ các bài toán con nhỏ nhất cần giải sẽ được giải trước 
Sử dụng các kết quả để tìm nghiệm của bài toán lớn hơn 
Quá trình tiếp tục cho đến khi bài toán cuối được giải 
2 Tiếp cận cài đặt Quy hoạch động 
Sơ đồ cài đặt 
void SolveSmallProblems(){} void SolveSubProblems(){} void Trace(){} void DynamicProgramming(){	SolveSmallProvlems();	SolveSubProblems();	//Trace();	} 
2 Tiếp cận cài đặt Quy hoạch động 
Ưu điểm của tiếp cận Bottom – Up 
Tốn ít bộ nhớ 
Khuyết điểm của tiếp cận Bottom – Up 
Cài đặt dài hơn tiếp cận Top – Down 
Vì để tiết kiệm bộ nhớ nên bài toán con nào dùng xong mà không dùng nữa thì bỏ đi Sau khi giải xong sẽ không xem được trình tự quá trình giải (không lưu lại lịch sử) 
2 Tiếp cận cài đặt Quy hoạch động 
Tiếp cận từ trên xuống (Top Down) – Dùng đệ qui có nhớ (Memoization) 
[Divide] Chia bài toán thành các bài toán con 
[Solve] 
Trước khi giải bài toán con, chúng kiểm tra xem bài toán này đã được giải trước đó chưa. 
Nếu đã giải thì lấy lời giải trong bảng ra 
Nếu chưa giải thì giải 
Sau khi có lời giả thì chúng lưu kết quả lại vào bảng 
[Combine] Kết hợp các lời giải của các bài toán con thành lời giải của bài toán 
2 Tiếp cận cài đặt Quy hoạch động 
Sơ đồ cài đặt 
void DynamicProgramming(A, x){	 if (A đã giải quyết)	x = LoiGiai(A) ; // Lấy lời giải từ bộ nhớ	 if (A du nho) 	 LoiGiai(A) = Solve(A); //lưu lời giải bài	 //toán A vào bộ nhớ	 else 	{	- Phan chia A thanh A 0 , A 1 , , A n-1 	- for (i=0; i<n; i++)	DynamicProgramming(A i , x i )	- Ket hop cac nghiem x i de duoc nghiem x	- LoiGiai(A) = x;	}} 
2 Tiếp cận cài đặt Quy hoạch động 
Ưu điểm của tiếp cận Top – Down 
Cài đặt ngắn gọn 
Có thể quan sát các bài toán con cần giải 
Khuyết điểm của tiếp cận Top – Down 
Tốn nhiều bộ nhớ vì phải lưu toàn bộ các bài toán con đã giải vì không biết bài toán con đó còn dùng nữa hay không 
Ví dụ 
Tính số Fibonacci thứ n 
Nếu n=1 hay n=2 
Nếu n >2 
Hai tiếp cận bằng Quy hoạch động 
Dùng tiếp cận từ trên xuống 
Dùng tiếp cận từ dưới lên 
Ví dụ 
cài đặt 
void QHD_TopDown( int n){} 
Ví dụ 
cài đặt 
void QHD_BottomUp( int n){} 
Quy hoạch động và Bài toán tối ưu 
Phương pháp 
Định nghĩa Quy hoạch động: Quy hoạch động là phương pháp giải quyết các bài toán tối ưu bằng cách tạo ra một chuỗi các quyết định xác định . Với mỗi quyết định, các bài toán con được giải quyết theo cùng cách sao cho lời giải tối ưu của bài toán ban đầu có thể được tìm thấy từ các lời giải tối ưu của các bài toán con . 
Phương pháp 
Phương pháp Quy hoạch động dựa trên nguyên tắc tối ưu của Bellman 
Nguyên lý tối ưu của Bellman: 
Trong một quá trình quyết định có nhiều giai đoạn, Lời giải tối ưu có thuộc tính: 
Dù trạng thái ban đầu và các quyết định ban đầu như thế nào đi nữa thì những quyết định còn lại phải tạo thành lời giải tối ưu mà không phụ thuộc vào trạng thái được sinh ra từ những quyết định ban đầu 
Phương pháp 
Bellman’s Principle of Optimality 
An optimal policy has the property that whatever the initial state and initial decision are, the remaining decisions must constitute an optimal policy with regard to the state resulting from the first decision. 
Phương pháp 
Chúng ta gọi: 
Hàm mục tiêu là f 
Giá trị tối ưu là f* 
Các quyết định là d 1 , d 2 ,  
Phương pháp 
Nguyên lý tối ưu của Bellman: 
Nói cách khác ngắn gọn hơn: 
Lời giải tối ưu cho bài toán P phải chứa lời giải tối ưu của các bài toán con của P ( Lời giải tối ưu có lời giải con tối ưu ) 
Nguyên lý trên phù hợp với nhận xét rằng: Nếu lời giải mà có lời giải con không tối ưu thì khi thay lời giải con đó bằng lời giải con tối ưu sẽ cho lời giải tối ưu hơn lời giải ban đầu 
Phương pháp 
Giả thiết: Nếu xmy là đường tối ưu từ x đến y. Đường đi này qua m thì my là đường đi tối ưu 
Chứng minh: Giả sử không đúng. Thế thì có một đường khác là đường c là đường đi tối ưu từ m đến y. Nghĩa là: Đường đi từ x đến m, rồi theo đường c đến y sẽ tối ưu hơn đường đi ban đầu. 
Đều này mâu thuẫn với giả thiết là xmy là đường đi tối ưu từ x đến y 
m 
x 
c 
y 
Phương pháp 
Nhận xét: 
Nguyên lý tối ưu của Bellman còn được gọi là thuộc tính cấu trúc con tối ưu (Optimal substructure) 
Việc giải bài toán tối ưu sẽ đưa về giải bài toán con tối ưu cùng dạng 
Để việc tính toán của phương pháp DP đạt hiệu quả thì các lời giải của các bài toán con được sử dụng nhiều lần chỉ nên được giải 1 lần rồi lưu trữ lại để sử dụng lại sau này 
Phương pháp 
Các bước giải bài toán tối ưu theo Quy hoạch động: 
Bước 1 [Xác định cấu trúc con tối ưu]: 
Chọn số tham số cho Hàm mục tiêu f 
(Hàm mục tiêu dùng để biểu diễn cấu trúc con của bài toán) 
Số tham số của hàm mục tiêu f phụ thuộc vào 
Số đại lượng tham gia vào bài toán 
Cấu trúc con tối ưu của từng bài toán tối ưu cụ thể 
Phương pháp 
Bước 2 [Tính toán Trường hợp Cơ bản]: 
Tính hàm mục tiêu f với các giá trị đơn giản nhất để biết hướng xây dựng các giá trị của hàm f 
Bước 3 [Tính toán Trường hợp Tổng quát]: 
Tìm công thức cho hàm mục tiêu f 
(Công thức/phương trình quy hoạch động) 
(Công thức/phương trình Bellman) 
Phương pháp 
Bước 4: [Tạo bảng phương án] 
Tạo bảng lưu trữ các giá trị của hàm mục tiêu theo công thức đã tìm được trong bước 3 
Bước 5: [Truy vết] 
Nếu bài toán yêu cầu chỉ ra tuần tự các quyết đã thực hiện, chúng ta cần truy vết từ quyết định cuối về quyết định ban đầu 
Các ví dụ 
Ví dụ 1: [Dãy con tăng dài nhất] 
Cho dãy số nguyên A = a 1 , a 2 , , a n (n ≤ 1000, -10000 ≤ a i ≤ 10000). Dãy con của A là một cách chọn ra trong A một số phần tử giữ nguyên thứ tự. 
Yêu cầu: Hãy tìm một dãy con tăng của dãy A và có số phần tử nhiều nhất 
Các ví dụ 
Các ví dụ 
Ví dụ 2: [ Đ ường đi lớn nhất] 
Cho hình chữ nhật kích thước mxn (n,m ≤100 ), mỗi ô chứa một số nguyên. Có thể di chuyển từ ô (i, j) đến 1 trong 3 ô kề bên phải (i-1, j+1) (i, j+1) và (i+1, j+1) thuộc hình chữ nhật. 
Yêu cầu: Hãy tìm một cách di chuyển từ một ô nào đó thuộc cột 1 đến 1 ô nào đó thuộc cột n sao cho tổng các số của các ô đi qua là lớn nhất. 
Các ví dụ 
Các ví dụ 
Ví dụ 3: [Dãy con chung dài nhất] 
Cho 2 dãy số nguyên 
A = (a 1 , a 2 , , a n ). 
B=(b 1 , b 2 , , b m ) (n, m ≤ 100, -10000 ≤ a i , b j ≤ 10000). 
Yêu cầu: Hãy tìm một dãy C tăng và dài nhất, trong đó C là dãy con của A và C là dãy con của B 
Các ví dụ 
HẾT CHƯƠNG 8 

File đính kèm:

  • pptxbai_giang_co_so_lap_trinh_nang_cao_chuong_8_phuong_phap_thie.pptx