Tải bản đầy đủ (.pdf) (19 trang)

TRÒ CHƠI DODGEM ỨNG DỤNG THUẬT TOÁN MINIMAX và ALPHA BETA PRUNNING

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 (534.59 KB, 19 trang )

Bài tập lớn

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

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.
2.
3.
4.

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

MSSV: 20081020
MSSV: 20081131
MSSV: 20082082
MSSV: 20083139

Lớp: TTM- K53


Hà Nội, 11-2011

Trò chơi Dodgem

Page 1


Bài tập lớn

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

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

Trò chơi Dodgem


Page 2


Bài tập lớn

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

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
Phần 7: Tài liệu tham khảo ................................................................................................. 19

Trò chơi Dodgem

Page 3


Bài tập lớn


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

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

Trò chơi Dodgem

Page 4


Bài tập lớn

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

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.

Trò chơi Dodgem

Page 5


Bài tập lớn

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

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


Trò chơi Dodgem

Page 6


Bài tập lớn

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

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á.


Trò chơi Dodgem

Page 7


Bài tập lớn

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

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


Trò chơi Dodgem

Page 8


Bài tập lớn

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

để đá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)

Trò chơi Dodgem

Page 9


Bài tập lớn

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

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 (xif (xif (alpha>=beta) return beta
}
return min
}


Trò chơi Dodgem

Page 10


Bài tập lớn

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

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

Trò chơi Dodgem

Page 11


Bài tập lớn


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

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:

Trò chơi Dodgem

Page 12


Bài tập lớn

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

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 ô

4.2 Grid

Trò chơi Dodgem

Page 13


Bài tập lớn

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

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
Int [] dx, dy

// Ma trận các ô
// 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ẽ ô

Trò chơi Dodgem

Page 14


Bài tập lớn

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

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

Trò chơi Dodgem

Page 15


Bài tập lớn

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

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

Trò chơi Dodgem

Page 16


Bài tập lớn

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

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:


Trò chơi Dodgem

Page 17


Bài tập lớn

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

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á

Trò chơi Dodgem

Page 18



Bài tập lớn

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

Phần 7: Tài liệu tham khảo
1.
2.
3.
4.
5.

Bài giảng trí tuệ nhân tạo – Nguyễn Nhật Quang
MSDN library
/> /> />
Trò chơi Dodgem

Page 19



×