Thuật toán quay lui

26 1.3K 0
Thuật toán quay lui

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Thuật toán quay lui

Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui Đặc tả yêu cầu toán: Cơ sở lý thuyết thuật toán quay lui Trình bày thuật toán cài đặt C chương trình ứng dụng thuật toán quay lui để tìm đường mê cung (Chương trình đọc liệu từ file INPUT.TXT số đỉnh đồ thị, tên đỉnh cạnh liên thuộc, đỉnh nguồn, đỉnh đích Chương trình đọc file, xử lý ghi file OUPUT.TXT đường ) File INPUT.TXT : a 0 0 e 5 0 0 0 0 0 0 c b d File OUT.TXT : 5 Nhóm SVTH: Nhóm 10 Trang Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui Chương 1: CƠ SỞ LÝ LUẬN Tìm kiếm vét cạn Trong thực tế thường gặp câu hỏi chẳng hạn “có khả ?”, “hãy cho biết tất khả ?”, “có tồn hay không khả ?” Ví dụ, có hay không cách đặt hậu vào bàn cờ cho chúng không công Các vấn đề thông thường đòi hỏi ta phải xem xét tất khả có Tìm kiếm vét cạn (exhaustive search) xem xét tất ứng cử viên nhằm phát đối tượng mong muốn Các thuật toán thiết kế tìm kiếm vét cạn thường gọi brute-force algorithms Ý tưởng thuật toán sinh-kiểm, tức sinh tất khả có kiểm tra khả xem có thoả mãn điều kiện toán không Trong nhiều vấn đề, tất khả mà ta cần xem xét quy đối tượng tổ hợp (các tập tập), hoán vị n đối tượng, tổ hợp k đối tượng từ n đối tượng Trong trường hợp thế, ta cần phải sinh ra, chẳng hạn, tất hoán vị, kiểm tra xem hoán vị có nghiệm toán không Tìm kiếm vét cạn đương nhiên hiệu quả, đòi hỏi nhiều thời gian Nhưng có vấn đề ta cách giải khác tìm kiếm vét cạn Ví dụ 1(Bài toán hậu) Chúng ta cần đặt hậu vào bàn cờ 8x8 cho chúng không công nhau, tức hai hậu nằm hàng, cột, đường chéo Vì hậu phải nằm hàng khác nhau, ta đánh số hậu từ đến 8, hậu i hậu đứng hàng thứ i (i=1, ,8) Gọi x i cột mà hậu thứ i đứng Vì hậu phải đứng cột khác nhau, nên (x 1, x2, ,x8) hoán vị số 1, 2, , Như tất ứng cử viên cho nghiệm toán hậu tất hoán vị số 1, 2, , Đến ta đưa thuật toán sau: sinh tất hoán vị (x 1, x2, ,x8), với Nhóm SVTH: Nhóm 10 Trang Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui hoán vị ta kiểm tra xem hai ô (i,x i) (j,xj) có đường chéo hay không Đối với toán tổng quát: đặt n hậu vào bàn cờ nxn, số hoán vị cần xem xét n!, dó thuật toán đặt n hậu tìm kiếm vét cạn đòi hỏi thời gian O(n!) Trong mục sau, đưa thuật toán hiệu thiết kế kỹ thuật quay lui Ví dụ ( Bài toán người bán hàng) Bài toán người bán hàng (saleperson problem) phát biểu sau Một người bán hàng, hàng ngày phải giao hàng từ thành phố đến số thành phố khác quay lại thành phố xuất phát Anh ta muốn tìm tua qua thành phố cần đến lần với độ dài tua ngắn Chúng ta phát biểu xác toán sau Cho đồ thị định hướng gồm n đỉnh đánh số 0,1, ,n-1 Độ dài cung (i,j) kí hiệu d ij số không âm Nếu đồ thị cung (i,j) ta xem d ij = +∞ Chúng ta cần tìm đường xuất phát từ đỉnh qua tất đỉnh khác đồ thị lần lại trở đỉnh xuất phát (tức tìm chu trình Hamilton) cho độ dài tua nhỏ Mỗi tua tế dãy đỉnh (a 0, a1, , an-1, a0), a0, a1, , an-1 khác Không tính tổng quat, ta xem đỉnh xuất phát đỉnh 0, a = Như vậy, tua tương ứng với hoán vị (a1, , an-1) đỉnh 1, 2, , n-1 Từ ta có thuật toán sau: sinh tất hoán vị n-1 đỉnh 1, 2, , n-1; với hoán vị ta tính độ dài tua tương ứng với hoán vị so sánh độ dài ta tìm tua ngắn Lưu ý rằng, có tất (n-1)! hoán vị tua cần n phép toán để tính độ dài, thuật toán giải toán người bán hàng với n thành phố tìm kiếm vét cạn cần thời gian O(n!) Bài toán người bán hàng toán kinh điển tiếng Ngoài cách giải tìm kiếm vét cạn, người ta đưa nhiều thuật toán khác cho toán Thuật toán quy hoạch động cho toán người bán hàng đòi hỏi thời gian Nhóm SVTH: Nhóm 10 Trang Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui (n22n) Cho tới người ta chưa tìm thuật toán có thời gian đa thức cho toán người bán hàng Quay lui 2.1 Quay lui (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 Kỹ thuật thiết kế thuật toán sử dụng để giải nhiều vấn đề khác Ưu điểm quay lui so với tìm kiếm vét cạn chỗ cho phép ta hạn chế khả cần xem xét Các toán thỏa mãn ràng buộc toán có lời giải đầy đủ, thứ tự phần tử không quan trọng Các toán bao gồm tập biến mà biến cần gán giá trị tùy theo ràng buộc cụ thể toán Việc quay lui để thử tất tổ hợp để tìm lời giải Thế mạnh phương pháp nhiều cài đặt tránh việc phải thử nhiều tổ hợp chưa hoàn chỉnh, nhờ giảm thời gian chạy Phương pháp quay lui có quan hệ chặt chẽ với tìm kiếm tổ hợp 2.2 Cài đặt Về chất, tư tưởng phương pháp thử khả tìm thấy lời giải Đó trình tìm kiếm theo độ sâu tập hợp lời giải Trong trình tìm kiếm, ta gặp hướng lựa chọn không thỏa mãn, ta quay lui điểm lựa chọn nơi có hướng khác thử hướng lựa chọn Khi thử hết 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 thử hướng lựa chọn Quá trình tìm kiếm thất bại không điểm lựa chọn Quy trình thường cài đặt hàm đệ quy mà thể hàm lấy thêm biến gán tất giá trị cho biến đó, với lần gán trị lại gọi chuỗi đệ quy để thử biến Chiến lược quay lui tương tự với tìm kiếm theo độ sâu sử dụng Nhóm SVTH: Nhóm 10 Trang Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui không gian nhớ hơn, lưu giữ trạng thái lời giải cập nhật Để tăng tốc trình tìm kiếm, giá trị chọn, trước thực lời gọi đệ quy, thuật toán thường xóa bỏ giá trị khỏi miền xác định biến có mâu thuẫn chưa gán (kiểm tra tiến - forward checking) kiểm tra tất số để tìm giá trị khác bị loại trừ giá trị vừa gán (lan truyền ràng buộc - constraint propagation) 2.3 Heuristic Người ta thường sử dụng số phương pháp heuristic để tăng tốc cho trình quay lui Do biến xử lý theo thứ tự bất kỳ, việc thử biến bị ràng buộc chặt (nghĩa biến có lựa chọn giá trị nhất) thường có hiệu tỉa tìm kiếm từ sớm (cực đại hóa ảnh hưởng lựa chọn sớm hành) Các cài đặt quay lui phức tạp thường sử dụng hàm biên, hàm kiểm tra xem từ lời giản chưa đầy đủ thu lời giải hay không, nghĩa hướng liệu có ích hay không Nhờ đó, kiểm tra biên phát lời giải dở dang chắn thất bại nâng cao hiệu tìm kiếm Do hàm hay chạy, bước, phí tính toán biên cần tối hiểu, không, hiệu toàn cục thuật toán không cải tiến Các hàm kiểm tra biên tạo theo kiểu gần hàm heuristic khác: nới lỏng số điều kiện toán Trong nhiều vấn đề, việc tìm nghiệm vấn đề quy tìm dãy trạng thái (a1, a2,…, ak,…), (i = 1,2,…) trạng thái chọn từ tập hữu hạn Ai trạng thái, thoả mãn điều kiện Tìm kiếm vét cạn đòi hỏi ta phải xem xét tất dãy trạng thái để tìm dãy trạng thái thoả mãn yêu cầu toán Chúng ta gọi dãy trạng thái (a 1, a2,…, an) thoả mãn yêu cầu toán vectơ nghiệm Ý tưởng kỹ thuật quay lui ta xây dựng vectơ Nhóm SVTH: Nhóm 10 Trang Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui nghiệm xuất phát từ vectơ rỗng, bước ta bổ xung thêm thành phần vectơ nghiệm, a1,a2,… Đầu tiên, tập S1 ứng cử viên thành phần vectơ nghiệm A1 Chọn a1 ∈ S1, ta có vectơ (a1) Giả sử sau bước thứ i-1, ta tìm vectơ (a1,a2,…,ai-1) Ta gọi vectơ nghiệm phần (nó thoả mãn đòi hỏi toán, chưa “đầy đủ”) Bây ta mở rộng nghiệm phần (a1,a2,…,ai-1) cách bổ xung thêm thành phần thứ i Muốn vậy, ta cần xác định tập Si ứng cử viên cho thành phần thứ i vectơ nghiệm Cần lưu ý rằng, tập Si xác định theo yêu cầu toán thành phần a 1,a2, …,ai-1 chọn trước, S i tập tập Ai trạng thái Có hai khả • Nếu Si không rỗng, ta chọn ∈ Si thu nghiệm phần (a 1,a2, …,ai-1,ai), đồng thời loại chọn khỏi Si Sau ta lại tiếp tục mở rộng nghiệm phần (a1,a2,…,ai) cách áp dụng đệ quy thủ tục mở rộng nghiệm • Nếu Si rỗng, điều có nghĩa ta mở rộng nghiệm phần (a1,a2,…,ai-2,ai-1), ta quay lại chọn phần tử a’ i-1 Si-1 làm thành phần thứ i-1 vectơ nghiệm Nếu thành công (khi S i-1 không rỗng) ta nhận vectơ (a1,a2,…,ai-2,a’i-1) tiếp tục mở rộng nghiệm phần Nếu không chọn a’i-1 ta quay lui tiếp để chọn a’i-2… Khi quay lui để chọn a’1 mà S1 trở thành rỗng thuật toán dừng Trong trình mở rộng nghiệm phần, ta cần kiểm tra xem có nghiệm không Nếu nghiệm, ta ghi lại in nghiệm Kỹ thuật quay lui cho phép ta tìm tất nghiệm toán Kỹ thuật quay lui mà ta trình bày thực chất kỹ thuật qua tìm kiếm theo độ sâu (đi qua theo thứ tự preorder) Cây tìm kiếm xây dựng sau • Các đỉnh gốc trạng thái S1 Nhóm SVTH: Nhóm 10 Trang Bài tập nhóm môn học: Cấu trúc liệu & giải thuật • Thuật toán quay lui Giả sử ai-1 đỉnh mức thứ i-1 Khi đỉnh ai-1 trạng thái thuộc tập ứng cử viên Si Cây tìm kiếm thể hình Start a1 S1 ai-1 b e c Hình Cây tìm kiếm vectơ nghiệm Trong tìm kiếm, đường từ gốc tới đỉnh tương ứng với nghiệm phần Khi áp dụng kỹ thuật quay lui để giải vấn đề, thuật toán thiết kế đệ quy lặp Sau ta đưa lược đồ tổng quát thuật toán quay lui Lược đồ thuật toán quay lui đệ quy Giả sử vector nghiệm phần (a1,a2,…,ai-1) Hàm đệ quy chọn thành phần thứ i vector nghiệm sau: Backtrack(vector , i) // Chọn thành phần thứ i vector { if (vector nghiệm) viết nghiệm; Nhóm SVTH: Nhóm 10 Trang Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui Tính Si; for (mỗi ai∈Si) Backtrack(vector + (ai) , i+1); } Trong hàm trên, vector nghiệm phần (a 1,…,ai-1) vector + (ai) nghiệm phần (a1,a2,…,ai-1,ai) Để tìm tất nghiệm, ta cần gọi Backtrack(vector,1), với vector vector rỗng Lược đồ thuật toán quay lui không đệ quy Backtrack { k = 1; Tính S1; while (k>0) { if (Sk không rỗng) { chọn ak ∈ Sk; Loại ak khỏi Sk; if ((a1,…,ak) nghiệm) viết nghiệm; k++; Tính Sk; } else k ; //Quay lui } } Nhóm SVTH: Nhóm 10 Trang Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui Chú ý rằng, cài đặt thuật toán theo lược đồ không đệ quy, cần biết cách lưu lại vết tập ứng viên S 1, S2,…,Sk để quay lui ta chọn thành phần cho vectơ nghiệm Ví dụ Thuật toán quay lui cho toán hậu Hình 16.2 mô tả nghiệm toán hậu x x x x x x x x Hình Một nghiệm toán hậu Như ví dụ 1, ta gọi cột hậu dòng i (i = 0,1, ,7) x i Nghiệm toán vectơ (x 0,x1,…,x7), chẳng hạn nghiệm hình (0,6,4,7,1,3,5,2) Con hậu (ở dòng 0) đặt tám cột Do S0={0,1,…,7} Khi ta đặt hậu cột (x 0=0), hậu cột (x1=6), hình 16.2, hậu đặt cột 1,3,4 Tổng quát, ta đặt hậu 0,1,2,…,k-1 hậu k (con hậu dòng k) đặt cột khác với cột mà hậu 0,1,2, …,k-1 chiếm không đường chéo với chúng Điều có nghiã chọn nghiệm phần (x 0,x1,…,xk-1) xk lấy tập ứng viên Sk xác định sau Sk = {xk ∈ {0,1,…,7} | xk ≠ xi | i-k | ≠ | xk-xi | với i < k} Từ ta đưa thuật toán sau cho toán hậu: Nhóm SVTH: Nhóm 10 Trang Bài tập nhóm môn học: Cấu trúc liệu & giải thuật void Thuật toán quay lui Queen(int x[8]) { int k = 0; x[0] = -1; while (k>0) { x[k]++; if (x[k]= 0, ta cần tìm nghiệm có giá thấp (nghiệm tối ưu) Giả sử rằng, giá nghiệm phần không giảm, tức (a1, ,ak-1) nghiệm phần (a1, ,ak-1,ak) nghiệm mở rộng cost(a1, ,ak-1) lowcost ta không cần mở rộng nghiệm phần (a 1, ,ak) nữa; điều có nghĩa là, tìm kiếm hình 16.1 ta cắt bỏ tất nhánh từ đỉnh ak Nhóm SVTH: Nhóm 10 Trang 12 Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui Từ điều trình bày trên, ta đưa lược đồ thuật toán tìm nghiệm tối ưu sau Thuật toán thường gọi thuật toán nhánh–và cận (branch – and – bound) BranchBound { lowcost = +∞; cost* = 0; k = 1; tính S1; while (k > 0) { if (Sk không rỗng cost* d(v) + w(v,u), gán d(u) = d(v) + w(u,v), ghi nhớ đỉnh v cạnh đỉnh x Nhóm SVTH: Nhóm 10 Trang 16 Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui để sau xây dựng đường ngắn nhất, tức truoc[v] = u Quay bước  Kết thúc b Sử dụng ngôn ngữ tựa (giả ngữ):  Dữ liệu vào: (file INPUT.TXT) Mãng chiều a[max,max]  Dữ liệu ra: (file OUPUT.TXT)  - Đường từ a đến z có - Độ dài ngắn đường Xử lý: (PROCESS) void Backtrack() { int u, v; for (v=0; v d[u] + a[u][v] // neu qua u ma duong tu dau toi v ngan hon (u thuộc chuaxet) chuaxet = chuaxet – {u} truoc[v] = u; Return (d(z)) // * z = un }  Kết thúc Nhóm SVTH: Nhóm 10 Trang 17 Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui CHƯƠNG 3: CÀI ĐẶT VÀ KẾT QUẢ CHẠY THỬ NGHIỆM Cài đặt chương trình C++: #include #include #include #define MAX 20 #define FILEDL "INPUT.txt" int a[MAX][MAX], // ma tran ke cua thi n, // so dinh cua thi c,b, // ten cac dinh T[MAX], // tap dinh d[MAX], // dai tu dinh s den dinh bat ky truoc[MAX], // thu tu cac dinh chuaxet[MAX], // danh dau cac dinh chua xet dau, cuoi; // dinh xuat phat va ket thuc cua duong di //******** Ham doc File INPUT.TXT *********** int DocFile() { FILE *f; unsigned i, j; f = fopen(FILEDL, "rt"); // *** Mở file if (f == NULL) { return 0; // *** That bai } else //**** Bat dau doc du lieu fscanf(f, "%d", &n); fscanf(f, "%d", &c); Nhóm SVTH: Nhóm 10 Trang 18 Bài tập nhóm môn học: Cấu trúc liệu & giải thuật Thuật toán quay lui fscanf(f, "%d", &b); for (i=0; i[...]... thuật Thuật toán quay lui 2 Kết quả chạy chương trình  Kết quả của đọc và xuất file « INPUT.TXT » :  Kết quả của quá trình tìm đường đi :  Kết quả của quá trình ghi file «d:\\ OUTPUT.TXT » : Nhóm SVTH: Nhóm 10 Trang 23 Bài tập nhóm môn học: Cấu trúc dữ liệu & giải thuật Thuật toán quay lui Kết luận 1 Đạt được: - Đã tìm hiểu rõ hơn về thuât toán quay lui - Phương pháp áp dụng thuật toán vào bài toán. .. thiết phải xem xét tiếp, và do đó thuật toán nhận được mới nhanh hơn đáng kế so với thuật toán tìm kiếm vét cạn Nhóm SVTH: Nhóm 10 Trang 14 Bài tập nhóm môn học: Cấu trúc dữ liệu & giải thuật Thuật toán quay lui CHƯƠNG 2: ĐỀ XUẤT GIẢI PHÁP 1 Cấu trúc dữ liệu để tổ chức và xử lý bài toán  Phương pháp tổ chức dữ liệu: Khai báo mãng 2 chiều a[max, max] để biểu diễn bài toán dưới dạng 1 ma trận kề, nhằm... kiếm hình 16.1 ta cắt bỏ đi tất cả các nhánh từ đỉnh ak Nhóm SVTH: Nhóm 10 Trang 12 Bài tập nhóm môn học: Cấu trúc dữ liệu & giải thuật Thuật toán quay lui Từ các điều trình bày trên, ta đưa ra lược đồ thuật toán tìm nghiệm tối ưu sau Thuật toán này thường được gọi là thuật toán nhánh–và cận (branch – and – bound) BranchBound { lowcost = +∞; cost* = 0; k = 1; tính S1; while (k > 0) { if (Sk không rỗng... có thuật toán sau: void SubSequences(int A[n], int M, int I[n]) { k = 0; I[0] = -1; int S = 0; while (k > 0) { I[k]++; If (I[k] < n) { if (S + A[i[k]] = 0, và ta cần tìm nghiệm có giá thấp... nếu d(u) > d(v) + w(v,u), thì gán d(u) = d(v) + w(u,v), và ghi nhớ đỉnh v cạnh đỉnh x Nhóm SVTH: Nhóm 10 Trang 16 Bài tập nhóm môn học: Cấu trúc dữ liệu & giải thuật Thuật toán quay lui để sau này xây dựng đường đi ngắn nhất, tức truoc[v] = u Quay về bước 2  Kết thúc b Sử dụng ngôn ngữ tựa (giả ngữ):  Dữ liệu vào: (file INPUT.TXT) Mãng 2 chiều a[max,max]  Dữ liệu ra: (file OUPUT.TXT)  - Đường đi... nhiều khó khăn - Tuy đã cố gắng để giải bài toán theo yêu cầu đề ra nhưng còn điểm chưa giải quyết được đó là: + Chưa in được đường đi theo chiều xuôi như đề ra là: 12435 + Mà đã in theo chiều ngược lại là: 5 3  4  2  1  3 Kiến nghị và hướng phát triển Nhóm SVTH: Nhóm 10 Trang 24 Bài tập nhóm môn học: Cấu trúc dữ liệu & giải thuật Thuật toán quay lui Tài liệu tham khảo Nhóm SVTH: Nhóm 10 Trang ... liệu & giải thuật { Thuật toán quay lui k ; S = S - A[i[k]]; } } } 2.4 Kỹ thuật quay lui để giải toán tối ưu Trong mục áp dụng kỹ thuật quay lui để tìm nghiệm toán tối ưu Giả sử nghiệm toán biểu... với nghiệm phần Khi áp dụng kỹ thuật quay lui để giải vấn đề, thuật toán thiết kế đệ quy lặp Sau ta đưa lược đồ tổng quát thuật toán quay lui Lược đồ thuật toán quay lui đệ quy Giả sử vector nghiệm... học: Cấu trúc liệu & giải thuật Thuật toán quay lui Kết luận Đạt được: - Đã tìm hiểu rõ thuât toán quay lui - Phương pháp áp dụng thuật toán vào toán cụ thể - Đạt yêu cầu toán đề ra: + Đọc file

Ngày đăng: 24/03/2016, 12:33

Tài liệu cùng người dùng

Tài liệu liên quan