Tải bản đầy đủ (.docx) (39 trang)

BÁO cáo CHUYÊN đề học PHẦN NHẬP môn TRÍ TUỆ NHÂN tạo đề tài áp dụng thuật toán minimax và cắt tỉa alpha vào trò chơi cờ tướng

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 (678.6 KB, 39 trang )

TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO CHUN ĐỀ HỌC PHẦN
NHẬP MƠN TRÍ TUỆ NHÂN TẠO
ĐÊ TÀI:
Áp dụng thuật tốn minimax và cắt tỉa alpha vào trị chơi cờ tướng

Sinh viên thực hiện
Giảng viên hướng dẫn
Ngành
Chuyên ngành
Lớp
Khóa
Hà Nội, tháng 12 năm 2021


PHIẾU CHẤM ĐIỂM
STT
1

2

Họ và tên giảng viên
Giảng viên chấm 1:

Giảng viên chấm 2:


MỤC LỤC
LỜI CẢM ƠN...................................................................................................................


LỜI NÓI ĐẦU..................................................................................................................
MỞ ĐẦU...........................................................................................................................
I. Đặt vấn đề...................................................................................................................
CHƯƠNG 1: THUẬT TOÁN MINIMAX VÀÀ̀ CẮT TỈA ALPHA...............................
1.1

Đặt ý tưởng.................................................................................

1.2

Thuật toán MiniMax và AlphaBeta.............................................

1.2.1

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

1.2.2

Thuật toán cắt tỉa AlphaBeta...

Chương 2: PHÂN TÍCH VÀÀ̀ LẬP TRÌNH GAME.....................................................
2.1

Mơ tả ý tưởng.............................................................................

2.2

Xây dựng chương trình...............................................................

2.2.1


Lượng giá................................

2.2.2

Sinh nước đi............................

2.2.3

Giao diện chương trình...........

2.3

Cài đặt chương trình...................................................................

CHƯƠNG 3 : KẾT LUẬN.............................................................................................
3.1

Các vấn đề khó khăn và cách thức giải quyết.............................

3.2

Đánh giá chương trình................................................................

3.3

Hướng phát triển.........................................................................

TÀÀ̀I LIỆU THAM KHẢO.............................................................................................



LỜI CẢM ƠN
Trong thời gian nghiên cưu va hoc tâpp̣ mơn Nhập mơn Trí tuệ nhân tạo(Vơi ngơn
ngữ lâpp̣ trinh java), mơn đồ họa máy tính cùng vơi viêcp̣ tim hiêu va đoc cac tai liêu
trên thư viêṇ Trường va viêcp̣ tim hiêu thêm tai liêu hoc tâpp̣ trên internet nhóm em
đã găpp̣ khơng it kho khăn vê viêcp̣ xây dưng va thiêt kê game Cờ tướng sử dung
ngôn java ưng dung đồ họa máy tính và kiến thức lập trình hướng đối tượng. Vơi
sư giúp đỡ quy bau của cac thầy cô giao va cac ban nhom em đã hoan thanh game
va bai bao cao môn học Xây game cờ tướng
Đông thời em xin gửi lời cam ơn đăcp̣ biêṭvê sư hương dẫn va chi bao nhiêṭtinh
của thầầ̀y giáo Phạm Đức Hồng đã tâṇ tinh giúp đỡ nhóm em trong suât qua trinh
hoan thanh game cũng như bai bao cao nay.
Tuy nhiên, kinh nghiêṃ còn thiêu nên trong game cũng như bai bao cao nay
chắc chắn sẽ không tranh khỏi những thiêu sot, han chê nhât định. Những y kiên
nhâṇ xét va gop y quy bau của thầy cô va cac ban la cơ sơ đê nhóm em hoc hỏi
thêm va hoan thiêṇ thêm kiên thưc va củng cô thêm kinh nghiêṃ của ban thân
minh. Nhóm em rât mong nhâṇ đươc sư nhâṇ xét va gop y từ thầy cô va cac
ban.Mặc dùầ̀ đãã̃ rất nỗ lực và cố gắng nhưng chắc chắn rằng đề tài vẫã̃n còầ̀n nhiều
thiếu sót,nhóm em mong sẽã̃ nhận đuợc sự góp ý, phê bình củủ̉a cac thầầ̀y cơ, va các
bạn để đề tài hoàn thiện hơn.

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

1


LỜI NĨI ĐẦU
Các chiến lược tìm kiếm cơ bản chỉ sửủ̉ dup̣ng các thơng tin chung củủ̉a bài tốn, nó
khơng phùầ̀ hợp với nhiều bài toán thực tế trong cuộc sống vì chúú́ng đòầ̀i hỏủ̉i quá
nhiều về thờầ̀i gian và bộ nhớ. Bên cạnh đó, chúú́ng ta ngày càng đặt ra nhữã̃ng bài

