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

Định nghĩa [Tham lam – Greedy]: Tham lam là một phương pháp thiết kế thuật toán để tìm nghiệm của bài toán tối ưu bằng cách xây dựng nghiệm dần dần từng bước. Tại mỗi bước:

Chúng ta luôn luôn chọn giá trị tốt nhất tại thời điểm đó mà không quan tâm đến tương lai (tối ưu cục bộ)

Chúng ta hy vọng việc chọn các tối ưu cục bộ tại mỗi bước sẽ cho tối ưu toàn cục

 

pptx 29 trang phuongnguyen 8460
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 7: Phương pháp thiết kế thuật toán Tham lam - 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 7: Phương pháp thiết kế thuật toán Tham lam - Tôn Quang Toại

Bài giảng Cơ sở lập trình nâng cao - Chương 7: Phương pháp thiết kế thuật toán Tham lam - 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 – THAM LAM – 
Chương 7 
Nội dung 
Giới thiệu 
Phương pháp 
Sơ đồ cài đặt 
Các ví dụ 
Ưu điểm và khuyết điểm 
Hình ảnh 
1 
2 
3 
4 
5 
Giới thiệu 
Định nghĩa [Tham lam – Greedy]: Tham lam là một phương pháp thiết kế thuật toán để tìm nghiệm của bài toán tối ưu bằng cách xây dựng nghiệm dần dần từng bước. Tại mỗi bước: 
Chúng ta luôn luôn chọn giá trị tốt nhất tại thời điểm đó mà không quan tâm đến tương lai (tối ưu cục bộ) 
Chúng ta hy vọng việc chọn các tối ưu cục bộ tại mỗi bước sẽ cho tối ưu toàn cục 
Phương pháp 
Phát biểu bài toán: Giả sử bài toán yêu cầu tìm phương án X=(x 1 , x 2 , , x n ), trong đó 
x i được chọn ra từ tập D i . 
f(X) là hàm đánh giá sự tốt nhất của phương án X (f là hàm mục tiêu hay hàm chi phí) 
Phương pháp 
Phương pháp Tham lam 
Phương pháp Tham lam xây dựng dần nghiệm X của bài toán : 
Ban đầu X=( ) 
Giả sử đã xây dựng được (k-1) thành phần của nghiệm ( x 1 , x 2 , , x k-1 ) 
Bây giờ ta mở rộng nghiệm thành ( x 1 , x 2 , , x k-1 , x k ) bằng cách chọn x k là giá trị tốt nhất trong tập D k 
Phương pháp 
Phương pháp Tham lam 
Thông thường tập D được sắp theo một trật tự tăng dần hay giảm dần theo tiêu chí nào đó từ đó giúp việc chọn giá trị tốt nhất cho x i sẽ dễ dàng hơn 
Bước 1 [Sắp xếp]: Sắp xếp dữ liệu D tăng dần hay giảm dần theo tiêu chí nào đó 
Bước 2 [Chọn giá trị tốt nhất]: Với mỗi thành phần x i . Ta tìm giá trị tốt nhất trong dữ liệu đã được sắp xếp trong bước 1 và thỏa điều kiện của bài toán để gán cho x i 
Sơ đồ cài đặt 
void Greedy1(){	X=();	 for (i=1; i<=n; i++)	{	Xác định D i ;	x i = SelectBest(D i );	}} 
Sơ đồ 1: 
Sơ đồ cài đặt 
void Greedy2(){	Sort(D);	 for (i=1; i<=n; i++)	{	- Chọn v là giá trị tốt nhất trong D và	thỏa điều kiện bài toán 
	- x i = v;	- Bỏ v khỏi D		}} 
