最快的Connect 4 win检查方法

时间:2016-12-16 13:35:22

标签: python performance python-3.x artificial-intelligence

我正在尝试按照alpha-beta pruning方法制作一个符合tic-tac-toe的方法。我需要尽可能快地检查胜利,因为ai将经历许多不同的可能游戏状态。现在我已经想到了两种方法,这两种方法都没有效率。

  1. 创建一个大元组,用于连续获胜条件中每个可能的4个得分,然后循环。
  2. 使用for循环,水平,垂直检查,左侧诊断,诊断朝右。这似乎比#1慢得多。
  3. 有人会推荐这样做吗?

1 个答案:

答案 0 :(得分:0)

从您的问题来看,您的方法将如何实施有点不清楚。但是从alpha-beta修剪开始,似乎你想要看看很多不同的游戏状态,并且在递归中确定了一个"得分"每一个人。

一个非常重要的观察结果是,一旦找到了4行,递归就会结束。这意味着在递归步骤开始时,游戏板没有任何4-in-a-row实例。

使用这个,我们可以直观地看到放在所述递归步骤中的新片段必须是在递归步骤中创建的任何4-in-row实例的一部分。这大大减少了解决方案的搜索空间,从总共69个(21个垂直,24个水平,12 + 12对角线)4个行的位置到最多13个(3个垂直,4个水平,3 + 3个对角线)

这应该是您第二种方法的基线。对于一个简单的实现,它将需要最多52(13 * 4)个检查,或者对于更快的算法,需要25(6 + 7 + 6 + 6)个检查。

现在我很难击败25次布尔检查以进行此次胜利检查我会说,但我猜测你的#1方法会交换一些额外的内存使用量以减少计算量每个递归步骤。这样做的最简单方法是存储8个整数(单个字节对于这个应用来说很好),它代表了在8个方向中任何一个方向都可以找到的同色芯片的最长链。

使用此功能,可以将win检查减少到8个布尔检查和4个添加。只需在新放置的芯片的相对两侧获得链长,检查它们是否与芯片颜色相同,如果是,则添加它们的长度并添加1(对于新放置的芯片)。

从这个计算中,似乎你的#1方法可能是最有效的。但是,它具有更大的维护数据结构的开销,并且使用更多内存,除非您可以通过引用传递,否则应该避免这种情况。此外(假设布尔检查和添加的速度相似),即使忽略开销,更难的方法也只能赢得因子2。

我做了一些简化,有些解释可能不是很清楚,但问你是否还有其他问题。