toán trong thực tế, nhằm giải quyết được các vấn đề, nhu cầầ̀u củủ̉a con ngườầ̀i, với
một lượng thông tin, dữã̃ liệu khổng lồ, cầầ̀n phải đưa ra nhữã̃ng chiến lượng giải
quyết tối ưu, thơng mình để đạt hiệu quả hơn, vậy nên cầầ̀n nghiên cứu, thiết lập và
cải thiện nhữã̃ng chiến lược tìm kiếm với tri thức bổ sung (informed search
strategies) sửủ̉ dup̣ng các tri thức cup̣ thể củủ̉a bài tốn.Trong đồ án này, nhóm sinh viên
chúú́ng em đãã̃ chọn ra một trong các giải thuật tìm kiếm để mơ phỏủ̉ng vào một bài
tốn thực tế đó là chương trình “Cờầ̀ tướng”, một tròầ̀ chơi rất quen thuộc với chúú́ng
ta.Với mup̣c tiêu đặt là có thể hiểu và vận dup̣ng được giải thuật tìm kiếm tri thức, và
củủ̉ng cố được kĩ năng lập trình để tạo nên bản demo hồn chỉnh.
Q trình thực hiện bao cao gặp nhiều khó khăn vì ngơn ngữã̃ lập trình mới, kinh
nghiệm thực tế còầ̀n hạn chế, em mong sẽã̃ nhận được sự góp ý, phê bình củủ̉a cơ để
đề tài này hoàn thiện hơn.

Em xin chân thành cảm ơn sự giúp đỡ của Thầy!

2


MỞ ĐẦU
I. Đặt vấn đề
Game cờầ̀ tướng đãã̃ xuất hiện từầ̀ rất lâu đờầ̀i, được nhiều các thế hệ yêu thích
bởi việc chơi cờầ̀ cũã̃ng như việc cầầ̀n quân đánh trận. Hiện nay, Cờầ̀ Tướng trở thành
một tròầ̀ chơi trí tuệ mang tầầ̀m cỡã̃ quốc tế.
Tròầ̀ chơi Cờầ̀ Tướng (tên phiên âm Trung Quốc XiangQi, tên tiếng Anh Chinese
Chess) là một minh hoạ rất tốt cho bài tốn tìm kiếm trên cây tròầ̀ chơi và áp dup̣ng
thuật toán AlphaBeta trên cây này như thế nào. Đây là một tròầ̀ chơi thúú́ vịp̣ và tương
đối phổ biến ở Việt nam, châu Á cũã̃ng như trên tồn thế giới. Nó tạo cảm giác
dườầ̀ng như máy tính có thể suy nghĩ và đọ sức với con ngườầ̀i (thực tế cho đến nay
nó vẫã̃n chỉ tính tốn mà thơi). Cờầ̀ Tướng là loại cờầ̀ có độ phức tạp và rất nhiều mặt
tương đương với cờầ̀ Vua.


3


CHƯƠNG 1: THUẬT TOÁN MINIMAX VÀ CẮT TỈA ALPHA
1.1 Đặt ý tưởng
Cờ tương la trò chơi đôi khang, trong đo hai người luôn phiên nhau đi nươc
đi của minh. Trang thai băt đầu la trang thai khơi tao ban cờ, sau môi nươc đi của
môṭbên, trang thai ban cờ sẽ đươc thay đôi thanh môṭtrang thai mơi hiêṇ hanh. Cờ
tương co luâṭcủa no, va trò chơi sẽ kêt thúc khi môṭngười co đươc trang thai phan
anh sư thăng cuôcp̣ hoăcp̣ hai người rơi vao trang thai hòa cờ. Ta tim cach phân tich
xem từ môṭtrang thai nao đo sẽ dẫn đên đâu thủ nao sẽ thăng vơi điêu kiêṇ ca hai
co trinh đô p̣như nhau. Giai thuâṭMinimax sẽ đươc ap dung vao trong trò chơi cờ
tương. Hai đâu thủ trong trò chơi sẽ đươc goi la MIN va MAX va hai đâu thủ đêu
biêt rõ thông tin trên ban cờ như nhau.
- MAX đai diêṇ cho đâu thủ quyêt danh thăng lơi hoăcp̣ tôi đa hoa ưu thê của minh.
- MIN ngươc lai, cô găng tôi thiêu hoa điêm sô của MAX.
Ban cờ tương cũng chinh la môṭkhông gian trang thai vơi cac mưc va đươc
biêu diên băng cây trò chơi. Môi nút của cây biêu diên cho môṭtrang thai trên ban
cờ. Nút gôc biêu diên trang thai băt đầu van cờ. Cac nút la thê hiêṇ trang thai kêt
thúc của trò chơi (khi môṭđâu thủ gianh phần thăng, thua, hay hai đâu thủ hòa
nhau).
Hai đâu thủ đươc goi la MAX va MIN va luân phiên đi nươc cờ của minh nên
môi mưc trên cây đươc biêu diên luân phiên la MAX va MIN. Cac nút ưng vơi
trang thai ma từ đo đâu thủ MAX chon nươc đi ưng vơi lơp MAX, cac nút ma đâu
thủ MIN chon nươc đi ưng vơi lơp MIN. Vơi môi nươc đi trong ban cờ, tương ưng
vơi cac mưc trên cây, giai thuâṭminimax sẽ định gia trị cho cac nút như sau:
Nêu nút la nút la gan cho nút đo môṭgia trị đê phan anh trang thai
thăng, thua hay hòa của cac đâu thủ
Sử dung gia trị cac nút la đê xac định gia trị của cac nút ơ mưc trên

