1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

5 4,7K 98

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 87 KB

Nội dung

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.. 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ụcA

Trang 1

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.

Trang 2

-Đá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;

Trang 3

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

Trang 4

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; }

}

Trang 5

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.

Ngày đăng: 12/03/2014, 19:50

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w