Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 15 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
15
Dung lượng
313,05 KB
Nội dung
Bài CÁC THUẬT TỐN TÌM KIẾM 2.1 Các thuật tốn tìm kiếm khơng có thơng tin o Thuật tốn tìm kiếm theo bề rộng o Thuật tốn tìm kiếm theo độ sâu o Thuật tốn tìm kiếm theo độ sâu lặp 2.1.1 Thuật tốn tìm kiếm theo bề rộng (Breadth First Search) Phát triển đỉnh theo mức 0,1,… Khitất đỉnh mức phát triển Tại mứcta chọn đỉnh để phát triển đỉnh sinh trước so với đỉnh chờ c om xong phát triển đỉnh mức ng phát triển khác co Ví dụ: Cho khơng gian trang thái hình 2.1 Tìm dãy phép biến đổi để biến đổi thành du on g th an Ta có tìm kiếm BFS hình 2.2 Q trình thuật tốn thực hình 2.3 cu u 10 aa sa Hình 2.1: Khơng gian trang thái CuuDuongThanCong.com https://fb.com/tailieudientucntt 10 om Hình 2.2 : Cây tìm kiếm BFS Bước lặp Open Khởi tạo (1,null) // đỉnh có cha null (5,1),(8,1),(9,1) //5 cha (8,1),(9,1),(4,5),(7,5),(10,5) (9,1),(4,5),(7,5),(10,5) (4,5),(7,5),(10,5),(3,9) 1,5,8,9 (7,5),(10,5),(3,9) 1,5,8,9,4 (10,5),(3,9),(2,7)//mở => ngừng co ng c Close 1,5 1,5,8 an th 1,5,8,9,4,7 on g Rỗng Thuật toán: du Hình 2.3: bước BFS thực cho kết quà: 1->5->7->2 u bool Breadth_First_Search { cu if (trạng thái ban đầu trạng thái kết thúc) return true; //tìm kiếm thành cơng khởi tạo danh sách open chứa đỉnh bắt đầu; khởi tạo danh sách close rỗng; while (true){ if (open rỗng) return false; //tìm kiếm thất bại chọn loại đỉnh u đầu danh sách open; thêm u vào danh sách close; for (mỗi đỉnh v kề u) { if (v khơng có close v khơng có open) { father(v) =u; if (v đỉnh kết thúc) return true; //tìm kiếm thành công CuuDuongThanCong.com https://fb.com/tailieudientucntt thêm v vào cuối danh sách open; } } } } Nhận xét: Đỉnh sinh trước phát triển trước, danh sách open xử lý hàng đợi (queue) Nếu có đường từ trạng thái ban đầu tới trạng thái đích thuật tốn tìm kiếm theo bề rộng om ln tìm với số phép biến đổi nhất.Nếukhơng có đường từ trạng thái ban đầu tới c trạng thái đích khơng gian trạng thái hữu hạn, thuật tốn dừng thơng báo tìm kiếm Giả sử đỉnh phát triển sinh b đỉnh kề (b gọi làhệ số nhánh) vàđỉnh kết thúcở co ng thất bại mức d tìm kiếm Dođỉnh kết thúc tìm đỉnh mức d, nên số th + b + b2 + + bd-1 + bd an đỉnh cần xét nhiều để tìm đỉnh kết thúc là: Như vậy, độ phức tạp thời gian thuật tốn tìm kiếm theo bề rộng O(bd ) Ðộ phức tạp on g không gian (bộ nhớ) O(bd ) ta lưu vào danh sách open/close tất đỉnh Để thấy rõ tìm kiếm theo bề rộng địi hỏi thời gian khơng gian lớn tới mức nào, ta xét u du tìm kiếm tới mức d cu trường hợp b = 10 giả sử kiểm tra 1000 trạng thái cần giây, lưu giữ trạng thái cần 100 bytes Khi thời gian khơng gian mà thuật tốn địi hỏi cho bảng sau: Độ sâu d Thời gian Không gian 11 giây megabyte 18 giây 111 megabytes 31 11 gigabytes 10 128 ngày terabyte 12 35 năm 111 terabytes 14 3500 năm 11.111 terabytes Với độ sâu 10 trở lên thuật tốnkhơng thể chấp nhận được! CuuDuongThanCong.com https://fb.com/tailieudientucntt 2.1.2 Thuật tốn tìm kiếm theo độ sâu (Depth First Search) Tại bước, đỉnh chọn để phát triển đỉnh sinh sau số đỉnh chờ phát triển Trong thuật tốn tìm kiếm theo bề rộng, ta sửa“thêm v vào cuối danh sách open”thành “thêmv vào đầu danh sách open” có Thuật tốn tìm kiếm theo độ sâu Ví dụ: Cho khơng gian trang thái hình 2.1 Tìm dãy phép biến đổi để biến đổi thành Ta có tìm kiếm DFS hình 2.4 Q trình thuật tốn thực hình 2.5 c om co ng th an on g Bước lặp du Hình 2.4 : Cây tìm kiếm DFS Open Close (1,null) // đỉnh có cha null Rỗng (9,1),(8,1),(5,1) //5 cha 1 (3,9),(8,1),(5,1) 1,9 (7,3),(8,1),(5,1) 1,9,3 (2,7),(8,1),(5,1) //mở => ngừng 1,9,3,7 cu u Khởi tạo Hình 2.5: bước DFS thực cho kết quà: 1->9->3->7->2 CuuDuongThanCong.com https://fb.com/tailieudientucntt Thuật toán: bool Depth_First_Search { if (trạng thái ban đầu trạng thái kết thúc) return true; //tìm kiếm thành cơng khởi tạo danh sách open chứa đỉnh bắt đầu; khởi tạo danh sách close rỗng; while (true){ if (open rỗng) return false; //tìm kiếm thất bại chọn loại đỉnh u đầu danh sách open; thêm u vào danh sách close; for (mỗi đỉnh v kề u) { om if (v close v khơng có open) { father(v) =u; thêm v vào đầu danh sách open; ng } co } } th an } g Nhận xét: Do đỉnh sinh sau phát triển trước, nên danh sách open xử lý ngăn xếp on du (stack) Nếu có trạng thái kết thúc khơng gian trạng thái hữu hạn, thuật tốn tìm kiếm theo độ u c if (v đỉnh kết thúc) return true; //tìm kiếm thành cơng cu sâusẽ tìm Nếu khơng gian trạng thái vơ hạn khơng tìm ra, thuật tốn theo nhánh vơ hạn mà trạng thái kết thúc khơng nằm nhánh thuật tốn không dừng Giả sửtrạng thái kết thúc mức d tìm kiếm có hệ số nhánh b Trường hợp xấu làtrạng thái kết thúc đỉnh ngồi mức d, độ phức tạpthời gian tìm kiếm theo độ sâu trường hợp xấu O(bd) Khi đỉnh u tìm kiếm theo độ sâu, có đỉnh “hậu duệ”đã mở đỉnh u hủy Do độ phức tạp khơng gian tìm kiếm theo độ sâu rút gọn O(db) CuuDuongThanCong.com https://fb.com/tailieudientucntt Tìm kiếm theo độ sâu thường nhanh tìm kiếm theo bề rộng,vì tìm kiếm theo bề rộng phải xem xét tồn tìm kiếm tới mức d-1, xem xét đỉnh mức d Cịn tìm kiếm theo độ sâu, ta cần xem xét phận nhỏ tìm kiếm tìm trạng thái kết thúc 2.1.3 Thuật tốn tìm kiếm sâu lặp (Depth Deepening Search) Nếu tìm kiếm chứa nhánh vơ hạn, tìm kiếm theo độ sâu mắc kẹt nhánh vơ hạn khơng tìm ratrạng thái kết thúc Để khắc phục ta tìm kiếm theo độ sâu mức 0, khơng tìm trạng thái kết thúc, talại tìm kiếm theođộ sâu mức 1,2,… Quá trình lặp lại dếnmột độ sâu Max ta c om chọn.Nếu khơng tìm thấy thơng báo “tìm kiếm thất bại” tăng Max tìm lại Thuật tốn tìm kiếmđến độ sâud ng boolDepth_Limited_Search(d) { co if (trạng thái ban đầu trạng thái kết thúc) return true; khởi tạo danh sách open có đỉnh bắt đầu chứa trạng thái ban đầu u0; an khởi tạo danh sách close rỗng; th depth(u0)=0; while(true){ on g if (open rỗng) return false; chọn loại đỉnh u đầu danh sách open; du thêm u vào danh sách close; if (depth(u) < d) { cu u for (mỗi đỉnh v kề u) { if (v khơng có close v khơng có open) { father(v) =u; depth(v)=depth(u) + 1; if (v đỉnh kết thúc) return true; thêm v vào đầu danh sách open; } } } } } CuuDuongThanCong.com https://fb.com/tailieudientucntt Thuật tốn tìm kiếm sâu lặp boolDepth_Deepening_Search (max){ for (d =0 to max){ result= Depth_Limited_Search (d); if (result==true) return true; } return false; } Nhận xét Kỹ thuật tìm kiếm sâu lặp kết hợp ưu điểm tìm kiếmtheo bề rộng tìm kiếm om c theo độ sâu.Cũng tìm kiếm theo bề rộng, có trạng thái kết thúc, tìm kiếm sâu lặp ln Tìm kiếm sâu lặp với độ sâu d cần nhớ tìm kiếm theo độ sâu tức O(db).Tổng số đỉnh co ng tìm ramiễn ta chọn độ sâu max đủ lớn cần phát triển tìm kiếm sâu lặpvới độ sâu d là:(d+1) + db + (d-1)b2+ + 2bd-1+ 1bd th an Do thời gian tìm kiếm sâu lặp O(bd) Nên áp dụng tìm kiếm sâu lặp cho không gian trạng thái lớn độ sâu trạng thái kết thúc on du Tóm tắt g khơng biết trước cu u Độ phức tạp Thời gian Bộ nhớ BFS O(bd) O(bd) DFS O(bd) O(bd) DDS O(bd) O(bd) 2.2 Các thuật tốn tìm kiếm có thơng tin(informed search/heuristic search) Nếu không gian trạng thái lớn, thuật tốn“tìm kiếm khơng có thơng tin” khơng thể áp dụng tốn nhiều nhớ thời gian Các thuật tốn“tìm kiếm có thơng tin” giống với thuật tốn “tìm kiếm khơng có thơng tin” chọn đỉnh để phát triển,ta không chọn ngẫu nhiên mà chọndựa vào hàm đánh giá.Thơng thường thuật tốn “tìm kiếm có thơng tin”nhanh chóng tìm lời giải có Hàm đánh giá trạng thái:thường có ba hàm đánh giá trạng thái CuuDuongThanCong.com https://fb.com/tailieudientucntt g(u):chi phí nhỏ để chuyểntừ đỉnh ban đầu tới đỉnh u g(u) gọi hàm đánh giá dựa vào thơng tin h(u):chi phí nhỏ dự kiến để chuyển từ trạng thái u tới trạng thái kết thúc h(u) gọi hàm đánh giá dựa vào thông tin tương lai Cần xây dựng h(u) cho h(u) ≤chi phí thực tế để chuyển từ trạng thái u tới trạng thái kết thúc gần với chi phí thực tế tốt f(u):chi phí nhỏ để di chuyển từ trạng thái ban đầuqua u, tới trạng thái kết thúc f(u) gọi hàm đánh giá đỉnh u Thông thường f(u) = g(u) + h(u) Hàm đánh giá cần xây dựng hợp lý tìm kiếm hiệu quả.Trong trình tìm kiếm, om bước ta chọn đỉnh để phát triển đỉnh có giá trị hàm đánh giá nhỏ nhất(hoặc lớn nhất), c đỉnh xem đỉnh có nhiều hứa hẹn dẫn tới đỉnh kết thúc nhanh nhất, tốn chi phí ng co Một sốví dụ hàm đánh giá: Tìm đường đồ an g(u) là chiều dài đường đitừ thành phố xuất phát đến thành phố u th h(u) độ dài đường chim bay từ thành phố u tới thành phố đích on g f(u) = g(u) + h(u) ta chọn đỉnh u có f(u) nhỏ để phát triển Tròchơi số: u với trạng thái u du g(u) số lần dịch chuyểnđể biến đổi đỉnh ứng với trạng thái ban đầu đến đỉnh ứng h(u) hàm h1(u) h2(u) sau: cu o h1(u): số số không nằm vịtrí trạng thái đích Như hình 2.1, h1(u) = 4, các số khơngđúng vị trí 3, 8, o h2(u): Gọi khoảng cách số làsố bước dịch chuyển theo hàng và/hoặc cột để chuyểnsốđó tới vị trí củanó trạng thái đích.Khi h2(u) tổng khoảng cách số trạng thái u.Ví dụ hình2.1,h2(u) = + + + = 9, khoảng cách số 2, số 3, số số CuuDuongThanCong.com https://fb.com/tailieudientucntt f(u) = g(u) + h(u) Các thuật tốn tìm kiếm có thơng tin Tìm kiếm tốt đầu tiên: Tìm kiếm theo bề rộng sử dụnghàm đánh giá Tìm kiếm leo đồi: Tìm kiếm theo độ sâu sử dụng hàm đánh giá .c 2.2.1Thuật tốn tìm kiếm tốt (best-first search) om Thuật toán A*: Cải tiến thuật tốn tìm kiếm tốt Tìm kiếm tốt - tìm kiếm theo bề rộng hướng dẫn hàm đánh giá Open xếp tăng theo giá trị hàm đánh giá Đỉnh chọn để mở đỉnh đầu open Trong tìm kiếm theo bề rộng ta phát triển tất cácđỉnh mức để sinh an co ng th đỉnh mức Trong tìm kiếm tốt - ta chọn đỉnh để phát triển đỉnh g đánh giá tốt số đỉnh chờ phát triển, đỉnh mức du on mức Ví dụ: cu u Xét không gian trạng thái biểu diễn đồ thị hình 2.6.Trạng thái ban đầu A, trạng thái kết thúc B Số ghi kế bên đỉnh giá trị hàm đánh giá.Quá trình tìm kiếm tốt - đầu tiêndiễn sau: Đầu tiên phát triển đỉnh A sinh đỉnh kề C, D E Trong ba đỉnh này, đỉnh D có giá trị hàm đánh giá nhỏ nhất, chọn để phát triển sinh F, I Trong số đỉnh chưa phát triển C, E, F, I đỉnh E có giá trị đánh giá nhỏ nhất, chọn để phát triển sinh đỉnh G, K Trong số đỉnh chưa phát triển G tốt nhất, phát triển G sinh B, H Đến ta đạt tới trạng thái kết thúc Cây tìm kiếm tốt - biểu diễn hình 2.7 CuuDuongThanCong.com https://fb.com/tailieudientucntt Bước lặp Hình 2.7: tìm kiếm tốt Open om Hình 2.6: Đồ thị khơng gian trạng thái Close (A,20,null) // A có giá trị f=20, có cha null (D,6,A),(E,7,A),(C,15,A) (E,7,A),(I,8,D),(F,10,D),(C,15,A) (G,5,E),(I,8,D),(F,10,D),(K,12,E),(C,15,A) A,D,E (B,0,G),(H,3,G),(I,8,D),(F,10,D),(K,12,E),(C,15,A) A,D,E,G an co ng c Khởi tạo Rỗng A A,D th Mở đỉnh B => ngừng, kết quà: A->E->G->B bool Best_First_Search { on g Thuật toán du if (trạng thái ban đầu trạng thái kết thúc) return true; //tìm kiếm thành công u khởi tạo danh sách open chứa đỉnh bắt đầu; cu khởi tạo danh sách close rỗng; while(true){ if (open rỗng) return false; chọn loại đỉnh u đầu danh sách open; thêm u vào danh sách close; for (mỗi đỉnh v kề u) { if (v khơng có close v khơng có open) { father(v) =u; if (v trạng thái kết thúc) return true; chèn v vào open cho open tăng theo giá trị hàm đánh giá; } 10 CuuDuongThanCong.com https://fb.com/tailieudientucntt } } } 2.2.2 Thuật tốn tìm kiếm leo đồi (hill-climbing search) Tìm kiếm leo đồi tìm kiếm theo độ sâu đượchướng dẫn hàm đánh giá Khi chọn đỉnh để phát triển, ta chọnđỉnh đánh giá tốtnhất mức Ví dụ: om Xét đồ thị khơng gian trạng thái hình 2.6 Quá trình tìm kiếm leo đồi tiến hành c sau: Đầu tiên phát triển đỉnh A sinh đỉnh C, D, E Trong đỉnh này, chọn D để phát ng triển (vìf(D)= nhỏ nhất),và sinh F, I Trong hai đỉnh này, ta chọn I để phát triển, sinh co đỉnh B, G Do tìm B nên thuật tốn kết thúc Cây tìm kiếm leo đồi cho Thuật toán cu u du on g th an hình 2.8 Hình 2.8: tìm kiếm leo đồi bool Hill_Climbing_Search { if (trạng thái ban đầu trạng thái kết thúc) return true; //tìm kiếm thành công khởi tạo danh sách open chứa đỉnh bắt đầu; khởi tạo danh sách close rỗng; while(true){ if (open rỗng) return false; chọn loại đỉnh u đầu danh sách open; thêm u vào danh sách close; khởi tạo danh sách L rỗng; 11 CuuDuongThanCong.com https://fb.com/tailieudientucntt for (mỗi đỉnh v kề u) { if (v khơng có close v khơng có open) { father(v) =u; if (v đỉnh kết thúc) return true; chèn v vào L cho L tăng theo giá trị hàm đánh giá; } } Gắn danh sách Lvào đầu danh sách open; } } Thuật toán A* sử dụng thuật tốn tìm kiếm tốt đầutiên (Best_First_Search)vớihàm đánh c om 2.2.3Thuật toán A* giá f(u)=g(u)+h(u), với g(u) chi phí nhỏ để từ đỉnh ban đầu tới đỉnh u, h(u) chi phí co ng dự kiến để biến đổi đỉnh u tới đỉnh đích Khi phát triển đỉnh đỉnh u có trạng thái giống với trạng thái đỉnh v có Nếu hàm h(u) D->E->I->B cu u Đầu tiên, phát triển A sinh C, D, E, F Ta có: g(C)=9, h(C)=15, f(C)=g(C) + h(C)=9+15=24; tính tương tự f(D)=13, f(E)=21, f(F)=27.Như đỉnh tốt D f(D) nhỏ Phát triển D, ta H E Ta có: g(H)=g(D)+Độ dài cung (D, H) = + = 15, f(H) = 15 + 10 = 25 g(E) = g(D) + Độ dài cung (D, E) = + = 11 Vậy đỉnh E có f(E) = g(E) + h(E) = 11 + = 19< f(E cũ) => bỏ đỉnh E cũ thay E (nếu E có giá trị >= giá trị E cũ giữ E cũ, bỏ E mới) Như đỉnh tốt E Phát triển E K I Tiếp tục đỉnh chọn để phát triển đỉnh kết thúc B ngừng độ dài đường ngắn tới B g(B) = 19 Thuật toán 13 CuuDuongThanCong.com https://fb.com/tailieudientucntt bool A_Star_Search { if (trạng thái ban đầu trạng thái kết thúc) return true; //tìm kiếm thành cơng khởi tạo danh sách open chứa đỉnh bắt đầucó trạng thái ban đầu u0 g(u0)=0; khởi tạo danh sách close rỗng; while (true) { if (open rỗng) return false; chọn loại đỉnh u đầu danh sách open; if (u trạng thái kết thúc) return true; thêm u vào danh sách close; for (mỗi đỉnh v kề u) { om father(v) =u; c tính g(v)= g(u) + a(u,v); //a(u,v) trọng số cung (u,v) tính f(v)= g(v) + h(v); ng if (v khơng có close v khơng có open) { co chèn v vào open cho open tăng theo giá trị f; }else{ th hủy v cũ; an if (v có open f(v)