19

Click here to load reader

Báo cáo AI

Embed Size (px)

Citation preview

Page 1: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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: 200810202. Lê Bá Huy MSSV: 200811313. Thân Văn Quang MSSV: 200820824. Nguyễn Hoàng Việt MSSV: 20083139

Lớp: TTM- K53

Hà Nội, 11-2011

Page 2: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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

Page 3: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 3

Mục lụcPhầ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

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

Page 4: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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).

Page 5: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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.

Page 6: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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;

}

Page 7: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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á.

Page 8: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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 để đánh giá của một đỉnh Trắng, còn tham số b ghi lại giá trị nhỏ nhất trong các đỉnh con

Page 9: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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)

{

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

return Analysis(b)

Page 10: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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

}

Page 11: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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.

Ví dụ, tính giá trị bàn cờ cho 2 hình vẽ bên dưới. Trong bàn cờ đầu, ta có các giá trị sau: Quân đen: -10 + 0 = -10, Quân đỏ: 5 + 10 = 15, xét các trạng thái khác, ta thấy quân đen

Page 12: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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:

Page 13: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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 CellLà 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 ô

4.2 Grid

Page 14: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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ẽ ô

Page 15: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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

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

Page 16: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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

Page 17: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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).

Sau khi chọn xong tất cả các Tùy chọn, để bắt đầu vào chơi bạn Click vào Button Xác nhận. Giao diện chính của trò chơi sẽ hiện lên:

Page 18: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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: Chưa thực sự tối ưu được hàm lượng giá

Page 19: Báo cáo AI

Bài tập lớn NHẬP MÔN TRÍ TUỆ NHÂN TẠO

Trò chơi Dodgem Page 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 Quang2. http://msdn.microsoft.com/en-us/library/52f3sw5c.aspx MSDN library3. http://en.wikipedia.org/wiki/Alpha-beta_pruning4. http://en.wikipedia.org/wiki/Minimax5. http://www.ocf.berkeley.edu/~yosenl/extras/alphabeta/alphabeta.html