Ứng dụng thuật toán Minimax viết AI cho trò chơi Tic Tac Toe

Ứng dụng thuật toán Minimax viết AI cho trò chơi Tic Tac Toe

Trong bài viết này, mình sẽ giải thích về thuật toán minimax mình sử dụng để viết trò chơi này. Nhưng trước hết mình nên giải thích cho mọi người hiểu về AI là gì nhỉ!
AI(Artificial Intelligence) có khá nhiều định nghĩa. Chúng ta hãy xem nguồn gốc về định nghĩa AI để hiểu rõ hơn.
Vào tháng 10/1950, nhà bác học Alan Turning đã suy nghĩ về một chương trình AI. Ông tự hỏi liệu máy tính có thể suy nghĩ như con người không? Ông đưa ra một trò chơi như sau: Trò chơi gồm có 3 thành viên tham gia, gồm hai người và một máy tính. Một người sẽ làm người đặt ra câu hỏi, và hai thành viên kia sẽ trả lời (dưới dạng ẩn danh). Trò chơi diễn ra đến khi người đặt câu hỏi không phân biệt được đâu là câu trả lời của người, đâu là câu trả lời của máy, thì khi đó máy tính coi như là đã “suy nghĩ” như con người.
Thế chúng ta có thể hiểu rằng, AI xem như là trí thông minh của máy tính, xây dựng bằng cách mô phỏng lại suy nghĩ của con người, cách xử lí vấn đề giống con người. Trong ngành khoa học máy tính, người ta định nghĩa rằng: AI là những thiết bị có khả năng cảm nhận được môi trường xung quanh và lựa chọn giải pháp với tỉ lệ thành công cao để đạt được mục đích của nó. (Wikipedia).
Thử áp dụng AI vào trong cờ caro, ta có định nghĩa về AI trong trò đánh caro như sau: AI trong trò caro là một cách đưa ra các giải pháp và lựa chọn giải pháp có tỉ lệ thắng cao nhất.
Thật vậy, thuật toán Minimax cũng đưa ra các bước đi, đánh giá xem bước đi nào có tỉ lệ thắng cao nhất, và lựa chọn nó. Nó cũng dựa trên trò chơi Zero-sum (trò chơi có tổng bằng 0), hiểu cơ bản là khi người chơi thứ nhất muốn cộng điểm, thì người chơi thứ hai sẽ cố gắng trừ số điểm đó xuống.
Trò Tic tac toe có 3^9 = 19683 trường hợp, đủ để máy tính có thể xử lí, nên ta có thể dùng Minimax xét các trường hợp được. Nhưng nếu những trò có nhiều trường hợp hơn (như cờ vua), ta phải dùng thêm phương pháp Alpha-beta pruning (cắt tỉa alpha-beta) để giảm thiểu số trường hợp cần xử lí.
Chúng ta hãy cùng xem các bước mà minimax làm trong trò caro. (Phần hack não sắp bắt đầu, chuẩn bị tinh thần nhé 😂)
Giả sử chúng ta có bàn cờ như sau:

Với lượt X là lượt của máy, và lượt O là lượt của người. Đến lượt máy tính đi, lúc này thuật toán minimax sẽ chạy như sau:

