Chiến lược tìm kiếm xâu lặp

6 15 0
Chiến lược tìm kiếm xâu lặp

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

Thông tin tài liệu

Tuy nhiên, trong trường hợp không gian trạng thái vô hạn, thì có thể không tìm ra nghiệm, lý do là ta luôn đi xuống theo độ sâu, nếu ta đi theo một nhánh vô hạn mà nghiệm không nằm trong[r]

(1)Chiến lược tìm kiếm xâu lặp Đinh Quang Huy - Đỗ Đức Đông Khi chúng ta muốn giải vấn đề nào đó tìm kiếm, đầu tiên ta phải xác định không gian tìm kiếm Không gian tìm kiếm bao gồm tất các đối tượng mà ta cần quan tâm tìm kiếm Nó có thể là không gian liên tục nó có thể là không gian các đối tượng rời rạc Muốn biểu diễn vấn đề không gian trạng thái ta cần xác định các yếu tố sau: * Trạng thái ban đầu * Một tập hợp các toán tử Trong đó toán tử mô tả hành động phép biến đổi có thể đưa trạng thái tới trạng thái khác Tập hợp tất các trạng thái có thể đạt tới từ trạng thái ban đầu cách áp dụng dãy toán tử lập thành không gian trạng thái vấn đề Ta ký hiệu không gian trạng thái là U, trạng thái ban đầu là u0 (u0 thuộc U) Mỗi toán tử R có thể xem ánh xạ R:U õ†’ U Nói chung R là ánh xạ không xác định khắp nơi trên U * Một tập hợp T các trạng thái kết thúc (trạng thái đích) T là tập không gian U Các trạng thái đích có thể mô tả là các trạng thái thỏa mãn số điều kiện nào đó Khi chúng ta biểu diễn vấn đề thông qua các trạng thái và các toán tử, thì việc tìm nghiệm bài toán quy việc tìm đường từ trạng thái ban đầu tới trạng thái đích (Một đường không gian trạng thái là dãy toán tử dẫn trạng thái tới trạng thái khác) Sau xác định xong không gian tìm kiếm, ta cần chọn chiến lược tìm kiếm Có hai chiến lược tìm kiếm mù: Tìm kiếm theo bề rộng và tìm kiếm theo bề sâu Tìm kiếm theo bề rộng Tư tưởng tìm kiếm theo bề rộng là bước ta chọn trạng thái để phát triển là trạng thái sinh trước các trạng thái chờ phát triển khác Chúng ta sử dụng danh sách L để lưu các trạng thái đã sinh và chờ phát triển Muc tiêu tìm kiếm không gian trạng thái là tìm đường từ trạng thái ban đầu tới trạng thái đích, đó quá trình tìm kiếm ta cần lưu lại vết đường Ta có thể sử dụng mảng father để lưu lại vết đường đi, father[v]=u cha đỉnh v là u Thủ tục tìm kiếm theo bề rộng viết theo ngôn ngữ giả PASCAL Procedure Breadth_First_Search; Begin Khởi tạo danh sách L chứa trạng thái ban đầu Lặp 2.1 if L rỗng then begin thông báo tìm kiếm thất bại; exit; end ; 2.2 loại trạng thái u đầu danh sách L; 2.3 if u là trạng thái kết thúc then begin thông báo tìm kiếm thành công; exit; end; 2.4 for trạng thái v kề u begin đặt v vào cuối danh sách L; Lop11.com (2) father[v]=u; end; End; Nhận xét: Trong tìm kiếm bề rộng, trạng thái nào sinh trước phát triển trước (theo nguyên tắc FIFO), đó danh sách L xử lý đợi (Queue) Nếu bài toán có nghiệm (tồn đường từ trạng thái ban đầu đến trạng thái đích), thì thuật toán tìm kiếm theo bề rộng tìm nghiệm, đồng thời đường tìm là ngắn Trong trường hợp bài toán vô nghiệm và không gian trạng thái là hữu hạn, thuật toán dừng và cho thông báo vô nghiệm Đánh giá độ phức tạp: Giả sử rằng, trạng thái phát triển sinh b trạng thái kề Ta gọi b là nhân tố nhánh Giả sử rằng, nghiệm bài toán là đường có độ dài d Bởi vì nghiệm có thể tìm đỉnh mức d cây tìm kiếm, đó số đỉnh cần xem xét để tìm nghiệm là: + b + b2 + + bd-1 + k Trong đó k có thể là 1,2, ,bd Do đó số đỉnh lớn cần xem xét là: + b + b2 + + bd Như độ phức tạp thời gian thuật toán tìm kiếm theo bề rộng là: O(bd) Độ phức tạp không gian là O(bd), vì đây cần lưu vào danh sách L tất các đỉnh cây tìm kiếm mức d, số các đỉnh này là bd Tìm kiếm theo độ sâu Tư tưởng tìm kiếm theo độ sâu là bước ta chọn trạng thái để phát triển là trạng thái sinh sau cùng số các trạng thái chờ phát triển Cũng tìm kiếm theo bề rộng, chúng ta sử dụng danh sách L để lưu các trạng thái đã sinh và chờ phát triển và sử dụng mảng father để lưu lại vết đường đi, father[v]=u cha đỉnh v là u Thủ tục tìm kiếm theo độ sâu viết theo ngôn ngữ giả PASCAL Procedure Depth_First_Search; Begin Khởi tạo danh sách L chứa trạng thái ban đầu Lặp 2.1 if L rỗng then begin thông báo tìm kiếm thất bại; exit; end; 2.2 loại trạng thái u đầu danh sách L; 2.3 if u là trạng thái kết thúc then begin thông báo tìm kiếm thành công; exit; end; 2.4 for trạng thái v kề u begin đặt v vào đầu danh sách L; father[v]=u; Lop11.com (3) end; End; Nhận xét: Trong tìm kiếm độ, trạng thái nào sinh sau phát triển trước (theo nguyên tắc LIFO), đó danh sách L xử lý ngăn xếp (Stack) Thuật toán tìm kiếm theo bề rộng luôn tìm nghiệm bài toán có nghiệm Song không phải với bài toán có nghiệm nào thuật toán tìm kiếm theo chiều sâu tìm nghiệm Nếu bài toán có nghiệm và không gian trạng thái hữu hạn, thì thuật toán tìm kiếm theo độ sâu tìm nghiệm Tuy nhiên, trường hợp không gian trạng thái vô hạn, thì có thể không tìm nghiệm, lý là ta luôn xuống theo độ sâu, ta theo nhánh vô hạn mà nghiệm không nằm nhánh đó thì thuật toán không dừng, Do không nên áp dụng tìm kiếm theo độ sâu cho các bài toán có cây tìm kiếm chứa các nhánh vô hạn Đánh giá độ phức tạp: Giả sử rằng, nghiệm bài toán là đường có độ dài d, cây tìm kiếm có nhân tố nhánh là b và có chiều cao là d Có thể xảy ra, nghiệm là đỉnh ngoài cùng bên phải trên mức d cây tìm kiếm, đó độ phức tạp thời gian cây tìm kiếm theo độ sâu trường hợp xấu là O(bd), tức là tìm kiếm theo bề rộng Tuy nhiên trên thực tế nhiều bài toán tìm kiếm theo độ sâu thực nhanh tìm kiếm theo bề rộng Lý là tìm kiếm theo bề rộng phải xem xét toàn cây tìm kiếm tới mức (d-1), xem xét các đỉnh mức d Còn tìm kiếm theo độ sâu, có thể ta cần xem xét phận nhỏ cây tìm kiếm thì đã tìm nghiệm Để đánh giá độ phức tạp không gian tìm kiếm theo độ sâu ta có nhận xét rằng, phát triển đỉnh u trên cây tìm kiếm theo độ sâu, ta cần lưu các đỉnh chưa phát triển mà chúng là các đỉnh các đỉnh nằm trên đường từ gốc tới đỉnh u Như cây tìm kiếm có nhân tố nhánh b và độ sâu lớn là d, ta cần lưu ít db đỉnh Do đó độ phức tạp không gian tìm kiếm theo độ sâu là O(db), đó tìm kiếm theo bề rộng đòi hỏi không gian nhớ O(bd) Đó là hai chiến lược tìm kiếm mù phổ biến và thông dụng, song điều tôi muốn thảo luận với bạn đọc là kết hợp hai chiến lược này để tận dụng các mạnh chiến lược Đó là chiến lược tìm kiếm sâu lặp Tìm kiếm sâu lặp Nếu cây tìm kiếm chứa nhánh vô hạn, sử dụng tìm kiếm theo độ sâu, ta có thể mắc kẹt nhánh đó và không tìm nghiệm Để khắc phục hoàn cảnh đó, ta tìm kiếm độ sâu mức d nào đó Nếu không tìm nghiệm, ta tăng độ sâu lên d+1 Quá trình trên lặp lại lại với d là: 1, 2, đến độ sâu max nào đó Như thuật toán tìm kiếm sâu lặp sử dụng thủ tục tìm kiếm sâu hạn chế thủ tục Đó là thủ tục tìm kiếm theo độ sâu d nào đó quay lên Trong thủ tục tìm kiếm sâu hạn chế, d là tham số độ sâu, mảng depth ghi lại độ sâu đỉnh Procedure Depth_Limited_Search(d); Begin khởi tạo danh sách L chứa trạng thái u0; depth[u0]=0; Lop11.com (4) Lặp 1.1 if L rỗng then begin thông báo thất bại; exit; end; 1.2 loại trạng thái u đầu danh sách L; 1.3 if u là trạng thái kết thúc then begin thông báo thành công; exit; end; 1.4 if depth[u]<=d then for trạng thái v kề u begin đặt v vào đầu danh sách L; depth[v]:=depth[u]+1; end; End ; Procedure Depth_Deepening_Search; Begin For d:=0 to max begin Depth_Limited_Search(d); if thành công then exit; end; End; Nhận xét: Kỹ thuật tìm kiếm sâu lặp kết hợp các ưu điển tìm kiếm theo bề rộng và tìm kiếm theo độ sâu Chúng ta có số nhận xét sau: - Cũng tìm kiếm theo bề rộng, tìm kiếm sâu lặp luôn tìm nghiệm (nếu bài toán có nghiệm), miễn là ta chọn độ sâu max đủ lớn - Trong tìm kiếm sâu lặp cần không gian nhớ tìm kiếm theo độ sâu - Trong tìm kiếm sâu lặp, ta phải phát triển lặp lại nhiều lần cùng trạng thái Điều đó làm cho ta có cảm giác rằng, tìm kiếm sâu lặp lãng phí nhiều thời gian Thực thời gian cho phát triển lặp lại các trạng thái là không đáng kể so với thời gian tìm kiếm theo bề rộng Thật vậy, lần gọi thủ tục tìm kiếm sâu hạn chế tới mức d, cây tìm kiếm có nhân tố nhánh là b, thì số đỉnh cần phát triển là: + b + b2 + + bd Nếu nghiệm độ sâu d, thì tìm kiếm sâu lặp, ta phải gọi thủ tục tìm kiếm sâu hạn chế với độ sâu là: 0, 1, 2, , d Do đó các đỉnh mức phải phải phát triển lặp d lần, các đỉnh mức lặp d-1 lần, , các đỉnh mức d lặp lần Như tổng số đỉnh cần phát triển tìm kiếm sâu lặp là: (d+1)1 + db + (d-1)b2 + + 2bd-1 + 1bd Do đó thời gian tìm kiếm sâu lặp là O(bd) Tóm lại, thời gian tìm kiếm sâu lặp có độ phức tạp thời gian là O(bd) - tìm kiếm theo bề rộng, và có độ phức tạp không gian là O(bd) - tìm kiếm theo độ sâu Nói chung, chúng ta nên áp dụng tìm kiếm sâu lặp cho các vấn đề có không gian trạng thái lớn và độ sâu nghiệm không biết trước Có thể nói rằng, đây là chiến lược tốt các chiến lược tìm kiếm mù Các trạng thái lặp Lop11.com (5) Bạn đọc thắc mắc là quá trình phát triển các trạng thái có thể sinh các trạng thái lặp Đúng là vậy, ba chiến lược trên: Tìm kiếm theo bề rộng, tìm kiếm theo chiều sâu và tìm kiếm sâu lặp có khả sinh các trạng thái đã phát triển Điều này làm lãng phí nhiều thời gian để phát triển lại các trạng thái Để giải vấn đề này ta có các giải pháp sau: - Khi phát triển đỉnh u, không sinh các đỉnh trùng với cha đỉnh u - Khi phát triển đỉnh u, không sinh các đỉnh trùng với đỉnh nào đó nằm trên đường dẫn tới u - Không sinh các đỉnh mà nó đã sinh ra, tức là sinh các đỉnh Hai giải pháp đầu dễ cài đặt và không tốn nhiều thời gian và không gian nhớ, nhiên các giải pháp này không tránh hết các trạng thái lặp (song khá tốt) Để thực giải pháp thứ ba ta cần xác định hàm f ánh xạ (hàm không quá phức tạp) các trạng thái vào tập số nguyên tương ứng - (thường là từ trở đi) lưu lại các trạng thái đã phát triển cách lưu lại ánh xạ nó và kiểm tra xem trạng thái có phải lần đầu sinh không Chúng ta có thể cài đặt bảng băm tập ánh xạ rời rạc và sử dụng mảng để đánh dấu (sử dụng kỹ thuật nén bít!) tập ánh xạ là liên tục và hữu hạn Ta thử nhiệm với bài toán cụ thể sau: Đề bài: Chúng ta có bảng NxN (N<=5), đó có ô chứa số và các ô còn lại chứa các số nguyên dương Ví dụ ta có bảng sau: Ta có thể đổi chỗ ô cho nhau, ô kề cạnh ô số và ô số để bảng Ví dụ ta đổi chỗ ô (2,3) với ô (3,3) để bảng sau: Bài toán đặt là: Cho trước trạng xuất phát và trạng thái đích Hãy tìm cách biến đổi để đưa trạng thái xuất phát trạng thái đích với số lần đổi chỗ là ít Trạng thái đích: Giải: Bước 1: Xác định không gian trạng thái - Trạng thái ban đầu là bảng xuất phát Lop11.com (6) - Tương ứng với qui tắc đổi chỗ với ô số 0, ta có bốn toán tử: Đổi chỗ với ô trên, đổi chỗ với ô dưới, đổi chỗ với ô bên trái, đổi chỗ với ô bên phải - Trạng thái kết thúc là bảng đích Bước 2: Chọn chiến lược tìm kiếm sâu lặp để giải Để đơn giản chương trình sử dụng giải pháp tránh trạng thái lặp, không sinh các đỉnh trùng với cha u Với chiến lược tìm kiếm sâu lặp dễ cài đặt và ngắn gọn Với test mà số bước biến đổi ít cần dùng mà lớn thì thuật toán bế tắc (độ phức tạp thời gian quá lớn), song xin nhắc lại đây là chiến lược tìm kiếm mù tốt Một số test thử nhiệm: Lop11.com (7)

Ngày đăng: 01/04/2021, 21:38

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan