Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
1,27 MB
Nội dung
TRƯỜNG CAO ĐẲNG CNTT HỮU NGHỊ ViỆT - HÀN KHOA KHOA HỌC MÁY TÍNH -*** - THUẬTTOÁN (Algorithms) Nguyễn Thanh Cẩm Nội Dung C1 THUẬTTOÁN VÀ ĐỘ PHỨC TẠP C2 CHIA ĐỂ TRỊ C3 QUY HOẠCH ĐỘNG C4 THUẬTTOÁN THAM LAM C5 THUẬTTOÁNQUAYLUI Nguyễn Thanh Cẩm THUẬTTOÁNQUAYLUI 5.1 Thuậttoánquaylui 5.2 Một số toán minh họa Nguyễn Thanh Cẩm THUẬTTOÁNQUAYLUI 5.1 Thuậttoánquaylui 5.1.1 Đệ quy 5.1.2 Thuậttoánquaylui tổng quát Nguyễn Thanh Cẩm 5.1 Thuậttoánquaylui Quaylui (backtracking) chiến lược tìm kiếm lời giải cho toán thỏa mãn ràng buộc Người đề thuật ngữ (backtrack) nhà toán học người Mỹ D H Lehmer vào năm 1950 Nguyễn Thanh Cẩm 5.1.1 Đệ quy Thí dụ 1: Tìm thuậttoán đệ quy tính giá trị an với a số thực không âm n số nguyên không âm Thuậttoán đệ quy tính an float power (a: float; n: int); { if (n = 0) power(a, n) = else power(a, n) = a*power(a, n-1) } Nguyễn Thanh Cẩm 5.1.1 Đệ quy Thí dụ 2: Tìm thuậttoán đệ quy tính UCLN hai số nguyên a, b không âm a < b Thuậttoán đệ quy tính UCLN(a, b) int UCLN(int a, int b); { if (a = 0) UCLN(a, b) = b else UCLN(a,b) = UCLN(b mod a,a) } Nguyễn Thanh Cẩm 4.1.2 Thuậttoánquaylui tổng quát Thuậttoánquaylui dùng để giải toán liệt kê cấu hình Mỗi cấu hình xây dựng cách xây dựng phần tử, phần tử chọn cách thử tất khả Nguyễn Thanh Cẩm 4.1.2 Thuậttoánquaylui tổng quát Giả thiết cấu hình cần liệt kê có dạng (x1, x2, …, xn) Khi thuậttoánquaylui thực bước sau: Xét tất giá trị x1 nhận, thử cho x1 nhận giá trị Với giá trị thử gán cho x1 ta sẽ: Xét tất giá trị x2 nhận, lại thử cho x2 nhận giá trị Với giá trị thử gán cho x2 lại xét tiếp khả chọn x3… tiếp tục đến bước: Xét tất giá trị xn nhận, thử cho xn nhận giá trị đó, thông báo cấu hình tìm (x1, x2, …, xn) Trên phương diện quy nạp, nói thuậttoánquaylui liệt kê cấu hình n phần tử dạng (x1, x2, …, xn) cách thử cho x1 nhận giá trị Với giá trị gán cho x1 lại liệt kê tiếp cấu hình n -1 phần tử (x2, x3, …, xn) Nguyễn Thanh Cẩm 4.1.2 Thuậttoánquaylui tổng quát Mô hình thuậttoánquaylui mô tả sau: Void Try(int i) { For (mọi giá trị V gán cho xi) { ; If (xi phần tử cuối cấu hình) Else { ; Try(i + 1); ; } } } Nguyễn Thanh Cẩm 5.2.3 Bài toán xếp hậu Cài đặt Ta có mảng logic để đánh dấu: Mảng a[1 n] = TRUE cột i tự do, = FALSE cột i bị quân hậu khống chế Mảng b[2 2n] bi = TRUE đường chéo ĐB-TN thứ i tự do, bi = FALSE đường chéo bị quân hậu khống chế Mảng c[1 - n n - 1] ci = TRUE đường chéo ĐN-TB thứ i tự do, ci = FALSE đường chéo bị quân hậu khống chế Ban đầu mảng đánh dấu mang giá trị TRUE (Các cột đường chéo tự do) Nguyễn Thanh Cẩm 5.2.3 Bài toán xếp hậu Áp dụng thuậttoánquaylui cho toán xếp hậu: Xét tất cột, thử đặt quân hậu vào cột, với cách đặt vậy, xét tất cách đặt quân hậu không bị quân hậu ăn, lại thử cách đặt xét tiếp cách đặt quân hậu 3… Mỗi cách đặt đến quân hậu n cho ta nghiệm Khi chọn vị trí cột j cho quân hậu thứ i, ta phải chọn ô(i, j) không bị quân hậu đặt trước ăn, tức phải chọn cột j tự do, đường chéo ĐB-TN (i+j) tự do, đường chéo ĐNTB(i-j) tự Điều kiểm tra (aj = bi+j = ci-j = TRUE) Khi thử đặt quân hậu thứ i vào cột j, quân hậu cuối (i = n) ta có nghiệm Nếu không: Nguyễn Thanh Cẩm 5.2.3 Bài toán xếp hậu Trước gọi đệ quy tìm cách đặt quân hậu thứ i + 1, ta đánh dấu cột đường chéo bị quân hậu vừa đặt khống chế (aj = bi+j = ci-j := FALSE) để lần gọi đệ quy tiếp sau chọn cách đặt quân hậu không chọn vào ô nằm cột j đường chéo Sau gọi đệ quy tìm cách đặt quân hậu thứ i + 1, có nghĩa tới ta lại thử cách đặt khác cho quân hậu thứ i, ta bỏ đánh dấu cột đường chéo bị quân hậu vừa thử đặt khống chế (aj = bi+j = ci-j := TRUE) tức cột đường chéo lại thành tự do, đặt quân hậu i sang vị trí khác cột đường chéo hoàn toàn gán cho quân hậu khác Nguyễn Thanh Cẩm 5.2.3 Bài toán xếp hậu Thủ tục đặt hậu: void Try(int i) {int j; for (j = 1;j