Sơ đồ 2: 
Chú ý 
Một ý tưởng đối nghịch với phương pháp “tham lam” là ý tưởng “trông rộng”: 
Gom nhỏ thành to 
Năng nhặt chặt bị 
Chú ý 
Để giải bài toán bằng phương pháp tham lam, chúng ta cần: 
Xác định các tập giá trị D i 
Hàm mục tiêu f 
Hàm chọn SelectBest để chọn giá trị cho x i 
Các ví dụ: {1} Bài toán thu nhạc 
Ví dụ 1 [Bài toán thu nhạc]Một băng đĩa có thể thu được các bài hát với tổng thời lượng là T. Có N bài hát, bài thứ i có thời lượng là h i khi lưu trên đĩa (i=1, 2, , N) 
Yêu cầu: Hãy chọn một cách thu các bài hát sao cho mỗi bài chỉ thu một lần và tổng số bài thu được trên băng là nhiều nhất 
Các ví dụ: {1} Bài toán thu nhạc 
Biểu diễn lời giải của bài toán là 1 vector độ dài k: X=(x 1 , x 2 , , x k ). Trong đó x i =1, 2, , n 
f(X)=|X| max 
Bài toán: Tìm vector X 
Thuật toán tham lam: 
Chọn bài có thời lượng nhỏ thu trước, bài có thời lượng lớn thu sau nếu còn chổ 
Các ví dụ: {1} Bài toán thu nhạc 
cài đặt 
void ThuNhac_Greedy(){} 
Các ví dụ: {2} Bài toán cái túi 
Ví dụ 2 [Bài toán cái túi – 0-1 Knapsack problem]Cho n loại đồ vật được đánh số từ 1 đến n, đồ vật thứ i có 
v i – giá trị của đồ vật i 
w i – trọng lượng đồ vật i 
Yêu cầu: Tìm một số đồ vật để bỏ vào túi sao cho tổng trọng lượng các đồ vật bỏ vào túi không vượt quá W và tổng giá trị của các đồ vật là lớn nhất. 
Các ví dụ: {2} Bài toán cái túi 
Biểu diễn lời giải của bài toán là 1 vector nhị phân độ dài n: X=(x 1 , x 2 , , x n ). (x i {0, 1}) 
x i =1: Chọn đồ vật i 
x i =0: Không chọn đồ vật i 
Trọng lượng của nghiệm thành phần: x i *w i 
Giá trị của nghiệm thành phần: x i *v i 
Bài toán: Tìm vector X 
Các ví dụ: {2} Bài toán cái túi 
Thuật toán tham lam 1: 
Bước 1: Sắp xếp các đồ vật có giá trị giảm dần 
Bước 2: 
TrongLuong=0 
x i =0 i 
Bước 3: Xét tuần tự các đồ vật từ trái sang phải. Với đồ vật thứ i: 
Nếu TrongLuong + w i < W thì 
Chọn đồ vật i: x i =1 
TrongLuong = TrongLuong + w i 
Các ví dụ: {2} Bài toán cái túi 
Thuật toán tham lam 2: 
Sắp xếp các đồ vật có giá trị tăng dần 
Thuật toán tham lam 3: 
Sắp xếp các đồ vật có giá trị trên 1 đơn vị trọng lượng (v i /w i ) giảm dần 
Thuật toán tham lam 4: 
Các ví dụ: {2} Bài toán cái túi 
cài đặt 
void KnapSack_Greedy(){} 
Các ví dụ: {3} Bài toán người du lịch 
Ví dụ 3 [Bài toán người du lịch – Traveling Salesman Problem – TSP]Cho n thành phố được đánh số từ 1 đến n và khoảng cách giữa thành phố i và thành phố j được cho bởi c ij (chú ý: c ij =c ji )Yêu cầu: Tìm một hành trình ngắn nhất cho phép viếng thăm n thành phố, mỗi thành phố viếng thăm đúng 1 lần và quay về thành phố ban đầu. 
Các ví dụ: {3} Bài toán người du lịch 
Biểu diễn lời giải của bài toán là 1 vector độ dài n: X=(x 1 , x 2 , , x n ). (x 1 =1). Trong đó (x 1 , x 2 , , x n ) là một hoán vị của (1, 2, , n) 
Bài toán: Tìm vector X 
Các ví dụ: {3} Bài toán người du lịch 
Thuật toán tham lam: 
Ý tưởng: Xuất phát từ thành phố số 1, tại mỗi bước ta sẽ chọn thành phố tiếp theo là thành phố chưa viếng thăm và có khoảng cách từ thành phố hiện tại đến thành phố đó là nhỏ nhất 
Bước 1: x 1 =1; x n =1 
Bước 2: Chọn x i là thành phố chưa đi qua và có khoảng cách đến x i-1 là nhỏ nhất. 
Các ví dụ: {3} Bài toán người du lịch 
cài đặt 
void TSP_Greedy(){} 
Các ví dụ: {4} Bài toán mã đi tuần 
Ví dụ 4 [Bài toán mã đi tuần]Trên bàn cờ quốc tế có một con mã nằm tại một ô nào đó. Hãy chỉ ra 1 cách di chuyển con mã trên bàn cờ theo luật đi con mã sao cho mỗi ô trên bàn cờ, con mã nhảy đến đúng một lần. 
Các ví dụ: {4} Bài toán mã đi tuần 
Thuật toán tham lam: 
Ở gần biên sẽ có ít nước đi hơn các ô bên trong 
Ý tưởng: Ưu tiên đi ra biên để đi những ô có ít nước đi nhất rồi mới đi đến những ô bên trong 
Các ví dụ: {4} Bài toán mã đi tuần 
cài đặt 
void Horse_Greedy(){} 
Ưu điểm và khuyết điểm 
Ưu điểm 
Tìm được các nghiệm gần tối ưu 
Thời gian thực thi nhanh hơn các phương pháp tối ưu, quay lui 
Khuyết điểm 
Nghiệm tìm được có thể không tốt nhất 
HẾT CHƯƠNG 7 

File đính kèm:

  • pptxbai_giang_co_so_lap_trinh_nang_cao_chuong_7_phuong_phap_thie.pptx