Giảng viên: TS Lương Ngọc Hoàng ❖ Sokoban đã được mô hình hóa ra sao? Sơ lược về game Sokoban: Sokoban là trò chơi trí tuệ dạng giải câu đố trong đó người chơi phải đẩy một số khối vuông vượt qua chướng ngại vật để đến đích. Trò chơi có dạng bảng ô vuông. Có một số khối vuông được đẩy đến đích (số ô đích đúng bằng số khối vuông). Chỉ có thể đẩy từng khối vuông một, và không thể kéo, cũng như không thể đẩy một dãy hai hay nhiều khối. Khối vuông bị dính tường nếu như nó bị đẩy sát vào tường mà hai bên tường đều là góc. Vì không thể kéo khối lại được nên coi như khối này bị mất, nó không thể được đưa đến đích trừ phi đích nằm đúng trên cạnh tường đó. Dính tường là một trường hợp cần tránh khi chơi. Mô hình hóa: Trò chơi sẽ được mô hình hóa theo ý tưởng sau: - Tòa bản đồ trò chơi được xây dựng như một ma trận tọa độ x,y. - Người chơi sẽ được tọa độ hóa để lưu vị trí (a,b) - Sẽ có n thùng gỗ được thể hiện bằng các tọa độ ((𝑥1 ,𝑦1 ),( 𝑥2 ,𝑦2 ),…( 𝑥𝑛 ,𝑦𝑛 ). - Tương đương với n thùng sẽ có n đích đến với tọa độ là ((𝑋1 ,𝑌1 ),( 𝑋2 , ,𝑌2 ),…( 𝑋𝑛 ,𝑌𝑛 ). - Và tọa độ hóa vị trí của bức tường, chướng ngại vật. Mỗi bước đi nhân vật có 4 hướng để để di chuyển (right, left, up, down) vì vậy chúng ta sẽ sử dụng cây tứ phân để tìm hướng di chuyển cho nhân vật. Mỗi node trong cây sẽ bao gồm vị trí của người chơi cũng như vị trí của các hộp gỗ, ngoài ra còn có hành động để tới được node này. Sau mỗi bước sẽ kiểm tra tọa độ của các thùng có trùng với đích hay không. Nếu trùng thì bài toán được giải quyết và tập hợp các bước đi từ node gốc đến node hiện tại là đáp án. Sau đó, tìm các bước di chuyển (ngoại trừ trường hợp đi xuyên tường, chướng ngại vật và đẩy hai thùng trong cùng thời điểm, đẩy thùng xuyên chướng ngại vật,…) và thực hiện hành động. Sau mỗi lần thực hiện hành động thì cập nhật vị trí thùng gỗ và vị trí người chơi, rồi lưu các trạng trái trên vào một node con của node hiện tại cho đến khi tất cả tọa độ thùng trùng với tọa độ đích. Trạng thái khởi động: là trạng thái do nhà phát triển trò chơi gốc đưa ra bao gồm vị trí ban đầu của người chơi, vị trí ban đầu của các thùng gỗ. Tập hợp các bước di chuyển là rỗng. Trạng thái kết thúc là trạng thái khi tất cả các thùng được chuyển đến các vị trí đích đến. Các hành động hợp lệ bao gồm di chuyển 4 hướng (right, left, up, down). Trong lúc di chuyển có thể đẩy 1 thùng gỗ theo hướng di chuyển của nhân vật. Ngoại trừ trường hợp đi xuyên tường, chướng ngại vật và đẩy hai thùng trong cùng thời điểm, đẩy thùng xuyên chướng ngại vật và không thể kéo thùng. Hàm tiến triển (successor function) bao gồm legalActions(posPlayer, posBox) trả về các hướng đi hợp lệ và hàm updateState(posPlayer, posBox, action) cập nhật thôn tin trạng thái. Hàm kiểm tra trạng thái kết thúc là isEndState(posBox), hàm sẽ trả về True nếu tìm được lời giải, ngược lại trả về False. ❖ Tìm kiếm theo chiều sâu (DFS) Trong cây nhị phân thì DFS tìm kiếm theo một nhánh, rồi bám theo nhánh đó cho đến node lá. Tiếp tục bám theo nhánh tiếp theo rồi duyệt đến node lá. Cứ như vậy cho đến khi tìm được lời giải bài toán hoặc khi duyệt hết cây và không quan tâm nếu nó không phải là bước tối ưu. ❖ Tìm kiếm theo chiều rộng (BFS) Theo như tên gọi thì BFS là khám phá không gian tìm kiếm theo thứ tự chiều sâu tăng dần và chi phí đi từ trạng thái này sang trạng thái khác là giả định là một số dương. Thông thường, thuật toán này thường được kết hợp với khái niệm ngăn xếp và xếp hàng và đẩy và xuất hiện từ ngăn xếp. Thuật toán BFS sẽ tìm ra lời giải có ít bước đi nhất. Đặc biệt khi áp dụng vào tìm lời giải cho sokoban. Vấn đề là ở chỗ có nhiều nhánh toả ra rất rộng khiến cho việc lưu trữ gặp khó khăn, có thể khiến không đủ bộ nhớ để chạy được bài toán hay là tốn nhiều thời gian để tìm ra lời giải. Đề xuất giải thuật BFS dùng xử lý game Sodoban: ❖ Tìm kiếm chi phí thống nhất (UCS) Là thuật toán duyệt theo cây tìm kiếm nhưng chọn nhánh có chi phí cực tiểu để mở rộng. UCS thêm việc tính toán chi phí tại mỗi node nên việc tìm kiếm lâu hơn BFS và DFS. Do việc luôn chọn các nhánh có chi phí nhỏ nhất khi duyệt nên thuật toán này là có thể là thuật toán tối ưu cho việc tìm đường đi có chi phí. Thuật toán này không mở rộng tất cả các nhánh như BFS nên ít tốn bộ nhớ hơn hai phương pháp trên. UCS sử dụng hàng đợi ưu tiên để lưu trữ các trạng thái, và độ ưu tiên chính là chi phí tính ở mỗi node. Khi lấy một trạng thái ra để xử lý, nó sẽ lấy trạng thái có chi phí nhỏ nhất trước. Điều này làm cho số lượng trạng thái được lưu trữ trong hàng đợi ưu tiên ít hơn nhiều so với thuật toán BFS. Đề xuất giải thuật UCS dùng xử lý game Sodoban: ❖ Nhận xét: Khi áp dụng các thuật toán trên để giải quyết game Sokoban dựa trên số liệu thực tiễn như sau: Ta rút ra được một số nhận xét: Level Thời gian thực hiện Số bước thực hiện DFS BFS UCS DFS BFS UCS 2 0.01 0.01 0.01 24 9 9 3 0.3 0.25 0.16 403 15 15 4 0.01 0.01 0.01 27 7 7 5 Overtime Overtime 213.11 Non-result Non-result 20
- Số lượng bước tối ưu nhất: UCS, BFS.
- Thời gian xử lý và dung lượng lưu trữ thấp nhất: UCS. - Một số worst case như level 5, khi không gian trạng thái quá lớn khiến DFS và BFS không thể xử lý dẫn đến khó để tìm đáp án ở hai màn này. UCS thì có thể tìm ra đáp án trước khi tràn bộ nhớ. Trong trường hợp này chúng ta thấy được UCS tối ưu hơn so với hai thuật toán còn lại.