Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 57 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
57
Dung lượng
2,44 MB
Nội dung
CÁC CHIẾN LƯỢC THIẾT KẾ GIẢI THUẬT 1 CHƯƠNG 5 Nội dung Qui hoạch động Giải thuật tham lam Giải thuật quay lui (backtracking) Giải thuật nhánh và cận 2 Giải thuật quay lui (backtracking) Ý tưởng phương pháp Lược đồ giải thuật Các ví dụ Giải thuật quay lui • Kĩ thuật quay lui (backtracking) như là một quá trình phân tích đi xuống và quay lui trở lại theo con đường đã đi qua. • Tại mỗi bước phân tích chúng ta chưa giải quyết được vấn đề do còn thiếu cứ liệu nên cứ phải phân tích cho tới các điểm dừng, nơi chúng ta xác định được lời giải của chúng hoặc là xác định được là không thể (hoặc không nên) tiếp tục theo hướng này. • Từ các điểm dừng này chúng ta quay ngược trở lại theo con đường mà chúng ta đã đi qua để giải quyết các vấn đề còn tồn đọng và cuối cùng ta sẽ giải quyết được vấn đề ban đầu. Giải thuật quay lui Ba kĩ thuật quay lui là: • “vét cạn” là kĩ thuật phải đi tới tất cả các điểm dừng rồi mới quay lui. • “Cắt tỉa Alpha-Beta” và “Nhánh-Cận” là hai kĩ thuật cho phép chúng ta không cần thiết phải đi tới tất cả các điểm dừng, mà chỉ cần đi đến một số điểm nào đó và dựa vào một số suy luận để có thể quay lui sớm. Giải thuật quay lui Ví dụ kĩ thuật quay lui “vét cạn” Biểu thức 5 + 2 * 3 - 4 Trị của nút gốc chính là trị của biểu thức. Để định trị cho nút gốc, chúng ta phải định trị cho hai con của nó, đối với mỗi con ta xem nó có phải là nút lá hay không, nếu không phải ta lại phải xét hai con của nút đó. Quá trình cứ tiếp tục như vậy cho tới khi gặp các nút lá mà giá trị của chúng đã được biết, quay lui để định trị cho các nút cha của các nút lá và cứ như thế mà định trị cho tổ tiên của chúng. Ý tưởng phương pháp • Thử từng khả năng cho đến khi tìm thấy lời giải đúng. Đó là một quá trình tìm kiếm theo độ sâu trong một tập hợp các lời giải. • Trong quá trình tìm kiếm, nếu ta gặp một hướng lựa chọn không thỏa mãn, ta quay lui về điểm lựa chọn nơi có các hướng khác và thử hướng lựa chọn tiếp theo. • Khi đã thử hết các lựa chọn xuất phát từ điểm lựa chọn đó, ta quay lại điểm lựa chọn trước đó và thử hướng lựa chọn tiếp theo tại đó. Quá trình tìm kiếm thất bại khi không còn điểm lựa chọn nào nữa. • Quy trình đó thường được cài đặt bằng một hàm đệ quy mà trong đó mỗi thể hiện của hàm lấy thêm một biến và lần lượt gán tất cả các giá trị có thể cho biến đó, với mỗi lần gán trị lại gọi chuỗi đệ quy tiếp theo để thử các biến tiếp theo. Ý tưởng phương pháp • Chiến lược quay lui tương tự với tìm kiếm theo độ sâu nhưng sử dụng ít không gian bộ nhớ hơn, nó chỉ lưu giữ trạng thái của một lời giải hiện tại và cập nhật nó. • Để tăng tốc quá trình tìm kiếm, khi một giá trị được chọn, trước khi thực hiện lời gọi đệ quy, thuật toán thường xóa bỏ giá trị đó khỏi miền xác định của các biến có mâu thuẫn chưa được gán (kiểm tra tiến - forward checking) và kiểm tra tất cả các hằng số để tìm các giá trị khác đã bị loại trừ bởi giá trị vừa được gán (lan truyền ràng buộc - constraint propagation). Phương pháp • Có thể xem nghiệm bài toán là một vector x = (x 1 , x 2 , , x n ) mà x i được chọn trong A i nào đó • Giả sử đã chọn được k-1 thành phần x 1 , x 2 , , x k-1 của x • Lúc đó chọn thành phần x k bằng cách duyệt mọi khả năng có thể (trong A k ) để đề cử cho x k Ý tưởng phương pháp • Với mỗi khả năng j, kiểm tra xem có chấp nhận đươc không, có 2 trường hợp • Nếu chấp nhận j thì xác định x k theo j, khi k = n thì có một lời giải, ngược thì tiếp tục xác định x k+1 • Nếu thử tất cả các khả năng x k A∈ k mà không có khả năng nào được chấp nhận thì quay lui lại bước trước để xác định lại x k-1 Lưu ý • Tại mỗi bước đi qua, khi xác định x k , cần phải ghi nhớ những khả năng nào đã được thử để tránh trùng lặp • Có thể sử dụng một stack để ghi nhớ những khả năng đã được thử dùng kỹ thuật đệ qui để thiết kế thuật toán⇒ [...]... tất cả các khả năng Lược đồ thuật giải Giả thiết cấu hình cần liệt kê có dạng (x1,x2, ,xn) Khi đó thuật toán quay lui được thực hiện qua các bước sau: 1 Xét tất cả các giá trị x1 có thể nhận, thử cho x1 nhận lần lượt các giá trị đó Với mỗi giá trị thử cho x1 ta sẽ: 2 Xét tất cả các giá trị x2 có thể nhận, lại thử cho x2 nhận lần lượt các giá trị đó Với mỗi giá trị thử gán cho x2 lại xét tiếp các khả... chọn các thành phần ở các bước trước • Vì vậy, có thể phải ghi nhớ trạng thái của quá trình tìm kiếm sau khi xác định xk theo j và trả lại trạng thái cũ sau lời gọi Back_Tracking(k+1) • Các trạng thái được ghi nhận bởi biến toàn cục Ví dụ Sử dụng chiến lược quay lui dùng để giải bài toán liệt kê các cấu hình Mỗi cấu hình được xây dựng bằng cách xây dựng từng phần tử, mỗi phần tử được chọn bằng cách.. .Lược đồ thuật giải Back_Tracking(k) // xác định xk, k nguyên 1 for j ←1 to nk // chọn khả năng j, trong nk khả năng 2 do if accepting j 3 then 4 if k = n 5 then< recording 1 solution >//có 1 lời giải 6 else Back_Tracking(k+1) Lược đồ thuật giải Nhận xét • Cần chỉ rõ tập khả năng {1, …, nk} và kiểm tra • Nói chung, ngoài sự phụ thuộc vào j, các xi còn phụ... end; end; Quá trình tìm kiếm lời giải của thuật toán quay lui Ví Dụ: Liệt kê các xâu nhị phân độ dài n Liệt kê các xâu nhị phân độ dài n Giải • Biểu diễn xâu nhị phân dạng b = (b1, b2, , bn), bi= 0,1 • Back_Tracking(k) xác định bk với các giá trị được đề cử thuộc Ak= {0,1} Banary_Back_Tracking(k) 1 for j ←0 to 1 2 do 3 b[k] ←j 4 if k = n 5 then Print(b) 6 else return • Các đề cử mặc nhiên đươc chấp nhận... 011, 100, 101, 110, 111 Các Ví Dụ Ví Dụ: Liệt kê các xâu nhị phân độ dài n Liệt kê các xâu nhị phân độ dài n Ví Dụ: Liệt kê các xâu nhị phân độ dài n Liệt kê các xâu nhị phân độ dài n Ví Dụ:Liệt kê các hoán vị của n phần tử từ tập A = {1, 2, , n} Giải • Biểu diễn mỗi hoán vị như là một vector p = (p1, p2, , pn) trong đó pi∈A và pi≠pj • pk nhận giá trị j =1, 2, , n ≠p1, p2, , pk-1 • Dùng biến logic bj... 6 15 10 21 try(2, x0, y0, q) 14 9 20 5 16 19 2 7 22 11 8 13 24 17 4 25 18 3 12 23 Hình 6.3.1 trình bày một lời giải đạt được với vị trí với n = 5 Nhận xét Từ thí dụ trên ta đi đến với một kiểu giải quyết vấn đề” mới: Đặc điểm chính là “bước hướng về lời giải đầy đủ và ghi lại thông tin về bước này mà sau đó nó có thể bị tháo gỡ và xóa đi khi phát hiện rằng bước này đã không dẫn đến lời giải. .. hành , có 8 khả năng để chọn ô kế tiếp để đi tới Chúng được đánh số từ 1 đến 8 như sau: 3 2 4 1 ⊕ 5 8 6 7 Dòng a[1]:=2; a[2]:=1; a[3]:=–1; a[4]:=–2; a [5] :=–2; a[6]:=–1; a[7]:=1; a[8]:=2; Cột b[1]:= 1; b[2]:= 2; b[3]:= 2; b[4]:= 1; b [5] := –1; b[6]:= –2; b[7]:= –2; b[8]:= –1; Sự tinh chế sau cùng • Cách đơn giản nhất để đạt được tọa độ u, v từ x, y là bằng cách cộng độ sai biệt toạ độ tại hai... giá trị đó Với mỗi giá trị thử gán cho x2 lại xét tiếp các khả năng chọn x3 cứ tiếp tục như vậy đến bước: n Xét tất cả các giá trị xn có thể nhận, thử cho xn nhận lần lượt các giá trị đó, thông báo cấu hình tìm được Thuật toán quay lui (pseudocode) //Thủ tục thử cho xi nhận lần lượt các giá trị mà nó có thể nhận procedure Try(i: Integer); begin for (mọi giá trị có thể gán cho xi) do begin . CÁC CHIẾN LƯỢC THIẾT KẾ GIẢI THUẬT 1 CHƯƠNG 5 Nội dung Qui hoạch động Giải thuật tham lam Giải thuật quay lui (backtracking) Giải thuật nhánh và cận 2 Giải thuật quay lui. cách thử tất cả các khả năng. Lược đồ thuật giải 1. Xét tất cả các giá trị x 1 có thể nhận, thử cho x 1 nhận lần lượt các giá trị đó. Với mỗi giá trị thử cho x 1 ta sẽ: 2. Xét tất cả các. lui Ba kĩ thuật quay lui là: • “vét cạn” là kĩ thuật phải đi tới tất cả các điểm dừng rồi mới quay lui. • “Cắt tỉa Alpha-Beta” và “Nhánh-Cận” là hai kĩ thuật cho phép chúng ta không cần thiết