• Nenhum resultado encontrado

Báo cáo AI

N/A
N/A
Protected

Academic year: 2021

Share "Báo cáo AI"

Copied!
19
0
0

Texto

(1)

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG

BÀI TẬP LỚN

NHẬP MÔN TRÍ TUỆ NHÂN TẠO

ĐỀ TÀI : TRÒ CHƠI DODGEM

ỨNG DỤNG THUẬT TOÁN MINIMAX VÀ ALPHA BETA PRUNNING

GV hướng dẫn: TS. NGUYỄN NHẬT QUANG Sinh viên thực hiện:

1. Nguyễn Văn Hòa MSSV: 20081020 2. Lê Bá Huy MSSV: 20081131 3. Thân Văn Quang MSSV: 20082082 4. Nguyễn Hoàng Việt MSSV: 20083139

(2)

LỜI NÓI ĐẦU

Đây là tài liệu dùng để biểu diễn cơ bản thiết kế và xây dựng “Trò chơi Dodgem” sử dụng thuật toán MiniMax và Alpha beta pruning do nhóm em thiết kế và lập trình. Tài liệu này giúp ta có cái nhìn toàn vẹn về các chức năng của phần mềm cũng như ứng dụng thuật toán MiniMax và Alpha beta prunning để giải quyết bài toán này. Do thời gian có hạn nên đồ án không thể tối ưu được toàn bộ các trạng thái bài toán. Tuy nhiên, nhóm sẽ nghiên cứu hoàn thiện trong thời gian sớm nhất.

Nhóm thực hiện đề tài nhằm mục đích xây dựng một trò chơi ứng dụng giải trí và có tính “ nhân tạo “ khá cao. Trong quá trình thực hiện đề tài không tránh khỏi những sai sót, nhóm em mong sẽ nhận được sự góp ý và đánh giá của thầy.

Sinh viên thực hiện

Nguyễn Văn Hòa Lê Bá Huy Thân Văn Quang Nguyễn Hoàng Việt

(3)

Mục lục

Phần 1: Giới thiệu trò chơi Dodgem...4

Phần 2 : Thuật toán MiniMax và Alpha beta pruning...5

2.1 Thuật toán MiniMax...5

2.2 Thuật toán Alpha beta pruning...7

3.1 Hàm đánh giá 1... 11 3.2 Hàm đánh giá 2... 12 Phần 4 : Cài đặt chương trình...13 4.1 Cell...13 4.2 Grid... 13 4.3 Computer... 15 4.4 GameManager... 16 Phần 5: Giao diện chương trình... 17 Phần 6: Kết luận... 18

(4)

Phần 1: Giới thiệu trò chơi Dodgem

Dodgem game là một chess game, giống như cờ Caro hay cờ tướng… Mỗi game đều có 2 người chơi. Một người là Min, người còn lại sẽ là Max. Hai người chơi sẽ thay phiên nhau đưa ra các nước đi của mình theo một quy luật nào đó.

Trò chơi Dodgem game được tạo ra gồm có hai quân Đen và hai quân Đỏ được xếp vào bàn cờ 3*3 (hình vẽ).

Luật chơi:

 Quân Đen: được phép đi lên trên, sang phải hoặc xuống dưới.Quân Đen có thể được đưa ra ngoài khi ở cột ngoài cùng bên phải.

 Quân đỏ: được phép đi lên trên, sang trái hoặc sang phải.Quân Đỏ có thể đưa được ra ngoài khi ở hàng trên cùng của bàn cờ.

Trò chơi kết thúc khi 1 trong 2 người chơi đưa được hết các quân cờ của mình ra ngoài hoặc chặn không cho quân đối phương di chuyển (thì được coi là chiến thắng).

(5)

Phần 2 : Thuật toán MiniMax và Alpha beta pruning

