Nghiên cứu phương pháp cắt tỉa AnfaBeta cho trò chơi cờ ca rô

29 388 0
Nghiên cứu phương pháp cắt tỉa AnfaBeta cho trò chơi cờ ca rô

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CÔNG NGHỆ THÔNG TIN NỘI DUNG NGHIÊN CỨU HỌC PHẦN TRÍ TUỆ NHÂN TẠO CHO LỚP: CAO HỌC K23 HCM Yêu cầu bắt buộc: ngoài việc nghiên cứu lý thuyết, cần lựa chọn ví dụ viết chương trình minh họa theo lý thuyết đã nghiên cứu Tài liệu tham khảo chính: Pattern Classification 2nd Edition - Wiley GV Giảng Dạy: TS NGÔ HỮU PHÚC Sinh Viên Thực Hiện: ST T Mã HV Họ và tên Nội dung nghiên cứu Đánh giá kết quả 1 11870171 Viên NgọcBạch Nghiên cứu phương pháp cắt tỉa Anfa-Beta cho trò chơi cờ ca rô TPHCM, Tháng 07 năm 2012 1. Tìm hiểu giải thuật Minimax: • Giải thuật tìm kiếm Heuristic với các hàm heuristic chỉ thích hợp cho các bài toán không có tính đối kháng. Như các trò chơi chỉ có một người chơi: Puzzle, tìm lối ra mê cung, bài toán n quân hậu,… • Các trò chơi có tính đối kháng cao, thường là các trò chơi 2 người chơi như: tic tac toa, caro, cờ quốc tế,… giải thuật trên không có tác dụng vì: đối phương không bao giờ đi theo con đường cho ta có thể đi đến goal. Vỉ vậy cần phải có một giải thuật khác phù hợp hơn. Đó là chiến lược Minimax. Nó dựa trên 2 giả thiết sau: − Cả 2 đối thủ có cùng kiến thức như nhau về không gian trạng thái của trò chơi − Cả 2 đối thủ có cùng mức cố gắng thắng như nhau • Hai đối thủ trong trò chơi có tên là MAX và MIN − Max: biểu diễn cho mục đích của đối thủ này là làm lớn tối đa lợi thế của mình − Min: biểu diễn cho mục đích của đối thủ này là làm nhỏ tối đa lợi thế của đối phương. • Trên cây tìm kiếm sẽ phân lớp thành các lớp Max và Min. Với một node n bất kỳ, − Nếu nó thuộc lớp Max thì gán cho nó giá trị Max của các node con − Nếu nó thuộc lớp Min thì gán cho nó giá trị nhỏ nhất của các node con. • Các hàm trong chiến lược Minimax: − Hàm gán giá trị Max − Hàm gán giá trị Min − Thủ thục Minimax • Đánh giá về chiến lược Minimax − Tính đủ: có (nếu cây tìm kiếm là hữu hạn) − Tính tối ưu: có (đối với đối thủ luôn ra nước tối ưu) − Độ phức tạp thời gian: O(bm) (với m là độ cao của cây, tại mỗi đỉnh có b bước đi) − Độ phức tạp không gian: O(bm) (DFS) • Hàm đánh giá trong chiến lược Minimax: − Trong chiến lược Minimax, nếu có hàm f(), hàm kết quả, thì chương trình có giá trị tối ưu, tuy nhiên cần xét cả không gian trạng thái. − Để tìm ra kết quả nhanh, nước đi tốt, ta có thể sử dụng hàm đánh giá, hàm này chỉ xét một bộ phận của cây trò chơi. − Chất lượng của chương trình phụ thuộc vào hàm đánh giá, nếu hàm đánh giá không chính xác về trạng thái sẽ cho nước đi kém. − Hàm đánh giá phụ thuộc vào nhiều yếu tố của trò chơi. Ở đây có sự mâu thuẫn giữa độ chính xác và thời gian tính toán. • Chiến lược Minimax với độ sâu giới hạn − Minimax như đã xét buộc phải có toàn bộ không gian trạng thái đã được triển khai để có thể gán trị cho các nút lá và tính ngược lại è Không khả thi với các bài toán lớn vì không gian trạng thái là quá lớn. è Giới hạn không gian trạng thái lại theo một độ sâu nào đó và giới hạn các node con theo một qui tắc nào đó − Đây là chiến lược thông thường của các người chơi cờ: khả năng tính trước bao nhiêu nước. − Khi đó ta chỉ triển khai các nút con đến độ sâu giới hạn. − Đánh giá cho các nút này như là nút lá bằng một hàm lượng giá Heuristic. − Áp dụng chiến lược minimax cho việc đánh giá các nút cấp trên. − Kỹ thuật này gọi là nhìn trước K bước với K là độ sâu giới hạn. • Áp dụng cho cây sau: − Kết quả là: − Các lá trên cây là giá trị heuristic − Các giá trị tại các nút trong là các giá trị nhận được trên giải thuật Minimax. 2. Tìm hiểu giải thuật cắt tỉa alpha-beta: • Nhận xét về chiến lược Minimax: − Trong chiến lược minimax, để tìm nước đi tốt cho quân trắng tại trạng thái u, cho dù đã hạn chế không gian bằng việc giảm độ cao thì cũng rất lớn nếu h>=3. • Tư tưởng của phương pháp cắt tỉa 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), ta không cần đi xuống đỉnh a nữa mà không ảnh hưởng đến 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ác hàm trong chiến lược alpha-beta: − Hàm sử dụng α để ghi giá trị lớn nhất trong các giá trị của đỉnh con đã đánh giá của một đỉnh Trắng, β ghi giá trị nhỏ nhất trong các đỉnh con của một đỉnh Đen. − Hàm MaxValue(u,α,β) tính giá của đỉnh Trắng u. − Hàm MinValue(u,α,β) tính giá của đỉnh Đen u. − Hàm gán giá trị Max − Hàm gán giá trị Min − Thủ tục alpha-beta: tìm nước đi cho quân trắng, v là đỉnh cần tới. • Áp dụng cho cây sau: 3. Áp dụng vào trò chơi cờ caro: • Để hiện thực hóa ý tưởng thực hiện xây dựng chương trình ta áp dụng phương pháp cắt Alpha - Beta - Chúng ta cố gắng tìm một cách sao cho khi định trị một nút thì không nhất thiết phải định trị cho tất cả các nút con cháu của nó. Trước hết ta có nhận xét như sau: − Nếu P là một nút MAX và ta đang xét một nút con Q của nó (dĩ nhiên Q là nút MIN). Giả sử Vp là một giá trị tạm của P, Vq là một giá trị tạm của Q và nếu ta có Vp ≥ Vq thì ta không cần xét các con chưa xét của Q nữa. Vì nếu có xét thì giá trị của Q cũng sẽ nhỏ hơn hoặc bằng Vq và do đó không ảnh hưởng gì đến Vp. − Tương tự nếu P là nút MIN (tất nhiên Q là nút MAX) và Vp ≤ Vq thì ta cũng không cần xét đến các con chưa xét của Q nữa. Việc không xét tiếp các con chưa được xét của nút Q gọi là việc cắt tỉa Alpha-Beta các con của nút Q. Trên cơ sở nhận xét đó, ta nêu ra quy tắc định trị cho một nút không phải là nút lá trên cây như sau: o Khởi đầu nút MAX có giá trị tạm là -∞ và nút MIN có giá trị tạm là ∞. o Nếu tất cả các nút con của một nút đã được xét hoặc bị cắt tỉa thì giá trị tạm của nút đó trở thành giá trị của nó. o Nếu một nút MAX n có giá trị tạm là V1 và một nút con của nó có giá trị là V2 thì đặt giá trị tạm mới của n là max (V1,V2). Nếu n là nút MIN thì đặt giá trị tạm mới của n là min (V1,V2). o Vận dụng quy tắc cắt tỉa Alpha-Beta nói trên để hạn chế số lượng nút phải xét. 4. Hiện thực thuật toán trong chương trình: • Kiểm tra thắng thua: − Mỗi khi 1 bên đặt quân vào bàn cờ thì kiểm tra 1 lần, duyệt hàng dọc, ngang, chéo chính, chéo phụ đi qua quân cờ vừa đặt, nếu biến đếm là 5 thì tất nhiên là ai đặt người đó thắng. • Định giá bàn cờ: − Duyệt theo 4 hướng ngang, dọc, chéo chính, chéo phụ. − Xét các trường hợp, độ ưu tiên tuân theo thứ tự này, còn nếu có 2 độ ưu tiên bằng nhau thì xét xem trường hợp nào tốt hơn. * 0 .Nếu tấn công dành chiến thắng hoàn toàn * 1. Phòng thủ khi đối phương tạo được 5 ô liên tiếp * 2.Tấn công khi tạo được 4 ô không bị chặn đầu nào * 3.Tấn công khi tạo được 2 đường 4 bị chặn 1 đầu * 4.Tấn công khi tạo được 1 đường 4 chặn 1 đầu và 1 đường 3 không bị chặn * 5.Phòng thủ khi đối phương tạo được 4 quân liên tiếp không bị chặn * 6.Phòng thủ khi đối phương tạo được 2 đường 4 bị chặn 1 đầu * 7.Phòng thủ khi đối phương tạo được 1 đường 4 chặn 1 đầu và 1 đường 3 không bị chặn * 8.Tấn công khi tạo được 4 quân liên tiếp bị chặn 1 đầu * 9.Tấn công khi tạo được 2 đường 3 quân liên tiếp không bị chặn đầu nào * 10.Tấn công khi tạo được 1 đường 3 quân liên tiếp không bị chặn đầu nào và 1 đường bị chặn 1 đầu * 11.Tấn công khi tạo được 3 quân liên tiếp không bị chặn đầu nào * 12.Phòng thủ khi đối phương tạo được 4 quân liên tiếp bị chặn 1 đầu * 13.phòng thủ khi đối phương tạo được 2 đường 3 quân liên tiếp không bị chặn đầu nào * 14.Phòng thủ khi đối phương tạo được 1 đường 3 quân liên tiếp không bị chặn đầu nào và 1 đg bị chặn 1 đầu * 15.Phòng thủ khi đối phương tạo được 3 quân liên tiếp không bị chặn đầu nào * 16.Tấn công khi tạo được 2 đường 3 quân liên tiếp bị chặn 1 đầu * 17.Tấn công khi tạo được 3 quân liên tiếp bị chặn 1 đầu * 18.Tấn công khi tạo được 2 đường 2 quân liên tiếp không bị chặn * 19.Tấn công khi tạo được 2 quân liên tiếp không bị chặn * 20.Phòng thủ khi đối thủ tạo 2 đường 3 quân liên tiếp bị chặn 1 đầu * 21.Phòng thủ khi đối thủ tạo 3 quân liên tiếp bị chặn 1 đầu * 22.Phòng thủ khi đối thủ tạo được 2 quân liên tiếp không bị chặn • Sinh nước đi cho máy tính: − Sử dụng thuật toán Alpha- Beta: thiết kế chiều cao cây càng cao thì độ thông minh càng cao nhưng phải có những thuật toán để làm giảm không gian tìm kiếm, nếu không thì không gian sẽ khá lớn. − Việc xây dựng cây thông qua 2 bước: o Phân tích, tạo cây: B1: Tìm các Node Con (những Node ta đặt quân), đây là những Node hiệu quả nhất B2: Cắt nhánh khi tới nước thắng và không thua (trường hợp 0,2,3,4 như trên) B3: Với mỗi node con, tìm các Node cháu (những Node máy đặt quân) B4: Cắt hẳn nếu tới Node thua B5: Với mỗi node cháu, tiếp tục đệ quy (Phân tích, tạo cây). o Chuẩn hóa cây: Khi đã xây dựng xong cây thì ta sẽ tìm Node con nào có chiều cao thấp nhất (có khả năng đi tới nước thắng ngắn nhất) 5. Chương trình Caro-Game: • Đây là trò chơi mà người và máy chơi với nhau. Người được ưu tiên đi trước. − Nếu ai đánh được 5 con liên tiếp trước theo hàng dọc hay hàng ngang hay đường chéo thì sẽ chiến thắng. • Giao diện chương trình: • Source Code: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Collections; namespace Caro_Game { enum PawnStatus{NULL,BLACK,WHITE} enum Win { ROW, COLUMN, PRINCIPAL_DIAGONAL, SECONARY_DIAGONAL } enum Attack { ROW, COLUMN, PRINCIPAL_DIAGONAL, SECONARY_DIAGONAL } enum Defend { ROW, COLUMN, PRINCIPAL_DIAGONAL, SECONARY_DIAGONAL } enum Ability { _OO_,XOO_,_OOO_,XOOO_,_OOOO_,XOOOO_,OOOOO} class CellPosition [...]... return; } chess_board[p.row, p.col] = computer; turn_player = true; } private CellPosition ChoosePosition() { CellPosition chosen= new CellPosition(ROW/2,COLUMN/2); int maxValue = -1; foreach (CellPosition cp in WillBeChecked) { int value= Valuate(cp); if (value > maxValue) { chosen = cp; maxValue = value; } } return chosen; } private void UpdatePotitionsWillBeChecked(CellPosition p) { //Xóa p nếu p tồn... (CheckWinning(new CellPosition(row, col), player) == true) { MessageBox.Show("Chúc Mừng, Bạn đã chiến thắng ! "); NewGame(); return; } //Lượt máy chơi turn_player = false; Turn_Computer(); } } //Lượt Máy Tính private void Turn_Computer() { CellPosition p= ChoosePosition(); Graphics g = CreateGraphics(); Graphic.PutPawn(g, p.row, p.col, computer); UpdatePotitionsWillBeChecked(p); if (CheckWinning(p,... private void NewGame() { //Cập nhật lại trạng thái của người chơi player = PawnStatus.WHITE; computer = PawnStatus.BLACK; //Cập nhật lại ma trận for (int i = 0; i < ROW; i++) for (int j = 0; j < COLUMN; j++) chess_board[i, j] = PawnStatus.NULL; //Cập nhật lại danh sách các ô sẽ được kiểm tra WillBeChecked.Clear(); //Vẽ lại Form Invalidate(); //người chơi đi trước turn_player = true; } } } HẾT ... (chess_board[j, i] == PawnStatus.BLACK) Graphic.PutPawn(e.Graphics, j, i, PawnStatus.BLACK); else if (chess_board[j, i] == PawnStatus.WHITE) Graphic.PutPawn(e.Graphics, j, i, PawnStatus.WHITE); } } //Lượt Người chơi protected override void OnMouseUp(MouseEventArgs e) { Graphics g = CreateGraphics(); int col = (e.X - LEFT) / EDGE; int row = (e.Y - TOP) / EDGE; if (e.Button == MouseButtons.Left && col >= 0 && col... (cp.row=ROW||cp.col=COLUMN|| chess_board[cp.row, cp.col]!= PawnStatus.NULL) return; foreach(CellPosition p in WillBeChecked) { if (cp.col == p.col&&cp.row==p.row) return ; } WillBeChecked.Add(cp); } //Định giá bàn cờ private int Valuate(CellPosition cp) { //2 danh sách chứa các khả năng tấn công và phòng ngự List attackAbilities = new List(); List defendAbilities = new List();... public partial class MainForm : Form { //Define const int COLUMN = 20; const int ROW = 20; const int LEFT = 150; const int TOP = 100; const int EDGE = 22; //Properties bool turn_player; //Lượt đi của người chơi( 0: computer, 1: player) int last_col, last_row; PawnStatus [,] chess_board; ArrayList WillBeChecked; PawnStatus player; PawnStatus computer; //Method public MainForm() { InitializeComponent(); Paint

Ngày đăng: 03/07/2015, 14:45

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan