Tải bản đầy đủ (.doc) (25 trang)

Chiến lược minimax và phương pháp cắt tỉa alpha-beta

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 (501.23 KB, 25 trang )

TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂN
KHOA CÔNG NGHỆ THÔNG TIN
…………………………
BÀI TẬP LỚN
TRÍ TUỆ NHÂN TẠO
ĐỀ TÀI:
CHIẾN LƯỢC MINIMAX VÀ PHƯƠNG PHÁP CẮT TỈA
ALPHA-BETA
Giáo viên hướng dẫn :
Sinh viện thực hiện :
Hà Nội
LỜI MỞ ĐẦU
Ngày nay, vấn đề giải trí là một phần tất yếu của cuộc sống. Một đóng góp
không nhỏ cho phần tất yếu đấy chúng ta không thể không thể không nhắc tới
các trò chơi như cờ vua, cờ tướng….
Để giúp mọi người chơi tốt các trò chơi này, ta sẽ xây dựng một cây trò
chơi bao gồm tất cả các nước đi có thể của cả hai đấu thủ và các cấu hình bàn
cờ là kết quả của các nước đi đó. Ta có thể tìm kiếm trên cây này để có được
một chiến lược chơi hiệu quả. Dạng bài toán này có đặc điểm độc nhất vô nhị
là ta phải tính đến mọi nước đi mà đối thủ của ta có thể sử dụng. Để làm điều
này, các chương trình máy tính chơi cờ, cũng như các dạng khác của trí tuệ
nhân tạo như lập kế hoạch tự động (machine planning), thường sử dụng các
thuật toán tìm kiếm như thuật toán minimax, tỉa cây tìm kiếm, và tỉa cây
alpha-beta (alpha-beta pruning). Để hiểu sâu hơn về các nước đi này em đã
chọn “Chiến lược minimax và phương pháp cắt tỉa alpha-beta” làm đề tài
nghiên cứu.
Em xin chân thành cảm ơn thầy Lưu Minh Tuấn đã trang bị cho em những
kiến thức cần thiết qua môn “Trí tuệ nhân tạo” để có thể hoàn thành bài viết
này.
Tuy nhiên do thời gian cùng với trình độ hiểu biết còn hạn hẹp nên khó
tránh khỏi những thiếu sót. Rất mong nhận được sự đóng góp của quý thầy cô


và các bạn để bài viết được hoàn thiện hơn.
Xin chân thành cảm ơn!
CHƯƠNG I: CHIẾN LƯỢC MINIMAX
I. Giới thiệu chung.
I.1. Khái quát về minimax.
Minimax (còn gọi là minmax) là một phương pháp trong lý thuyết quyết
định có mục đích là tối thiểu hóa (minimize) tổn thất vốn được dự tính có thể
là "tối đa" (maximize). Có thể hiểu ngược lại là, nó nhằm tối đa hóa lợi ích
vốn được dự tính là tối thiểu (maximin). Nó bắt nguồn từ trò chơi có tổng
bằng không. Nó cũng được mở rộng cho nhiều trò chơi phức tạp hơn và giúp
đưa ra các quyết định chung khi có sự hiện diện của sự không chắc chắn.
Một phiên bản của giải thuật áp dụng cho các trò chơi như tic-tac-toe, khi
mà mỗi người chơi có thể thắng, thua, hoặc hòa. Nếu người chơi A có thể
thắng trong 1 nước đi, thì "nước đi tốt nhất" chính là nước đi để dẫn đến kết
quả thắng đó. Nếu người B biết rằng có một nước đi mà dẫn đến tình huống
người A có thể thắng ngay ở nước đi tiếp theo, trong khi nước đi khác thì sẽ
dẫn đến tình huống mà người chơi A chỉ có thể, tốt nhất, là hòa thì nước đi tốt
nhất của người B chính là nước đi sau.
Ta sẽ nắm rõ, thế nào là một nước đi "tốt nhất". Giải thuật Minimax giúp
tìm ra đường đi tốt nhất, bằng cách đi ngược từ cuối trò chơi trở về đầu. Tại
mỗi bước, nó sẽ ước định rằng người A đang cố gắng tối đa hóa cơ hội thắng
của A khi đến phiên anh ta, còn ở nước đi kế tiếp thì người chơi B cố gắng để
tổi thiểu hóa cơ hội thắng của người A (nghĩa là tối đa hóa cơ hội thắng của
B).
I.2. Tiêu chuẩn Minimax trong lý thuyết quyết định thống kê.
Trong lý thuyết quyết định thống kê cổ điển, ta có một đánh giá δ được
dùng để đánh giá một tham số . Chúng ta cũng giả sử có một hàm rủi ro
R(θ,δ), thường được cho như là một tích phân của một hàm thua lỗ. Trong cấu
trúc này, được gọi là minimax nếu như nó thỏa mãn
.