2.1 Thuật toán MiniMax Nguyên lý:

 Một chiến lược tối ưu là một chuỗi các nước đi giúp đưa đến trạng thái đích mong muốn.

 Chiến lược của MAX bị ảnh hưởng ( phụ thuộc ) vào các nước đi của MIN – và ngược lại

 MAX cần chọn một chiến lược giúp cực đại hóa giá trị của hàm mục tiêu – với giả sử là MIN đi các nước đi tối ưu

 Chiến lược này được xác định bằng việc xét các giá trị MINIMAX đối với mỗi nút trong cây biểu diễn trò chơi

 MAX chọn các nước đi tương ứng với giá trị MINIMAX cực đại ( MIN chọn cá nước đi ứng với giá trị MINIMAX cực tiểu

Áp dụng vào trò chơi DODGEM

Với Quân Đen, ta chọn Max(các children), Quân Đỏ, ta tìm Min(các children). Từ hình vẽ trên, ta xây dựng các thủ tục đệ quy, gồm 2 hàm, MaxVal() đại diện cho Quân Đen, nhằm tìm nước đi tối ưu cho mình ( Max(children) ), ngược lại, MinVal() đại diện cho Quân Đỏ, tìm Min(Children) cho mình.

(6)

int MinVal( dept, beta) {

int p;

if( GameOver() or dept > maxdept) return;

int min = vô cung lon for moi vi tri cua quan den {

1. Di chuyen sang o lan can

2. IF (dept = maxdept ) p=getpoint() ; 3. Else p=MaxVal ( dept +1, beta) 4. If ( beta >= p ) beta =p;

5. Cho quan den ve vi tri cu }

return beta; }

int MaxVal( dept, alpha) {

int p;

if( GameOver() or dept > maxdept) return;

int max = vô cung bé for moi vi tri cua quan do {

1. Di chuyen sang o lan can

2. IF (dept = maxdept ) p=getpoint() ; 3. Else p=MinVal ( dept +1, beta) 4. If ( alpha <= p ) alpha =p; 5. Cho quan do ve vi tri cu }

return alpha; }

(7)

Với maxdept là độ sâu tối đa sẽ duyệt đến.Maxdept càng lớn ( duyệt càng sâu ) thì càng tiến gần đến thắng lợi. Biến dept được khởi tạo giá trị là 0. Như vậy Computer đóng vai trò là quân đỏ ( Min ) nó sẽ gọi đến hàm MinVal.

2.2 Thuật toán Alpha beta pruning

Trong chiến lược tìm kiếm Minimax, để tìm kiếm nước đi tốt cho Trắng tại trạng thái u, cho dù ta hạn chế không gian tìm kiếm trong phạm vi cây trò chơi gốc u với độ cao h, thì số đỉnh của cây trò chơi này cũng rất lớn với h >= 3.

Chẳng hạn, trong cờ vua, nhân tố nhánh trong cây trò chơi trung bình khoảng 35, thời gian đòi hỏi phải đưa ra nước đi là 150 giây, với thời gian này trên máy tính thông thường chương trình của bạn chỉ có thể xem xét các đỉnh trong độ sâu 3 hoặc 4.

Một người chơi cờ tr.nh độ trung bình cũng có thể tính trước được 5, 6 nước hoặc hơn nữa, và do đó chương trình của bạn mới đạt trình độ người mới tập chơi!

Khi đánh giá đỉnh u tới độ sâu h, một thuật toán Minimax đòi hỏi ta phải đánh giá tất cả các đỉnh của cây gốc u tới độ sâu h. Song ta có thể giảm bớt số đỉnh cần phải dánh giá mà vẫn không ảnh hưởng gì đến sự đánh giá đỉnh u. Phương pháp cắt cụt alpha-beta cho phép ta cắt bỏ các nhánh không cần thiết cho sự đánh giá đỉnh u.

Tư tưởng của kỹ thuật cắt cụt alpha-beta là như sau:

Nhớ lại rằng, chiến lược tìm kiếm Minimax là chiến lược tìm kiếm theo độ sâu.

Giả sử trong quá trính tìm kiếm ta đi xuống đỉnh a là đỉnh Trắng, đỉnh a có người anh em v đã được đánh giá.

(8)

Giả sử cha của đỉnh a là b và b có người anh em u d. được đánh giá, và giả sử cha của b là c(Xem hình trên).

Khi đó ta có giá trị đỉnh c (đỉnh Trắng) ít nhất là giá trị của u, giá trị của đỉnh b (đỉnh Đen) nhiều nhất là giá trị v. Do đó, nếu eval(u) > eval(v), ta không cần đi xuống để đánh giá đỉnh a nữa mà vẫn không ảnh hưởng gì dến đánh giá đỉnh c. Hay nói cách khác ta có thể cắt bỏ cây con gốc a. Lập luận tương tự cho trường hợp a là đỉnh Đen, trong trường hợp này nếu eval(u) < eval(v) ta cũng có thể cắt bỏ cây con gốc a.

Cụ thể hơn, ta có hình bên dưới

Trong khi, ta đang cố tìm giá trị cho A, Chúng ta đi xuống B, và tìm được giá trị là 6 là Min(6,9). Sau đó, ta đi qua C. Từ đó, chúng ta tính được E là 4 là Max(4,-2). Do đó, C là nhỏ hơn,Ngay tại lúc này ta biết được giá trị của C là <=4, Do đó, C sẽ không được chọn bởi A là giá trị Maximum, vì A đã có B chứa giá trị 6, là giá trị chắc chắn lớn hơn bất kỳ giá trị nào của C (nếu ta tính tiếp). Do đó việc tìm giá tri Max cho F và G là không cần thiết nữa. Và lúc đó, ta sẽ dừng việc sử lý trên Node C, Và ta tiếp tục tìm trên Node D… Như vậy, cho đến bây giờ ta có thể bổ sung kỹ thuật vừa nói trên vào thuật toán Minimax, ta có được chương trình hoàn thiện như sau:

Để cài đặt kỹ thuật cắt cụt alpha-beta, đối với các đỉnh nằm trên đường đi từ gốc tới đỉnh hiện thời, ta sử dụng tham số a để ghi lại giá trị lớn nhất trong các giá trị của các đỉnh con

(9)

để đánh giá của một đỉnh Đen. Giá trị của a và b sẽ được cập nhật trong quá trình tìm kiếm. a và b được sử dụng như các biến địa phương trong các hàm MaxVal(u, a, b) (hàm xác định giá trị của đỉnh Trắng u) và Minval(u, a, b) (hàm xác định giá trị của đỉnh Đen u).

int BlueValue(Board b, int depth, int alpha, int beta) {

if ((GameOver(b) or depth>MaxDepth) return Analysis(b)

int max = -infinity

for each legal move m in board b {

copy b to c

make move m in board c

int x = RedValue(c, depth+1, alpha, beta) if (x>max) max = x

if (x>alpha) alpha = x if (alpha>=beta) return alpha }

return max }

//////////////////////////////////////////////////////////////////////////////////////////////////////////

int RedValue(Board b, int depth, int alpha, int beta) {

(10)

int min = infinity

for each legal move m in board b {

copy b to c

make move m in board c

int x = BlueValue(c, depth+1, alpha, beta) if (x<min) min = x

if (x<beta) beta = x

if (alpha>=beta) return beta }

return min }

(11)

Phần 3: Hàm đánh giá

Vấn đề được đặt ra là: làm sao có thể lựa chọn được nước đi tối ưu nhất dành cho mỗi lần đi?

Để làm được điều này câu trả lời là cần phải xây dựng 1 hàm đánh giá phù hợp và tối ưu. 3.1 Hàm đánh giá 1

Cho điểm các ô trong bàn cờ đối với các quân cờ Đen và Đỏ như sau:

Ngoài ra, nếu quân trắng cản trực tiếp quân đen, cộng thêm 40 điểm cho quân trắng, nếu cản gián tiếp thì được cộng 30 điểm, Tương tự cho quân đen, nếu quân Đen cản trực tiếp quân Đỏ nó được thêm -40 điểm, cản gián tiếp nó được thêm -30 điểm.

(12)

vừa bị cản trực tiếp, vừa bị cản gián tiếp, Quân đỏ được thêm 70 điểm, Vậy KQ cuối cùng là: -10 + 15+70 = 75, tương tự, cho hình số 2.

3.2 Hàm đánh giá 2

Hàm đánh giá 2 được cải thiện từ hàm đánh giá 1:

Do tiêu chí của bài toán là đưa được hết quân cờ ra ngoài bàn cờ vì vậy mà mỗi quân khi được đưa ra ngoài sẽ được cộng ( hoặc trừ) với một giá trị nhất định.

Ngoài phần cho điểm như hàm đánh giá 1 thì với mỗi quân Đen (quân Đỏ ) được đưa ra ngoài ta sẽ công thêm -85 điểm ( 85 điểm ), vì vậy ta sẽ cho điểm các ô bên ngoài như sau:

(13)

Phần 4 : Cài đặt chương trình

Chương trình được cài đặt bằng ngôn ngữ C# gồm các Class như sau: 4.1 Cell

Là 1 là 1 dẫn xuất của lớp PictureBox. Biểu diễn trạng thái của 1 ô trên bàn cờ.

Biến :

Int x ,y ; // Tọa độ của 1 ô Char State ; // Trạng thái của 1 ô

Bool selected; // Xem 1 ô đã được chọn hay chưa Hàm:

Public Cell ( char type, int x, int y ) // Phương thức khởi dựng Void state (char type ) // Xác định trạng thái của 1 ô

(14)

Biến :

Int x, y // Tọa độ của 1 ô

Int n // Kích thước của bàn cờ

Char[,] State // Trạng thái của 1 ô tính theo tọa độ x,y

Int [,] redpoint // Điểm của quân đỏ trên bàn cờ theo tọa độ x,y Int [,] blackpoint // Điểm của quân Đen trên bàn cờ theo tọa độ x,y Cell [,] Matrix // Ma trận các ô

Int [] dx, dy // Xác định các ô lân cận có thể di chuyển theo luật Int[] SelectedCell // lưu lại tọa độ của 1 ô được chọn

Hàm:

Void PanelClick(object sender, MouseEventArgs e) // Xử lý sự kiên để đưa 1 quân cờ ra ngoài

Void CellClick( int x, int y) // Xử lý sự kiện khi click vào 1 ô trên bàn cờ Void DisableOthers() // Chuyển trạng thái của 1 ô sau 1 nước đi

Void UpdateCell() // Cập nhật bàn cờ

Public Grid(int N) // phương thưc khởi tạo dung để khởi tạo bàn cờ, cho điểm các ô Void DrawCell() // Vẽ ô

(15)

Public GetState() // Lấy trạng thái của bàn cờ Public SetState () // Thiết lập trạng thái của bàn cờ 4.3 Computer

Biến :

Int [] dx, dy // Tìm đến tọa độ các ô lân cận có thể di chuyển Int n // Kích thước bàn cờ

Int [,] S // Trạng thái của 1 ô theo tọa độ x, y Int maxdept = 10 // Độ sâu tìm kiếm tối đa

Int INT_MAX = 2147483647 Hàm:

Int MinVal ( int dept, int alpha, int beta) // Hàm tính điểm cho MIN theo thuật toán Alpha beta pruning

(16)

Void Getstate () // Lấy trạng thái của bàn cờ Void Setstate () // Thiết lập trạng thái của bàn cờ

Byte [] Solve ( byte[] state) // hàm máy tính dùng để tính toán nước đi tiếp theo Int Getpoint() // Tính điểm tại 1 trạng thái của bàn cơ

4.4 GameManager

Biến:

Int [,] dx, dy // Tìm đến tọa độ các ô lân cận có thể di chuyển Bool lockTimer //

Bool GameOver // Trò chơi kết thúc hay chưa

Bool Player // Biến xác định lượt chơi là người hay máy Hàm:

Void newGame() // Chọn trò chơi mới Void SwitchPlayer() // Đổi lượt chơi

Void Check() // Kiểm tra xem trò chơi đã kết thúc chưa, xem ai là // người thắng

(17)

Phần 5: Giao diện chương trình

Đây là giao diện đầu tiên mà bạn thấy khi vào Game

 Để bắt đầu chơi bạn vào Game - chọn New Game.

 Để xem hướng dẫn Cách chơi bạn vào Help  chọn Cách chơi

Sau khi vào New Game, 1 Form mới sẽ hiện ra. Ở Form này bạn có thể chọn các chức năng của trò chơi như: kích thước của bàn cờ (tối đa là 15*15) , lượt chơi và Cấp độ khó dễ (Level).

(18)

Phần 6: Kết luận

Qua môn học và trong quá trình tìm hiểu để thực hiện đề tài này, nhóm em đã có cái nhìn toàn diện hơn trong việc ứng dụng trí tuệ nhân tạo vào giải quyết vấn đề trong thực tế. Dodgem là một trò chơi ứng dụng tốt 2 thuật toán MINIMAX và Alpha beta Prunning. Tuy nhiên trong quá trình thực hiện thì chương trình không thể tránh khỏi những sai sót và chưa thực sự tối ưu. Chúng em mong được sự góp ý của thầy để có thể tiếp tục hoàn thiện hơn trong tương lai.

Em xin chân thành cảm ơn.

1. Những gì đã đạt được:

 Biết cách cài đặt được 2 thuật toán MiniMax và Alpha beta pruning  Lập trình Window form với C#

2. Những gì chưa đạt được:

(19)

Phần 7: Tài liệu tham khảo

1. Bài giảng trí tuệ nhân tạo – Nguyễn Nhật Quang

2. http://msdn.microsoft.com/en-us/library/52f3sw5c.aspxMSDN library

3. http://en.wikipedia.org/wiki/Alpha-beta_pruning

4. http://en.wikipedia.org/wiki/Minimax

Referências

Documentos relacionados

Entidade

Com esse intuito, as seguintes possibilidades podem ser exploradas: (i) a ampliação da análise para outros setores industriais com vistas a construir um mapa geral

Se um processo tentar abrir uma fila em modo de escrita, e nesse instante não houver um processo que tenha aberto a fila em modo de acesso de leitura, o processo fica

Os candidatos deverão apresentar, na data das provas, até 30 (trinta) minutos após o encerramento das mesmas, em salas especialmente designadas, cópia reprográfica acompanhada

Como resultado do mapeamento das atividades diárias e da definição das atividades definidas como críticas ao trabalho dos colaboradores avaliados, foram

Os mesmos autores ainda destacam que entre os fatores de risco para tal condição incluem a idade avançada, o sexo feminino, regiões de menores latitudes, pele mais escura e

Este medidor adota a teoria da medição por ondas de ultrassom para verificação da espessura de diferentes tipos de materiais que sejam capazes de propagar os pulsos destas ondas

Excepcionalmente para este instrumento normativo, faculta-se a empresa realizar a Suspensão Temporária do Contrato de Trabalho de quaisquer dos seus empregados,