Xét trò chơi đối kháng hai người, với mỗi trò chơi sẽ có luật chơi riêng và đặc thù riêng của nó. Tuy thế có một điểm chung trong các trò chơi đối kháng hai người là hai người sẽ thay phiên nhau thực hiện những nước đi hợp lệ cho đến một trạng thái kết thúc, trạng thái được quy định theo luật của trò chơi. Khi đó trò chơi sẽ kết thúc và có một người thắng cuộc hoặc có thể trạng thái hoà xuất hiện. Việc thực hiện trò chơi như thế nào sẽ đánh giá trình độ của người chơi ở trò chơi đó mức cao hay thấp. Ví dụ về trò chơi cờ tướng: Luật chơi sẽ giống nhau cho cả hai người, cách di chuyển các con Tướng, Sĩ, Tượng, Xe... là hoàn toàn giống nhau đối với cả hai người chơi. Cả hai người chơi đều biết rõ thông tin về tình trạng hiện tại của bàn cờ.
Chúng ta có thể biểu diễn trò chơi như một cây mà ở đó mỗi nút là một trạng thái (trạng thái được mô hình hoá tuỳ thuộc trò chơi, ví dụ cờ tướng có thể chọn sự sắp xếp các quân cờ trên bàn cờ là một trạng thái). Ví dụ về cách xây
dựng một cây trò chơi cho cờ tướng:
Nút gốc là trạng thái bàn cờ khi cuộc chơi chuẩn bị bắt đầu.
Các nhánh là một cách biến đổi từ trạng thái này sang trạng thái khác phục thuộc vào sự lựa chọn nước đi cảu người chơi
Các tra ̣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 (chẳng ha ̣n, quân Trắng thắng hoặc quân Đen thắng hoặc hai bên hòa nhau)
2.1.3 Ý tƣởng thuật toán
Hai người chơi tạm gọi là MAX và MIN. Người chơi MAX luôn tìm cách đi để thu về lợi nhuận lớn nhất cho mình còn người chơi MIN thì tìm cách đi để tối thiểu hoá lợi nhuận thu được của người chơi MAX.
Trò chơi có thể biểu diễn dưới dạng cây:
Nút gốc là trạng thái ban đầu của trò chơi
Nút con của một nút bất kỳ là trạng thái có thể biến đổi được từ nút cha mà người chơi MIN hoặc MAX thực hiện
Một cây độ sâu d thì người chơi MAX được quyền biến đổi các nút ở độ sâu chẵn: 0,2,4,6… Người chơi MIN được quyền biến đổi các nút ở độ sâu lẻ 1,3,5,7…
Trong mỗi cây trò chơi các trạng thái ở nút là luôn là trạng thái kết thúc của cuộc chơi, vì vậy trong các cây trò chơi trạng thái nút lá luôn là một trong ba trường hợp sau: “thắng” “hoà” hoặc “bại”. Nếu chúng ta có thể xây dựng được một hàm đánh giá cho trạng thái nút lá và đưa ra một giá trị định lượng cho trạng thái đó, việc thực hiện một quy tắc tính toán và định trị cho các nút thuộc lớp trên của các trạng thái lá là hoàn toàn khả thi. Ý tưởng của thuật toán Minimax như sau:
Điều kiện cần:
o Xây dựng được hàm định lượng cho trạng thái nút lá Chiến lược Minimax:
o Người chơi thuộc lớp MAX sẽ chọn nhánh đi sao cho khả năng dành chiến thắng của mình là cao nhất. Vì vậy nhánh được chọn sẽ là nhánh dẫn đến nút con có giá trị định lượng lớn nhất. Gán cho giá trị nút MAX là giá trị lớn nhất trong các giá trị nút con của nó có được.
o Người chơi thuộc lớp MIN sẽ chọn nhánh đi tốt nhất để hạn chế chiến thắng của đối phương. Vì vậy nhánh được chọn sẽ là nhánh dẫn đến nút con có giá trị định lượng thấp nhất (vì định lượng của mỗi nút được tính cho người chơi MAX). Gán cho giá trị nút MIN là giá trị nhỏ nhất trong các giá trị nút con của nó có được.
o Ở các trạng thái lá ta đã định lượng được giá trị của nó, bởi vậy quá trình tính ngược từ lá về gốc theo hai quy tắc trên là hoàn toàn thực hiện được
Sau khi đã định lượng được cho toàn bộ các nút của cây trò chơi, thì người chơi MAX sẽ chọn nước đi cho mình theo nhánh chứa nút con mà nó vừa nhận giá trị của nút con đó. Cũng như vậy, người chơi MIN sẽ chọn nước đi theo nhánh chứa nút con có giá trị nhỏ nhất.
Ví dụ về chiến lƣợc Minimax: Xét cây tìm kiếm trên hình 2.1, dễ nhận thấy điều kiện cần cho thuật toán Minimax đã được thoả mãn:
o Nút gốc là nút A, cây trò chơi được phát triển từ nút A như hình vẽ
Hình 2.1: Cây tìm kiếm đã tính được trọng số lá
Hình 2.2: Cây tìm kiếm đã được tính trọng số tất cả các nút
Việc gán trọng số cho các nút A,B,C,D,E,F,G,H,I,J sẽ được tính ngược từ trạng thái lá và có kết quả như (hình 2.2). Cụ thể quá trình đó như sau:
o Bước 1: Tính giá trị của các nút E,F,G,H,I,J thuộc lớp MAX nên giá trị sẽ được gán cho giá trị Max của những nút con. Cụ thể Val(E) = Max(2,5) = 5, tương tự với các nút F,G,H,I,J
o Bước 2: Tính giá trị của các nút B,C,D thuộc lớp MIN, giá trị sẽ được gán là giá trị Min của những nút con. Cụ thể Val(B) = Min(Val(E), Val(F)) = Min(3, 9) = 3, tương tự với các đỉnh C và D
o Bước 3: Tính giá trị nút gốc A thuộc lớp MAX nên Val(A) = Max(Val(B, Val(C), Val(D)) = Max(3, 0, 2) = 3
Vậy người chơi MAX sẽ chọn nhánh đi theo nút A -> B vì giá trị của nút A tìm được theo nhánh đi này.
2.1.4 Thuật toán Minmax với độ sâu định trƣớc
Với các trò chơi phức tạp ta không thể duyệt toàn bộ không gian để tìm được nước đi tốt nhất. Lúc này ta chỉ có thể tìm kiếm trên cây trò chơi với một chiều cao hạn chế d nào đó. Chiến lược này được gọi là tính trước n nước đi (n – move lookahead). Vì giá trị các nút trong đồ thị con này không phải là trạng thái kết thúc của trò chơi nên chúng không phản ánh giá trị thắng cuộc hay thua cuộc. Chúng chỉ có thể được gán một giá trị phù hợp với một hàm đánh giá heuristic nào đó. Giá trị được truyền ngược về nút gốc không cung cấp thông tin thắng cuộc hay thua cuộc mà chỉ là giá trị heuristic của trạng thái tốt nhất có thể tiếp cận sau n nước đi kể từ nút xuất phát.
Hàm đánh giá sẽ đánh giá mức độ tốt của một trạng thái theo cách nhìn nhận của người chơi MAX. Val(u) càng lớn thì người chơi MAX càng có lợi nếu chiến lược u được chọn, ngược lại Val(u) càng nhỏ thì người chơi MAX sẽ càng bất lợi nếu chọn chiến lược u. Trường hợp Val(u) = 0 thì chiến lược u sẽ không làm lợi cho bất kỳ người nào trong cuộc chơi.
Việc xây dựng hàm đánh giá là cực kỳ quan trọng trong mỗi cuộc chơi. Hàm đánh giá tốt sẽ làm cho chiến lược chơi theo giải thuật Minimax tốt, ngược lại nếu hàm đánh giá không tốt sẽ làm cho người chơi có thể lựa chọn những nước đi sai lầm. Xây dựng được hàm đánh giá tốt đòi hỏi người chơi phải am hiểu trò chơi và có những kinh nghiệm nhất định trong trò chơi đó.
Ví dụ về hàm đánh giá: Hàm đánh giá cho cờ vua . Mỗi loa ̣i quân được gán một giá tri ̣ số phù hợp vớ i “sức ma ̣nh” của nó . Chẳng ha ̣n , quân tốt Trắng (Đen) được gán giá trị 1 (-1), mã hoặc tượng Trắng (Đen) được gán giá trị 3 (-3), xe Trắng (Đen) được gán giá trị 5 (-5) và hậu Trắng (Đen) được gán giá trị 9 (-9). Hàm đánh giá của một tra ̣ng thái được tính bằng cách lấy tổng giá trị của tất cả các quân cờ trong tra ̣ng th ái đó. Hàm đánh giá này được go ̣i l à hàm tuyến tính có trọng số, vì có thể biểu diễn dưới da ̣ng: s1w1 +s2w2 +...+snwn
Đây là cách đánh giá đơn giản, vì nó không tính đến sự bố trí của các quân cờ , các mối tương quan giữa chúng.
Xét ví dụ về cây tìm kiếm theo giải thuật Minimax với độ sâu d = 4
Hình 2.3: Minh hoạ cây tìm kiếm với giải thuật Minimax
Trong ví dụ trên, chiến lược được chọn cho người chơi MAX là biến đổi trạng thái ban đầu về trạng thái bên trái.
2.1.5 Thủ tục Minimax
Để ha ̣n chế không gian tìm kiếm , khi xác đi ̣nh nu ̛ớc đi cho Trắng ta ̣i u , ta chỉ xem xét cây gốc u ta ̣i độ cao h nào đó . Áp du ̣ng thủ tu ̣c Minimax cho cây trò chơi gốc u, độ cao h và sử du ̣ng hàm đánh giá để xác đi ̣nh giá tri ̣ cho các lá của cây.
Procedure Minimax(u, v, h); begin
val ←-∝;
for mỗI w là đỉnh con của u do if val(u) <= MinVal(w, h-1) then { val ← MinVal(w, h-1); v ← w; } end; ---
Function MinVal(u, h); {hàm xác đi ̣nh giá tri ̣ cho các đỉnh Đen} begin
if u là đỉnh kết thúc or h = 0 then MinVal(u, h) ← eval(u)
else MinVal(u, h) ← min{MaxVal(v, h-1) | v là đỉnh con của u} end;
---
Function MaxVal(u, h); { hàm xác đi ̣nh giá tri ̣ cho các đỉnh Trắng} begin
if u là đỉnh kết thúc or h =0 then MaxVal(u, h) ← eval(u)
else MaxVal(u, h) ← max{MinVal(v, h-1) | v là đỉnh con của u} end;
Trong thủ tục trên thì u là trạng thái hiện tại, v là trạng thái được chọn cho nước đi tốt nhất từ u, h là độ cao của nút u đang xét.
2.1.6 Đánh giá thuật toán Minimax
Thuật toán Minimax là thuật toán tìm kiếm theo chiều sâu và duyệt toàn bộ cây nên nó sẽ có không gian tìm kiếm và không gian bộ nhớ hao tốn giống như thuật toán tìm kiếm theo chiều sâu.
Ước tính chi phí:
Giả sử tại mỗi nút người chơi có b cách đi: hệ số nhánh của cây là b Độ cao của cây tìm kiếm là d
Thuật toán Minimax sẽ thăm số nút: b(bd-1)/(b-1). Do đó độ phức tạp thời gian là O(bd). Bản chất của thuật toán là tìm kiếm theo chiều sâu, vì vậy việc đòi hỏi không gian bộ nhớ của nó chỉ tuyến tính với d và b. Vì thế độ phức tạp không gian là O(bd).
Nếu hệ số nhánh trung bình của cây là b = 20, và tìm kiếm đến độ sâu 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à 204 = 160000 (16 vạn nút). Còn với b = 20, d = 5 thì số nút phải lượng giá sẽ tăng 20 lần nữa thành 205 = 3200000 (trên 3 triệu nút), đây là con số tương đối lớn.[1]
Thuật toán Minimax khá đơn giản và còn một số hạn chế. Chúng ta có thể nhận thấy rằng trong quá trình tính trọng số của các nút, đôi khi có rất nhiều nhánh không cần thăm vì kết quả của nhánh đó sẽ không làm ảnh hưởng đến toàn cục diện của nút đang được xét. Từ yếu tố đó thuật toán cải tiến Minimax alpha-beta được đưa ra để hạn chế việc thăm một số nhánh dư thừa. Thuật toán này sẽ được trình bày rõ hơn trong phần 2.2.
2.2 Thuật toán cải tiến Minimax Alpha-beta
Với thuật toán Minimax độ sâu hạn chế, ta thấy đượ rằng để đánh giá được đỉnh gốc ta duyệt qua toàn bộ cây, thăm tất cả các đỉnh rồi sau đó hồi quy về gốc. Để ý một chút thì ta sẽ thấy có rất nhiều nhánh chắc chắn sẽ cho kết quả tồi hơn một kết quả nào đó ở thời điểm hiện tại đang có. Rõ ràng trong trường hợp đó thì không cần tiếp tục đánh giá nhánh đó. Việc không cần thiết đánh giá một nhánh được cho là tồi sẽ không làm ảnh hưởng đến kết quả toàn cục khi đánh giá đỉnh gốc.
Hình 2.4: Một phần của cây trò chơi với ý tưởng cắt nhánh alpha Thuật toán Alpha-beta là một cải tiến của thuật toán Minimax nhằm tỉa bớt nhánh không cần thiết của cây trò chơi. Xét hình 2.4 tại nút C rõ ràng nhánh bên phải cần được cắt bỏ vì dù đi theo nhánh đó các trạng thái bên dưới thế nào đi nữa thì cuối cùng giá trị thu được không tốt bằng đi theo nhánh bên trái.
2.2.1 Ý tƣởng thuật toán
Nguyên 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.”
Giả sử tại thời điểm hiện ta ̣i đang ở đỉnh MAX a, đỉnh a có anh em là v đã được đánh giá. Giả sử cha của đỉnh a là b, b có anh em là u đã được đánh giá, và cha của b là c như hình 2.5
Để cài đ ặt kỹ thu ật này, đối với các đỉnh nằm trên đu ̛ờng đi từ gốc tới đỉnh hiện thời, ta sử du ̣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 MAX, tham số β để ghi lại giá trị nhỏ nhất trong các giá tri ̣ của các đỉnh con đã đánh giá của một đỉnh MIN.
Hình 2.5: Minh hoạ ý tưởng cắt nhánh theo alpha
Như vậy, dựa vào mối quan hệ của các nút ở lớp thứ n và n + 2 ta có thể loại bỏ các cây con ở lớp n + 1. Việc loại bỏ các cây con ở lớp n + 1 sẽ không làm ảnh hưởng đến kết quả toàn cục khi tính toán trọng số của nút thứ n.
2.2.2 Giải thuật Minmax Alpha-beta
Thuật toán Alpha -Beta
- Khởi tạo giá trị alpha- beta cho đỉnh gốc, đặt giá trị của alpha là - và beta
là +.
- Nếu quá trình tìm kiếm đạt đến trạng thái lá (là trạng thái kết thúc trò chơi hoặc đạt đến độ sâu giới hạn tìm kiếm), áp dụng hàm tính trọng số để gán giá trị định lượng cho nút.
- Nếu như mức đang xét là của người chơi cực tiểu (MIN):
o Áp dụng thủ tục Alpha-beta với giá trị alpha và beta hiện tại cho một con. Ghi nhớ lại kết quả.
Nếu giá trị đó nhỏ hơn thì đặt beta bằng giá trị mới này. Ghi nhớ lại beta (thu hẹp khoảng [alpha, beta] bằng cách giảm giá trị beta).
Nếu giá trị đó lớn hơn beta thì dừng quá trình tìm kiếm từ cây con này (ở đây ta thực hiện việc cắt tỉa và gọi là cắt tỉa beta
- Nếu như mức đang xét là của người chơi cực đại (MAX):
o Áp dụng thủ tục Alpha-beta với giá trị alpha và beta hiện tại cho một con. Ghi nhớ lại kết quả.
o So sánh giá trị ghi nhớ với giá trị alpha:
Nếu giá trị đó lớn hơn thì đặt alpha bằng giá trị mới này. Ghi nhớ lại alpha (thu hẹp khoảng [alpha, beta] bằng cách tăng giá trị alpha).
Nếu giá trị đó nhỏ hơn alpha thì dừng quá trình tìm kiếm từ cây con này (ở đây ta thực hiện việc cắt tỉa và gọi là cắt tỉa
Giả mã thuật toán Minimax alpha-beta:
Procedure Alpha_beta(u, v); begin
α←-∝; β←-∝;
for (mỗI w là đỉnh con của u) do if α <= MinVal(w, α, β) then { α←MinVal(w,α,β); v← w; } end; ---
Function MinVal(u, α, β); {hàm xác đi ̣nh giá tri ̣ cho các đỉnh Đen} begin
if (u là đỉnh kết thúc or u là lá của cây hạn chế)then MinVal(u, α, β) ← eval(u)
Else
for (mỗI đỉnh v là con của u) do {
β ← min{β, MaxVal(v, α, β)} ;
If α >= β then exit; //cắt bỏ các cây con từ các đỉnh v còn la ̣i }
MinVal(u, α, β) ← β; end;
---