Cách biểu diễn trong không gian trạng thái
Trang 1Biểu diễn không gian trạng thái
Hoàng Anh Vũ
Bước đầu để giải quyết các bài toán Trí Tuệ Nhân Tạo
Trước hết ta cần định nghĩa 'Biểu diễn không gian trạng thái (KGTT)' là gì Biểu diễn
KGTT, đó là chọn lựa một vài cách để biểu diễn trạng thái của bài toán được rõ ràng
Có 2 cách để biểu diễn KGTT:
- Biểu diễn theo cây: các bài toán 8-puzzle, cờ vua, rót nước, tích phân, di chuyển khối
- Biểu diễn theo đồ thị: các bài toán chơi cờ, rót nước, hành trình người bán hàng, hành trình con mã
Các bước để biểu diễn KGTT:
- Biểu diễn trạng thái ban đầu
- Biểu diễn một cách chính xác khi một trạng thái thỏa mãn đích của bài toán
- Kích hoạt các luật sinh từ trạng thái ban đầu và các trạng thái tiếp theo cho đến khi trạng thái đích được tìm thấy
Các vẩn đề nảy sinh và thỏa hiệp:
- Lựa chọn các luật sinh như thế nào?
- Khi có quá nhiều trạng thái được sinh ra, rõ ràng ta không thể lưu trữ được các trạng thái Những trường hợp như vậy gọi là ẩn Vậy chúng ta nên tìm kiếm trên cây ẩn hay trên đồ thị ẩn?
- Cần một lời giải tối ưu hay chỉ là lời giải bất kỳ?
- Nên thu gọn bài toán hay phân rã nó ra
- Nên tìm kiếm theo hướng tiến từ trạng thái khởi đầu, hay theo hướng lùi từ trạng thái
đích
Ta xét các ví dụ sau:
Ví dụ 1: Bài toán rót nước
Cho 2 bình nước: 4(L) và 3(L) Hãy rót vào bình 4(L) một lượng 2(L) nước
Giải: Ta biểu diễn một trạng thái như sau:
[nội dung của bình lớn, nội dung của bình nhỏ]
- Trạng thái ban đầu: [0,0]
- Trạng thái đích : [2,0]
Cây biểu diễn của bài toán:
Ta phát biểu các luật sinh cho bài toán như sau:
- Làm đầy bình lớn: [x,y]&x<4 → [4,y]
- Làm đầy bình nhỏ: [x,y]&y<3 → [x,3]
Trang 2- Làm rỗng bình lớn: [x,y]&x>0 → [0,y]
- Làm rỗng bình nhỏ: [x,y]&y>0 → [x,0]
- Làm đầy bình lớn từ bình nhỏ: [x,y]&y>4-x → [4,x+y-4]
- Làm đầy bình nhỏ từ bình lớn: [x,y]&x>3-y → [x+y-3,3]
- Rót hết nước từ bình nhỏ sang bình lớn:
[x,y]&y>0&y ≤ 4 - x→ [0,x+y]
- Rót hết nước từ bình lớn sang bình nhỏ:
[x,y]&y>0&y ≤ 3 - y→ [0,x+y]
Các luật trên là các luật tối thiểu nhưng cũng đúng nhất cho bài toán rót nước Có thể còn nhiều cách rót nữa, nhưng chúng ta dễ dàng nhận thấy, chúng đều dẫn đến không gian dư thừa
Ví dụ 2: Phát triển một chương trình có thể chơi cờ được
Giải: Ta có thể biểu diễn một trạng thái của bàn cờ bằng một danh sách liên kết, mà mỗi
phần tử gồm có cấu trúc như sau:
[tên quân cờ, hàng ngang, hàng dọc]
Danh sách cho trạng thái bàn cờ trên như sau:
([H_den, 8, B],
[M_den, 7, A],
[T1_den, 7, H],
[T2_den, 5, E],
[H_trang, 1, F],
[X_trang, 2, D],
[T1_trang, 2, H])
Ta tiếp tục mô tả các luật để biểu diễn di chuyến:
Giả sử, ta muốn di chuyển một tốt trắng từ hàng 2 lên hàng 4, ta thực hiện:
([Tốt_trắng, 2, x], [ô_trống, 3, x], [ô_trống, 4, x])
→ Thêm([Tốt_trắng, 4, x])+Xóa([Tốt_trắng, 2, x])
Tương tự như vậy, ta có thể biểu diễn di chuyển cho các quân cờ khác
Để xác định một trạng thái đích, ta có thể biểu diễn:
Thắng (quân_đen) ← Tấn_công (hậu_trắng) +
Không_di_chuyen_hop_le (hau_trang)
Một cách tương tự, ta có thể biểu diễn cho các trạng thái thắng quân cờ
Thắng(quân_cờ) ← Tấn_công(quân_cờ) +
Không_di_chuyen_hop_le(quân_cờ)
Đối với các bài toán chơi cờ, số không gian trạng thái được tạo ra từ một nước đi là rất lớn, vì vậy, ta không thể lưu toàn bộ không gian này vào bộ nhớ Trong các chương trình chơi cờ, người ta chỉ lưu KGTT này sau một vài bước đi, rồi tiếp tục xử lý và lưu chồng
Trang 3lên Ta thấy rằng, nếu số nước đi càng sâu, thì chương trình càng chơi hay
Rõ ràng, với các cách biểu diễn như trên, ta rất dễ dàng để viết mã cho bài toán bằng bất
kỳ thuật toán tìm kiếm nào (rộng, sâu, hoặc các thuật toán thông minh khác) Bạn chỉ cần
so sánh trạng thái hiện thời với các luật để sinh ra trạng thái kế tiếp Các trạng thái này có thể được lưu vào một QUEUE (tống quát) nào đó chẳng hạn, cho đến khi tìm được trạng thái đích, và lần ngược về để tìm ra các bước đi Nếu first > last trong QUEUE nghĩa là bài toán không có lời giải
Để kết thúc bài viết của mình, tôi giới thiệu với các bạn một vài bài toán Hi vọng các bạn
sẽ giải được nó Nếu có khó khăn, hãy liên hệ với tôi Chúc các bạn thành công
Bài 1: Bài toán người nông dân, con cáo, con ngỗng và bó lúa
Một người nông dân muốn qua sông với một con cáo, một con ngỗng và một bó lúa Chiếc thuyền nhỏ của ông ta chỉ có thể chở ông ta với một trong ba vật sở hữu trên Nếu
sơ suất, con cáo sẽ ăn con ngỗng và con ngỗng sẽ ăn bó lúa
a Tìm một phương pháp để biểu diễn tốt cho bài toán
b Tìm các luật để người nông dân và các vật sở hữu qua sông được an toàn
Bài 2: Bài toán 3 tu sĩ và 3 kẻ cướp
Có 3 tu sĩ và 3 kẻ cướp đang ở trên cùng một bờ sông và đều muốn sang bờ bên kia Trên
bờ sông có một chiếc thuyền nhỏ chỉ chở được 2 người Biết rằng, nếu số kẻ cướp nhiều hơn số tu sĩ thì các tu sĩ sẽ bị kẻ cướp ăn thịt
a Tìm một phương pháp biểu diễn tốt cho bài toán
b Tìm các luật để tất cả bọn họ qua sông được an toàn