no:
+ Nút thuôcp̣ lơp MAX gan cho no gia trị lơn nhât trong cac nút la.
+ Nút thuôcp̣ lơp MIN gan cho no gia trị nhỏ nhât trong cac nút la.
Gan gia trị cho từng thê cờ theo quy tăc trên chi rõ gia trị của trang thai tôt
nhât ma môi đâu thủ hi vong đat đươc. Cũng giông như viêcp̣tinh toan nươc đi va
thưc hiêṇ môṭnươc cờ thưc sư của đâu thủ. Giai thuâṭMinimax thê hiêṇ viêcp̣tinh
toan nươc đi tôi ưu cho cac đâu thủ thông qua gia trị của cac nút đươc gan. Trong
môṭnươc cờ, khi đâu thủ MAX đên lươt đi, đâu thủ nay sẽ chon nươc đi ưng vơi
trang thai co gia trị cao nhât trong cac trang thai con, còn đâu thủ MIN sẽ chon môṭ
nươc đi ưng vơi trang thai co gia trị nhỏ nhât trong cac trang thai con.
Tuy nhiên, cờ tương la môṭtrò chơi co thê noi la phưc tap, viêcp̣mơ rôngp̣
không gian trang thai khi ap dung giai thuâṭMinimax co thê găpp̣ kho khăn. Vi thê
4


ma chúng ta chi xét đên viêcp̣triên khai giai thuâṭMinimax vơi trò chơi cờ tương
co mưc đô p̣sâu đươc định trươc (khoang 5 mưc). Viêcp̣định trươc mưc hay đô sp̣ âu
sẽ lam giam thời gian tinh toan cho giai thuâṭva AI (may) sẽ đưa ra đươc môṭ
nươc đi nhanh hơn va chinh xac hơn. Phần sau đây nhóm em sẽ trinh bay vê qua
trinh xây dưng giai thuâṭMinimax.
1.2 Thuật toán MiniMax và AlphaBeta
1.2.1 Thuật tốn MiniMax
1.2.1.1 Mơ tả

5


Giả sửủ̉ chúú́ng ta có một bộ phân tích thế cờầ̀ có thể áp dup̣ng tất cả các luật,
các phương pháp đánh cờầ̀ khác nhau vào từầ̀ng thế cờầ̀ và chuyển đổi chúú́ng thành
một con số đại diện (cho điểm thế cờầ̀). Mặt khác, ta giả sửủ̉ con số đó là dương

khi áp dup̣ng cho thế cờầ̀ củủ̉a một đấu thủủ̉ (được gọi là người chơi cực đại maximizer), và là âm khi áp dup̣ng cho đấu thủủ̉ bên kia (được gọi là người chơi
cực tiểu - minimizer). Quá trình tính tốn cho điểm thế cờầ̀ được gọi là lượng
giá tĩnh (static evaluation). Hàm thực hiện việc tính tốn được gọi là một bộ
lượng giá tĩnh, và giá trịp̣ nhận được gọi là điểm lượng giá tĩnh. Cả hai đấu thủủ̉
đều cố gắng đi như thế nào đó để đạt được điểm tuyệt đối lớn nhất. Ngườầ̀i chơi

cực đại sẽã̃ tìm nhữã̃ng nước đi dẫã̃n đến điểm củủ̉a mình trở nên lớn hơn (hay cao
nhất có thể được) hay điểm củủ̉a đối thủủ̉ bớt âm hơn (nhỏủ̉ hơn về giá trịp̣ tuyệt
đối) . Còầ̀n đấu thủủ̉ củủ̉a anh ta, ngườầ̀i chơi cực tiểu, lại ra sức phản kháng lại, để
dẫã̃n tới điểm âm củủ̉a anh ta béú́ hơn hay điểm dương củủ̉a đối thủủ̉ nhỏủ̉ đi (hình 1).

6


Ví dup̣ một phầầ̀n cây tròầ̀ chơi trong hình 2
Ngườầ̀i chơi cực đại hi vọng chọn nước đi bên phải để đạt được điểm 8.
Thế nhưng nếu đi như vậy thì khi đến lượt đi củủ̉a ngườầ̀i chơi cực tiểu, anh ta sẽã̃
cố gắng không cho ngườầ̀i chơi cực đại đạt được điểm này bằng cách chọn nước
đi nhánh bên trái và như vậy, ngườầ̀i chơi cực đại chỉ được có 1 điểm thay vì 8.
Ngược lại, nếu ngườầ̀i chơi cực đại chọn nước đi bên trái, thì trong tình huống
xấu nhất anh ta vẫã̃n còầ̀n được 2 điểm, lớn hơn là chọn nước đi bên phải. Nói
chung, ngườầ̀i chơi cực đại sẽã̃ phải tìm cách nhận ra các nước đi củủ̉a đối phương
tiếp theo làm cho điểm giảm xuống. Và tương tự như vậy, ngườầ̀i chơi cực tiểu
phải nhận biết được nước đi củủ̉a ngườầ̀i chơi cực đại cố gắng làm tăng điểm lên.
Thủủ̉ tup̣c tìm nước đi tốt nhất trên cây tròầ̀ chơi như trên được gọi là thủủ̉ tup̣c
Minimax do điểm ở mỗi núú́t có thể là điểm cực đại hoặc có thể là điểm cực tiểu
và có thuật tốn như sau:

