CHƯƠNG 2: TÌM HIỂU VÀ LỰA CHỌN PHƯƠNG PHÁP
1.2. Các phương pháp tìm kiếm không gian trạng thái trong cờ vua
- Từ đỉnh xuất phát duyệt một đỉnh kề.
- Các đỉnh của đồ thị được duyệt theo các nhánh đến nút lá.
- Nếu chưa tìm thấy đỉnh TG thì quay lui tới một đỉnh nào đó để sang nhánh khác.
- Việc tìm kiếm kết thúc khi tìm thấy đỉnh TG hoặc đã hết các đỉnh 1.2.1.2. Thuật toán tìm kiếm theo chiều sâu
Giải thuật tìm kiếm theo chiều sâu (Depth First Search – DFS), còn được gọi là giải thuật tìm kiếm ưu tiên chiều sâu, là giải thuật duyệt hoặc tìm kiếm trên một cây hoặc một đồ thị và sử dụng stack (ngăn xếp) để ghi nhớ đỉnh liền kề để bắt đầu việc tìm kiếm khi không gặp được đỉnh liền kề trong bất kỳ vòng lặp nào.Giải thuật tiếp tục cho tới khi gặp được đỉnh cần tìm hoặc tới một nút
không có con. Khi đó giải thuật quay lui về đỉnh vừa mới tìm kiếm ở bước trước.
Hình 2.3. Minh hoạ tìm kiếm theo chiều sâu
Mã giả của thuật toán
Lưu trữ: Sử dụng hai danh sách DONG và MO trong đó:
DONG: Chứa các đỉnh đã xét, hoạt động theo kiểu FIFO (hàng đợi).
MO: chứa các đỉnh đang xét , hoạt động theo kiểu LIFO (ngăn xếp).
MO = ứ; MO = MO ∪ {T0} while (MO != ứ)
{ n = get(MO) //lấy đỉnh đầu trong danh sách MO if (n==TG) //nếu n là trạng thái kết thúc
return TRUE //tìm kiếm thành công, dừng DONG = DONG ∪ {n} //đánh dấu n đã được xét for các đỉnh kề v của n
if (v chưa đc xét) //v chưa ở trong DONG
MO = MO ∪ {v} //đưa v vào đầu DS MO
father(v)=n //lưu lại vết đường đi từ n đến v }
Ưu và nhược điểm khi áp dụng trong cờ vua Ưu điểm:
- Dễ triển khai
- Hiệu quả trong các trường hợp cần đi sâu để tìm trạng thái mong muốn Nhược điểm:
- Dễ rơi vào vòng lặp nếu không kiểm tra các trạng thái đã thăm - Có thể bỏ qua các giải pháp tối ưu ở mức sâu hơn
1.2.2. Thuật toán tìm kiếm theo chiều rộng (Breadth First Search – BFS) 1.2.2.1. Tư tưởng của chiến lược tìm kiếm theo chiều rộng
- Từ đỉnh xuất phát duyệt tất cả các đỉnh kề.
- Làm tương tự với các đỉnh vừa duyệt
- Quá trình duyệt kết thúc khi tìm thấy đỉnh TG hoặc đã hết các đỉnh để duyệt
1.2.2.2. Thuật toán tìm kiếm theo chiều rộng
Giải thuật tìm kiếm theo chiều rộng (Breadth First Search – BFS) duyệt qua một đồ thị theo chiều rộng và sử dụng hàng đợi (queue) để ghi nhớ đỉnh liền kề để bắt đầu việc tìm kiếm khi không gặp được đỉnh liền kề trong bất kỳ vòng lặp này
Hình 2.4. Minh hoạ tìm kiếm theo chiều rộng
Mã giả của thuật toán
Lưu trữ: Sử dụng hai danh sách DONG và MO hoạt động theo kiểu FIFO (hàng đợi).
DONG: Chứa các đỉnh đã xét MO: chứa các đỉnh đang xét MO = ứ; MO = MO ∪ {T0 } while (MO != ứ)
{ n = get(MO) //lấy đỉnh đầu trong danh sách MO if (n==TG) //nếu n là trạng thái kết thúc
return TRUE //tìm kiếm thành công, dừng DONG = DONG ∪ {n} //đánh dấu n đã được xét for các đỉnh kề v của n
if (v chưa đc xét) //v chưa ở trong DONG MO = MO ∪ {v} //đưa v vào đầu DS MO
father(v)=n //lưu lại vết đường đi từ n đến v }
Ưu và nhược điểm khi áp dụng trong cờ vua Ưu điểm:
- Đảm bảo tìm được giải pháp với số nước đi ít nhất (nếu có) - Không bị mắc kẹt trong các nhánh vô hạn
Nhược điểm:
- Tốn bộ nhớ do phải lưu trữ tất cả các trạng thái ở mỗi mức độ sâu - Không hiệu quả khi không cần tìm giải pháp ngắn nhất
2.2.3 Thuật toán tìm kiếm sâu dần(Iterative Deepening Search -IDS) 2.2.3.1 Tư tưởng của thuật toán tìm kiếm sâu dần
Thuật toán Tìm kiếm sâu dần (IDS) kết hợp những ưu điểm của tìm kiếm theo chiều sâu (DFS) và Tìm kiếm theo chiều rộng (BFS). Cụ thể, IDS thực hiện tìm kiếm theo chiều sâu với một độ sâu giới hạn, sau đó tăng dần độ sâu này qua các lần lặp.
- Phương pháp này giúp tránh việc tiêu tốn bộ nhớ lớn như BFS (do không cần lưu trữ tất cả các trạng thái cùng một lúc), nhưng vẫn đảm bảo tìm được giải pháp tối ưu. IDS cũng tránh được những vấn đề như vòng lặp vô hạn mà DFS có thể gặp phải khi không có giới hạn độ sâu.
2.2.3.2 Các bước thuật toán
- Khởi tạo độ sâu ban đầu là 0.
- Lặp lại các bước sau cho đến khi tìm thấy mục tiêu:
- Thực hiện tìm kiếm theo chiều sâu với độ sâu giới hạn hiện tại.
- Nếu tìm thấy mục tiêu, trả về kết quả.
- Nếu không, tăng độ sâu giới hạn và lặp lại bước tìm kiếm.
Mã giả của thuật toán
def dfs(state, depth, max_depth):
# Hàm DFS với độ sâu giới hạn if depth > max_depth:
return None # Nếu độ sâu vượt quá giới hạn, trả về None if goal_test(state): # Kiểm tra nếu trạng thái là mục tiêu
return state
for child in expand(state): # Mở rộng trạng thái con result = dfs(child, depth + 1, max_depth)
return result # Nếu tìm thấy kết quả, trả về return None
def ids(initial_state):
depth = 0 while True:
result = dfs(initial_state, 0, depth) if result:
return result # Nếu tìm thấy mục tiêu, trả về kết quả depth += 1 # Tăng độ sâu giới hạn và tiếp tục tìm kiếm Ưu và nhược điểm khi áp dụng trong cờ vua:
Ưu điểm:
- Tiết kiệm bộ nhớ: So với BFS, IDS chỉ cần lưu trữ một nhánh của cây tìm kiếm tại một thời điểm, giúp tiết kiệm đáng kể bộ nhớ.
- Tìm kiếm tối ưu: IDS luôn đảm bảo tìm được giải pháp tốt nhất (nếu có) vì tìm kiếm theo chiều sâu của nó có thể mở rộng hết các nhánh cùng độ sâu trước khi chuyển sang độ sâu cao hơn.
- Tránh vòng lặp vô hạn: Bằng cách tăng dần độ sâu giới hạn, IDS tránh được tình trạng lặp vô hạn như trong DFS khi không có kiểm soát độ sâu.
Nhược điểm:
- Tốn thời gian: IDS sẽ lặp lại việc tìm kiếm trên các mức độ sâu thấp nhiều lần, dẫn đến việc tính toán có thể trở nên tốn thời gian.
- Chi phí tính toán cao: Mặc dù IDS tiết kiệm bộ nhớ, nhưng việc lặp lại quá trình tìm kiếm cho các độ sâu thấp có thể làm tăng chi phí tính toán tổng thể.