Một tiêu chuẩn khác trong lý thuyết quyết định là đánh giá Bayes với sự hiện
diện của một phân bố cho trước Π. Một đánh giá là Bayes nếu như nó làm tối
thiểu rủi ro trung bình
.
I.3. Định lý Minimax với các bước đi liên tiếp.
Trong ví dụ sau đây của một trò chơi tổng bằng 0, khi A và B đi các bước
cùng một lúc, minh họa thuật toán minimax. Nếu như mỗi người chơi có 3
chọn lựa và ma trận lợi cho A là:
B chọn B1 B chọn B2 B chọn B3
A chọn A1 +3 -2 +2
A chọn A2 -1 0 +4
A chọn A3 -4 -3 +1
và B có ma trận lợi như nhau nhưng ngược dấu (i.e. nếu các lựa chọn là
A1 và B1 thì B trả 3 cho A) sau đó lựa chọn minimax đơn giản cho A là A2
bởi vì kết quả xấu nhất là sau khi phải trả 1, trong khi lựa chọn minimax đơn
giản cho B là B2 bởi vì kết quả xấu nhất là sau đó không phải trả gì cả. Tuy
vậy, lời giải này là không ổn định, bởi vì nếu B tin rằng A sẽ chọn A2 thì B sẽ
chọn B1 để thắng 1; sau đó nếu A tin rằng B sẽ chọn B1 thì A sẽ chọn A1 để
thắng 3; và sau đó B sẽ chọn B2; và cuối cùng cả hai người chơi sẽ nhận ra sự
khó khăn của việc chọn lựa. Do đó một chiến lược ổn định hơn là cần thiết.
Một số chọn lựa bị thống trị bởi những người khác và có thể bị loại bỏ : A
sẽ không chọn A3 bởi vì hoặc A1 hay A2 sẽ sinh ra một kết quả tốt hơn, bất
kể là B chọn gì; B sẽ không chọn B3 bởi vì B2 sẽ sinh ra kết quả tốt hơn, bất
kể là A chọn cái gì.
A có thể tránh việc phải trả số lượng dự định (expected payment) hơn 1/3
bằng cách chọn A1 với xác suất 1/6 và A2 với xác suất 5/6, bất kể là B đã
chọn gì. B có thể tính chắc phần lợi dự định (expected gain) ít nhất 1/3 bằng
cách sử dụng một chiến thuật ngẫu nhiên của việc chọn B1 với xác suất 1/3 và
B2 với xác suất 2/3, bất kể là A chọn gì. Những chiến lược minimax hỗn hợp
bây giờ là ổn định và không thể nào cải tiến nữa.