7



Thuật tốn Minimax
Nếu như đạt đến giới hạn tìm kiếm (đến tầầ̀ng dưới cùầ̀ng củủ̉a cây tìm kiếm),
tính giá trịp̣ tĩnh củủ̉a thế cờầ̀ hiện tại ứng với ngườầ̀i chơi ở đó. Ghi nhớ kết quả
Nếu như mức đang xéú́t là củủ̉a ngườầ̀i chơi cực tiểu, áp dup̣ng thủủ̉ tup̣c Minimax
này cho các con củủ̉a nó. Ghi nhớ kết quả nhỏủ̉ nhất
Nếu như mức đang xéú́t là củủ̉a ngườầ̀i chơi cực đại, áp dup̣ng thủủ̉ tup̣c Minimax
này cho các con củủ̉a nó. Ghi nhớ kết quả lớn nhất.
1.2.1.2 Xây dựng chương trình cho thuật tốn Minimax
Dựa vào phát biểu trên để viết chương trình cho thuật tốn này bằng ngơn
ngữã̃ tựa Java. Đây là một phương thức có tên là Minimax và sẽã̃ là loại đệ qui.
Trước hết, để phương thức này biết đãã̃ đạt đến giới hạn tìm kiếm chưa, ta cầầ̀n
cung cấp cho nó một tham số về độ sâu tìm kiếm depth (để biết phải tìm đến
đâu). Giá trịp̣ trả về củủ̉a hàm chính là điểm củủ̉a thế cờầ̀ (bàn cờầ̀) pos.
Mỗi khi Minmax được gọi, nó sẽã̃ càng gầầ̀n đến giới hạn tìm kiếm, do đó
ta sẽã̃ gọi hàm này với độ sâu bằng độ sâu cũã̃ trừầ̀ đi một. Đạt đến độ sâu giới hạn
chính là khi depth = 0. Khi đạt độ sâu này ta sẽã̃ gọi phương thức lượng giá Eval
để đánh giá chất lượng củủ̉a thế cờầ̀ pos hiện tại (thực hiện điều một củủ̉a thuật
toán). Như vậy bước đầầ̀u phương này có dạng sau:
Public int MinMax (int pos, int depth){
if (depth == 0)
Return Eval (pos)
else{
...
MinMax (pos, depth - 1);
dần
...
}
}
trên, Minmax được gọi với độ sâu giảm đi một. Đó là độ sâu củủ̉a các

thế cờầ̀ là con. Các thế cờầ̀ con pos' đó là các thế cờầ̀ được tạo ra từầ̀ pos bằng cách
đi một nước đi hợp lệ m nào đó. Do đó ta phải có các lệnh thực hiện đi quân để
đến các thế cờầ̀ mới. Để biết từầ̀ thế cờầ̀ pos có thể đi được nhữã̃ng nước nào, ta
dùầ̀ng một thủủ̉ tup̣c Gen có tham số là thế cờầ̀ cha pos. Thủủ̉ tup̣c này sẽã̃ cất các thế
cờầ̀ con pos' đó vào bộ nhớ (dạng danh sách). Việc tiếp theo là ta lấy từầ̀ng thế cờầ̀
đó ra và áp dup̣ng tiếp thủủ̉ tup̣c Minimax cho nó để tính điểm value củủ̉a nó.


8


