You are on page 1of 5

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN

----□&□----

Báo cáo Assignment 01


BFS và UCS cho game Sokoban

Sinh viên: Huỳnh Phạm Việt Pháp – 19522571


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.

You might also like