John von Neumann chứng minh định lý Minimax vào năm 1928, phát biểu
rằng những chiến lược như vậy luôn luôn tồn tại trong những trò chơi tổng
bằng không cho hai người chơi và có thể tìm ra bằng cách giải một tập hợp
các phương trình trong cùng một lúc.
I.4. Minimax khi gặp sự không chắc chắn.
Lý thuyết minimax đã được mở rộng ra các quyết định khi mà không có
người chơi khác, nhưng các hậu quả của các quyết định dựa trên những sự
kiện không biết trước. Chẳng hạn, quyết định tương lai phát đạt của một mỏ
khoáng chất kèm theo đuôi một giá phải trả nếu như không có khoáng sản ở
nơi muốn thăm dò, nhưng sẽ đem lại mối lợi lớn nếu có. Một tiếp cận là đối
xử việc này như một trò chơi chống với Tự nhiên, và sử dụng một suy nghĩa
giống như là luật Murphy, theo một tiếp cận làm tối thiểu các tổn thất dự định
cực đại (maximum expected loss), sử dụng các kỹ thuật giống như trong
những trò chơi hai người với tổng bằng không.
Thêm vào đó, các cây expectiminimax đã được phát triển, cho những trò
chơi trong đó sự ngẫu nhiên (ví dụ, thảy xúc xắc) là một yếu tố.
I.5. Giải thuật Minimax với các nước đi khác nhau .
Một thuật toán minimax là một thuật toán đệ quy cho việc lựa chọn bước
đi kế tiếp trong một trò chơi có hai người chơi. Một giá trị được gán cho mỗi
vị trí hay một trạng thái của trò chơi. Giá trị này được tính toán bằng một hàm
tính giá trị vị trí và nó cho biết độ tốt nếu như một người chơi đạt được đến
đó. Người chơi sau đó đi một bước làm tối đa giá trị tối thiểu của vị trí là kết
quả từ tập hợp những bước đi có thể của đối thủ. Nếu đó là phiên A sẽ đi, A
sẽ cho một giá trị cho mỗi bước đi hợp pháp của anh ta.
Một phương pháp bố trí là gán cho một số vị trí thắng cho A như là +1 và
cho B là −1. Điều này sẽ dẫn đến lý thuyết trò chơi tổ hợp được phát triển bởi
John Horton Conway.
Một cách khác là sử dụng một quy định rằng nếu như kết quả của một
bước đi là một chiến thắng lập tức cho A nó được gán dương vô hạn và, nếu
như là một chiến thắng lập tức cho B, âm vô hạn. Giá trị cho A của bất kì

nước đi nào khác là giá trị minimum của các giá trị kết quả từ mỗi bước trả lời
có thể của B. (A được gọi là người chơi là cực đại và B gọi là người chơi làm
cực tiểu), do vậy được gọi là thuật toán minimax. Thuật toán trên sẽ gán một
giá trị dương hay âm vô hạn cho mỗi vị trí bởi vì giá trị của mỗi vị trí sẽ là giá
trị của một số vị trí thắng hay thua nào đó. Thông thường nhìn chung điều này
chỉ có thể xảy ra tại điểm cuối của những trò chơi phức tạp như cờ vua hay cờ
vây, bởi vì về mặt tính toán ta không có khả năng tính xa đến mức kết thúc trò
chơi, trừ khi là trò chơi sắp kết thúc, và các vị trí không đi khác nhau được
cho các giá trị hữu hạn như là các đánh giá về mức độ tin tưởng là chúng sẽ
dẫn đến chiến thắng cho người này hay người khác.
Điều này có thể được mở rộng nếu như chúng ta cung cấp một hàm đánh
giá heuristic đưa ra các giá trị cho các vị trí trò chơi chưa phải là cuối cùng
mà không xét tất cả mọi trường hợp theo sau một chuỗi đầy đủ. Chúng ta sau
đó có thể giới hạn thuật toán minimax để chỉ xét một số nào đó các nước đi kế
tiếp. Số này được gọi là "số bước kế tiếp", đo bằng "ply". Ví dụ, "Deep Blue"
nhìn trước 12 ply.
Thuật toán này có thể được nghĩ như là khám phá các node của một cây
trò chơi. Số cắt xén hiệu quả của một cây là trung bình của số các con của mỗi
nốt (i.e., trung bình của các nước đi hợp pháp trong một vị trí). Số lượng các
nodes được khám phá thường là tăng theo hàm mũ với số lượng ply (nó sẽ
nhỏ hơn hàm mũ nếu đánh giá các nước đi bắt buộc hay là các bước lặp lại).
Số lượng các nodes cần khám phá cho việc phân tích một trò chơi do đó gần
bằng số cắt xét nâng lên luỹ thừa số ply. Do vậy là không thể phân tích trò
chơi ví dụ như cờ vua một cách hoàn toàn chỉ bằng thuật toán minimax. Sự
trình diễn của thuật toán minimax ngây thơ có thể được cải tiến đáng kể, mà
không ảnh hưởng đến kết quả, bằng cách sử dụng cắt xén alpha-beta. Các
phương pháp cắt xén heuristic khác cũng có thể được sử dụng, nhưng không
phải tất cả chúng bảo đảm sẽ cho kết quả giống nhau như là tìm kiếm không
cắt xén.
I.6. Mô tả thuật toán minimax.

