Biểu diễn không gian trạng thái
20/01/2006

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?< /p>

- 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]

- 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 lê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.

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.
URL của bài viết này::http://www.vnschool.net/modules.php?name=News&file=article&sid=30