我正在开发一个井字游戏的变体棋盘游戏。其具体规则如下:
1. 游戏在一个 n
xn
的棋盘上进行,n
是可变的。
2. 如果玩家成功地首先放置 k
个对齐,玩家获胜,k
是可变的。
3. 对齐由 l
个标记(X 或 O)组成,可以是水平、垂直或对角线,l
是固定的。
4. 如果 n
xn
的网格已满(没有玩家可以添加 X 或 O 的标记),且没有玩家成功放置 k
个对齐,那么游戏平局。
我正在使用带有 alpha-beta 剪枝
的 minmax
算法。这是我的第一个包含人工智能的程序,我不太确定如何创建算法使用的评估函数。我在网上看到了一些使用材料加权来评估位置的例子,但这些在我这里不适用。目前,我使用了一个随机评估函数,返回一个介于 -100
和 100
之间的值。
float Conf_eval(Configuration c) { return (rand()%201)-100; }
对于给定的棋盘配置,您有何评估建议?
回答:
这在书籍 人工智能 – 现代方法 中有详细讨论
还有基于该书系列的优秀实现(这是 Java 版本,也有 Python 版本,您可以 Google 搜索更多),包括井字游戏(和 alpha-beta 剪枝代理)。
如果您使用的是带有 alpha-beta 剪枝 的 min-max 算法,您可以使用排序的“动作”列表来提高性能,同时使用您的启发式函数(一个简单的效用函数可以将胜利赋值为 1,平局赋值为 0,失败赋值为 -1 – 这些都是 min-max 扩展树的叶节点)。
为了排序动作,您可以优先选择那些将您的符号(X,O)添加到明确胜利路径的动作。这最终应该会导致更好的剪枝。