【问题标题】:fastest Connect 4 win checking method最快的连接 4 获胜检查方法
【发布时间】:2016-12-16 13:35:21
【问题描述】:

我正在尝试按照alpha-beta pruning 井字游戏的方法制作人工智能。我需要尽可能快地检查胜利,因为人工智能将经历许多不同的可能游戏状态。目前我想到了两种方法,都不是很有效。

  1. 创建一个大元组,为每一个可能的连续 4 个获胜条件评分,然后循环遍历它。
  2. 使用 for 循环,检查水平、垂直、diag 朝左和 diag 朝右。这似乎比#1 慢得多。

有人会建议怎么做?

【问题讨论】:

  • 出于好奇,你最后是怎么实现的?

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


【解决方案1】:

根据您的问题,您的方法将如何实施有点不清楚。但是从 alpha-beta 剪枝看来,您似乎想查看很多不同的游戏状态,并在递归中为每个状态确定一个“分数”。

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

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

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

现在,对于我要说的这个胜利检查,很难通过 25 次布尔检查,但我猜你的 #1 方法会牺牲一些额外的内存使用来减少每个递归步骤的计算。执行此操作的最简单方法是存储 8 个整数(单字节适用于此应用程序),它们表示可以在 8 个方向中的任何一个方向上找到的最长的同色芯片链。

使用它,可以将获胜检查减少到 8 次布尔检查和 4 次加法。只需获取新放置的筹码相对两侧的链长,检查它们是否与筹码相同的颜色,如果是,则将它们的长度相加并加1(对于新放置的筹码)。

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

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

【讨论】:

  • 澄清一下:我认为这是关于 connect-4 的下拉版本,它有 6 行和 7 列。然而,对于“无限”的游戏板,数字不应该改变,因为它只是一个本地搜索。虽然这意味着 28 (7+7+7+7) 次检查而不是 25 次。
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2017-07-19
相关资源
最近更新 更多