Vậy phương thức MinMax có dạng:
public int MinMax (int pos, int depth){
if (depth == 0)
return Eval (pos) // Tính giá trị thế cờ pos else{
Gen (pos);
while (còầ̀n lấy được một nước đi m){
pos = Tính thế cờầ̀ mới nhờầ̀ đi m;
value = Minimax (depth-1);
...
}
...
}
}
Theo phát biểu củủ̉a thuật toán, ta thấy các điều 2 và 3 chỉ khác nhau ở
cách chọn kết quả tốt nhất best phup̣ thuộc vào ngườầ̀i chơi đang là ngườầ̀i chơi
cực đại hay cực tiểu. Cuối cùầ̀ng thuật toán sẽã̃ trả về điểm tốt nhất đạt được. Vậy
hàm này được phát triển tiếp thành:
public int MinMax (int pos, int
if (depth == 0){

return Eval (pos)
}
else{
Gen (pos); //Sinh ra mọi nước đi từ thế cờ pos while (còầ̀n lấy
được một nước đi m) {
pos = Tính thế cờầ̀ mới nhờầ̀ đi m;
value = Minimax (pos, depth-1); //Tính điểm của pos
/ Chọn điểm tốt nhất tuỳ thuộc theo người
chơi if (ngườầ̀i chơi là ngườầ̀i cực đại) {
if (value > best) best = value;
}
}
Thông thườầ̀ng để cho tiện (và cũã̃ng rất gầầ̀n sự thực) ta coi cả hai ngườầ̀i
chơi (hai bên) có cùầ̀ng cách đánh giá về một thế cờầ̀. Có điều thế cờầ̀ này là tốt
với một ngườầ̀i thì phải được đánh giá là tồi với ngườầ̀i kia và ngược lại. Trong
máy tính cách thể hiện tốt nhất là ta cho điểm một thế cờầ̀ có thêm dấu âm
9


dương: dấu dương dành cho ngườầ̀i chơi cực đại và dấu âm cho ngườầ̀i chơi cực
tiểu. Với ngườầ̀i chơi cực đại sẽã̃ mong muốn điểm này càng dương càng tốt, còầ̀n
ngườầ̀i chơi cực tiểu lại mong muốn điểm này càng âm càng tốt. Do đó để dễ xửủ̉
lí ta sẽã̃ tuỳ theo mức ngườầ̀i chơi mà đổi dấu giá trịp̣ đánh giá thế cờầ̀ pos. Chúú́ ý
rằng, thay đổi độ sâu là chuyển sang đối phương nên phải đổi dấu. Chương
trình thực hiện đổi dấu như sau:
value = -Minimax (depth-1);

//Tính điểm của pos

Cũã̃ng do dùầ̀ng cùầ̀ng hàm lượng giá nên khi đến lượt ngườầ̀i chơi cực đại

và cực tiểu có cùầ̀ng cái nhìn như nhau về một thế cờầ̀. Điều này dẫã̃n đến có thể
dùầ̀ng cùầ̀ng cách chọn nước đi tốt nhất cho họ (gộp được điều 2 và 3 lại với nhau
được). Giá trịp̣ best cầầ̀n được khởi đầầ̀u rất nhỏủ̉ để đảm bảo không vượt mọi giá trịp̣
value, tốt nhất là giá trịp̣ - vô cùầ̀ng:
Public int MinMax (int pos, int depth){
if depth = 0 then
return Eval (pos); //Trả về giá trị thế cờ pos else{
best = -INFINITY;
Gen (pos);
//Sinh ra mọi nước đi từ thế cờ pos
while (còầ̀n lấy được một nước đi m)
{
pos = Tính thế cờầ̀ mới nhờầ̀ đi m;
value = -MinMax (pos, depth - 1);
if (value > best) best = value;
}
return best;
}
}
Thông thườầ̀ng, bàn cờầ̀ được biểu diễn bằng các biến tồn cup̣c. Do đó thay
cho truyền tham số là một bàn cờầ̀ mới pos vào thủủ̉ thup̣c Minimax thì ngườầ̀i ta
biến đổi ln biến toàn cup̣c này nhờầ̀ thực hiện nước đi "thửủ̉" (nước đi dẫã̃n đến
bàn cờầ̀ mới pos). Sau khi Minimax thực hiện việc tính tốn dựa vào bàn cờầ̀ lưu
ở biến tồn cup̣c thì thuật tốn sẽã̃ dùầ̀ng một số thủủ̉ tup̣c để loại bỏủ̉ nước đi này.
Minimax bỏủ̉ các tham số pos và được xây dựng hoàn chỉnh như sau:
public int MinMax(int depth) {
if (!run) {
return -1;
}
10



int best, i, value;
if (depth == 0) {
return Eval();
} else {
best = -INFINITY;
Gen();
i = gen_begin[ply];
while (i < gen_end[ply]) {
makeMove(gen_dat[i].m);
value = MinMax(depth - 1);
unMakeMove();
if (value > best) {
best = value;
if (ply == 0) {
newMove = gen_dat[i].m;
}
}
++i;
}
return best;
}
}
1.2.1.3 Đánh giá
Nếu hệ số nhánh trung bình củủ̉a cây là b và ta thực hiện tìm kiếm đến độ
sâu d thì số núú́t phải lượng giá ở đáy cây như ta đãã̃ biết là bd. Đây chính là số đo
độ phức tạp củủ̉a thuật toán. Nếu b = 40, d = 4 (các con số thườầ̀ng gặp trong tròầ̀
chơi cờầ̀) thì số núú́t phải lượng giá là 40 4 = 2560000 (trên 2 triệu rưỡã̃i núú́t). Còầ̀n
với b = 40, d = 5 thì số núú́t phải lượng giá sẽã̃ tăng 40 lầầ̀n nữã̃a thành 40 5 =

102400000 (trên 102 triệu núú́t).
Lưu ý: toàn bộ ý tưởng của thuật toán này là dựa trên việc chuyển đổi
mỗi thế cờ thành một con số để đánh giá. Rất tiếc là các con số này thường
không tốt và không đủ để đánh giá hết mọi điều. Mặt khác, thuật tốn này có
thể rất tốn kém (chạy chậm) do việc sinh các nước đi và lượng giá rất tốn thời
gian tính tốn, do vậy độ sâu của cây trò chơi cũng bị hạn chế nhiều. Ta cần có
thêm những cải tiến để cải thiện tình hình.
1.2.2 Thuật tốn cắt tỉa AlphaBeta
1.2.2.1 Mơ tả
Thủủ̉ tup̣c AlphaBeta là một cải tiến thuật toán Minimax nhằm tỉa bớt
nhánh củủ̉a cây tròầ̀ chơi, làm giảm số lượng núú́t phải sinh và lượng giá, do đó có
11


thể tăng độ sâu củủ̉a cây tìm kiếm. Giả sửủ̉ hình 3 là một thế cờầ̀ mà hai núú́t đầầ̀u
tiên đãã̃ được lượng giá. Nếu thực hiện thủủ̉ tup̣c Minimax đối với các núú́t đó sẽã̃
cho thấy ngườầ̀i chơi cực đại đãã̃ được đảm bảo nếu đi nước bên trái sẽã̃ được ít
nhất là 2 điểm dùầ̀ là các lượng giá củủ̉a các núú́t khác cho kết quả như thế nào đi
nữã̃a.

