Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 97 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
97
Dung lượng
272,5 KB
Nội dung
1 THUẬT TOÁN QUAY LUI (BACKTRACKING) Phương pháp (thuật toán quay lui Backtracking) Trong kỹ thuật để thiết kế thuật toán, quay lui kỹ thuật quan trọng cho phép giải lớp toán lớn có dạng tổng quát sau: Tìm (hoặc tất cả) nghiệm (x1, x2, , xn) thỏa mãn điều kiện F đó, thành phần x i chọn từ tập hữu hạn Di với i = 1, 2, , n Tư tưởng phương pháp quay lui sau : - Ta xây dựng nghiệm bước, thành phần nghiệm x1 chọn giá trị S1 = D1 - Giả sử chọn thành phần x 1, x2, , xi-1, từ điều kiện toán ta xác định tập S i gồm giá trị chọn cho thành phần nghiệm xi Tập Si tập Di phụ thuộc vào thành phần x1, x2, , xi-1 chọn Chọn phần tử xi thuộc Si thành phần T1 nghiệm Từ (x1, x2, , xi) lặp lại trình để tiếp tục mở rộng nghiệm cho thành phần xi+1 Nếu không chọn thành phần xi+1 (do Si+1 rỗng) ta quay lại chọn phần tử khác Si làm thành phần nghiệm xi (ý nghĩa quay lui bước này) - Trong trình mở rộng nghiệm ta kiểm tra nghiệm thành phần có phải nghiệm toán hay không Nếu cần nghiệm ta dừng lại, cần tìm tất nghiệm trình tìm nghiệm dừng tất khả chọn thành phần nghiệm vét cạn Quay lui phương pháp vét cạn giá trị nghiệm chọn không thực cách duyệt tuyến tính Điểm tốt thuật toán quay lui so với vét cạn tuyến tính hạn chế bớt nhánh phải duyệt mà theo nhánh không tìm lời giải thể T1 việc xây dựng tập giá trị S i tìm thành phần nghiệm xi quay lui không mở rộng thành phần nghiệm xi+1 Tuy nhiên hạn chế phương pháp phải duyệt qua nhiều khả nên độ phức tạp chương trình thường mức giai thừa hay hàm mũ nên tốc độ tính toán lâu trường hợp kích thước liệu vào lớn Để khắc phục hạn chế người ta tìm cách hạn chế khả không đưa đến kết phương pháp nhánh cận, nhiên lớp toán dùng phương pháp không nhiều Đa số toán vét cạn sử dụng phương pháp duyệt đệ quy để xét hết khả có nghiệm theo nguyên tắc "thử sai" quay lui Về tư tưởng, thuật toán vét cạn đơn giản ứng dụng vào việc giải toán cần có kỹ thuật định Để giải toán thuật toán quay lui cần thực công việc quan trọng sau: * Tìm cách biểu diễn nghiệm toán dạng dãy đối tượng chọn dần bước (x1, x2, , xn) T1 * Xác định tập S i khả chọn làm thành phần thứ i nghiệm Chọn cách thích hợp để biểu diễn Si * Tìm điều kiện để nghiệm chọn nghiệm toán Một số lưu ý xây dựng thuật toán quay lui: * Phải duyệt qua phương án toán chứa nghiệm (vét cạn) * Tránh trường hợp duyệt trùng lặp khả duyệt Để giải toán thuật toán quay lui, thông thường ta thường dùng thủ tục đệ quy Try(i : Integer) để chọn thành phần nghiệm xi Có ba dạng thuật toán quay lui: Dạng 1: Tìm tất nghiệm Dạng 2: Tìm nghiệm Dạng 3: Tìm nghiệm tối ưu thỏa mãn điều kiện T1 Ta xét cách giải dạng phương pháp quay lui: T1 Dạng 1: Tìm tất nghiệm T1 T1 T1 T1 10 Mô hình thuật toán quay lui mô tả sau: T1 83 Var j:Longint; Begin If c+(s-tong)/tmax[i] >= cmin then exit; for j:=0 to Begin x[i]:=j; tong:=tong+x[i]*t[i]; c:=c+j; If i=n then luucauhinh Else If tong[...]... B e g i n ; Try(i + 1); ` {Gọi đệ quy để chọn tiếp xi+1} ; End; End; End; Thuật toán quay lui thường bắt đầu bằng lời gọi Try(1) ************************************************ ****************** VÍ DỤ 1 LIỆT KÊ DÃY NHỊ PHÂN ĐỘ DÀI N Input: file văn bản NHIPHAN.INP chứa số nguyên dương... (x1, x2, , xn) Ta sẽ liệt kê các dãy này bằng cách thử dùng các giá trị {0, 1} gán cho xi Với mỗi giá trị thử gán cho xi lại thử các giá trị có thể gán cho xi+1… Chương trình liệt kê bằng thuật toán quay lui có thể viết: VÍ DỤ 2 TỔ HỢP (XÁC ĐỊNH TỔ HỢP CHẬP K CỦA TẬP N PHẦN TỬ) Input: file văn bản TOHOP.INP chứa hai số nguyên dương n, k (1≤ k ≤ n ≤ 20) cách nhau ít nhất một dấu cách Output: file văn... lệ và đảm bảo có ít nhất một đáp 56890 án 24562 Ví dụ: 12373 35691 T1 28 Ý tưởng: Ta nhận thấy rằng mỗi nghiệm của bài toán chính là một cấu hình của tổ hợp chập K của M phần tử Ta áp dụng thuật toán quay lui để duyệt mọi cấu hình tổ hợp để tìm ra cấu hình thoả mãn Tuy nhiên để giảm bớt số lần duyệt ta cần phải loại những thẻ mà chúng có tổng điểm bằng 0 và cần đánh dấu những thẻ đã được chọn Dùng mảng... viết chương trình như thế nào? Phải duyệt hết mọi khả năng mới rõ kết luận vô nghiệm hay không vô nghiệm Nghĩa là đã đi theo mọi nhánh nhưng nhánh nào cũng đều không tới đích, do đó theo quy luật cứ quay lui mãi để tìm kiếm thì đến lúc nào đó dẫn đến tình trạng phải trở về ô xuất phát Vậy khi gặp ô chọn nghiệm mới trùng với ô xuất phát thì bài toán vô nghiệm Vậy trong thủ tục Try(i) ta thêm một bước... nào thực sự hữu hiệu để giải bài toán, mà cho tới nay việc tìm nghiệm của chúng vẫn phải dựa trên mô hình liệt kê toàn bộ các cấu hình có thể và đánh giá, tìm ra cấu hình tốt nhất Mô hình thuật toán quay lui là tìm kiếm trên 1 cây phân cấp Nếu giả thiết rằng ứng với mỗi nút tương ứng với một giá trị được chọn cho xi sẽ ứng với chỉ 2 nút tương ứng với 2 giá trị mà x i+1 có thể nhận thì cây n cấp sẽ có... trong quá trình liệt kê lời giải ta cần tận dụng những thông tin đã tìm được để loại bỏ sớm những phương án chắc chắn không phải tối ưu Kỹ thuật đó gọi là kỹ thuật đánh giá nhánh cận trong tiến trình quay lui T1