Trước khi đọc sơ đồ, ta có các quy ước sau:
1.                    Với bàn cờ WIN - phần thắng dành cho X (máy), ta sẽ cộng 10 điểm; Với bàn cờ LOSE - phần thắng dành cho O (người), ta sẽ trừ 10 điểm; Với bàn cờ DRAW - hòa, ta sẽ nhận 0 điểm.
2.                    Với lượt của X, ta luôn tìm bàn cờ nào có điểm số cao nhất; Với lượt của O, ta luôn tìm bàn cờ nào có điểm số thấp nhất.
Xong. Bây giờ chúng ta sẽ giải thích từ từ như sau.
Với bàn cờ (1), tới lượt của X(máy) ta có 3 lựa chọn để đi: (2), (3), (4). Với lựa chọn (4), ta dành phần thắng nên số điểm sẽ là 10. Còn lựa chọn (2) và (3) thì chưa rõ ràng, ta tiếp tục đào sâu để tìm thêm.
Lựa chọn (2), tới lượt của O(người): Ta có 2 lựa chọn (5) và (6). Cả 2 lựa chọn khi đi sâu xuống depth = 3, ta được số điểm của (9) và (10) lần lượt là +7 và 0 (Mình sẽ giải thích lí do tại sao là +7 mà không phải +10 sau). Khi truyền lên trên, bàn cờ (5) và (6) có số điểm cũng lần lượt là +7 và 0. Tại vị trí (5)(6) này, là lượt của min (lượt O – người), ta sẽ lựa chọn bàn cờ có số điểm thấp nhất. (Lí do giống như trong trò chơi có tổng bằng không đã nói, ở lượt đối thủ, họ luôn muốn giảm số điểm của mình xuống). Từ đó, bàn cờ (2) nhận giá trị là 0.
Lựa chọn (3), tới lượt của O(người): Ta có 2 lựa chọn (7) và (8). Lựa chọn (7) chúng ta bị thua và sẽ trừ điểm xuống -8; còn lựa chọn (8) ta nhận được số điểm là 0 (như hình). Với 2 lựa chọn (7)(8), số điểm tương ứng là -8 và 0, và với lượt chơi là min, ta chọn cho bàn cờ (3) số điểm thấp nhất là -8.
Cả 3 bàn cờ (2)(3)(4) lần lượt có số điểm là 0, -8 và 9. Vì đây là lượt của ta và ta có xu hướng lựa chọn bàn cờ có số điểm cao nhất +9, ta sẽ chọn bàn cờ (4).
Giải thích: Một dấu chấm hỏi lớn đặt ra là: Tại sao có trường hợp thắng (4) là +9 mà không phải +10, trường hợp thua (7) là -8 mà không phải là -10. Mình sẽ cho các bạn thấy:

Nếu cùng là bàn cờ thắng, nhưng nếu càng xuống sâu (càng đánh lâu), thì tỉ lệ thắng càng thấp, vì mỗi lần xuống là một loạt các nhánh khác (có thể thắng, có thể hòa, có thể thua). Nếu là bạn thì bạn sẽ chọn lựa chọn nào mà ít sâu hơn phải không? Nên số điểm chiến thắng sẽ được tính bằng 10 – depth, càng sâu thì số điểm sẽ càng giảm.
Còn ngược lại thì như sau:

Giữa lựa chọn có thể khiến cho đối thủ thắng ngay lập tức và lựa chọn câu thời gian để tìm cơ hội chiến thắng thì bạn sẽ chọn thế nào, tất nhiên là câu giờ rồi nhỉ. Càng câu thời gian, tức với các bàn thua càng đi xuống sâu, thì càng có lợi cho ta, nên giá trị của trận thua sẽ được tính bằng -10 + depth.
Như thế coi như chúng ta đã hoàn thành trò chơi Tic tac toe này rồi.
Về phần code thì mình sẽ không bàn đến vì code của mình chưa tham khảo của ai hết, mà suy nghĩ còn non nên còn nhiều cái dư thừa quá 😁.
Nội dung bài viết thuộc về Lê Công Diễn.

Người viết: Lê Công Diễn
Mang đi nhớ ghi nguồn


Nhận xét

Bài đăng phổ biến từ blog này

Deploy project Springboot MIỄN PHÍ sử dụng Render

Ứng dụng Mã hóa bất đối xứng (Asymmetric cryptography) vào Chữ ký số (Digital Signature)

TÔI DÀNH 3 NGÀY ĐÁNH GIÁ THỊ TRƯỜNG CNTT CUỐI NĂM 2024 CHO BẠN.