Tải bản đầy đủ (.doc) (5 trang)

Báo cáo Bài tập lớn trí tuệ nhân tạo :Không gian trạng thái được mô tả là trò chơi cờ tướng. Hãy xây dựng chương trình giải quyết bài toán theo phương pháp cắt tỉa alpha-beta

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (124.6 KB, 5 trang )


Báo cáo môn Trí tuệ nhân tạo
Sinh viên: Đỗ Tuấn Sơn.
Lớp: Tin5A.
Giáo viên hướng dẫn: Ngô Hữu Phúc.
Đề tài:Không gian trạng thái được mô tả là trò chơi cờ tướng.
Hãy xây dựng chương trình giải quyết bài toán theo phương
pháp cắt tỉa alpha-beta.
Để mô tả không gian trạng thái của 1, ta sử dụng 3 mảng răng cưa:
private int[][] giatri = new int[150][];
private int[][] cha = new int[150][];
private int[][] con = new int[150][];
Mảng giatri[][] để chứa các giá trị của từng node, mảng cha[][] để xác định giá trị
cha của từng node, mảng con để xác định node đó là lá của cây hay là đỉnh kết thúc.
Thuật toán cắt tỉa Alpha-Beta:
Ý tưởng này được gọi là nguyên tắc Alpha-Beta do nó dùng trong thủ tụcAlphaBeta
Hai tham số của thủ tục này (theo các đặt tên truyền thống) được gọi là alpha và beta
và dùng để theo dõi các triển vọng - chúng cho biết các giá trị nằm ngoài khoảng
[alpha, beta] là các điểm "thật sự tồi" và không cần phải xem xét nữa. Khoảng [alpha,
beta] còn được gọi là cửa sổ alpha, beta. Trong ngữ cảnh của các trò chơi, nguyên tắc
Alpha-Beta nói rằng, mỗi khi xem xét một nút bất kì, nên kiểm tra các thông tin đã
biết về các nút cha, ông của nó. Rất có thể do có đủ thông tin từ cha, ông nên không
cần phải làm bất cứ việc gì nữa cho nút này. Cũng vậy, nguyên tắc này cũng giúp
chỉnh sửa hoặc xác định chính xác giá trị tại nút cha, ông nó. Như trên nói, một cách
để tiện theo dõi quá trình tính toán là dùng các tham số alpha và beta để ghi lại các
thông tin theo dõi cần thiết. Thủ tục AlphaBeta được bắt đầu tại nút gốc với giá trị
của alpha là -vôcùng và beta là +vôcùng. Thủ tục sẽ tự gọi đệ quy chính nó với
khoảng cách giữa các giá trị alpha và beta ngày càng hẹp hơn.
-Đánh giá độ phức tạp của thuật toán Alpha-Beta:
Trong trường hợp điều kiện lý tưởng, thuật toán Alpha-Beta chỉ cần xét số nút:
+Số d chẵn:


+Số d lẻ:
b là số nút, d là độ sâu.
Phương pháp alpha-beta:
-Giả sử quá trình tìm kiếm đi xuống đỉnh Trắng a, đỉnh a có đỉnh cùng cấp v đã
xét.
-Giả sử đỉnh a có cha là b, b có đỉnh cùng cấp là u đã xét; cha của b là c.
-Khi đó, giá của c ít nhất là u, giá của b nhiều nhất là v.
-Nếu eval(u)> eval(v) (nếu là trường hợp min-max-min thì eval(u)<eval(v)), ta
không cần đi xuống đỉnh a nữa mà không ảnh hưởng tới giá của c.
-Lập luận tương tự cho đỉnh a là Đen, với đánh giá eval(u)<eval(v).

Cắt tỉa gốc a nếu eval(u)>eval(v)
Thuật toán cắt tỉa Alpha-Beta:
private int AlphaBeta(int[][] gt, int[][] ch, Point vitri, int buoc,
int val, int hang) //Thu+Hq0-t to+AOE-n c+Hq8-t c+HuU-t alpha-beta
{
if (con[vitri.X][vitri.Y] == 0)
return gt[vitri.X][vitri.Y];
int count = 0;
int max = int.MinValue;
int min = int.MaxValue;
if (vitri.X % 2 == 1)
{
for (int i = 0; i < gt[vitri.X + 1].Length; i++)
{
if (ch[vitri.X + 1][i] == vitri.Y)
{
if (buoc > 1)
{
if (count > 0)

{
if (min > gt[vitri.X + 1][i - 1])
min = gt[vitri.X + 1][i - 1];
gt[vitri.X + 1][i] = AlphaBeta(gt, ch,
new Point(vitri.X + 1, i), buoc - 1, min, hang);
}
else
{
gt[vitri.X + 1][i] = AlphaBeta(gt, ch,
new Point(vitri.X + 1, i), buoc - 1, int.MinValue, hang);
}
}
count++;
if (val <= gt[vitri.X + 1][i])
{
return val;
}
else
{
if (max < gt[vitri.X + 1][i])
{
max = gt[vitri.X + 1][i];
if (vitri.X == hang)
{
cot = i;
}
}
}
}
}

return max;
}
else
{
for (int i = 0; i < gt[vitri.X + 1].Length; i++)
{
if (ch[vitri.X + 1][i] == vitri.Y)
{
if (buoc > 1)
{
if (count > 0)
{
if (max < gt[vitri.X + 1][i - 1])
max = gt[vitri.X + 1][i - 1];
gt[vitri.X + 1][i] = AlphaBeta(gt, ch,
new Point(vitri.X + 1, i), buoc - 1, max, hang);
}
else
{
gt[vitri.X + 1][i] = AlphaBeta(gt, ch,
new Point(vitri.X + 1, i), buoc - 1, int.MaxValue, hang);
}
}
count++;
if (val >= gt[vitri.X + 1][i])
{
return val;
}
else
{

if (min > gt[vitri.X + 1][i])
{
min = gt[vitri.X + 1][i];
if (vitri.X == hang)
{
cot = i;
}
}
}
}
}
return min;
}
}
Thiết kế chương trình:
Nút Newgame để chơi lại từ đầu.
Nút Caidatdulieu để thiết lập database cho máy.
Nút Close đóng chương trình.

×