考虑对称性。实际可能的配置数量远小于 3x3 板上的 9^3。例如,基本上只有 3 种不同的配置,其中一个x
在黑板上。
旋转次数
有许多板配置都应该导致您的 AI 做出相同的决策,因为它们具有相同的模对称性。例如:
x - - - - x - - - - - -
- - - - - - - - - - - -
- - - - - - - - x x - -
这些都是相同的配置。如果你单独对待他们,你就会浪费训练时间。
镜像
不仅有旋转对称,还可以在不改变实际情况的情况下镜像棋盘。以下内容基本都是一样的:
0 - x x - 0 - - - - - -
- - - - - - - - - - - -
- - - - - - 0 - x x - 0
排除“不可能发生”的配置
接下来考虑当一名玩家获胜时游戏结束。例如,您有 3^3 个配置,全部如下所示
x 0 ?
x 0 ? // cannot happen
x 0 ?
他们永远不可能出现在正常的比赛中。你不必为它们预留空间,因为它们根本不可能发生。
排除更多“不可能发生”
此外,您大大高估了配置空间的大小9^3
因为玩家轮流轮流。例如,您无法达到如下配置:
x x -
x - - // cannot happen
- - -
如何获得所有需要的配置?
简而言之,这就是我解决问题的方法:
- 定义一个
operator<
为您的董事会
- 使用
<
您可以为每组“相似”配置选择一个代表(例如,<
比集合中的所有其他人都要多)
- 编写一个函数,对于给定的配置返回代表性配置
- brute force iterate all possible moves (only possible moves!, ie by making alternating turns of the players only until the game is won). While doing that you
- 计算您遇到的每个配置的代表
- 记住所有代表性配置(请注意,由于对称性,它们出现了多次)
您现在拥有所有模对称配置的列表。在实际游戏中,您只需将棋盘变换为其代表,然后进行移动即可。如果您记得如何旋转/镜像回来,您可以稍后转换回实际配置。
这是相当蛮力的。我的数学有点生疏,否则我会尝试直接获取代表名单。然而,对于每种尺寸的电路板,您只需执行一次此操作。