12


13


Bây giờầ̀, ta lại giả sửủ̉ núú́t tiếp theo được lượng giá và cho kết quả là 1. Nếu đi
vào nhánh này thì đối phương sẽã̃ đảm bảo làm điểm củủ̉a ngườầ̀i chơi cực đại không
thể vượt quá được giá trịp̣ 1 dùầ̀ là các lượng giá củủ̉a các núú́t khác cho kết quả như
thế nào đi nữã̃a. Do đó đến đây, nước đi tốt nhất là chọn nước đi bên trái với đảm

bảo là ít nhất đạt được 2 điểm. Và do đó, hồn tồn khơng cầầ̀n thiết phải lượng giá
núú́t còầ̀n lại.

14


Ngun tắc Alpha-Beta
Nếu biết điều đó thật sự tồi thì đừng mất thời gian tìm hiểu nó sẽ tồi tệ
đến đâu
Ý tưởng này được gọi là nguyên tắc Alpha-Beta do nó dùầ̀ng trong thủủ̉ tup̣c
AlphaBeta (ta sẽã̃ xéú́t dưới đây). Hai tham số củủ̉a thủủ̉ tup̣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ịp̣ 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 địp̣nh chính xác giá trịp̣ tại núú́t cha, ơng nó. Như trên nói, một
cách để tiện theo dõã̃i q trình tính tố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ủủ̉ tup̣c AlphaBeta được bắt đầầ̀u tại núú́t
gốc với giá trịp̣ củủ̉a alpha là -vôcùầ̀ng và beta là +vơcùầ̀ng. Thủủ̉ tup̣c sẽã̃ tự gọi đệ
quy chính nó với khoảng cách giữã̃a các giá trịp̣ alpha và beta ngày càng hẹp hơn.

15


Thuật toán AlphaBeta
Nếu mức đang xéú́t là đỉnh (gốc cây), đặt giá trịp̣ củủ̉a alpha
là -vôcùầ̀ng và beta là +vôcùầ̀ng
*Nếu như đạt đến giới hạn tìm kiếm (đến tầầ̀ng dưới cùầ̀ng củủ̉a cây tìm

kiếm), tính giá trịp̣ tĩnh củủ̉a thế cờầ̀ hiện tại ứng với ngườầ̀i chơi ở
đó. Ghi lại kết quả
*

Nếu như mức đang xéú́t là củủ̉a ngườầ̀i chơi cực tiểu.
o Thực hiện các công việc sau cho đến khi tất cả các con
củủ̉a nó đãã̃ được xéú́t với thủủ̉ tup̣c AlphaBeta hoặc cho đến
khi alpha là bằng hoặc lớn hơn beta.
- Áp dup̣ng thủủ̉ tup̣c AlphaBeta với giá trịp̣ alpha
và beta hiện tại cho một con. Ghi nhớ lại
kết quả.
- So sánh giá trịp̣ ghi nhớ với giá trịp̣ beta, nếu
giá trịp̣ đó nhỏủ̉ hơn thì đặt beta bằng giá trịp̣ mới
này.
o Ghi nhớ lại beta

*Nếu như mức đang xéú́t là củủ̉a ngườầ̀i chơi cực đại,
o Thực hiện các công việc sau cho đến khi tất cả các con
củủ̉a nó đãã̃ được xéú́t với thủủ̉ tup̣c AlphaBeta hoặc cho đến
khi alpha là bằng hoặc lớn hơn beta.
- Áp dup̣ng thủủ̉ tup̣c AlphaBeta với giá trịp̣ alpha
và beta hiện tại cho một con. Ghi nhớ lại
kết quả.
- So sánh giá trịp̣ ghi nhớ với giá trịp̣ alpha,
nếu giá trịp̣ đó lớn hơn thì đặt alpha bằng giá
trịp̣ mới này.
o Ghi nhớ lại alpha.

16



1.2.2.2 Xây dựng chương trình cho thuật tốn AlphaBeta
Từầ̀ phát biểu trên ta sẽã̃ xây dựng hàm AlphaBeta bằng ngôn ngữã̃ tựa
Pascal. Hàm này sẽã̃ có dạng khai báo như dưới, trong đó depth là độ sâu tìm
kiếm, INFINITY là giá trịp̣ vơ cùầ̀ng, thuật tốn tính tốn dựa trên thế cờầ̀ hiện tại
pos là các biến toàn cup̣c:
public int AlphaBeta(int alpha, int beta, int depth) {
if (!run) {
return 0;
}
int best, value, i;
if (depth == 0) {
return Eval();
} else
{ Gen
();
best = -INFINITY;
i = gen_begin[ply];
while (i < gen_end[ply] && best < beta) {
if (best > alpha) {
alpha = best;
}
if (makeMove(gen_dat[i].m)) {
value = 1000 - ply;
} else {
value = -AlphaBeta(-beta, -alpha, depth - 1);
}
unMakeMove();
if (value > best) {
best = value;

if (ply == 0) {
newMove = gen_dat[i].m;
}
}
++i;
}
return best;
}
}

17


