Quay lui là một phương pháp thiết kế thuật toán để tìm nghiệm của bài toán bằng cách xét tất cả các phương án. Một phương án gồm nhiều thành phần, và phương pháp quay lui sẽ xây dựng từng thành phần trong mỗi bước. Trong quá trình xây dựng thành phần thứ i (tìm nghiệm cho thành phần thứ i), nếu không thể xây dựng được thì quay lại chọn nghiệm khác cho thành phần thứ (i-1)
Chương PHƯƠNG PHÁP THIẾT KẾ THUẬT TOÁN – QUAY LUI – Nội dung Giới thiệu Phương pháp Sơ đồ cài đặt Các ví dụ Ưu điểm khuyết điểm Hình ảnh … Giới thiệu Định nghĩa [Quay lui – Backtracking]: • Quay lui phương pháp thiết kế thuật toán để tìm nghiệm tốn cách xét tất phương án • Một phương án gồm nhiều thành phần, phương pháp quay lui xây dựng thành phần bước • Trong q trình xây dựng thành phần thứ i (tìm nghiệm cho thành phần thứ i), khơng thể xây dựng quay lại chọn nghiệm khác cho thành phần thứ (i-1) Bài toán Phát biểu toán: Giả sử nghiệm tốn cần tìm có dạng X=(x1, x2, …, xk, …), • xi thành phần nghiệm tốn • xi có miền giá trị Di (xi Di) • Số lượng thành phần xi xác định hay khơng xác định • Bài tốn có ràng buộc F Yêu cầu: Hãy xây dựng nghiệm hay tất nghiệm toán thỏa điều kiện F Phương pháp Phương pháp Quay lui • Phương pháp Quay lui xây dựng dần nghiệm X toán: Bắt đầu từ x1 chọn từ tập D1, đến x2 chọn từ tập D2, cách thử khả xảy • Một cách tổng quát: Nếu xác định lời giải phận gồm (i-1) thành phần X(i-1) = (x1, x2, , xi-1), tìm giá trị cho thành phần xi cách xét khả có xi tập Di Với khả j (jDi), kiểm tra xem thỏa điều kiện nghiệm thành phần tốn khơng Phương pháp • Có khả xảy ra: – Nếu khả j thỏa điều kiện Gán xi = j Tiếp theo tìm nghiệm cho thành phần xi+1 – Nếu thử khả j mà khơng thỏa điều kiện tốn có nghĩa theo đường X(i-1) = (x1, x2, , xi-1) dẫn đến kết Chúng ta quay bước trước để xác định lại xi-1 (bằng cách chọn giá trị khác Di-1) Phương pháp • Quá trình dừng tìm nghiệm toán hay vét qua hết khả mà khơng thể tìm nghiệm tốn Phương pháp Cây tìm kiếm (Cây khơng gian tìm kiếm): Quá trình tìm kiếm lời giải theo phương pháp Quay lui sinh tìm kiếm x1 x2 x3 Phương pháp Đặc điểm phương pháp Quay lui • Xây dựng dần thành phần phương án • Trong q trình xây dựng phương án thực hiện: – Tiến: Để mở rộng thành phần phương án – Lui: Nếu mở rộng phương án • Xét khả xảy Phương pháp quay lui cịn gọi với tên khác như: Vét cạn (Exhaustion), Duyệt, thử sai (Trial and Error), … 10 Các ví dụ: {1} Tổ hợp cài đặt void ToHop(int i) { } 22 Các ví dụ: {2} Chỉnh hợp lặp Một chỉnh hợp lặp chập k tập n phần tử (k≤n) (có thứ tự) gồm k phần tử tập n phần tử thành phần trùng • Ví dụ: Tập {1, 2, 3, 4, 5} có chỉnh hợp lặp chập là: • Số lượng chỉnh hợpk lặp chập k tập n phần tử: k An n 23 Các ví dụ: {2} Chỉnh hợp lặp Bài tốn: Hãy tìm tất chỉnh hợp lặp chập k tập n phần tử • Bước 1: Biểu diễn nghiệm X • Bước 2: Tìm miền giá trị Di xi • Bước 3: Ràng buộc xi xj • Bước 4: Xác định điều kiện F để X nghiệm 24 Các ví dụ: {2} Chỉnh hợp lặp Cấu trúc liệu #define MAX 20 int x[MAX+1]; int n, k; 25 Các ví dụ: {2} Chỉnh hợp lặp cài đặt void ChinhHopLap(int i) { } 26 Các ví dụ: {3} Chỉnh hợp khơng lặp Một chỉnh hợp không lặp chập k tập n phần tử (k≤n) (có thứ tự) gồm k phần tử tập n phần tử thành phần khơng trùng • Ví dụ: Tập {1, 2, 3, 4, 5} có chỉnh hợp không lặp chập là: n!k tập • Số lượng chỉnh hợp không lặp chập k An n(n 1) ( n k 1) n phần tử: (n k )! 27 Các ví dụ: {3} Chỉnh hợp khơng lặp Bài tốn: Hãy tìm tất chỉnh hợp khơng lặp chập k tập n phần tử • Bước 1: Biểu diễn nghiệm X • Bước 2: Tìm miền giá trị Di xi • Bước 3: Ràng buộc xi xj • Bước 4: Xác định điều kiện F để X nghiệm 28 Các ví dụ: {3} Chỉnh hợp không lặp Cấu trúc liệu #define MAX 20 int x[MAX+1]; int n, k; int status[MAX+1]; 29 Các ví dụ: {3} Chỉnh hợp không lặp cài đặt void ChinhHopKhongLap(int i) { } 30 Các ví dụ: {4} Xếp Hậu Bài toán: Hãy đặt hậu lên bàn cờ vua 8x8, cho không hậu ăn hậu nào, tức chúng • Khơng hàng • Khơng cột • Khơng đường chéo 31 Các ví dụ: {4} Xếp Hậu • Bước 1: Biểu diễn nghiệm X • Bước 2: Tìm miền giá trị Di xi • Bước 3: Ràng buộc xi xj • Bước 4: Xác định điều kiện F để X nghiệm 32 Các ví dụ: {4} Xếp Hậu Cấu trúc liệu #define MAX int x[MAX+1]; int cot[MAX+1]; int cheoChinh[ … ]; int cheoPhu[ … ]; 33 Các ví dụ: {4} Xếp Hậu cài đặt void Xep8Hau(int i) { } 34 Ưu điểm khuyết điểm Ưu điểm • Ln đảm bảo tìm nghiêm • Cho phép liệt kê nghiệm tốn Khuyết điểm • Độ phức tạp thuật tốn lớn • Thời gian thực thi lâu • Chỉ giải tốn có kích thước nhỏ 35 Tóm tắt chương 36 ... kiện tốn có nghĩa theo đường X(i-1) = (x1, x2, , xi-1) dẫn đến kết Chúng ta quay bước trước để xác định lại xi-1 (bằng cách chọn giá trị khác Di-1) Phương pháp • Quá trình dừng tìm nghiệm tốn hay... D2, cách thử khả xảy • Một cách tổng quát: Nếu xác định lời giải phận gồm (i-1) thành phần X(i-1) = (x1, x2, , xi-1), tìm giá trị cho thành phần xi cách xét khả có xi tập Di Với khả j (jDi),... dựng thành phần bước • Trong q trình xây dựng thành phần thứ i (tìm nghiệm cho thành phần thứ i), khơng thể xây dựng quay lại chọn nghiệm khác cho thành phần thứ (i-1) Bài toán Phát biểu toán: