Bài giảng Cơ sở lập trình nâng cao - Chương 4: Phương pháp thiết kế thuật toán-Quay lui - Tôn Quang Toại
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 4: Phương pháp thiết kế thuật toán-Quay lui - Tôn Quang Toại", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
        Tài liệu đính kèm:
 bai_giang_co_so_lap_trinh_nang_cao_chuong_4_phuong_phap_thie.pptx bai_giang_co_so_lap_trinh_nang_cao_chuong_4_phuong_phap_thie.pptx
Nội dung text: Bài giảng Cơ sở lập trình nâng cao - Chương 4: Phương pháp thiết kế thuật toán-Quay lui - 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
- Chương 4 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 và khuyết điểm
- Hình ảnh
- Giới thiệu • Định nghĩa [Quay lui – Backtracking]: – 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)
- Bài toán • Phát biểu bài toán: Giả sử nghiệm của bài toán cần tìm có dạng X=(x1, x2, , xk, ), trong đó – xi là 1 thành phần nghiệm của bài toán – xi có một miền giá trị Di nào đó (xi Di). – Số lượng thành phần xi có thể xác định hay không xác định – Bài toán có những ràng buộc là F • Yêu cầu: Hãy xây dựng 1 nghiệm hay tất cả các nghiệm của bài 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 của bài toán: Bắt đầu từ x1 được chọn ra từ tập D1, rồi đến x2 được chọn ra từ tập D2, bằng cách thử mọi khả năng có thể xảy ra. – Một cách tổng quát: Nếu chúng ta đã xác định được lời giải bộ phận gồm (i-1) thành phần X(i-1) = (x1, x2, , xi-1), bây giờ chúng ta tìm giá trị cho thành phần xi bằng cách xét mọi khả năng có thể có của xi trong tập Di. Với mỗi khả năng j (j Di), chúng ta kiểm tra xem có thể thỏa điều kiện là nghiệm thành phần của bài toán không
- Phương pháp – Có 2 khả năng xảy ra: • Nếu khả năng j thỏa điều kiện thì – Gán xi = j – Tiếp theo tìm nghiệm cho thành phần xi+1 • Nếu đã thử mọi khả năng của j mà không thỏa điều kiện bài toán thì có nghĩa là đi theo con đường X(i-1) = (x1, x2, , xi-1) sẽ không thể dẫn đến kết quả. Chúng ta quay về bước trước để xác định lại xi-1 (bằng cách chọn 1 giá trị khác trong Di-1).
- Phương pháp – Quá trình này dừng cho đến khi tìm được nghiệm của bài toán hay vét qua hết khả năng mà không thể tìm được nghiệm của bài toá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 sẽ sinh ra 1 cây tìm kiếm x1 x2 x3
- Phương pháp • Đặc điểm của phương pháp Quay lui – Xây dựng dần từng thành phần trong 1 phương án – Trong quá trình xây dựng phương án nó thực hiện: • Tiến: Để mở rộng các thành phần của phương án • Lui: Nếu không thể mở rộng phương án – Xét mọi khả năng có thể xảy ra • Phương pháp quay lui còn được gọi với những tên khác như: Vét cạn (Exhaustion), Duyệt, thử và sai (Trial and Error),
- Phương pháp • Các bước sử dụng phương pháp Quay lui – Bước 1 [Biểu diễn nghiệm]: Biểu diễn nghiệm bài toán dưới dạng một vector X=(x1, x2, x3, , xk, ) – Bước 2 [Tìm miền giá trị thô]: Xác định các miền giá trị cơ bản Di cho các xi (Di=[mini, maxi]) – Bước 3 [Ràng buộc]: Tìm những ràng buộc của xi và giữa xi và xj. Từ đó có thể xác định lại các Di – Bước 4: Xác định những điều kiện F khác để X là nghiệm của bài toán
- Phương pháp • Xác định miền giá trị Di (Bước 3): – Xác định cận trên và cận dưới của miền Di (Di=[mini, maxi]) – Chi tiết việc xác định Di • Nếu các Di và Dj độc lập nhau thì không cần chỉnh sửa Di trong bước 2 • Nếu Di bị thay đổi do việc chọn lựa ở những thành phần xj (j<i) trước đó thì chúng ta cần xác định lại Di khi chọn lựa xj ở bước j Dùng biến mảng trạng thái để lưu sự biến đổi của miền giá trị
- Sơ đồ cài đặt • Nếu các Di và Dj độc lập nhau: void BackTrack_1A(int i) { if (thỏa điều kiện bài toán F) Tìm được 1 nghiệm else for (j Di) { xi = j; BackTrack_1A(i+1); } }
- Sơ đồ cài đặt • Nếu các Di và Dj độc lập nhau: void BackTrack_1B(int i) { for (j Di) { xi = j; if (thỏa điều kiện bài toán F) Tìm được 1 nghiệm else BackTrack_1B(i+1); } }
- Sơ đồ cài đặt • Nếu các Di và Dj phụ thuộc nhau: void BackTrack_2A(int i) { if (thỏa điều kiện bài toán F) Tìm được 1 nghiệm else for (j Di và status[j]==0) { status[j] = 1; xi = j; BackTrack_2A(i+1); status[j]=0; } }
- Sơ đồ cài đặt • Nếu các Di và Dj phụ thuộc nhau : void BackTrack_2B(int i) { for (j Di và status[j]==0) { status[j]=1; xi = j; if (thỏa điều kiện bài toán F) Tìm được 1 nghiệm else BackTrack_2B(i+1); status[j]=0; } }
- Sơ đồ cài đặt • Sơ đồ tổng quát void BackTrack_3A(int x[], int i, data input) { int D[MAXCANDIDATES]; int nD; if (IsSolution(x, i)) ProcessSolution(x, i, input); else { ConstructCandidates(x, i, input, D, &nD); for (j D) { x[i] = j; BackTrack_3A(x, i+1, input); } } }
- Sơ đồ cài đặt • Sơ đồ tổng quát void BackTrack_3B(int x[], int i, data input) { int D[MAXCANDIDATES]; int nD; ConstructCandidates(x, i, input, D, &nD); for (j D) { x[i] = j; if (IsSolution(x, i, input)) ProcessSolution(x, I, input); else BackTrack_3B(x, i+1, input); } }
- Các ví dụ: {1} Tổ hợp • Một tổ hợp chập k của tập n phần tử (k≤n) là một tập hợp con gồm k phần tử của tập n phần tử – Ví dụ: Tập {1, 2, 3, 4, 5} có các tổ hợp chập 2 là: – Số lượng tổ hợp chập k của tập n phần tử: n( n− 1) ( n − k + 1) n ! Ck == n k! k !( n− k )!
- Các ví dụ: {1} Tổ hợp • Bài toán: Hãy tìm tất cả các tổ hợp chập k của 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 của xi – Bước 3: Ràng buộc giữa xi và xj – Bước 4: Xác định điều kiện F để X là nghiệm
- Các ví dụ: {1} Tổ hợp • Cấu trúc dữ liệu #define MAX 20 int x[MAX+1]; int n, k;
- Các ví dụ: {1} Tổ hợp void ToHop(int i) { }
- Các ví dụ: {2} Chỉnh hợp lặp • Một chỉnh hợp lặp chập k của tập n phần tử (k≤n) là một bộ (có thứ tự) gồm k phần tử của tập n phần tử và các thành phần của bộ có thể trùng nhau – Ví dụ: Tập {1, 2, 3, 4, 5} có các chỉnh hợp lặp chập 2 là: – Số lượng chỉnh hợp lặp chập k của tập n phần tử: k k An = n
- Các ví dụ: {2} Chỉnh hợp lặp • Bài toán: Hãy tìm tất cả các chỉnh hợp lặp chập k của 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 của xi – Bước 3: Ràng buộc giữa xi và xj – Bước 4: Xác định điều kiện F để X là nghiệm
- Các ví dụ: {2} Chỉnh hợp lặp • Cấu trúc dữ liệu #define MAX 20 int x[MAX+1]; int n, k;
- Các ví dụ: {2} Chỉnh hợp lặp void ChinhHopLap(int i) { }
- 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 của tập n phần tử (k≤n) là một bộ (có thứ tự) gồm k phần tử của tập n phần tử và các thành phần của bộ không được trùng nhau – Ví dụ: Tập {1, 2, 3, 4, 5} có các chỉnh hợp không lặp chập 2 là: – Số lượng chỉnh hợp không lặp chập kn !của tập n Ak = n(n −1) (n − k +1) = phần tử: n (n − k)!
- Các ví dụ: {3} Chỉnh hợp không lặp • Bài toán: Hãy tìm tất cả các chỉnh hợp không lặp chập k của 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 của xi – Bước 3: Ràng buộc giữa xi và xj – Bước 4: Xác định điều kiện F để X là nghiệm
- Các ví dụ: {3} Chỉnh hợp không lặp • Cấu trúc dữ liệu #define MAX 20 int x[MAX+1]; int n, k; int status[MAX+1];
- Các ví dụ: {3} Chỉnh hợp không lặp void ChinhHopKhongLap(int i) { }
- Các ví dụ: {4} Xếp 8 Hậu • Bài toán: Hãy đặt 8 con hậu lên bàn cờ vua 8x8, sao cho không con hậu nào được ăn con hậu nào, tức là chúng – Không cùng hàng – Không cùng cột – Không cùng đường chéo
- Các ví dụ: {4} Xếp 8 Hậu – Bước 1: Biểu diễn nghiệm X – Bước 2: Tìm miền giá trị Di của xi – Bước 3: Ràng buộc giữa xi và xj – Bước 4: Xác định điều kiện F để X là nghiệm
- Các ví dụ: {4} Xếp 8 Hậu • Cấu trúc dữ liệu #define MAX 8 int x[MAX+1]; int cot[MAX+1]; int cheoChinh[ ]; int cheoPhu[ ];
- Các ví dụ: {4} Xếp 8 Hậu void Xep8Hau(int i) { }
- Ưu điểm và khuyết điểm • Ưu điểm – Luôn đảm bảo tìm nghiêm đúng – Cho phép liệt kê mọi nghiệm của bài toán • Khuyết điểm – Độ phức tạp thuật toán lớn – Thời gian thực thi lâu – Chỉ giải những bài toán có kích thước nhỏ