Cũã̃ng tương tự như thuật toán Minimax ta đãã̃ gộp hai mup̣c 2 và 3 làm một
nhờầ̀ việc đổi dấu thích hợp. So với thuật tốn Minimax thì trong thuật toán
AlphaBeta đãã̃ đưa thêm hai biến alpha, beta làm hai mức ngưỡã̃ng. Ta thấy cứ
mỗi khi best >= beta thì thuật tốn khơng thực hiện tiếp vòầ̀ng lặp, có nghĩa là nó
khơng chịp̣u mở rộng tiếp nhữã̃ng nhánh còầ̀n lại nữã̃a. Các nhánh đó đãã̃ bịp̣ cắt bỏủ̉ và do đó ta sẽã̃ tiết kiệm được thờầ̀i gian. Việc cắt bỏủ̉ này hồn tồn an tồn với
nhữã̃ng lí do ta đãã̃ xéú́t ở trên. Ta thấy rằng mỗi lầầ̀n hàm này được gọi thì chỉ có
tham số beta được dùầ̀ng để so sánh cắt bỏủ̉, còầ̀n tham số alpha không được dùầ̀ng.
Tuy nhiên khi áp dup̣ng cùầ̀ng thuật toán cho cây con thì ta đãã̃ hốn vịp̣ hai giá trịp̣
alpha, beta cho nhau (và đảo cả dấu), do đó alpha sẽã̃ có tác dup̣ng trong độ sâu
sau, rồi độ sâu sau nữã̃a lại đến lượt beta... Nói cách khác, một giá trịp̣ chỉ luôn
ảnh hưởng đến ngườầ̀i chơi cực đại, còầ̀n giá trịp̣ kia lại luôn ảnh hưởng đến ngườầ̀i
chơi cực tiểu. Chúú́ng là các ngưỡã̃ng củủ̉a họ (ngưỡã̃ng giữã̃a các nước đi được chấp
nhận và không chấp nhận). Nhữã̃ng nước đi cầầ̀n quan tâm phải nằm lọt giữã̃a hai
giá trịp̣ này. Dầầ̀n dầầ̀n khoảng cách giữã̃a hai giá trịp̣ alpha - beta càng ngày càng thu
hẹp và dẫã̃n đến các nhánh cây có giá trịp̣ nằm ngồi khoảng này nhanh chóng bịp̣
cắt bỏủ̉ (hình 4).


1.2.2.3 Đánh giá
Trong điều kiện lí tưởng, thuật tốn AlphaBeta chỉ phải xéú́t số núú́t theo
công thức:

Với b = 40 và d = 4 ta có số núú́t phải xéú́t là 2x402 - 1 = 3199. Như vậy
trong điều kiện lí tưởng thì số núú́t phải xéú́t nhờầ̀ AlphaBeta (chỉ khoảng 3 nghìn
núú́t) ít hơn thuật toán Minimax (hơn 2,5 triệu núú́t) là 2560000 / 3199 khoảng
800 lầầ̀n. Còầ̀n với b = 40 và d = 5 ta có số núú́t phải xéú́t là 40 3 + 405/2 - 1 =
64000+10119- 1 = 74118. Số núú́t phải xéú́t nhờầ̀ AlphaBeta ít hơn thuật tốn
Minimax (hơn 102 triệu núú́t) là 102400000/74118 = 1382 lầầ̀n.
18


Dưới đây là bảng so sánh số núú́t phải xéú́t giữã̃a hai thuật tốn Minimax và
AlphaBeta.

Đ


u
1
2
3
4
5
6
7
8
Ta có thể nhận xéú́t như sau:
Số lầầ̀n tăng số núú́t khi tăng độ sâu củủ̉a Minimax luôn là hệ số phân nhánh

b, trong trườầ̀ng hợp này là 40. Số lầầ̀n tăng củủ̉a AlphaBeta ít hơn nhiều:
chỉ cỡã̃ 1.7 lầầ̀n khi tăng từầ̀ d lẻ sang d chẵn và 23.2 lầầ̀n khi từầ̀ d chẵn sang
lẻ - trung bình chỉ tăng khoảng hơn 6 lầầ̀n khi tăng d
Số núú́t củủ̉a AlphaBeta tăng chậm hơn rất nhiều lầầ̀n so với Minimax. Tỉ
số núú́t phải xéú́t giữã̃a hai thuật tốn này càng cao khi d càng lớn.
Cơng thức tính số núú́t cho thấy số núú́t phải xéú́t khi dùầ̀ng AlphaBeta ít hơn
nhiều so với Minimax nhưng vẫã̃n là hàm số mũã̃ và vẫã̃n dẫã̃n tới bùầ̀ng nổ tổ hợp.
Thuật tốn AlphaBeta hồn tồn khơng chống được bùng nổ tổ hợp mà chỉ
làm giảm tốc độ bùng nổ. Tuy trong thực tế số núú́t phải xéú́t (lượng giá) thườầ̀ng
nhiều hơn trong điều kiện lí tưởng nhưng nó vẫã̃n đủủ̉ để tiết kiệm khá nhiều thờầ̀i
gian. Trong cùầ̀ng một khoảng thờầ̀i gian, thuật tốn AlphaBeta có thể tìm đến độ
sâu gấp hai lầầ̀n độ sâu tìm kiếm bằng Minimax. Hình 5 là đồ thịp̣ so sánh giữã̃a
hai thuật tốn này.
19