Giả sử chúng ta có một bộ phân tích thế cờ có thể áp dụ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 dụ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 dụ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 toá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 toán được
gọi là một bộ lượng giá tĩnh, và giá trị 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ị 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 âm hơn hay điểm
dương của đối thủ nhỏ đi (hình dưới đây).
II. Thuật toán Minimax.
II.1. Mô tả.
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ủ tụ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ủ tụ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 toán như sau:
- 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ị 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 dụng thủ tụ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 dụng thủ tục
Minimax này cho các con của nó.
- Ghi nhớ kết quả lớn nhất.
II.2. Viết chương trình cho thuật toán Minimax.
Bây giờ, ta thử dựa vào phát biểu trên để viết chương trình cho thuật toán
này bằng ngôn ngữ tựa Pascal. Đây là một hàm có tên là Minimax và sẽ là
loại đệ qui. Trước hết, để hàm 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), đồng thời ta cũng phải cho biết thế cờ hiện tại pos để nó từ đó nó
biết cách tính tiếp. Giá trị trả về của hàm chính là điểm của thế cờ (bàn cờ)
pos. Vậy hàm sẽ có khai báo dạng:
Code:
function Minimax (pos, depth): integer;
// Mỗi khi Minimax đượ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 hàm 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 hàm này có dạng sau:
Code:
function Minimax (pos, depth): integer;
begin
if depth = 0 then { Đã đạt đến giới hạn }
Minimax := Eval (pos) { Tính giá trị thế cờ pos }
else begin

Minimax (pos, depth - 1); { Gọi đệ qui với độ sâu giản dần}


end;
end;
// Ở trên, Minimax đượ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ủ tục Gen có tham số là thế cờ cha pos. Thủ tụ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 dụng tiếp thủ tục Minimax cho nó để tính điểm value của nó.
Vậy hàm Minimax bây giờ có dạng:
Code:
function Minimax (pos, depth): integer;
begin
if depth = 0 then
Minimax := Eval (pos) { Tính giá trị thế cờ pos }
else begin
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 do
begin
pos := Tính thế cờ mới nhờ đi m;
value := Minimax (pos, depth-1); { Tính điểm của pos }

end;

end;
end;
// 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 phụ 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:

