MỤC LỤC
Lời nói đầu.........................................................................................................4
Chương 1. Kỹ thuật xây dựng trò chơi.............................................................5
1. Phân loại trò chơi .........................................................................................5
1.1 Trò chơi đối xứng và bất đối xứng ..........................................................5
1.2 Trò chơi tổng bằng không và trò chơi tổng khác không...........................6
1.3 Trò chơi đồng thời và trò chơi tuần tự .....................................................6
1.4 Trò chơi thông tin hoàn hảo và trò chơi thông tin không hoàn hảo ................7
1.5 Trò chơi dài vô tận ..................................................................................7
2. Trí tuệ nhân tạo trong trò chơi ......................................................................8
3. Các kỹ thuật tìm kiếm ..................................................................................9
3.1 Tìm kiếm không có thông tin ..................................................................9
3.1.1 Tìm kiếm trên danh sách ...................................................................9
3.1.2 Tìm kiếm trên cây...........................................................................10
3.1.3 Tìm kiếm trên đồ thị .......................................................................10
3.2 Tìm kiếm có thông tin ...........................................................................11
3.2.1 Tìm kiếm Heuristic .........................................................................12
3.2.2 Phương pháp tìm kiếm leo đồi ........................................................13
3.2.3 Phương pháp tìm kiếm tốt nhất - đầu tiên........................................16
3.3 Tìm kiếm đối kháng ..............................................................................18
3.3.1 Cây trò chơi và vấn đề tìm kiếm trên cây trò chơi ...........................18
3.3.2 Chiến lược Minimax .......................................................................21
3.3.3 Phương pháp cắt cụt alpha – beta ....................................................24
1
3.4 Tìm kiếm thỏa mãn rằng buộc...............................................................30
Chương 2. Trò chơi cờ vua và ngôn ngữ lập trình C# ...................................31
1.Trò chơi cờ vua ...........................................................................................31
1.1 Giới thiệu về cờ vua ..............................................................................31
1.2 Nguyên lý chơi cờ vua ..........................................................................31
1.3 Chiến lược và chiến thuật......................................................................34
1.4 Xây dựng trò chơi cờ vua......................................................................41
1.4.1 Người với máy................................................................................41
1.4.2 Người với người .............................................................................47
1.4.2.1 Hai người chơi Offline trên cùng một máy................................47
1.4.2.2 Hai người chơi Online qua mạng LAN .....................................56
2. Ngôn ngữ lập trình C#................................................................................61
2.1 Lịch sử về ngôn ngữ C# ........................................................................61
2.2 Những thế mạnh của ngôn ngữ C# ........................................................62
2.3 Các bước chuẩn bị cho chương trình .....................................................64
Chương 3. Cài đặt chương trình.....................................................................66
1.Giao diện chính của chương trình................................................................66
2.Một số chức năng chính của chương trình ...................................................67
2.1 Tạo Game .............................................................................................67
2.2 Lưu Game.............................................................................................67
2.3 Mở Game..............................................................................................68
2.4 Chức năng Lùi Lại ................................................................................69
2.5 Chức năng xem quân bị ăn ....................................................................69
2.6 Chức năng Người với Người.................................................................70
2
2.7 Chức năng Người với Máy....................................................................70
2.8 Chức năng Chơi Qua Mạng...................................................................71
2.9 Chức năng phong cấp cho Tốt...............................................................71
Kết luận............................................................................................................72
Tài liệu tham khảo...........................................................................................74
Phụ lục .............................................................................................................75
3
Lời nói đầu
Ngày nay, do nhu cầu đời sống của con người ngày càng được nâng cao,
trong đó nhu cầu giải trí của con người được quan tâm đến rất nhiều. Việc giải trí
bằng Game máy tính ngày càng phát triển nhanh và lan rộng ra do sự lôi cuốn rất
mạnh mẽ của nó. Hầu như ai sử dụng máy tính cũng đều giải trí bằng một số
game nào đó trên máy tính. Có thể nói Game là một thể loại phong phú nhất
trong tất cả các chương trình trên máy tính.
Các loại hình Game hiện nay rất đa dạng từ Game hành động, Game trí
tuệ, Game chiến lược,… Cờ vua là một trong những Game trí tuệ phổ biến nhất
thế giới; nó được nói đến không chỉ như là một trò chơi mà còn là nghệ thuật,
khoa học và thể thao. Cờ vua đôi khi được nhìn nhận như là trò chơi chiến tranh
trừu tượng, cũng như là "các cuộc đấu trí tuệ", và việc chơi cờ vua được coi như
là một cách để rèn luyện tư duy và bản lĩnh. Cờ vua được chơi để tiêu khiển cũng
như để thi đấu trong các câu lạc bộ cờ vua, các giải đấu, chơi trực tuyến.
Mặc dù hiện nay các chương trình Game rất nhiều, nhưng để có thể viết ra
được một chương trình Game hay có thể chơi được và đáp ứng được sự yêu thích
của người chơi là một điều không dễ. Tuy vậy, với niềm đam mê về Game máy
tính, em đã lựa chọn đề tài:
KỸ THUẬT XÂY DỰNG TRÒ CHƠI, ỨNG DỤNG XÂY DỰNG
TRÒ CHƠI CỜ VUA ĐỐI KHÁNG
Vì thời gian thực hiện đề tài có hạn nên trong chương trình còn có nhiều
thiếu sót. Kính mong các thầy cô và các bạn góp ý để Đề Tài của em hoàn thiện
hơn.
4
Chương 1. Kỹ thuật xây dựng trò chơi
1. Phân loại trò chơi
1.1 Trò chơi đối xứng và bất đối xứng
Trò chơi đối xứng là một trò chơi mà phần lợi cho việc chơi một chiến
thuật nào đó chỉ phụ thuộc vào các chiến thuật được sử dụng, chứ không phụ
thuộc vào người nào đang chơi. Nếu như tính danh của những người chơi có thể
thay đổi mà không làm thay đổi phần lợi đối với chiến thuật chơi, thì một trò
chơi là đối xứng. Nhiều trò chơi 2×2 thường được nghiên cứu là đối xứng.
Những biểu diễn chuẩn của trò chơi con gà, song đề tù nhân, đi săn nai là những
trò chơi đối xứng.
Đa số những trò chơi bất đối xứng được nghiên cứu là những trò chơi mà
các tập hợp chiến thuật khác nhau được sử dụng bởi hai người chơi. Chẳng hạn,
trò chơi tối hậu thư và tương tự như vậy trò nhà độc tài có chiến thuật khác nhau
cho mỗi người chơi. Tuy vậy, có thể xảy ra trường hợp một trò chơi có những
chiến thuật giống nhau cho cả hai người chơi, nhưng vẫn bất đối xứng. Chẳng
hạn, trò chơi được minh họa dưới đây là bất đối xứng mặc dù cho có cùng tập các
chiến thuật cho cả 2 người chơi.
E
F
E
1, 2
0, 0
F
0, 0
1, 2
Hình 1.1.1 Một trò chơi bất đối xứng
5
1.2 Trò chơi tổng bằng không và trò chơi tổng khác không
Trong trò chơi tổng bằng không, với mọi tổ hợp của các chiến lược chơi,
tổng điểm của tất cả các người chơi trong ván chơi luôn bằng 0. Nói một cách
không chính thức, đấu thủ này hưởng lợi trên thiệt hại của các đấu thủ khác.
Ví dụ trò Poker, trong đó người này thắng số điểm bằng đúng số điểm mà
người kia thua. Các loại cờ cổ điển như cờ vây, cờ vua và cờ tướng cũng là các
trò chơi tổng bằng không. Nhiều trò chơi mà các nhà lý thuyết trò chơi nghiên
cứu, trong đó có song đề tù nhân nổi tiếng, là các trò chơi tổng khác không, do có
một số kết cục có tổng kết quả lớn hơn hoặc nhỏ hơn không. Nói một cách không
chính thức, trong các trò chơi tổng khác không, một thu hoạch của đấu thủ này
không nhất thiết tương ứng với một thiệt hại của một đấu thủ khác. Có thể biến
đổi một trò chơi bất kỳ thành một trò chơi tổng bằng không bằng cách bổ sung
một đấu thủ "bù nhìn" sao cho các thiệt hại của đấu thủ này bù lại tổng thu hoạch
của các đấu thủ khác.
A
B
A
2, -2
-1, 1
B
-1, 1
3, -3
Hình 1.2.1 Một trò chơi tổng bằng 0
1.3 Trò chơi đồng thời và trò chơi tuần tự
Trong các trò chơi đồng thời (Simultaneous game), cả hai đấu thủ thực
hiện các nước đi một cách đồng thời, hoặc nếu không thì đấu thủ này sẽ không
biết về các hành động trước đó của các đối thủ khác (và như vậy cũng tạo "hiệu
ứng" đồng thời). Trong các trò chơi tuần tự (Sequential game), người đi sau có
biết một số (nhưng không nhất thiết toàn bộ) thông tin về các nước đi trước.
6
1.4 Trò chơi thông tin hoàn hảo và trò chơi thông tin không hoàn hảo
Các trò chơi thông tin hoàn hảo (Games of perfect information) lập thành
một tập con quan trọng của các trò chơi tuần tự. Một trò chơi được gọi là có
thông tin hoàn hảo nếu mọi đấu thủ biết tất cả các nước đi mà tất cả các đấu thủ
khác đã thực hiện. Do vậy chỉ có các trò chơi tuần tự mới có thể là các trò chơi
thông tin hoàn hảo. Hầu hết các trò chơi được nghiên cứu trong lý thuyết trò chơi
là các trò chơi thông tin không hoàn hảo, một số trò chơi hay như cờ vây, cờ vua
lại là trò chơi thông tin hoàn hảo.
Tính chất thông tin hoàn hảo thường bị nhầm lẫn với khái niệm thông tin
đầy đủ. Tính chất thông tin đầy đủ đòi hỏi rằng mỗi người chơi biết về các chiến
lược và thành quả thu được của các người chơi khác, nhưng không nhất thiết biết
về các hành động của họ.
1.5 Trò chơi dài vô tận
Bởi các lý do hiển nhiên, các trò chơi được nghiên cứu bởi các kinh tế gia
và những người chơi trong thế giới thực, nhìn chung là kết thúc trò chơi trong
hữu hạn các bước đi. Các nhà toán học lý thuyết không bị cản trở bởi điều đó, và
lý thuyết gia về tập hợp đặc biệt nghiên cứu về các trò chơi kết thúc sau vô hạn
các bước đi, bởi người thắng (hay là phần lợi) là không biết được cho đến sau khi
các bước đi đó đã hoàn thành.
Sự chú ý thường không phải là quá nhiều về cách nào tốt nhất để chơi trò
chơi, mà đơn giản là chỉ phụ thuộc vào người chơi hay người kia có hay không
một chiến thuật chiến thắng (có thể chứng minh rằng, sử dụng tiên đề chọn lựa,
là có những trò chơi với ngay cả là đầy đủ thông tin hoàn toàn, và chỉ có kết quả
là "thắng" hay "thua" và không người chơi nào có chiến thuật để chiến thắng). Sự
tồn tại của những chiến thuật như vậy, cho những trò chơi được thiết kế một cách
thông minh, có những kết quả quan trọng trong lý thuyết miêu tả tập hợp.
7
2. Trí tuệ nhân tạo trong trò chơi
Trí tuệ nhân tạo (Artificial Intelligence - AI) Có thể được định nghĩa
như một ngành của khoa học máy tính liên quan đến việc tự động hóa các hành
vi thông minh. Trí tuệ nhân tạo là một bộ phận của khoa học máy tính và do đó
nó phải được đặt trên những nguyên lý, lý thuyết vững chắc, có khả năng ứng
dụng được của lĩnh vực này. Những nguyên lý này bao gồm các cấu trúc dữ liệu
dùng cho biểu diễn tri thức, các thuật toán cần thiết để áp dụng những tri thức đó,
cùng các ngôn ngữ và kỹ thuật lập trình dùng cho việc cài đặt chúng.
Hai mối quan tâm nền tảng nhất của các nhà nghiên cứu Trí tuệ nhân tạo
là biểu diễn tri thức (Knowledge representation) và tìm kiếm (Search). Ở đây
chúng ta xét đến mối quan tâm thứ hai đó là tìm kiếm. Đối với các Game thuộc
dạng bảng như cờ vua, cờ tướng, cờ caro,… Thì việc tìm kiếm các bước đi tốt
nhất để có thể chiến thắng là vấn đề mấu chốt, tìm kiếm là kỹ thuật giải quyết
vấn đề theo cách khảo sát có hệ thống một không gian trạng thái bài toán
(Problem state), tức là các giai đoạn tuần tự và có chọn lựa trong quá trình giải
quyết vấn đề.
Ngay từ thời kỳ đầu của việc nghiên cứu vấn đề tìm kiếm trong không
gian trạng thái, người ta đã tiến hành nhiều thử nghiệm bằng cách sử dụng các trò
chơi thông dụng có bàn cờ như cờ đam (Checker), cờ vua và trò đố 15 ô (15
Puzzule). Hầu hết các trò chơi đều sử dụng một tập hợp các luật chơi được xác
định rõ ràng. Điều này làm cho việc phát sinh không gian tìm kiếm trở nên dễ
dàng và giải phóng nhiều nghiên cứu khỏi những sự mơ hồ và phức tạp vốn có
trong các bài toán ít cấu trúc hơn. Hình dạng của những bàn cờ sử dụng trong các
trò chơi này dễ dàng được biểu diễn vào máy tính, trong khi không đòi hỏi một
hình thức khó hiểu cần thiết nào để nắm bắt những tinh tế và ngữ nghĩa trong
những lĩnh vực bài toán phức tạp hơn.
8
3. Các kỹ thuật tìm kiếm
3.1 Tìm kiếm không có thông tin
Giải thuật tìm kiếm không có thông tin là giải thuật không tính đến bản
chất cụ thể của bài toán. Khi đó, các giải thuật dạng này có thể được cài đặt tổng
quát, và cùng một cài đặt có thể được sử dụng trong một diện rộng các bài toán
(do sử dụng trừu tượng hóa). Nhược điểm của các giải thuật này là phần lớn các
không gian tìm kiếm có kích thước cực kì lớn, và một quá trình tìm kiếm (đặc
biệt tìm kiếm theo cây) sẽ cần một khoảng thời gian đáng kể cho các ví dụ nhỏ.
Do đó, để tăng tốc độ quá trình tìm kiếm, đôi khi chỉ có thể dùng giải thuật tìm
kiếm có thông tin.
3.1.1 Tìm kiếm trên danh sách
Có lẽ các giải thuật tìm kiếm trên danh sách là loại giải thuật tìm kiếm cơ
bản nhất. Mục đích là tìm trong một tập hợp một phần tử chứa một khóa nào đó.
Thuật toán đơn giản nhất là tìm kiếm tuyến tính. Thuật toán này kiểm
tra từng phần tử trong danh sách theo thứ tự của danh sách đó. Nó có
thời gian chạy khá lớn O(n), trong đó n là số phần tử trong danh sách,
nhưng có thể sử dụng thẳng cho một danh sách bất kỳ mà không cần
tiền xử lý.
Tìm kiếm nhị phân là một thuật toán cao cấp hơn với thời gian chạy là
O(log n). Đối với các danh sách lớn, thuật toán này tốt hơn hẳn tìm
kiếm tuyến tính, nhưng nó đòi hỏi danh sách phải được sắp xếp từ
trước và đòi hỏi khả năng truy nhập ngẫu nhiên (Random access).
Tìm kiếm nội suy (Interpolation search) tốt hơn tìm kiếm nhị phân đối
với các danh sách rất lớn với phân bố gần đều. Giải thuật Grover là
một thuật toán lượng tử cho phép tăng tốc độ gấp 4 lần so với tìm
kiếm tuyến tính truyền thống trên các danh sách chưa được sắp xếp.
9
Bảng băm (Hash table) cũng được dùng cho tìm kiếm trên danh sách. Nó
đòi hỏi thời gian hằng số trong trường hợp trung bình, nhưng lại cần nhiều phụ
phí về không gian bộ nhớ và thời gian chạy O(n) cho trường hợp xấu nhất. Một
phương pháp tìm kiếm khác dựa trên các cấu trúc dữ liệu chuyên biệt sử dụng
cây tìm kiếm nhị phân cân bằng (Self-balancing binary search tree) và đòi hỏi
thời gian chạy O(log n), các giải thuật loại này có thể coi là mở rộng của tư tưởng
chính về tìm kiếm nhị phân để cho phép chèn và xóa nhanh.
Đa số các giải thuật tìm kiếm trên danh sách, chẳng hạn tìm kiếm tuyến
tính, tìm kiếm nhị phân, và cây tìm kiếm nhị phân cân bằng, có thể được mở rộng
với một chút chi phí bổ sung để tìm tất cả các giá trị nhỏ hơn hoặc lớn hơn một
khóa cho trước - một phép toán được gọi là tìm kiếm khoảng (Range search).
3.1.2 Tìm kiếm trên cây
Tìm kiếm trên cây là trung tâm của các kỹ thuật tìm kiếm. Các thuật toán
này tìm kiếm trên các cây gồm các nút, cây này có thể là cây tường minh hoặc
được xây dựng dần trong quá trình tìm kiếm.
Nguyên lý cơ bản của tìm kiếm trên cây là: Một nút được lấy ra từ một
cấu trúc dữ liệu, các nút con của nó được xem xét và bổ sung vào cấu trúc dữ liệu
đó. Bằng cách thao tác trên cấu trúc dữ liệu này, cây tìm kiếm được duyệt theo
các thứ tự khác nhau, chẳng hạn theo từng mức (tìm kiếm theo chiều rộng) hoặc
đi tới một nút lá trước rồi quay lui (tìm kiếm theo chiều sâu). Các ví dụ khác về
tìm kiếm trên cây bao gồm: Tìm kiếm lặp sâu dần, tìm kiếm chiều sâu giới hạn,
tìm kiếm hai chiều và tìm kiếm chi phí đều.
3.1.3 Tìm kiếm trên đồ thị
Nhiều bài toán về lý thuyết đồ thị có thể được giải quyết bằng các thuật
toán tìm kiếm, chẳng hạn thuật toán Dijkstra, thuật toán Kruskal, giải thuật Láng
giềng gần nhất và giải thuật Prim. Các thuật toán này có thể được coi là các mở
rộng của các thuật toán tìm kiếm trên cây.
10
Thuật toán Dijkstra
Thuật toán Dijkstra, mang tên của nhà khoa học máy tính người Hà Lan
Edsger Dijkstra, là một thuật toán giải quyết bài toán đường đi ngắn nhất nguồn
đơn trong một đồ thị có hướng không có cạnh mang trọng số âm.
Thủ tục của thuật toán như sau:
Procedure Dijkstra (G = (V,E) là đơn đồ thị liên thông, có trọng số với
trọng số dương)
{G có các đỉnh a = u0, u1, ..., un = z và trọng số m(ui, uj), với
m(ui, uj) = nếu (u i, u j) không là một cạnh trong G}
for i := 1 to n
L(ui) :=
L(a) := 0
S := V \ {a}
u := a
while S
begin
for tất cả các đỉnh v thuộc S
if L(u) + m(u,v) < L(v) then L(v) := L(u) + m(u,v)
u := đỉnh thuộc S có nhãn L(u) nhỏ nhất
{L(u): độ dài đường đi ngắn nhất từ a đến u}
S := S \ {u}
end
3.2 Tìm kiếm có thông tin
Trong tìm kiếm có thông tin, người ta sử dụng một đánh giá Heuristic đặc
thù cho bài toán cần giải quyết với vai trò hướng dẫn cho quá trình tìm kiếm. Một
cách đánh giá Heuristic tốt sẽ làm cho quá trình tìm kiếm có thông tin hoạt động
hiệu quả hơn hẳn một phương pháp tìm kiếm không có thông tin.
11
Các trò chơi dạng bảng như cờ vua, cờ tướng,… Có thể phát sinh ra một
số lượng không gian tìm kiếm cực kỳ lớn. Những không gian này đủ lớn và phức
tạp để đòi hỏi những kỹ thuật mạnh nhằm quyết định xem những chọn lựa nào
cần được khảo sát trong không gian bài toán. Những kỹ thuật này được gọi là các
Heuristic và chúng tạo thành một lĩnh vực lớn trong nghiên cứu Trí tuệ nhân tạo.
Một Heuristic là một chiến lược giải quyết vấn đề tốt nhưng tiềm ẩn khả năng
thất bại, chẳng hạn như việc kiểm tra để biết chắc rằng một thiết bị không nhạy
đã được cắm vào trước khi giả định rằng nó bị hỏng, hay cố gắng bảo vệ quân cờ
Hậu của bạn khỏi bị đối phương bắt trong trò chơi cờ vua.
Hầu hết mọi người đều có một số kinh nghiệm với những trò chơi đơn
giản này, nên chúng ta cũng có khả năng nghĩ ra và kiểm nghiệm tính hiệu quả
của những Heuristic của chính mình.
Có một vài thuật toán tìm kiếm có thông tin nổi trội dành cho danh sách.
Một trong số đó là một bảng băm với một hàm băm là một heuristic dựa trên bài
toán đang được giải. Đa số các thuật toán tìm kiếm có thông tin đều là tìm kiếm
trên cây. Trong đó có tìm kiếm theo lựa chọn tốt nhất và A*, ngoài ra còn có tìm
kiếm Leo đồi. Cũng như các thuật toán không có thông tin, các thuật toán này có
thể được mở rộng để làm việc trên cả các đồ thị.
3.2.1 Tìm kiếm Heuristic
Một cách tổng quát, vấn đề tìm kiếm có thể hiểu là tìm một đối tượng thỏa
mãn một số đòi hỏi nào đó, trong một tập hợp rộng lớn các đối tượng. Chúng ta
có thể kể ra rất nhiều vấn đề mà việc giải quyết nó được quy về vấn đề tìm kiếm.
Các trò chơi, chẳng hạn cờ vua, cờ carô có thể xem như vấn đề tìm kiếm.
Trong số rất nhiều nước đi được phép thực hiện, ta phải tìm ra các nước đi dẫn
tới tình thế kết cuộc mà ta là người thắng.
Tìm kiếm Heuristic - Tìm kiếm kinh nghiệm. Đây là phương pháp sử
dụng hàm đánh giá để hướng dẫn sự tìm kiếm. Chúng ta biết rằng không gian tìm
kiếm trong một bài toàn luôn có xu hướng tăng lên theo hàm mũ, khi đó để giải
12
quyết vấn đề này thì tìm kiếm Heuristic là một công cụ chủ yếu để xử lý sự bùng
nổ tổ hợp này.
Thuật toán Heuristic gồm 2 phần: Hàm đánh giá Heuristic và thuật toán để sử
dụng trong tìm kiếm không gian trạng thái.
Có nhiều phương pháp để xây dựng một thuật giải Heuristic, trong đó người
ta thường dựa vào một số nguyên lý cơ bản như sau:
Nguyên lý vét cạn thông minh: Trong một bài toán tìm kiếm nào đó, khi
không gian tìm kiếm lớn, ta thường tìm cách giới hạn lại không gian tìm
kiếm hoặc thực hiện một kiểu dò tìm đặc biệt dựa vào đặc thù của bài toán
để nhanh chóng tìm ra mục tiêu.
Nguyên lý tham lam (Greedy): Lấy tiêu chuẩn tối ưu (trên phạm vi toàn
cục) của bài toán để làm tiêu chuẩn chọn lựa hành động cho phạm vi cục
bộ của từng bước (hay từng giai đoạn) trong quá trình tìm kiếm lời giải.
Nguyên lý thứ tự: Thực hiện hành động dựa trên một cấu trúc thứ tự hợp
lý của không gian khảo sát nhằm nhanh chóng đạt được một lời giải tốt.
Hàm Heuristic: Trong việc xây dựng các thuật giải Heuristic, người ta
thường dùng các hàm Heuristic. Đó là các hàm đánh giá thô, giá trị của
hàm phụ thuộc vào trạng thái hiện tại của bài toán tại mỗi bước giải. Nhờ
giá trị này, ta có thể chọn được cách hành động tương đối hợp lý trong
từng bước của thuật giải.
3.2.2 Phương pháp tìm kiếm leo đồi
Cách đơn giản nhất để thực hiện tìm kiếm Heuristic là tìm kiếm “Leo đồi”
(Hill climbing search - Pearl 1984). Chiến lược tìm kiếm Leo đồi phát triển trạng
thái con tốt nhất sẽ được chọn cho bước tiếp theo, không lưu giữ lại bất kỳ thông
tin nào về các nút anh em lẫn cha mẹ của nó. Quá trình tìm kiếm sẽ dừng lại khi
tiếp cận trạng thái tốt hơn so với mọi trạng thái con của nó.
13
Phương pháp tìm kiếm leo đồi chú trọng tìm hướng đi dễ dẫn đến trạng
thái đích nhất. Cách đó được đưa ra nhằm làm giảm công sức tìm kiếm. Thuật
toán tìm kiếm leo đồi thực chất là thuật toán tìm kiếm theo chiều sâu, song tại
mỗi bước ta sẽ ưu tiên chọn một trạng thái có hứa hẹn nhanh tới đích nhất để
phát triển trước. Vấn đề quan trọng là biết khai thác khéo léo thông tin phản hồi
để xác định hướng đi tiếp và đẩy nhanh quá trình tìm kiếm. Thông thường ta gán
mỗi trạng thái của bài toán với một số đo (hàm đánh giá) nhằm đánh giá mức độ
gần đích của nó. Điều đó có nghĩa là nếu trạng thái hiện thời là u thì trạng thái v
sẽ được phát triển tiếp theo, nếu v kề với u và hàm đánh giá của v đạt giá trị Max
(hoặc Min).
A
15
20
7
C
12
E
6
10
K
D
8
F
I
G
B
5
0
H
3
Hình 3.2.2.1 Đồ thị không gian trạng thái.
Ví dụ: Ta lại xét đồ thị không gian trạng thái trong hình 3.2.2.1. Quá trình
tìm kiếm Leo đồi được tiến hành như sau:
Đầu tiên ta sẽ phát triển đỉnh A sinh ra các đỉnh con C, D, E. Trong các
đỉnh này sẽ chọn đỉnh D để phát triển, và nó sinh ra các đỉnh con B, G. Quá trình
tìm kiếm kết thúc. Cây tìm kiếm Leo đồi được cho trong hình 3.2.2.2.
14
A
15
C
10
6
D
F
0
20
E
I
B
7
8
G
5
Hình 3.2.2.2 Cây tìm kiếm Leo đồi.
Trong thủ tục tìm kiếm Leo đồi được trình bày dưới đây, ngoài danh sách
L lưu các trạng thái chờ được phát triển, chúng ta sử dụng danh sách L1 để lưu
giữ tạm thời các trạng thái kề trạng thái u, khi ta phát triển u. Danh sách L1 được
sắp xếp theo thứ tự tăng dần của hàm đánh giá, rồi được chuyển vào danh sách L
sao cho trạng thái tốt nhất kề u đứng ở danh sách L.
Thuật toán:
Procedure Hill_Climbing_Search;
Begin
1. Khởi tạo danh sách L chỉ chứa trạng thái ban đầu;
2. Loop do
2.1 if L rỗng then
{Thông báo thất bại; Stop;}
2.2 Loại trạng thái u ở đầu danh sách L;
2.3 if u là trạng thái kết thúc then
{Thông báo thành công; Stop;}
2.4 for mỗi trạng thái v kề u do đặt v vào L1;
15
2.5 Sắp sếp L1 theo thứ tự tăng dần của hàm đánh giá;
2.6 Chuyển danh sách L1 vào đầu danh sách L;
End;
3.2.3 Phương pháp tìm kiếm tốt nhất - đầu tiên
Tìm kiếm tốt nhất - đầu tiên (Best - First search) là tìm kiếm theo bề rộng
được hướng dẫn bởi hàm đánh giá. Nhưng nó khác với tìm kiếm theo bề rộng ở
chỗ, trong tìm kiếm theo bề rộng ta lần lượt phát triển tất cả các đỉnh ở mức hiện
tại để sinh ra các đỉnh ở mức tiếp theo, còn trong tìm kiếm tốt nhất - đầu tiên ta
chọn đỉnh để phát triển là đỉnh tốt nhất được xác định bởi hàm đánh giá (tức là
đỉnh có giá trị hàm đánh giá là nhỏ nhất), đỉnh này có thể ở mức hiện tại hoặc ở
các mức trên.
Ví dụ: Xét không gian trạng thái được biểu diễn bởi đồ thị trong hình
3.2.2.1, trong đó trạng thái ban đầu là A, trạng thái kết thúc là B. Giá trị của hàm
đánh giá là các số ghi cạnh mỗi đỉnh. Quá trình tìm kiếm tốt nhất - đầu tiên diễn
ra như sau:
Đầu tiên phát triển đỉnh A sinh ra các đỉnh kề là C, D và E. Trong ba đỉnh
này, đỉnh D có giá trị hàm đánh giá nhỏ nhất, nó được chọn để phát triển và nó
sinh ra đỉnh F và đỉnh I. Trong số các đỉnh chưa được phát triển C, E, F, I thì
đỉnh E có giá trị đánh giá nhỏ nhất, nó được chọn để phát triển và sinh ra các
đỉnh G, K. Trong số các đỉnh chưa được phát triển thì G tốt nhất, phát triển đỉnh
G sinh ra đỉnh B và đỉnh H. Đến đây ta đã đạt tới trạng thái kết thúc. Cây tìm
kiếm tốt nhất - đầu tiên được biểu diễn trong hình 3.2.3.1.
16
A
15
6
C
20
D
E
F
I
10
8
5
7
K
G
B
H
0
3
12
Hình 3.2.3.1 Cây tìm kiếm tốt - nhất đầu tiên.
Sau đây là thủ tục tìm kiếm tốt nhất - đầu tiên. Trong thủ tục này, chúng ta
sử dụng danh sách L để lưu các trạng thái chờ phát triển, danh sách được sắp
theo thứ tự tăng dần của hàm đánh giá sao cho trạng thái có giá trị hàm đánh giá
nhỏ nhất ở đầu danh sách.
Thuật toán:
Procedure Best_First_Search;
Begin
1. Khởi tạo danh sách L chỉ chứa trạng thái ban đầu;
2. Loop do
2.1 if L rỗng then
{Thông báo thất bại; Stop;}
2.2 Loại trạng thái u ở đầu danh sách L;
2.3 if u là trạng thái kết thúc then
{Thông báo thành công; Stop;}
17
2.4 for mỗi trạng thái v kề u do
Xen v vào danh sách L sao cho L được sắp theo thứ tự tăng dần
của hàm đánh giá;
End;
3.3 Tìm kiếm đối kháng
Trong các trò chơi như cờ vua hay cờ tướng, có 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).
3.3.1 Cây trò chơi và vấn đề tìm kiếm trên cây trò chơi
Trong phần này chúng ta tập trung nghiên cứu các trò chơi có hai người
tham gia, chẳng hạn như các loại cờ (cờ tướng, cờ vua, cờ caro,…). Một người
chơi được gọi là Trắng, đối thủ của anh ta gọi là Đen. Mục tiêu của chúng ta là
nghiên cứu chiến lược chọn nước đi cho Trắng thắng (ở đây máy tính là quân
Trắng).
Chúng ta sẽ xét các trò chơi có hai người với các đặc điểm sau. Hai người
thay phiên nhau đưa ra các nước đi tuân theo các quy luật nào đó của trò chơi,
các luật này là như nhau cho cả hai người. Điển hình đó là trò chơi cờ vua, trong
cờ vua hai người chơi có thể áp dụng các luật đi cho con tốt, con xe,…để đưa ra
các nước đi. Luật đi cho con tốt Trắng, xe Trắng,… cũng giống như luật đi con
tốt Đen, xe Đen,… Một đặc điểm nữa là hai người chơi đều được biết thông tin
đầy đủ về các tình thế trong trò chơi (không như trong chơi bài, người chơi
không thể biết các người chơi khác còn những con bài gì). Vấn đề chơi cờ có thể
xem như vấn đề tìm kiếm nước đi, tại mỗi lần đến lượt mình, người chơi phải tìm
18
trong số rất nhiều nước đi hợp lệ (tuân theo đúng luật đi), một nước đi tốt nhất
sao cho qua một dãy nước đi đã thực hiện, anh ta giành phần thắng. Tuy nhiên
vấn đề tìm kiếm ở đây sẽ rất phức tạp, bởi vì ở đây có đối thủ, người chơi không
biết được đối thủ của mình sẽ đi nước nào trong tương lai.
Vấn đề chơi cờ có thể xem như vấn đề tìm kiếm trong không gian trạng
thái. Mỗi trạng thái là một tình thế (sự bố trí các quân của hai bên trên bàn cờ).
Trạng thái ban đầu là sự sắp xếp các quân cờ của hai bên lúc bắt đầu cuộc chơi.
Các toán tử là các nước đi hợp lệ.
Các trạng thái kết thúc là các tình thế mà cuộc chơi dừng, thường được
xác định bởi một số điều kiện dừng nào đó.
Một hàm kết cuộc (Payoff function) ứng mỗi trạng thái kết thúc với một
giá trị nào đó. Như trong cờ vua, mỗi trạng thái kết thúc chỉ có thể là
thắng, hoặc thua hoặc hòa. Do đó, ta có thể xác định hàm kết cuộc là hàm
nhận giá trị 1 tại các trạng thái kết thúc là thắng (đối với Trắng), hàm nhận
giá trị -1 tại các trạng thái kết thúc là thua (đối với Trắng) và 0 tại các
trạng thái kết thúc hòa. Trong một số trò chơi khác, chẳng hạn trò chơi
tính điểm, hàm kết cuộc có thể nhận giá trị nguyên trong khoảng [-k, k]
với k là một số nguyên dương nào đó.
Như vậy vấn đề của Trắng là tìm một dãy các nước đi sao cho xen kẽ với
các nước đi của Đen tạo thành một đường đi từ trạng thái ban đầu tới trạng thái
kết thúc là thắng cho Trắng.
Để thuận lợi cho việc nghiên cứu các chiến lược chọn nước đi, ta biểu diễn
không gian trạng thái trên dưới dạng cây trò chơi.
19
Cây trò chơi
Cây trò chơi được xây dựng như sau. Gốc của cây ứng với trạng thái ban
đầu. Ta sẽ gọi đỉnh ứng với trạng thái mà Trắng (Đen) đưa ra nước đi là đỉnh
Trắng (Đen). Nếu một đỉnh là Trắng (Đen) ứng với trạng thái u, thì các đỉnh con
của nó là tất cả các đỉnh biểu diễn trạng thái v, v nhận được từ u do Trắng (Đen)
thực hiện nước đi hợp lệ nào đó. Do đó, trên cùng một mức của cây các đỉnh đều
là Trắng hặc đều là Đen, các lá của cây ứng với các trạng thái kết thúc.
Ví dụ: Ta xét một trò chơi đơn giản có hai người tham gia, đó là trò
Dodgem (được tạo ra bởi Colin Vout). Có hai quân Trắng và hai quân Đen, ban
đầu được xếp vào bàn cờ 3*3 (như hình 3.3.1.1). Quân Đen có thể đi tới ô trống
ở bên phải, ở trên hoặc ở dưới. Quân Trắng có thể đi tới trống ở bên trái, bên
phải, ở trên. Quân Đen nếu ở cột ngoài cùng bên phải có thể đi ra khỏi bàn cờ,
quân Trắng nếu ở hàng trên cùng có thể đi ra khỏi bàn cờ. Ai đưa hai quân của
mình ra khỏi bàn cờ trước sẽ thắng, hoặc tạo ra tình thế bắt đối phương không đi
được cũng sẽ thắng.
Hình 3.3.1.1 Trò chơi Dodgem.
20
Giả sử quân Đen đi trước ta có cây trò chơi được biểu diễn như hình
3.3.1.2 sau:
Hình 3.3.1.2 Cây trò chơi Dodgem với quân Đen đi trước.
3.3.2 Chiến lược Minimax
Quá trình chơi cờ là quá trình Trắng và Đen thay phiên nhau đưa ra quyết
định, thực hiện một trong số các nước đi hợp lệ. Trên cây trò chơi, quá trình đó
sẽ tạo ra đường đi từ gốc tới lá. Giả sử tới một thời điểm nào đó, đường đi đã dẫn
tới đỉnh u. Nếu u là đỉnh Trắng (Đen) thì Trắng (Đen) cần chọn đi tới một trong
các đỉnh Đen (Trắng) v là con của u. Tại đỉnh Đen (Trắng) v mà Trắng (Đen) vừa
chọn, Đen (Trắng) sẽ phải chọn đi tới một trong các đỉnh Trắng (Đen) w là con
của v. Quá trình trên sẽ dừng lại khi đạt tới một đỉnh là lá của cây.
Giả sử Trắng cần tìm nước đi tại đỉnh u. Nước đi tối ưu cho Trắng là nước
đi dần tới đỉnh con của v là đỉnh tốt nhất (cho Trắng) trong số các đỉnh con của u.
Ta cần giả thiết rằng, đến lượt đối thủ chọn nước đi từ v, Đen cũng sẽ chọn nước
đi tốt nhất cho anh ta. Như vậy, để chọn nước đi tối ưu cho Trắng tại đỉnh u, ta
cần phải xác định giá trị các đỉnh của cây trò chơi gốc u. Giá trị của các đỉnh lá
(ứng với các trạng thái kết thúc) là giá trị của hàm kết cuộc. Đỉnh có giá trị càng
21
lớn càng tốt cho Trắng, đỉnh có giá trị càng nhỏ càng tốt cho Đen. Để xác định
giá trị các đỉnh của cây trò chơi gốc u, ta đi từ mức thấp nhất lên gốc u. Giả sử v
là đỉnh trong của cây và giá trị các đỉnh con của nó đã được xác định. Khi đó nếu
v là đỉnh Trắng thì giá trị của nó được xác định là giá trị lớn nhất trong các giá trị
của các đỉnh con. Còn nếu v là đỉnh Đen thì giá trị của nó là giá trị nhỏ nhất trong
các giá trị của các đỉnh con.
Ví dụ: Xét cây trò chơi trong hình 3.3.2.1, gốc a là đỉnh Trắng. Giá trị của
các đỉnh là số ghi cạnh mỗi đỉnh. Đỉnh I là Trắng, nên giá trị của nó là max(3,-2)
= 3, đỉnh D là đỉnh Đen, nên giá trị của nó là min(2, 3, 4) = 2.
A
-3
-3
-1
B
E
F
2
C
G
5
Max
H
2
D
2
I
3
Min
J
4
Max
-1
K
L
M
P
Q
5
2
-3
3
-2
Min
Hình 3.3.2.1 Gán giá trị cho các đỉnh của cây trò chơi.
Việc gán giá trị cho các đỉnh được thực hiện bởi các hàm đệ qui MaxVal
và MinVal. Hàm MaxVal xác định giá trị cho các đỉnh Trắng, hàm MinVal xác
định giá trị cho các đỉnh Đen.
22
Thuật toán:
Function MaxVal(u);
Begin
if u là đỉnh kết thúc then MaxVal(u) → f(u)
else MaxVal(u) ← max {MinVal(v) | v là đỉnh con của u}
End;
Function MinVal(u);
Begin
if u là đỉnh kết thúc then MinVal(u) ← f(u)
else MinVal(u)←min{MaxVal(v) | v là đỉnh con của u}
End;
Thủ tục chọn nước đi như trên gọi là chiến lược Minimax, bởi vì Trắng đã
chọn được nước đi dẫn tới đỉnh con có giá trị là max của các giá trị các đỉnh con,
và Đen đáp lại bằng nước đi tới đỉnh có giá trị là min của các giá trị các đỉnh con.
Thuật toán Minimax là thuật toán tìm kiếm theo độ sâu, ở đây ta đã cài đặt
thuật toán Minimax bởi các hàm đệ quy.
Về mặt lý thuyết, chiến lược Minimax cho phép ta tìm được nước đi tối ưu
cho Trắng. Song nó không thực tế, bởi sẽ không đủ thời gian để tính được nước
đi tối ưu. Bởi vì thuật toán Minimax đòi hỏi ta phải xem xét toàn bộ các đỉnh của
cây trò chơi. Trong các trò chơi này, cây trò chơi là cực kỳ lớn. Đối với cờ vua,
chỉ tính đến độ sâu 40, thì cây trò chơi đã có khoảng 10120 đỉnh! Nếu cây có độ
cao m, và tại mỗi đỉnh có b nước đi thì độ phức tạp về thời gian của thuật toán
Minimax là O(bm).
Để có thể tìm ra nhanh nước đi tốt (không phải là tối ưu) thay cho việc sử
dụng hàm kết cuộc và xem xét tất cả các khả năng dẫn tới các trạng thái kết thúc,
chúng ta sẽ sử dụng hàm đánh giá và chỉ xem xét một bộ phận của cây trò chơi.
23
Hàm đánh giá
Hàm đánh giá eval ứng với mỗi trạng thái u của trò chơi, với một giá trị số
eval(u), giá trị này là sự đánh giá “độ lợi thế” của trạng thái u. Trạng thái u càng
thuận lợi cho Trắng thì eval(u) là số dương càng lớn, u càng thuận lợi cho Đen
thì eval(u) là số âm càng nhỏ, eval(u) ≈ 0 đối với trạng thái không lợi thế cho ai
cả.
Chất lượng của chương trình chơi cờ phụ thuộc rất nhiều vào hàm đánh
giá. Nếu hàm đánh giá cho ta sự đánh giá chính xác về các trạng thái, nó có thể
hướng dẫn ta đi tới trạng thái được xem là tốt, nhưng thực tế lại rất bất lợi cho ta.
Thiết kế một hàm đánh giá tốt là một việc khó, đòi hỏi ta phải quan tâm đến
nhiều nhân tố: các quân còn lại của hai bên, sự bố trí của các quân đó,...Ở đây có
sự mâu thuẫn giữa độ chính xác của hàm đánh giá và thời gian tính của nó. Hàm
đánh giá chính xác sẽ đòi hỏi rất nhiều thời gian tính toán, mà người chơi lại bị
giới hạn bởi thời gian phải đưa ra nước đi.
3.3.3 Phương pháp cắt cụt alpha – beta
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 còn rất lớn với h ≥
3. Đối với 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, khi chạy 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 đánh giá mà vẫn không ảnh hưởng gì đến sự đánh giá đỉnh u.
24
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 như sau: 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á. 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 (như hình 3.3.3.1). 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
Ma x
b
u
Min
a
v
Ma x
Hình 3.3.3.1 Cắt bỏ cây con gốc a, nếu eval(u) > eval(v)
Để 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ố α để 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ố β ghi lại giá
trị nhỏ nhất trong các đỉnh con đã đánh giá của một đỉnh Đen. Giá trị của α và β
sẽ được cập nhật trong quá trình tìm kiếm. α và β được sử dụng như các biến địa
phương trong các hàm MaxVal(u, α, β) (hàm xác định giá trị của đỉnh Trắng u)
và Minval(u, α, β) (hàm xác định giá trị của đỉnh Đen u).
25