Ví dup̣: Ta sẽã̃ xem xéú́t thuật tốn AlphaBeta hoạt động như thế nào đối với
cây tròầ̀ chơi như trong hình 6.

20


Cây này có độ sâu bằng 3 và hệ số phân nhánh bằng 3. Các thứ tự kết
luận (các con số bên trái) được đưa ra như sau:
1-2 Tìm kiếm đi xuống dưới theo nhánh trái cho đến lá. Ở đây giá trịp̣ tĩnh
thu được là 8. Giá trịp̣ đầầ̀u tiên này do ngườầ̀i chơi cực đại được phéú́p
chọn trong ba giá trịp̣ ở nhánh này đãã̃ đảm bảo rằng là kết quả thu được
sẽã̃ ít nhất là bằng 8. Điều lưu ý này được bước 2 ghi lại.
3-5 Để chắc chắn khơng còầ̀n có điểm nào cao hơn 8, ngườầ̀i chơi cực đại
phải xéú́t cả hai thế cờầ̀ còầ̀n lại và thu được các giá trịp̣ 7 và 2. Do đó đến

đây đãã̃ kết luận chính xác điểm cao nhất có thể đạt được ở cây con là
đúú́ng bằng 8.
6.
Leo lên một tầầ̀ng cây. Đây là các nước đi củủ̉a ngườầ̀i chơi cực tiểu.
Ta không hi vọng anh ta cho ngườầ̀i chơi cực đại được nhiều điểm nên
có thể tạm kết luận ở mức này là sẽã̃ đạt được nhiều nhất là 8 điểm.
7-8. Để xem ngườầ̀i chơi cực tiểu còầ̀n lựa chọn nào tốt hơn (và tồi tệ hơn cho
ngườầ̀i chơi cực đại) ta phải xem xéú́t cả hai nước đi còầ̀n lại. Nước đi còầ̀n
lại đầầ̀u tiên dẫã̃n đến giá trịp̣ lượng giá tĩnh là 9 - một giá trịp̣ lớn hơn 8.
Như vậy nhánh giữã̃a là tồi tệ hơn cho ngườầ̀i chơi cực tiểu. Đến đây việc
cắt bỏủ̉ được thực hiện - đừầ̀ng hòầ̀ng ngườầ̀i chơi cực đại với tới được
điểm đó khi đãã̃ có sẵn lựa chọn thấp hơn cho anh ta (là 8). Điều này
cũã̃ng dẫã̃n đến không cầầ̀n thiết phải xéú́t hai núú́t còầ̀n lại - đằng nào nhánh
giữã̃a cũã̃ng đủủ̉ tồi tệ rồi và ngườầ̀i chơi cực tiểu sẽã̃ khơng chọn nó để đi.
9-

Ngườầ̀i chơi cực tiểu cầầ̀n phải khảo sát tiếp lựa chọn cuối cùầ̀ng.
14. Cách làm tương tự như phầầ̀n trên. Ở đây phải lượng giá cả ba núú́t cây và
kết luận cuối cùầ̀ng được đưa ra là ngườầ̀i chơi cực đại đi giỏủ̉i lắm thì chỉ
đạt được 4 điểm.
15. Như vậy nhờầ̀ việc khảo sát nhánh cây bên phải ngườầ̀i chơi cực tiểu thấy
rằng nếu chọn đi theo nhánh này thì ngườầ̀i chơi cực đại chỉ được có 4
điểm thay cho 8.
16. Bây giờầ̀ ta có thể kết luận ở mức trên cùầ̀ng. Mức này là củủ̉a ngườầ̀i chơi
cực đại. Anh ta thấy rằng nếu chọn đi theo nhánh trái thì được 4 điểm.
Như vậy anh ta đãã̃ chắc chắn điểm củủ̉a mình sẽã̃ ít nhất là 4 rồi. Để
xem liệu có thể đạt được điểm cao hơn nữã̃a hay không cầầ̀n phải xem xéú́t
hai nhánh còầ̀n lại.
17Tương tự như phầầ̀n trên, ta kết luận nhánh giữã̃a sẽã̃ mang lại cho
30. ngườầ̀i chơi cực đại 5 điểm. 31. Cũã̃ng tương tự như kết luận 16, ở đây ta

kết luận khả quan hơn là ngườầ̀i chơi cực đại đãã̃ cầầ̀m chắc 5 điểm và có
thể còầ̀n cao hơn.
32Ta kết luận được rất nhanh là cây con bên phải chỉ cho "thu
21


38

39.

hoạch" nhiều nhất là 3 điểm - một điểm số q kéú́m do đó thuật tốn
khơng buồn xem xéú́t các trườầ̀ng hợp còầ̀n lại nữã̃a. Do đó đãã̃ tiết kiệm
được 6 núú́t không cầầ̀n phải lượng giá và cũã̃ng không phải sinh nước đi
cho hai trườầ̀ng hợp.
Kết luận cuối cùầ̀ng là điểm cao nhất mà ngườầ̀i chơi cực đại có thể thu
được là 5 điểm nhờầ̀ chọn đi theo nhánh giữã̃a.

22


×