Error: Reference source not found b Các thuộc tính của thuật toán Error: Reference source not found Chương II: BÀI TOÁN BỐC DIÊM.. Minimax là giải thuật là một thuật toán đệ quy lựa ch
Trang 1TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI 2
VIỆN CNTT
***
BÁO CÁO NHẬP MÔN TRÍ TUỆ NHÂN TẠO
ĐỀ TÀI:
BÀI TOÁN BỐC DIÊM VỚI GIẢI THUẬT MINIMAX
-GV Hướng dẫn: Lưu Thị Bích Hương
-Sinh viên thực hiện:
Trang 2MỤC LỤC
Chương I: GIẢI THUẬT MINIMAX Error: Reference source not
found
1.
Sơ lược về giải thuật minimax . Error: Reference source
not found
a)
Thuật toán minimax là gì? Error: Reference source not
found
b)
Tại sao cần dùng minimax Error: Reference source not
found
c)
Các khái niệm Error: Reference source not found d)
Giải thuật minimax Error: Reference source not found
2.
Giải thuật minimax Error: Reference source not found
a)
Hoạt động của thuật toán minimax Error: Reference
source not found
b)
Các thuộc tính của thuật toán Error: Reference source not
found
Chương II: BÀI TOÁN BỐC DIÊM Error: Reference source not
found
1.
Giới thiệu bài toán Error: Reference source not found
2.
Cách giải bài toán Error: Reference source not found
a)
Các bước giải quyết bài toán Error: Reference source not
found
b)
Cài đặt thuật toán minimax Error: Reference source not
found
3. Giao diện chương trình Error: Reference source not found
a)
Biểu diễn lời giải thuật toán bằng ngôn ngữ C++ Error:
Reference source not found
b)
Giải thích chương trình Error: Reference source not found
PHỤ LỤC Error: Reference source not found
TÀI LIỆU THAM KHẢO Error: Reference source not found
Trang 3Phân công công việc
ST
công việc
Mức độ tham gia
1 Phạm Lê Hoàn Tìm tài liệu, viết
chương trình, viết báo cáo
100% Nhiệt
tình
2 Đỗ Hoàng Phúc Tìm tài liệu, viết
chương trình, làm slide thuyết trình
100% Nhiệt
tình
Trang 4Chương I: GIẢI THUẬT MINIMAX
1 Sơ lược về giải thuật minimax.
a Thuật toán minimax là gì?
Minimax là giải thuật là một thuật toán đệ quy lựa chọn bước đi kế tiếp trong một trò chơi có hai người bằng cách định giá trị cho các Node trên cây trò chơi sau đó tìm Node
có giá trị phù hợp để đi bước tiếp theo
b Tại sao phải cần dùng minimax?
Như các bạn đã biết thì có rất nhiều thuật toán tìm kiếm
để làm AI trong game như A, Heuristic Mỗi thuật toán thì
sẽ phù hợp với từng loại game cho nó Những game đối kháng trong đối người chơi luân phiên đánh như cờ vua, cờ tường, caro Khi chơi bạn có thể khai triển hết không gian trạng thái nhưng khó khăn chủ yếu là bạn phải tính toán được phản ứng và nước đi của đối thủ mình như thế nào? Cách xử lý đơn giản là bạn giả sử đối thủ của bạn cũng sử dụng kiến thức về không gian trạng thái giống bạn Giải thuật Minimax áp dụng giả thuyết này để tìm kiếm không gian trạng thái của trò chơi Trường hợp này thuật toán minimax sẽ đáp ứng những gì mình cần
c Các khái niệm
Cây trò chơi (Game tree) - Đại khái là một sơ đồ hình cây thể hiện từng trạng thái, từng trường hợp của trò chơi theo từng nước đi
Mỗi node biểu diễn 1 trạng thái của trò chơi hiện tại trên cây trò chơi
Node được gọi nút lá là tại đó trò chơi kết thúc (trạng thái trò chơi lúc đó có thể thắng, thua hoặc hòa)
d Giải thuật Minimax
Hai người chơi trong game được đại diện là MAX và MIN MAX đại diện cho người chơi luôn muốn chiến thắng và cố gắng tối ưu hóa ưu thế của mình còn MIN đại diện cho người chơi cố gắng cho người MAX giành số điểm càng thấp càng tốt Giải thuật Minimax thể hiện bằng cách định trị các Node trên cây trò chơi: Node thuộc lớp MAX thì gán cho nó giá trị lớn nhất của con Node đó Node thuộc lớp
Trang 5MIN thì gán cho nó giá trị nhỏ nhất của con Node đó Từ các giá trị này người chơi sẽ lựa chọn cho mình nước đi tiếp theo hợp lý nhất
2 Giải thuật minimax.
a Hoạt động của thuật toán Minimax
Có thể dễ dàng mô tả hoạt động của thuật toán minimax bằng cách sử dụng một ví dụ Dưới đây chúng tôi đã lấy một ví dụ về Game Tree đại diện cho trò chơi hai người chơi
Trong ví dụ này, có hai người chơi, một người được gọi là Maximizer và người khác được gọi là Minimizer
Maximizer sẽ cố gắng đạt được số điểm Tối đa có thể,
và Minimizer sẽ cố gắng đạt được số điểm tối thiểu có thể
Thuật toán này áp dụng DFS, vì vậy trong Game Tree này, chúng ta phải đi hết các lá để đến được các nút đầu cuối
Tại nút đầu cuối, các giá trị đầu cuối được đưa ra vì vậy chúng tôi sẽ so sánh các giá trị đó và điều chỉnh lại cây cho đến khi trạng thái ban đầu xảy ra Sau đây là các bước chính liên quan đến việc giải quyết Game Tree hai người chơi:
Bước 1: Trong bước đầu tiên, thuật toán tạo ra Game Tree và
áp dụng hàm tiện ích để nhận các giá trị và các trạng thái kết thúc.
Trong sơ đồ cây dưới đây, hãy lấy A là trạng thái bắt đầu của Tree Giả sử bộ tối đa hóa thực hiện lượt đi đầu tiên có giá trị ban đầu trong trường hợp xấu nhất = – infinite và minimizer sẽ thực hiện lượt tiếp theo có giá trị ban đầu trong trường hợp xấu nhất = + infinity
Trang 6Bước 2: Bây giờ, đầu tiên chúng ta tìm giá trị tiện ích cho Maximizer, giá trị ban đầu của nó là -∞, vì vậy chúng ta sẽ so sánh từng giá trị ở trạng thái đầu cuối với giá trị ban đầu của Maximizer và xác định các giá trị nút cao hơn Nó sẽ tìm thấy mức tối đa trong số tất cả
Đối với nút D max (-1, – -∞) => max (-1,4) = 4
Đối với nút E max (2, -∞) => max (2, 6) = 6
Đối với nút F max (-3, -∞) => max (-3, -5) = -3
Đối với nút G max (0, -∞) = max (0, 7) = 7
Trang 7Bước 3: Trong bước tiếp theo, đến lượt trình thu nhỏ, vì vậy nó
sẽ so sánh giá trị tất cả các nút với + ∞ và sẽ tìm giá trị nút lớp thứ 3
Đối với nút B = min (4,6) = 4
Đối với nút C = min (-3, 7) = -3
Bước 4: Bây giờ đến lượt Maximizer, nó sẽ lại chọn giá trị lớn nhất của tất cả các nút và tìm giá trị lớn nhất cho nút gốc Trong Game Tree này, chỉ có 4 lớp, do đó chúng tôi truy cập ngay đến nút gốc, nhưng trong trò chơi thực, sẽ có nhiều hơn 4 lớp
Đối với nút A max (4, -3) = 4
Trang 8b Các thuộc tính của thuật toán minimax
Complete– Thuật toán Min-Max đã hoàn thành Nó chắc
chắn sẽ tìm thấy một giải pháp (nếu tồn tại), trong cây tìm kiếm hữu hạn
Optimal– Min-Max là tối ưu nếu cả hai đối thủ đều chơi tối
ưu
Time complexity– Vì nó thực hiện DFS cho Game Tree,
do đó độ phức tạp thời gian của thuật toán Min-Max là O (bm), trong đó b là hệ số phân nhánh của Game Tree và m
là độ sâu tối đa của cây
Space Complexity – Độ phức tạp không gian của thuật
toán Mini-max cũng tương tự như DFS là O (bm)
c Giới hạn của thuật toán minimax
đối với các trò chơi phức tạp như Cờ vua, cờ vây, v.v Loại trò chơi này có hệ số phân nhánh rất lớn và người chơi có rất nhiều lựa chọn recursive Hạn chế này của thuật toán
minimax có thể được cải thiện từ việc lược bớt alpha-beta
mà chúng ta đã thảo luận trong chủ đề tiếp theo
Chương II: BÀI TOÁN BỐC DIÊM
1 Giới thiệu bài toán
Phân tích bài toán bốc diêm
Bài toán bốc diêm là một ví dụ điển hình của lý thuyết trò chơi, nơi hai người chơi cạnh tranh để đạt được mục tiêu cuối cùng Dưới đây là phân tích chi tiết về các khía cạnh của bài toán này
1 Mô hình trò chơi
Người chơi: Hai người chơi, thường được gọi là P1 và P2.
Trạng thái: Số lượng que diêm còn lại trên bàn.
Nước đi: Mỗi người chơi có thể bốc từ 1 đến MMM que
diêm trong mỗi lượt
2 Luật chơi
Số diêm ban đầu (N): Thường được xác định trước (ví
dụ: 18 que)
Số diêm tối đa có thể bốc (M): Giới hạn cho mỗi lượt (ví
dụ: 4)
Trang 9 Người thắng: Người nào bốc que diêm cuối cùng sẽ
thắng
3 Phân tích trạng thái thắng/thua
Trạng thái thua: Các số diêm còn lại là 1,2,3,4,5,61, 2, 3,
4, 5, 61,2,3,4,5,6 Nếu đối thủ chơi tốt, người chơi sẽ không thể thắng từ những trạng thái này
Trạng thái thắng: Các số diêm còn lại như
7,8,9,10,11,12, 7, 8, 9, 10, 11, 12, 7,8,9,10,11,12, Từ những trạng thái này, người chơi có thể bốc để đưa đối thủ vào trạng thái thua
4 Chiến lược tối ưu
Lập kế hoạch: Người chơi cần lập kế hoạch nước đi của
mình để luôn giữ cho đối thủ ở các trạng thái thua Điều này thường yêu cầu dự đoán các nước đi của đối thủ
Số lượng diêm còn lại: Người chơi nên cố gắng đưa số
diêm còn lại về một bội số của M+1M + 1M+1 (ví dụ: nếu M=4M = 4M=4, thì các số thua sẽ là 1, 6, 11, 16)
5 Áp dụng thuật toán Minimax
Minimax: Một phương pháp trong lý thuyết trò chơi, được
sử dụng để tìm nước đi tối ưu bằng cách tối đa hóa lợi ích cho người chơi trong khi tối thiểu hóa lợi ích cho đối thủ
Cách thức:
o Mỗi trạng thái có thể được phân tích để xác định giá trị của nó (thắng/thua)
o Thuật toán sẽ xem xét tất cả các khả năng và chọn nước đi dẫn đến trạng thái tốt nhất cho người chơi hiện tạ
6 Ví dụ minh họa
Trang 10o Bốc 4 que → 13 que.
3 P1 cần điều chỉnh nước bốc tiếp theo để đưa P2 vào trạng thái thua, như bốc đủ để đưa số diêm còn lại về 12
2 Cách giải bài toán.
a Các bước giải quyết bài toán.
1 Xác định quy tắc của trò chơi
Số diêm ban đầu (N): Số lượng que diêm trên bàn (ví dụ:
18)
Số diêm tối đa có thể bốc (M): Số que diêm mà mỗi
người có thể bốc trong một lượt (ví dụ: tối đa 4 que)
2 Phân tích trạng thái thắng/thua
2.1 Xác định trạng thái thua
Các trạng thái thua sẽ là: 1,2,3,4,5,61, 2, 3, 4, 5, 61,2,3,4,5,6 Nếu bạn ở trong trạng thái này và đối thủ chơi tốt, bạn sẽ không thể thắng
2.2 Xác định trạng thái thắng
Các trạng thái thắng sẽ là: 7,8,9,10,11,12, 7, 8, 9, 10, 11,
12, 7,8,9,10,11,12, Từ những trạng thái này, bạn có thể bốc que diêm để đưa đối thủ vào trạng thái thua
3 Lập kế hoạch nước đi
Chiến lược
Bắt đầu với số diêm ban đầu NNN Bạn muốn bốc sao cho
số diêm còn lại sau lượt của bạn là một trong các số thua
Nếu bạn là người chơi đầu tiên và N=18N = 18N=18:
o Bốc 1 que → Còn lại 17 que cho đối thủ
Dù đối thủ bốc bao nhiêu (1-4 que), bạn có thể luôn điều chỉnh lượt của mình để giữ cho họ ở trạng thái thua
4 Sử dụng thuật toán Minimax (tùy chọn)
Nếu bạn muốn tự động hóa quyết định nước đi, bạn có thể triển khai thuật toán Minimax để tìm ra nước đi tối ưu:
Trang 11b Cài đặt thuật toán Minimax
1 Định nghĩa hàm Minimax:
o Hàm sẽ kiểm tra các nước đi khả thi và đánh giá giá trị của từng trạng thái
2 Quy trình:
o Nếu số diêm còn lại là 0: Trả về trạng thái thua
o Nếu lượt của người chơi là 1 (tối đa hóa), tìm nước đi tốt nhất
o Nếu lượt của người chơi là 2 (tối thiểu hóa), tìm nước
đi tồi tệ nhất
3 Giao diện chương trình.
a Biểu diễn lời giải thuật toán bằng ngôn ngữ C++.
#include <iostream>
#include <algorithm>
#include <limits.h>
using namespace std;
// Hàm Minimax để đánh giá giá trị của từng trạng thái
int minimax(int n, int turn, int m) {
// Nếu không còn diêm, người chơi hiện tại thua
if (n == 0) {
return (turn == 1) ? -1 : 1;
}
if (turn == 1) { // Lượt của P1 (tối đa hóa)
int max_value = INT_MIN;
for (int k = 1; k <= min(m, n); ++k) {
int value = minimax(n - k, 2, m);
max_value = max(max_value, value);
}
return max_value;
} else { // Lượt của P2 (tối thiểu hóa)
Trang 12// Hàm tìm nước đi tốt nhất cho người chơi 1
int best_move(int n, int m) {
int best_value = INT_MIN;
int best_k = 0;
for (int k = 1; k <= min(m, n); ++k) {
int move_value = minimax(n - k, 2, m);
if (move_value > best_value) {
best_value = move_value;
best_k = k;
}
}
return best_k;
}
int main() {
int N = 18; // Số diêm ban đầu
int M = 4; // Số diêm tối đa có thể bốc
int move = best_move(N, M);
cout << "Nên bốc " << move << " que diêm." << endl;
return 0;
}
b Giải thích chương trình:
Chương trình trên sử dụng thuật toán Minimax để xác định nước
đi tốt nhất trong trò chơi bốc diêm với 18 que diêm Dưới đây là phần giải thích chi tiết về từng phần của chương trình:
Hàm minimax
Tham số của hàm:
n: Số que diêm hiện tại
turn: Lượt chơi (1 cho người chơi 1, 2 cho người chơi 2)
Trang 13m: Số que diêm tối đa có thể bốc.
Điều kiện dừng:
Nếu không còn que diêm (n == 0), người chơi hiện tại thua Nếu là lượt của P1 (1), trả về -1 (thua), nếu là P2 (2), trả về 1 (thắng)
Luật chơi:
Nếu là lượt của P1 (tối đa hóa):
Khởi tạo max_value là giá trị tối thiểu có thể
Lặp qua tất cả các nước đi khả thi (1 đến m hoặc n)
Gọi đệ quy hàm minimax với số que diêm còn lại
Cập nhật max_value với giá trị tốt nhất tìm được
Nếu là lượt của P2 (tối thiểu hóa):
Khởi tạo min_value là giá trị tối đa có thể
Lặp tương tự như trên, nhưng tìm giá trị nhỏ nhất
Hàm tìm nước đi tốt nhất
Hàm này tìm nước đi tốt nhất cho người chơi 1
best_value khởi tạo là giá trị tối thiểu
Lặp qua tất cả các nước đi khả thi từ 1 đến m
Gọi hàm minimax cho mỗi nước đi và cập nhật best_value và best_k (nước đi tốt nhất)
Hàm main
Trang 14PHỤ LỤC
-Tìm hiểu về các giải thuật, thuật toán có thể áp dụng cho bài toán
-Vận dụng các cơ sở tri thức đã tiếp thu qua môn học lập
trình(Ngôn ngữ C++) để viết chương trình
Trang 15TÀI LIỆU THAM KHẢO
https://viblo.asia/p/thuat-toan-minimax-ai-trong-game-APqzeaVVzVe
https://websitehcm.com/thuat-toan-mini-max-trong-tri-tue-nhan-tao/
https://www.iostream.co/article/giai-thuat-tim-kiem-minimax-s1EVnH