Code:
function Minimax (pos, depth): integer;
begin
if depth = 0 then
Minimax := Eval (pos) { Tính giá trị thế cờ pos }
else begin
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 do
begin
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 then
begin
if best < value then best := value;
end
else begin
if best > value then best := value;
end
end;
Minimax := best; { Trả về giá trị tốt nhất }
end;
end;
// 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
dương: dấu âm 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ị đá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:
Code:
value := -Minimax (pos, 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ị best cần được khởi đầu rất nhỏ để đảm bảo không vượt
mọi giá trị value, tốt nhất là giá trị -vô cùng:
Code:
function Minimax (pos, depth): integer;
begin
if depth = 0 then
Minimax := Eval (pos) { Tính giá trị thế cờ pos }
else begin
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 do
begin
pos := Tính thế cờ mới nhờ đi m;
value := -Minimax (pos, depth - 1);
if value > best then best := value;
end;
Minimax := best;
end;
end;
//Thông thường, bàn cờ được biểu diễn bằng các biến toàn cục. Do đó thay
cho truyền tham số là một bàn cờ mới pos vào thủ thục Minimax thì người ta
biến đổi luôn biến toàn cụ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 toán dựa vào bàn cờ
lưu ở biến toàn cục thì thuật toán sẽ dùng một số thủ tục để loại bỏ nước đi
này. Như vậy Minimax bỏ các tham số pos như sau:
Code:
function Minimax (depth): integer;
begin
if depth = 0 then Minimax := Eval { Tính thế cờ pos trong biến toàn cục }
else begin
best := -INFINITY;
Gen; { Sinh ra mọi nước đi từ thế cờ pos }
while còn lấy được một nước đi m do
begin
thực hiện nước đi m;
value := -Minimax (depth - 1);
bỏ thực hiện nước đi m;
if value > best then best := value;
end;
Minimax := best;
end;
end;
Thuật toán Minimax với việc đảo dấu mỗi khi thay đổi độ sâu như trên đôi
khi được gọi là thuật toán Negamax.
II.3. Đánh giá thuật toán minimax.
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 toá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 toá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.
CHƯƠNG II: PHƯƠNG PHÁP CẮT TỈA
ALPHA—BETA
I. Giới thiệu chung.
1.1. Khái quát về thủ tục Alpha-beta.
Tìm kiếm Alpha-Beta là phương pháp làm giảm số nút cần phải xét tới
trong chiến lược Minimax. Nó giảm thời gian cần thiết của việc tìm kiếm
và phải được giới hạn để không lãng phí thời gian tìm kiếm những nước đi
đã bất lợi rõ rệt cho người chơi. Việc thi hành chính xác của alpha-beta ghi
lại nước đi tốt nhất cho mỗi bên khi nó duyệt cây.
Chúng ta thực hiện theo cùng cách với thuật giải minimax. Với những nút
MIN, điểm số được tính bắt đầu từ dương vô cực và giảm dần. Với những
nút MAX, điểm số được tính bắt đầu từ âm vô cực và tăng dần.
Hiệu quả của thủ tục Alpha-Beta dựa trên thứ tự kiểm tra những hậu duệ
của một nút. Nếu chúng ta may mắn, tại nút MIN chúng ta sẽ luôn xem xét
những nút theo thứ tự điểm từ thấp đến cao và tại nút MAX, các nút theo
thứ tự điểm từ cao đến thấp. Nói chung, có thể diễn đạt rằng trong hầu hết
trường hợp thuận lợi, phép tìm kiếm alpha-beta mở ra nhiều lá tương
đương với một cây trò chơi minimax có độ sâu gấp đôi.
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ị 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 đó, hoàn toàn không cần
thiết phải lượng giá nút còn lại.
1.2. Nguyên tắc Alpha-beta.

Ý tưởng này được gọi là nguyên tắc Alpha-Beta do nó dùng trong thủ tục
AlphaBeta (ta sẽ xét dưới đây). Hai tham số của thủ tụ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ị 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 định chính xác giá trị tại nút cha, ông nó. Như trên nói,
một cách để tiện theo dõi quá trình tính toá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ủ tục AlphaBeta được bắt
đầu tại nút gốc với giá trị của alpha là -vôcùng và beta là +vôcùng. Thủ tục sẽ
tự gọi đệ quy chính nó với khoảng cách giữa các giá trị alpha và beta ngày
càng hẹp hơn.
II. Thuật giải Alpha-beta.
2.1. Viết chương trình cho thuật giải Alpha-beta.
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ị vô cùng, thuật toán tính toán dựa trên thế cờ hiện
tại pos là các biến toàn cục:
Code:
function AlphaBeta(alpha, beta, depth): integer;
begin
if depth = 0 then
AlphaBeta := Eval { Tính giá trị thế cờ pos }
else begin
best := -INFINITY;
Gen; { Sinh ra mọi nước đi từ vị trí pos }
while (còn lấy được một nước đi m) and (best < beta) do

begin
if best > alpha then alpha := best;
thực hiện nước đi m;
value := -AlphaBeta(-beta, -alpha, depth-1);
bỏ thực hiện nước đi m;
if value > best then best := value;
end;
AlphaBeta := best;
end;
end;
Lời gọi thủ tục AlphaBeta đầu tiên với độ sâu tìm kiếm 4 và thế cờ hiện tại
pos có dạng như sau:
Code:
AlphaBeta(-INFINITY, +INFINITY, 4);
// Cũng tương tự như thuật toán Minimax ta đã gộp hai mục 2 và 3 làm một
nhờ việc đổi dấu thích hợp. So với thuật toá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 toán không thực hiện tiếp vòng lặp, có nghĩa là
nó không chịu mở rộng tiếp những nhánh còn lại nữa. Các nhánh đó đã bị cắt
bỏ - và do đó ta sẽ tiết kiệm được thời gian. Việc cắt bỏ này hoàn toàn an toà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 dụng cùng thuật toán cho cây con thì ta đã hoán
vị hai giá trị alpha, beta cho nhau (và đảo cả dấu), do đó alpha sẽ có tác dụ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ị chỉ luôn ảnh hưởng đến người chơi cực đại, còn giá trị 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ị này. Dần dần khoảng cách giữa hai giá trị
alpha - beta càng ngày càng thu hẹp và dẫn đến các nhánh cây có giá trị nằm

ngoài khoảng này nhanh chóng bị cắt bỏ (hình 1.7).
2.2. Đánh giá thuật toán AlphaBeta
Trong điều kiện lí tưởng, thuật toán AlphaBeta chỉ phải xét số nút theo công
thức:
=
với d chẵn
=
với d lẻ
Với b = 40 và d = 4 ta có số nút phải xét là 2x40^2 - 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 + 40^(5/2) - 1 =
64000+10119-1 = 74118. Số nút phải xét nhờ AlphaBeta ít hơn thuật toán
Minimax (hơn 102 triệu nút) là 102400000/74118 = 1382 lần.
2.3. So sánh với thuật toán minimax
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 toá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 toán AlphaBeta hoàn toà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 toá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 dưới đây
là đồ thị so sánh giữa hai thuật toán này.

KẾT LUẬN
Do bùng nổ tổ hợp quá lớn của cây trò chơi mà cả người và máy không thể
(và không bao giờ) có thể tìm kiếm vét cạn (hết mọi khả năng). Do đó phương
pháp tìm kiếm duy nhất là chỉ tìm kiếm đến một độ sâu giới hạn nào đó và
chọn nước đi dẫn đến một thế cờ có lợi nhất cho mình. Do phải tính cả khả
năng chống trả của đối phương nên ta không dùng được các thuật toán tìm
kiếm thông thường. Phải dùng một thuật toán tìm kiếm riêng cho cây trò chơi.
Đó là thuật toán Minimax và cải tiến của nó là AlphaBeta. Tuy cả hai thuật
toán đều không tránh được bùng nổ tổ hợp nhưng AlphaBeta làm chậm bùng
nổ tổ hợp hơn nên được dùng nhiều trong các trò chơi cờ.
Mong rằng bài viết này của tôi sẽ giúp các bạn hiểu thêm phần nào về các
phương pháp tìm kiếm có đối thủ để có thể áp dụng nó vào chơi cờ tốt hơn.
Mọi đóng góp xin liên hệ :
Xin chân thành cảm ơn!

Tài liệu tham khảo
1. Giáo trình trí tuệ nhân tạo của Đinh Mạnh Tường
2. Giáo trình trí tuệ nhân tạo của Nguyễn Thanh Thuỷ
3. Giáo trình - Bài giảng - Giáo án của Võ Huỳnh Lâm,
Trần Ngân Bình.
4. www.ebook.com

×