TỔNG QUAN VỀ LÝ THUYẾT TRÕ CHƠI
Giới thiệu về lý thuyết trò chơi
Lý thuyết trò chơi là một lĩnh vực toán học nghiên cứu các tình huống chiến thuật, nơi các đối thủ cố gắng tối đa hóa kết quả cho bản thân Trong bối cảnh công nghệ thông tin phát triển mạnh mẽ hiện nay, Lý thuyết trò chơi ngày càng thu hút sự quan tâm của các nhà khoa học máy tính nhờ vào ứng dụng trong Trí tuệ nhân tạo và điều khiển học.
Một số tài liệu ghi lại thì lý thuyết trò chơi xuất hiện lần đầu tiên vào năm
Vào năm 1713, tác giả đã đề xuất giải pháp chiến thuật hỗn hợp Minimax cho trò chơi bài hai người Leher Tuy nhiên, lý thuyết trò chơi chỉ thực sự trở thành một ngành khoa học khi John von Neumann công bố loạt bài báo vào năm sau đó.
Năm 1828, John von Neumann đã hình thức hóa Lý thuyết trò chơi, đặc biệt trong bối cảnh Chiến tranh Lạnh, nhấn mạnh ứng dụng của nó trong chiến lược quân sự Ông nổi tiếng với khái niệm đảm bảo phá hủy lẫn nhau, thể hiện tầm quan trọng của lý thuyết này trong việc phân tích các tình huống cạnh tranh và xung đột.
Lý thuyết trò chơi hiện nay được áp dụng rộng rãi trong nhiều lĩnh vực như kinh tế, kinh doanh, sinh học, chính trị học, triết học, khoa học máy tính, logic, viễn thông, và cả trong một số trò chơi truyền hình.
Với sự phát triển mạnh mẽ của ngành công nghệ thông tin, lý thuyết trò chơi ngày càng trở nên quan trọng, đặc biệt trong lĩnh vực logic và khoa học máy tính Nhiều lý thuyết logic hiện nay dựa trên ngữ nghĩa trò chơi, trong khi các nhà khoa học máy tính sử dụng trò chơi để mô phỏng các tính toán tương tác.
Trong Lý thuyết trò chơi, nhiều thuật toán đã được nghiên cứu và ứng dụng hiệu quả, như thiết kế trò chơi Nim và các trò chơi có nhân, tính đối xứng Bài viết này tập trung vào việc áp dụng thuật toán tìm kiếm MinMax và thuật toán cắt tỉa Alpha-Beta để phát triển chương trình trò chơi 2048.
1.1.2 John Nash và thuyết cân bằng
Cân bằng Nash, một khái niệm trong Lý thuyết trò chơi do John Nash phát triển, xác định chiến lược tối ưu cho các trò chơi có nhiều đối thủ Nó được hình thành khi không một đối thủ nào có thể cải thiện kết quả của mình bằng cách thay đổi chiến lược hiện tại, trong khi các đối thủ khác giữ nguyên chiến lược của họ Nếu bất kỳ sự thay đổi đơn phương nào từ một đối thủ dẫn đến lợi ích thấp hơn so với chiến lược hiện tại, thì đó chính là cân bằng Nash Khái niệm này áp dụng cho các trò chơi có từ hai đối thủ trở lên, và Nash đã chứng minh rằng tất cả các giải pháp trước đó trong trò chơi đều có thể được diễn đạt dưới dạng cân bằng Nash.
Với mối quan hệ giữa giá trị cực đại và giá trị cực tiểu đã được xác lập, chúng ta có thể xác định giá trị cân bằng của trò chơi.
Một cặp chiến lược (p’,q’) được gọi là cân bằng nếu p’ tương xứng tốt với q’ và ngược lại q’tương xứng tốt với p’, nghĩa là:
Trong một trò chơi giữa hai đối thủ, mỗi người chọn một số từ 0 đến 10 mà không biết lựa chọn của người kia Người chọn số lớn hơn sẽ thua và phải trả tiền cho đối thủ Trò chơi này có một điểm cân bằng Nash duy nhất, đó là cả hai cùng chọn số 0 Mọi lựa chọn khác có thể dẫn đến việc một trong hai bên thua cuộc.
Một trò chơi có thể có nhiều hoặc không có cân bằng Nash Nash đã chứng minh rằng nếu cho phép các chiến lược hỗn hợp, tức là các đối thủ chọn ngẫu nhiên các chiến lược dựa vào xác suất đã được ấn định trước, thì bất kỳ trò chơi nào với n đối thủ, trong đó mỗi đối thủ có thể chọn từ nhiều chiến lược trong giới hạn cho trước, sẽ có ít nhất một cân bằng Nash của các chiến lược hỗn hợp.
Ví dụ về bài toán Tù nhân (Prisoner’s dilemma) minh họa sự mâu thuẫn giữa hành vi cá nhân và lợi ích của việc hợp tác Vấn đề chính là mỗi đối thủ cố gắng tối đa hóa lợi ích cá nhân mà không quan tâm đến lợi ích của người khác, thể hiện tính ích kỷ Bài toán này có một cân bằng Nash khi cả hai đối thủ không tôn trọng giao ước, nhưng thực tế cả hai đều thiệt thòi hơn so với việc hợp tác Chiến lược hợp tác không bền vững, vì một đối thủ có thể thu được lợi ích lớn hơn nếu không tôn trọng giao ước trong khi đối thủ còn lại vẫn hợp tác.
Lý thuyết kinh tế về đấu giá là một ứng dụng quan trọng của cân bằng Nash và lý thuyết trò chơi Trước đây, các nhà kinh tế chủ yếu phân tích thị trường dựa trên cung và cầu hàng hóa, mà ít chú ý đến các quy luật chi phối quá trình đấu giá.
Các hình thức đấu giá có sự khác biệt rõ rệt so với các thị trường khác như thị trường chứng khoán hay siêu thị nhờ vào các "trò chơi" trong quy trình đấu giá Hiện nay, nghiên cứu về đấu giá chủ yếu tập trung vào cân bằng Nash trong các quy luật đấu giá.
P Ordeshook Giáo sư chính trị học, Học viện công nghệ California, tác giả cuốn
Khái niệm cân bằng Nash là một trong những ý tưởng quan trọng nhất trong lý thuyết trò chơi không hợp tác, có ứng dụng rộng rãi trong việc phân tích chiến lược của ứng viên trong bầu cử cũng như trong việc nghiên cứu nguyên nhân của các cuộc chiến tranh.
Các nhóm quyền lợi và dự báo sự kiện đóng vai trò quan trọng trong việc tìm kiếm và mô tả các trạng thái cân bằng Nói một cách đơn giản, các chiến lược cân bằng chính là những dự đoán về hành vi con người.
Bài toán tìm kiếm và không gian tìm kiếm
Trong cuộc sống, chúng ta thường phải đối mặt với nhiều bài toán tìm kiếm, đặc biệt khi đưa ra quyết định giữa các lựa chọn Việc lựa chọn phương án tối ưu giúp chúng ta đạt được một hoặc nhiều mục tiêu đã đề ra.
Bài toán tìm kiếm liên quan đến quá trình suy nghĩ và đưa ra sự lựa chọn Không gian tìm kiếm bao gồm tất cả những lựa chọn khả thi mà chúng ta có.
Trong khoa học máy tính, nhiều bài toán chủ yếu là bài toán tìm kiếm Một phương pháp đơn giản để giải quyết vấn đề này là sử dụng cách thử sai, nơi tất cả các khả năng trong không gian tìm kiếm được xem xét và so sánh với mục tiêu ban đầu Mặc dù phương pháp này dễ thực hiện, nhưng thường tốn nhiều thời gian Một cách tiếp cận khác là tìm kiếm theo kinh nghiệm, trong đó kinh nghiệm được hình thành trong quá trình tìm kiếm để loại bỏ sớm những trạng thái không dẫn đến kết quả tối ưu Phương pháp này đã được nghiên cứu và áp dụng rộng rãi trong ngành khoa học máy tính.
Tìm kiếm là quá trình xác định một hoặc nhiều đối tượng đáp ứng các yêu cầu cụ thể trong một tập hợp lớn Nó liên quan đến việc tìm kiếm thông tin đã được lưu trữ, thường được tổ chức thành các mẩu tin (record) có khóa (key) riêng để dễ dàng truy xuất Mỗi khóa được sử dụng để tìm kiếm các mẩu tin cần thiết, và mỗi mẩu tin chứa đầy đủ thông tin phục vụ cho các quy trình xử lý khác nhau Tìm kiếm có ứng dụng rộng rãi và đa dạng trong nhiều lĩnh vực.
1.2.2 Không gian tìm kiếm 1.2.2.1 Không gian tìm kiếm
Trong quá trình giải quyết bài toán tìm kiếm, việc xác định không gian tìm kiếm là rất quan trọng Không gian tìm kiếm bao gồm tất cả các trạng thái mà chúng ta cần khám phá để tìm ra trạng thái thỏa mãn yêu cầu Không gian trạng thái có thể là liên tục, như không gian vector, hoặc chứa các đối tượng rời rạc, chẳng hạn như tập hợp các nút trong đồ thị.
Các bài toán tìm kiếm thường yêu cầu tìm một lộ trình trong không gian trạng thái, bắt đầu từ trạng thái ban đầu đến trạng thái kết thúc, nhằm đáp ứng một yêu cầu cụ thể đã được xác định trước Yêu cầu này chính là đặc điểm riêng biệt của từng bài toán.
Cho trước hai trạng thái T 0 và T G hãy xây dựng chuỗi trạng thái T 0 , T 1 , T 2 , ,
1 , ) thỏa mãn một điều kiện cho trước
Trong không gian trạng thái S, T i đại diện cho tất cả các trạng thái khả thi của bài toán, trong khi Pcost(T i-1, T i) là chi phí chuyển đổi từ trạng thái T i-1 sang T i Từ một trạng thái T i-1, có nhiều phương pháp để chuyển đổi sang trạng thái T i, mỗi phương pháp sẽ có những đặc điểm riêng.
T i-1 sang T i ta sẽ dùng thuật ngữ hướng đi (với ngụ ý nói về sự lựa chọn)
Hình 1.1: Ví dụ về đồ thị và các trạng thái
1.2.2.2 Biểu diễn bằng đồ thị Đồ thị có khả năng biểu diễn được nhiều cấu trúc và rất nhiều bài toán cụ thể trong cuộc sống có thể biểu diễn bằng đồ thị Ví dụ một mạng lưới giao thông trong một địa phương nào đó có thể được biểu diễn bằng đồ thị như sau: các đỉnh là các nút giao thông, các cạnh là các con đường, trọng số của mỗi cạnh là khoảng cách thực tế giữa hai nút giao thông… Với khả năng biểu diễn bài toán của đồ thị rất mạnh nên đồ thì là một mối quan tâm rất lớn đối với ngành khoa học máy tính
Cấu trúc đồ thị có thể được mở rộng thông qua việc gán trọng số cho từng cạnh, cho phép biểu diễn nhiều khái niệm khác nhau Đồ thị có trọng số mang lại khả năng mô hình hóa phong phú, thích hợp cho nhiều ứng dụng trong thực tế.
Trong đồ thị biểu diễn mạng đường giao thông, trọng số thường là độ dài của các con đường Để mở rộng đồ thị cơ bản, có thể quy định hướng cho các cạnh, tạo thành đồ thị có hướng Khi đồ thị có hướng và các cạnh có trọng số, nó được gọi là lưới.
Đồ thị được thể hiện bằng cách vẽ một điểm cho mỗi đỉnh, và nối các đỉnh bằng các cung nếu chúng có cạnh Đối với đồ thị có hướng, hướng được chỉ định bằng mũi tên.
Không nên nhầm lẫn giữa đồ hình của đồ thị và bản thân đồ thị, vì đồ thị là một cấu trúc trừu tượng không có hình ảnh cụ thể Sự khác biệt chủ yếu nằm ở cách kết nối các đỉnh và số lượng cạnh giữa chúng Trong thực tế, việc xác định hai đồ hình có biểu diễn cùng một đồ thị hay không thường gặp khó khăn, và tùy thuộc vào từng bài toán, một đồ hình có thể dễ hiểu và phù hợp hơn so với đồ hình khác.
Cấu trúc dữ liệu đồ thị
Có nhiều cách để biểu diễn đồ thị trên máy tính, trong đó phương pháp đơn giản nhất là sử dụng ma trận kề NxN, với N là số đỉnh của đồ thị Mỗi ô [i][j] trong ma trận lưu trữ mối quan hệ giữa đỉnh [i] và đỉnh [j] (1 < i, j 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
Trong các trò chơi phức tạp, việc duyệt toàn bộ không gian để tìm nước đi tốt nhất là không khả thi Thay vào đó, ta sử dụng chiến lược tính trước n nước đi (n-move lookahead) để tìm kiếm trên cây trò chơi với chiều cao hạn chế Giá trị các nút trong đồ thị con này không phản ánh kết quả thắng hay thua, mà chỉ có thể được gán một giá trị dựa trên hàm đánh giá heuristic Giá trị này được truyền ngược về nút gốc, cung cấp thông tin về giá trị heuristic của trạng thái tốt nhất có thể đạt được sau n nước đi từ nút xuất phát.
Hàm đánh giá xác định mức độ hiệu quả của một chiến lược trong trò chơi từ góc nhìn của người chơi MAX Nếu giá trị Val(u) lớn, người chơi MAX sẽ hưởng lợi từ chiến lược u; ngược lại, nếu Val(u) nhỏ, người chơi MAX sẽ gặp bất lợi khi chọn chiến lược này Đặc biệt, khi Val(u) bằng 0, chiến lược u sẽ không mang lại lợi ích cho bất kỳ ai trong trò chơi.
Việc xây dựng hàm đánh giá là yếu tố quan trọng trong mỗi trò chơi, vì hàm đánh giá tốt giúp cải thiện chiến lược chơi theo thuật toán Minimax Ngược lại, một hàm đánh giá kém có thể dẫn đến những quyết định sai lầm từ người chơi Để tạo ra một hàm đánh giá hiệu quả, người chơi cần có hiểu biết sâu sắc về trò chơi và kinh nghiệm thực tiễn.
Hàm đánh giá trong cờ vua gán giá trị số cho từng loại quân dựa trên "sức mạnh" của chúng Cụ thể, quân tốt được gán giá trị 1, mã hoặc tượng là 3, xe là 5, và hậu là 9 Để tính hàm đánh giá cho một trạng thái, ta lấy tổng giá trị của tất cả các quân cờ trong trạng thái đó, được biểu diễn dưới dạng hàm tuyến tính có trọng số: s1w1 + s2w2 + + snwn, trong đó wi là giá trị của quân cờ loại i và si là số quân loại đó Tuy nhiên, phương pháp này đơn giản vì không xem xét đến bố trí và mối tương quan giữa các quân cờ.
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
Thuật toán cải tiến Minimax Alpha-beta
Với thuật toán Minimax độ sâu hạn chế, để đánh giá đỉnh gốc, ta cần duyệt qua toàn bộ cây và thăm tất cả các đỉnh trước khi hồi quy về gốc Trong quá trình này, có nhiều nhánh chắc chắn sẽ cho kết quả kém hơn so với một kết quả hiện tại Do đó, không cần thiết phải tiếp tục đánh giá những nhánh này, vì việc loại bỏ các nhánh tồi sẽ không ả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 phiên bản tối ưu hóa của thuật toán Minimax, giúp loại bỏ các nhánh không cần thiết trong cây trò chơi Như minh họa ở hình 2.4, tại nút C, nhánh bên phải có thể bị cắt bỏ vì bất kỳ trạng thái nào bên dưới cũng không mang lại giá trị tốt hơn so với nhánh bên trái.
“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ử hiện tại chúng ta đang ở đỉnh MAX a, với các đỉnh anh em là v đã được đánh giá Cha của đỉnh a là b, và b có anh em là u cũng đã được đánh giá, trong khi 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 đườ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 MAX, và tham số β để ghi lại giá trị nhỏ nhất trong các giá trị 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
Dựa vào mối quan hệ giữa các nút ở lớp thứ n và n + 2, chúng ta có thể loại bỏ các cây con ở lớp n + 1 mà không ảnh hưởng đến kết quả tổng thể khi tính toán trọng số của nút thứ n.
2.2.2 Giải thuật Minmax Alpha-beta
- Khởi tạo giá trị alpha- beta cho đỉnh gốc, đặt giá trị của alpha là - và beta là +
Khi quá trình tìm kiếm đạt đến trạng thái lá, tức là kết thúc trò chơi hoặc đạt đến độ sâu giới hạn, cần áp dụng hàm tính trọng số để gán giá trị định lượng cho nút.
Để xử lý mức của người chơi cực tiểu (MIN), cần áp dụng thủ tục Alpha-beta với các giá trị alpha và beta hiện tại cho một con Sau đó, ghi nhớ kết quả và so sánh giá trị ghi nhớ với giá trị beta.
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, quá trình tìm kiếm từ cây con này sẽ dừng lại Hành động này được gọi là cắt tỉa beta.
Khi xét mức của người chơi cực đại (MAX), cần áp dụng thủ tục Alpha-beta với giá trị alpha và beta hiện tại cho một con Sau đó, ghi nhớ kết quả và 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, quá trình tìm kiếm từ cây con sẽ dừng lại, và đây được gọi là cắt tỉa alpha.
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 α = β then exit; //cắt bỏ các cây con từ các đỉnh v còn la ̣i }
- Function MaxVal(u, α, β); { hàm xác đi ̣nh giá tri ̣ cho các đỉnh Trắng} begin if u là đỉnh kết thúc or là lá của cây hạn chế then
For (mỗI đỉnh v là con của u) do { α ← max{α, MinVal(v, α, β)} ;
If α >= β then exit;/*cắt bỏ các cây con từ các đỉnh v còn la ̣i */
Thuật toán Alpha-beta giúp tiết kiệm thời gian so với Minimax, đồng thời đảm bảo độ chính xác trong kết quả tìm kiếm Tuy nhiên, số lượng nút bị cắt bỏ không ổn định và phụ thuộc vào thứ tự duyệt các nút.
Trong trường hợp lý tưởng, các nút lá có trọng số được sắp xếp theo thứ tự tăng dần, với lớp lá là lớp Max Khi đó, tất cả các cây con nhánh bên phải sẽ bị cắt bỏ.
Trong trường hợp xấu nhất, khi các nút lá có trọng số được sắp xếp theo thứ tự tăng dần và lớp lá là lớp Min, thuật toán Minimax alpha-beta vẫn cần phải duyệt qua toàn bộ các nút tương tự như thuật toán Minimax.
ÁP DỤNG VÀO TRÕ CHƠI 2048
Phân tích bài toán
2048 là trò chơi giải đố nổi tiếng do Gabriele Cirulli, lập trình viên 19 tuổi người Ý, phát triển vào tháng 3 năm 2014 Mục tiêu chính của trò chơi là trượt các khối vuông có số trên một lưới vuông để kết hợp chúng và tạo ra khối vuông có giá trị 2048.
2048 là trò chơi được chơi trên lưới vuông 4×4, nơi người chơi di chuyển các khối bằng phím mũi tên theo bốn hướng: lên, xuống, trái và phải Mỗi lượt, một khối mới có giá trị 2 hoặc 4 sẽ xuất hiện, tạo cơ hội cho người chơi kết hợp các khối giống nhau để đạt được điểm số cao hơn.
Trong trò chơi, số 4 sẽ xuất hiện ngẫu nhiên trên lưới, và các khối vuông sẽ trượt theo hướng chỉ định cho đến khi chạm vào biên hoặc gặp khối vuông khác Khi hai khối vuông có cùng giá trị chạm vào nhau, chúng sẽ kết hợp thành một khối vuông mới có giá trị gấp đôi Khối vuông mới này không thể kết hợp với khối vuông khác trong lượt di chuyển tiếp theo Để phân biệt, các khối vuông với giá trị khác nhau sẽ có màu sắc khác nhau.
Bảng điểm ở góc trên bên phải hiển thị điểm số của người chơi, bắt đầu từ 0 Khi hai khối vuông kết hợp, người chơi sẽ nhận được điểm tương ứng với giá trị của khối vuông mới Ngoài điểm hiện tại, bảng còn ghi lại kỷ lục điểm cao nhất mà người chơi đã đạt được.
Khi người chơi tạo ra ô vuông có giá trị 2048, họ sẽ thắng cuộc Sau đó, người chơi có thể quyết định tiếp tục để đạt được các giá trị cao hơn Trò chơi sẽ kết thúc khi không còn nước đi hợp lệ, tức là không còn ô trống và các ô kề nhau đều có giá trị khác nhau.
3.1.2 Áp dụng Minimax Alpha-beta vào trò chơi 2048
Trong trò chơi 2048, người chơi thực hiện một nước đi, sau đó máy tính ngẫu nhiên sinh ra một số 2 hoặc 4 ở ô trống Điều này cho phép chúng ta xem xét trò chơi như một bài toán đối kháng giữa người và máy tính, nơi thuật toán Minimax có thể được áp dụng, với máy tính hoạt động như một đối thủ không quá mạnh.
Hình 3.1: ví dụ một trạng thái của trò chơi và trạng thái chiến thắng
Hình 3.2: Mô hình bài toán tổng quát
Quy trò chơi 2048 về bài toán đối kháng: Đối tượng đối kháng: Người chơi + Máy tính Luật đi của các đối tượng:
Người chơi: Người chơi có thể chuyển bảng theo bốn hướng:
Dưới => Trên Trên => Dưới Trái => Phải Phải => Trái
Máy tính: Sinh ngẫu nhiên một số 2 hoặc 4 ở ô trống bất kỳ
Để tính điểm ở một trạng thái trong trò chơi, chúng ta bắt đầu từ trạng thái gốc khi khởi tạo bảng và theo dõi các nước di chuyển đến độ sâu n Điểm số ở độ sâu n được xác định là tổng điểm ăn được trong quá trình chuyển đổi trạng thái từ mức 0 đến mức n.
Ta có thể sử dụng điểm thô của một trạng thái để gán cho trọng số của các điểm lá trong mô hình tổng quát s
Ví dụ v ề cách tính điể m c ủ a m ộ t tr ạng thái:
Điểm số trong trò chơi được tính dựa trên từng lượt di chuyển của người chơi, với ô điểm số ghi nhận điểm tích lũy từ bước đi đầu tiên đến trạng thái hiện tại Các điểm tích lũy qua các lượt di chuyển được thể hiện như sau: (1: 0đ); (2: 0đ); (3: 4đ); (4: 8đ); (5: 16đ); (6: 20đ); (7: 20đ); (8: 24đ); (9: 28đ).
Mũi tên trên các trạng thái chỉ thị người chơi sẽ chọn cách di chuyển theo hướng mũi tên đó để đến được với trạng thái tiếp theo
Hình 3.3: Ví dụ về cách di chuyển và tính điểm của một trạng thái
3.1.3 Cách tính trọng số nút lá
Hàm tính trọng số của nút lá trong cây tìm kiếm của thuật toán Minimax đóng vai trò quan trọng trong việc đánh giá và so sánh quá trình tìm kiếm.
Nhiều trường hợp cho thấy một cách di chuyển có thể mang lại điểm số cao hơn, nhưng sau đó dẫn đến tình trạng các ô số bị ứ lại, không thể tiếp tục di chuyển, gây ra nguy cơ thua cuộc Để cải thiện tình huống này, thuật toán sẽ xem xét thêm số ô số còn có thể di chuyển trong bước tiếp theo cho mỗi quyết định Bên cạnh đó, còn nhiều yếu tố quan trọng khác ảnh hưởng đến việc đánh giá một trạng thái là tốt hay xấu, sẽ được phân tích chi tiết hơn ở phần dưới.
Score = smoothness * smoothWeight + monotonicity * monoWeight + log(emptyCellCount) * emptyWeight + maxLevel * maxWeight;
Trong đó:smoothWeight = 0.1, monoWeight = 1.0, emptyWeight = 2.7, maxWeight = 1.0; Ý nghĩa của các tham số trong công thức:
1 Smoothess: Độ mịn của bảng số tốt sẽ giúp cho mỗi bước di chuyển sẽ dễ dàng hợp nhất các ô số vào nhau Để tính được độ mịn của bảng thì ta căn cứ vào sự chênh lệch giữa các ô số đứng cạnh nhau trong bảng Khi mà sự chênh lệch không lớn thì độ mịn tốt, ngược lại nếu độ chênh lệch lớn thì độ mịn kém Ví dụ trong hình dưới đây là một trạng thái có độ mịn tối ưu trong lý thuyết
Hình 3.4(a): Trạng thái có độ mịn tối ưu
2 Monotonicity: Tính đơn điệu này đảm bảo rằng trong một bảng, mọi ô số được sắp theo một thứ tự từ nhỏ đến lớn hoặc từ lớn đến nhỏ theo một hướng cố định nào đó Có thể là từ phải sang trái và từ trên xuống dưới như hình
Hình 3.4(b): Trạng thái có tính đơn điệu tốt
3 EmptyCell: Một cách trực quan chúng ta cũng thấy rằng khi có nhiều ô trống hơn thì ta sẽ dễ dàng di chuyển trạng thái hiện tại hơn và trò chơi còn có thể tiếp tục được lâu dài Chỉ số này đặc biệt quan trọng và được đánh giá cao đối với trò chơi 2048
4 MaxLevel: Với mỗi bảng, maxlevel biểu thị ô số lớn nhất mà trạng thái đó có được Maxlevel khi chạm tới 2048 thì trò chơi kết thúc và người chơi dành chiến thắng
Các trọng số smoothWeight = 0.1, monoWeight = 1.0, emptyWeight = 2.7, maxWeight = 1.0; được lấy theo thực nghiệm sau những lần chạy chương trình và ghi nhận lại kết quả.
Cài đặt chương trình
Ứng dụng cài đặt trên hệ điều hành iOS >= 7.0
Sử dụng SpriteKit, và new 2-D game engine của Apple cho iOS
3.2.2 Giao diện của chương trình
Màn hình chính có các lự a ch ọ n:
Cài đặt ứng dụng cho phép người dùng điều chỉnh các thông số quan trọng như màu sắc, kích thước bàn chơi và thiết lập chế độ chơi tự động, giúp nâng cao trải nghiệm người dùng.
Chơi lại: bắt đầu chơi một phiên mới
Gợi ý: chức năng này chỉ cho người chơi một hướng di chuyển phù hợp với trạng thái hiện tại
Tự động: khi lựa chọn tự động thì máy sẽ tự thực hiện các bước di chuyển
Hình 3.5: giao diện chính chương trình
- Cho phép chọn kích thước bàn chơi, có các lựa chọn 3x3 4x4 5x5
- Sắc thái của game: Mặc định, Rực rỡ và tươi tắn
- Cấu hình cho máy chơi tự động
Màn hình cấu hình chơi tự động
- Cho phép chọn độ cao giới hạn của cây tìm kiếm tìm kiếm Minmax
- Thời gian giới hạn cho một quá trình tìm kiếm
Hình 3.5(a): giao diện cài đặt cho trò chơi
Lớp M2GameManager điều khiển logic của trò chơi, di chuyển và kiểm tra kết thúc (thắng, thua)
Lớp M2Grid là cấu trúc dữ liệu lưu trữ một trạng thái của bảng, sử dụng mảng một chiều
Lớp M2AI là lớp chính, đầu vào là một trạng thái và phải trả về cách di chuyển tốt nhất
Hình 3.5(b): giao diện cấu hình cho việc chơi tự động
Khởi tạo trạng thái ban đầu với 2 ô chứa số 2
Tính bước di chuyển tiếp theo (Sử dụng Minimax)
Kiểm tra kết thúc ( đã xuất hiện sô 2048)
Tạo ra trạng thái mới sử dụng cách đi vừa tìm được
No i ni t Wi t hGr i d: ( M2Gr i d * ) gr i d;
( voi d) moveToDi r ect i on: ( M2Di r ect i on ) di r ect i on
Sơ đồ khối biểu diễn quá trình tìm kiếm tương ứng với những function bên phải
Hình 3.6: Sơ đồ khối của quá trình chơi tự động
Chương trình được thực hiện trên Simulator của Xcode 5.1.1 Chạy trên máy MACBOOK 2012 sử dụng chip Core i7 2.6GHz thu được kết quả sau:
- Với mỗi bước sinh ngẫu nhiên các số 2 hoặc 4 với tỉ lệ, số 2: chiếm 90% số 4 chiếm 10%
- Sử dụng độ sâu tìm kiếm là 2 hoặc 3
Hình 3.7: Màn hình hiển thị kết quả trong quá trình chạy thử nghiệm Độ sâu Mục tiêu Số lần chạy
Thời gian trong bảng trên không chỉ bao gồm thời gian tính toán của thuật toán Minimax alpha-beta mà còn tính cả thời gian đồ họa, hiệu ứng vẽ và chuyển đổi trạng thái trong trò chơi từ trạng thái ban đầu đến trạng thái kết thúc, bao gồm cả chiến thắng và thất bại.
3.2.5 Quan sát quá trình chơi tự động và một số kinh nghiệm thu đƣợc
Trong quá trình máy tự động chơi trò 2048, chúng ta có thể nhận thấy các quyết định di chuyển tối ưu được thực hiện ở độ sâu nhất định Các trạng thái của trò chơi thường thay đổi theo những quy luật nhất định và có những điểm chung rõ rệt Từ những quan sát này, chúng ta có thể rút ra một số kinh nghiệm quý báu giúp người chơi nâng cao khả năng chiến thắng Dưới đây là một số mẹo được phát hiện trong quá trình máy chơi tự động.
1 Di chuyển theo 3 hướng định sẵn
Hình 3.8(a): Màn hình hiển thị một trạng thái kết quả của việc chọn cách di chuyển và xây dựng nền tảng các con số ở hàng dưới cùng
Người chơi nên di chuyển bảng số theo ba hướng: trái, phải và xuống để xây dựng nền tảng vững chắc Bằng cách thực hiện các chuyển động này, người chơi chỉ cần một chút thời gian để kết nối các con số giống nhau, từ đó tạo ra những số có giá trị lớn Hãy coi việc di chuyển theo ba hướng này là một chiến thuật quan trọng để liên kết các con số hiệu quả.
Khi đã xác định rõ chiến lược di chuyển theo ba hướng nhất định, người chơi cần hạn chế tối đa việc di chuyển theo hướng thứ tư Việc di chuyển theo hướng thứ tư có thể làm mất lợi thế và gây rời rạc cho những con số có giá trị cao mà người chơi đã nỗ lực tạo ra, đặc biệt khi những con số này đang ở vị trí thuận lợi để hợp nhất.
2 Cố gắng cân bằng giá trị của các con số trong bảng
Màn hình hiển thị một trạng thái kết quả của việc chọn cách di chuyển nhằm cân bằng các con số, điều này thể hiện một chiến lược hiệu quả khi người chơi duy trì sự tăng trưởng ổn định giữa các con số lớn nhất và nhỏ nhất Để tối ưu hóa cơ hội chiến thắng, người chơi nên cố gắng nhận được hai con số cao nhất tại mọi thời điểm và kết hợp các con số nhỏ hơn khi có thể Việc duy trì sự cân bằng trong trò chơi là yếu tố quyết định, vì nếu không, khả năng thua cuộc sẽ tăng cao do sự khác biệt và rời rạc trong giá trị các con số.
3 Giảm số lần di chuyển không có hợp nhất
Hình 3.8(c): Màn hình hiển thị một trạng thái kết quả của việc chọn cách chơi giảm số lần di chuyển trống
Bước di chuyển trống được hiểu là hành động không gộp được bất kỳ con số nào Người chơi cần hạn chế những di chuyển này vì mỗi lần di chuyển sẽ tạo ra một con số ngẫu nhiên Khi không thể gộp các con số, người chơi không nên để phát sinh quá nhiều số mới Trong quá trình di chuyển mà không có sự hợp nhất, điểm số sẽ không tăng, do đó thuật toán tự động sẽ tự động loại bỏ những cách di chuyển này.
4 Xây dựng những nền tảng cân bằng
Màn hình hiển thị trạng thái kết quả của việc chọn cách chơi xây dựng nền tảng nhỏ Người chơi sẽ nhận được nhiều con số phát sinh sau mỗi lần di chuyển trong thời gian dài, vì vậy cần ưu tiên kết hợp các con số này và cân bằng chúng ở mức ban đầu Việc xây dựng cách chơi để hợp nhất những nền tảng nhỏ sẽ giúp dễ dàng hơn cho các bước tiếp theo.
5 Di chuyển toàn bộ bảng số
Khi người chơi di chuyển theo bất kỳ hướng nào trong trò chơi, các con số mới sẽ xuất hiện, không hoàn toàn giống nhau Mục tiêu chính là kết hợp nhiều hình vuông nhất có thể trong mỗi bước di chuyển và tối ưu hóa không gian trống Việc tạo ra nhiều khoảng trống sẽ mở ra nhiều lựa chọn di chuyển cho người chơi, giúp họ có thêm chiến lược trong quá trình chơi.