algorithm - 计算井字游戏唯一状态的有效算法

标签 algorithm math rotation

我正在尝试构建一个井字游戏来演示和试验机器学习算法,我发现了一个有趣的问题。

例如:井字棋盘可以镜像,但对于机器学习而言,这两种状态是等价的

x _ o     o _ x
o o x  =  x o o
_ _ _     _ _ _

同样的旋转

x _ o   _ _ x   _ _ _   o _ _
_ _ _ = _ _ _ = _ _ _ = _ _ _ 
_ _ _   _ _ o   o _ x   x _ _

最后,并置

x _ o   o _ x
_ x _ = _ o _
_ _ x   _ _ o

识别/计算井字游戏独特状态的最佳方法是什么?

是否有我应该研究的研究领域或数学领域?

最佳答案

数学

技巧是使用 Polyas 枚举定理:

http://en.wikipedia.org/wiki/P%C3%B3lya_enumeration_theorem

忽略重复项,有 9 个正方形的 3 个状态(x、o 和 -),因此有 3^9 = 19683 个配置。您需要定义在板上提供操作的组。对于您的问题,Dihedral Group D4 似乎适用于除并列之外的所有内容。但是并列很容易,因为只要它不是一个充满无关紧要的板(所有 -,初始配置),就会有 2 个。

计算

虽然数学可以让我们计算配置,但它无助于识别它们。最简单的解决方案可能是将棋盘定义为元组:{p1, p2, p3, ..., p9} 其中每个 pn 是 {0,1,2}。它每平方需要 2 位,共有 9 位,总共 18 位。因此,棋盘可以用 32 位或更小的整数表示。

通过哈希表可以轻松地对板进行索引。只有 19000 个配置,所以它不会杀死我们。

遍历所有电路板配置最好在上面的 9 元组的 radix-3 算法上完成:{0,0,9,...,0}, {0,0,0,..., 1} , {0,0,0,...,1,0} 等等。它只是加进位。这会生成所有板。请注意集体行动和并列将如何改变这样的数字。可能性有限(juxta 将 x 移动到 o,反之亦然,其他人根据 D4 组在棋盘上的位置移动。有 8 种这样的转换。)您可以使用 Polya 来确保您的算法得到所有这些.

如建议的那样,从集合中挑选最小的人是配置模数操作的唯一表示。

关于algorithm - 计算井字游戏唯一状态的有效算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6160231/

相关文章:

string - 字符串中的子序列出现

algorithm - 在 O(1) 中查找插入删除和 getMin 的数据设计问题

c# - 用指数计算公式

android - 使用 API 8 旋转广告 View

旋转时Android应用程序崩溃

c - Fisher Yates 算法在系统时间播种时在并行启动的程序中返回相同顺序的数字

algorithm - 对 A* 算法使用不同的启发式

math - 聪明的数学标签舍入

algorithm - 您如何将代码表示为用于运行时分析的数学算法?

java - 计算 3D 空间中相对于另一个点的点