Để áp dụng thành công tối thiểu / tối đa cho trò chơi chiến lược theo lượt, bạn cần áp dụng chính xác tất cả các kỹ thuật cờ vua có sẵn ...
Chức năng đánh giá
Ngay cả các động cơ cờ vua có một sức mạnh rất xấu, nếu chức năng đánh giá của bạn là xấu. Phiên bản đơn giản nhất của chức năng đánh giá là: 1 = trò chơi thắng trắng, -1 = trò chơi thắng bằng màu đen, 0 = tất cả các trường hợp khác; Nhưng, điều này sẽ cung cấp cho bạn một hiệu suất rất xấu. Điều tương tự cũng xảy ra với trò chơi theo lượt của bạn! Nếu bạn muốn sử dụng min / max (với công cụ cắt tỉa alpha / beta) như trong cờ vua, bạn cũng phải thực hiện chức năng đánh giá hợp lý! Khác, bạn không thể so sánh hiệu suất của các thuật toán đó khi được áp dụng cho trò chơi chiến lược của mình với trường hợp nó được áp dụng cho cờ vua.
Những chức năng đánh giá của động cơ cờ vua làm gì, là đánh giá những thứ như:
- Làm thế nào tốt là một vị trí của một mảnh trên bảng?
- Bao nhiêu lần là một mảnh bị tấn công?
- Bao nhiêu lần là mảnh được bảo vệ?
- Làm thế nào tốt mỗi phần có thể tự do "di chuyển" trên bảng? (hoặc: Có bao nhiêu gạch "kiểm soát")
Những phần của chức năng đánh giá trước tiên phải được "dịch" sang trò chơi của bạn:
- Vị trí của mảnh: Có phải là ví dụ trên một ngọn đồi, đang mở rộng phạm vi bắn của nó?
- Bị tấn công: Mỗi mảnh nguy hiểm là bao nhiêu? (ví dụ: tổng giá trị tấn công của các đơn vị có thể tấn công một đơn vị đặc biệt nhân với xác suất bị tấn công bởi nó; xác suất tăng, nếu đơn vị đã bị hư hại; giảm nếu nhiều đơn vị khác nằm trong phạm vi của đơn vị tấn công)
- Tấn công riêng: Có bao nhiêu đơn vị có thể bị tấn công bởi mỗi đơn vị này?
- Bảo vệ: Có bao nhiêu mảnh riêng bên cạnh nó (để giúp đỡ)? Có thể một đơn vị không được tấn công các đơn vị dưới một khoảng cách tối thiểu và tốt nhất là bảo vệ nó bởi đơn vị có khả năng tấn công các đơn vị gần đó.
- Tính cơ động: Đơn vị di động của bạn như thế nào? (nó có thể chạy trốn không?)
Các xếp hạng khác nhau phải được tổng hợp theo hàm trọng số (Fact_a * rating_a + Fact_b * ranting_b + ...) cho tất cả các đơn vị ...
Trong các trò chơi chiến lược, các tài nguyên (vàng, gỗ, ...) còn lại phải được tính đến.
Nếu chức năng đánh giá của bạn đủ tốt, bạn không cần phải thực sự tìm kiếm "sâu" vào cây trong hầu hết các trường hợp. Vì vậy, có lẽ bạn chỉ cần xem xét kỹ hơn về 3 hoặc 10 lựa chọn hứa hẹn nhất. Xem chương tiếp theo ...
Di chuyển có thể ở mỗi vị trí
Vấn đề khó khăn nhất khi sử dụng min / max cho các game chiến thuật là bạn có thể chỉ huy nhiều đơn vị trong một lượt, trong khi trong cờ vua, bạn chỉ được phép chỉ huy một đơn vị (ngoại trừ việc ném, nhưng đây là tổ hợp di chuyển được xác định rõ ràng). Điều này gây ra 5 ^ N khả năng di chuyển cho N đơn vị cho mỗi "vị trí" (thuật ngữ cờ vua), nếu bạn chỉ quyết định giữa "di chuyển về phía bắc, nam, tây, đông HOẶC dừng" cho mỗi đơn vị. Bạn có thể giải quyết điều này bằng cách chia nhỏ lệnh phức tạp thành các lệnh cấp thấp: ví dụ: chọn hành động cho đơn vị A, đi sâu và quyết định cho đơn vị B .... quyết định cho đơn vị N ... và sau đó kết thúc lượt này. Nhưng, điều này một mình không thay đổi sự phức tạp! Bạn phải tối ưu hóa thứ tự các hành động được gán cho các đơn vị (ví dụ: đơn vị đầu tiên B, C, D và sau đó là đơn vị A). Bạn có thể ghi lại tác động của quyết định cho từng đơn vị trong lần tính toán cuối cùng và sau đó sắp xếp theo mức độ quan trọng. Cách cắt tỉa alpha-beta này có thể được sử dụng để loại bỏ bất kỳ sự kết hợp xấu nào từ cây tìm kiếm từ rất sớm. Ưu tiên cao nhất phải luôn là "không làm gì thêm và kết thúc lượt của bạn" (cắt tỉa di chuyển null) trong mỗi lần lặp. Bằng cách này, bạn có thể "bỏ qua" việc giao hầu hết các nhiệm vụ cho hầu hết các đơn vị và để họ tiếp tục những gì họ đã làm trước đó. Bằng cách này, việc tìm kiếm sẽ đi vào chiều sâu một cách nhanh chóng bằng cách chỉ nhìn vào các đơn vị "quan trọng" (ví dụ: những đơn vị thực sự đang chiến đấu ngay bây giờ). Đảm bảo chỉ ra lệnh cho mỗi đơn vị một lần ... Bạn cũng có thể sử dụng một số tính ngẫu nhiên để đảm bảo rằng các đơn vị "quan trọng" thỉnh thoảng cũng nhận được lệnh. Đặc biệt, các đơn vị hoàn thành một số công việc (ví dụ
Lặp đi lặp lại sâu + bộ nhớ đệm / bảng băm
Sau đó, bạn có thể "đào sâu tương tác" để đi sâu hơn và nhiều hơn nữa cho đến khi đạt được giới hạn thời gian. Vì vậy, bạn sẽ tìm kiếm sâu hơn nếu có ít đơn vị hơn và bạn luôn có một số "kết quả" nếu bạn ngừng tìm kiếm một giải pháp tốt hơn. Việc lặp lại sâu sẽ yêu cầu sử dụng bảng băm để lưu trữ các kết quả tìm kiếm trước đây. Điều này cũng cho phép sử dụng lại một số kết quả từ tìm kiếm lượt cuối cùng (nhánh của cây tìm kiếm bao gồm các lệnh thực sự được thực hiện trong lượt cuối cùng). Để thực hiện điều này, bạn cần một chức năng băm rất tốt (hãy xem "khóa zobrist"), có thể được cập nhật lặp lại. Cập nhật khóa băm có nghĩa là bạn chỉ cần lấy khóa băm của "vị trí" cũ và có thể chỉ cần thay đổi vị trí (ví dụ: lấy đi đơn vị ở vị trí x và đặt nó ở vị trí y). Cách tính toán khóa băm này rất nhanh chóng và bạn không cần xử lý toàn bộ tình huống của bảng để tính toán nó, chỉ để kiểm tra xem hàm băm có chứa mục nhập cũ cho vị trí này không. Theo một cách nào đó, bạn phải chắc chắn rằng không có va chạm băm xảy ra.
Hành vi không xác định
Hành vi không xác định là một vấn đề đối với các tìm kiếm tối thiểu / tối đa. Điều này có nghĩa là, không chắc chắn liệu bạn có trúng mục tiêu bị tấn công hay không (ví dụ: xác suất là 10%). Sau đó, bạn không thể lập kế hoạch này xảy ra. Trong trường hợp đó, bạn cần sửa đổi thuật toán và đặt một lớp "xác suất" ở giữa. Nó hơi giống như "đến lượt xác suất". Mỗi kết quả độc lập phải được xem xét riêng. Việc đánh giá thông qua "lớp" độ sâu này sau đó phải được lấy mẫu (lấy mẫu monte carlo) và kết quả của việc đánh giá sâu phải được cân nhắc bởi xác suất xảy ra. Các kết quả khác nhau của lớp xác suất phải được coi là các bước di chuyển khác nhau (nhưng thay vì tối thiểu / tối đa thì phải tính "trung bình"). Điều này tất nhiên sẽ làm tăng sự phức tạp của cây tìm kiếm.
Tóm lược
Khi áp dụng tất cả các kỹ thuật (tất cả được sử dụng bởi các công cụ cờ hiện tại) vào một trò chơi xác định, bạn chắc chắn sẽ có thể đạt được kết quả hợp lý cho một trò chơi. Đối với các trò chơi không xác định, điều này có thể sẽ phức tạp hơn, nhưng tôi nghĩ vẫn có thể quản lý được.
Một nguồn tốt để giải thích về các kỹ thuật đó (cho cờ vua) là http://chessprogramming.wikispaces.com/
Bạn thậm chí có thể thực hiện một số loại ngẫu nhiên theo chỉ dẫn trong các tìm kiếm tối thiểu / tối đa. Thay vì điều tra một cách xác định các kết quả tốt nhất trước tiên trong mỗi lần lặp, bạn chỉ cần chọn ngẫu nhiên và để thứ tự của nó được quyết định bởi phân phối xác suất dựa trên các đánh giá hiện tại ...