【问题标题】:How to work out the complexity of the game 2048?如何计算游戏2048的复杂性?
【发布时间】:2014-04-25 18:34:33
【问题描述】:

编辑:这个问题不是What is the optimal algorithm for the game 2048?的重复问题

  • 这个问题问“赢得比赛的最佳方式是什么?”
  • 此问题询问“我们如何才能计算出游戏的复杂性?”

它们是完全不同的问题。我对走向“胜利”状态需要哪些步骤不感兴趣 - 我感兴趣的是找出是否可以计算可能的步骤总数。


我一直在阅读 question 关于游戏 2048 的文章,其中讨论了创建在游戏中表现良好的算法的策略。

接受的答案提到:

游戏是一个离散的状态空间,完美的信息,象棋一样的回合制游戏

这让我想到了它的复杂性。对于像国际象棋这样的确定性游戏,有可能(理论上)计算出导致获胜状态的所有可能动作并向后工作,选择持续导致该结果的最佳动作。我知道这会导致大量可能的移动(在宇宙中的原子数量范围内).. 但是 2048 或多或少复杂?

伪代码:

for the current arrangement of tiles
    - work out the possible moves
    - work out what the board will look like if the program adds a 2 to the board
    - work out what the board will look like if the program adds a 4 to the board
    - move on to working out the possible moves for the new state

在这一点上,我想我会在这里等待它运行一段时间......

所以我的问题是 - 我将如何开始编写这个算法 - 哪种策略最适合计算游戏的复杂性?

我看到的 2048 和国际象棋之间的最大区别是程序可以在添加新棋子时在 2 到 4 之间随机选择 - 这似乎增加了大量额外的可能移动。

最终,我希望程序输出一个数字,显示游戏中可能排列的数量。这可能吗?!

【问题讨论】:

  • 有什么东西可以解释那个东西的规则吗?编辑:现在我明白了...
  • 因为有两个随机分量,并且您想要确切的数字(不是理论上的最大值)...我认为没有比尝试所有可能性更好的解决方案。 (顺便说一句,这个游戏很有趣:D)
  • 是的,所以我要问的是-'是否有一种标准方法可以以编程方式计算该确切数字,或者由于计算的实用性而只能猜测它'例如我的 psudocode 将需要很长时间,并且可能在完成之前耗尽内存
  • 在问题顶部添加了注释。很明显不是重复的。不知道为什么人们会抓住机会将其标记为这样。

标签: algorithm logic artificial-intelligence game-theory


【解决方案1】:

让我们确定有多少种可能的板配置。

每个图块可以是空的,也可以包含 2、4、8、...、512 或 1024 的图块。

每个图块有 12 种可能性。有 16 个图块,因此我们得到 1612 = 248 个可能的棋盘状态 - 这很可能包括一些无法访问的状态。

假设我们可以将所有这些都存储在内存中,我们可以从所有棋盘状态向后工作,这些棋盘状态将在下一步生成 2048 个图块,做大量工作以将可达棋盘状态相互关联,这应该给出我们对每个状态进行概率最佳移动。

要将所有位存储在内存中,假设我们需要每个图块 4 位,即每个板状态 64 位 = 8 个字节。

248 板状态将需要 8*248 = 2251799813685248 字节 = 2048 TB(更不用说为跟踪最佳板而增加的开销)。这有点超出了当今台式计算机所具备的能力,尽管可以巧妙地限制在任何给定时间所需的板数量,以减少到适合 3 TB 硬盘驱动器的东西,或者也许即使在 RAM 中。


供参考,chess has an upper bound of 2155 possible positions


如果我们从一开始就实际计算每一个可能的移动(以breadth-first search 类似的方式),我们会得到一个巨大的数字。

这不是确切的数字,而是对上限的粗略估计。

让我们做一些假设:(这绝对不总是正确的,但是,为了简单起见)

  • 总是有 15 个空方格

  • 你总是有 4 个动作(左、右、上、下)

  • 一旦棋盘上所有棋子的总和达到 2048,则需要最少的组合数才能得到单个 2048(因此,如果放置 2 使总和为 2048,则组合将为 2 - > 4 -> 8 -> 16 -> ... -> 2048,即走10步)

  • 总是会放置 2,而不是 4 - 算法不会假设这一点,但为了计算上限,我们会这样做。

  • 我们不会考虑在此过程中可能会产生重复板的事实。

要达到 2048,需要放置 2048 / 2 = 1024 个图块。

您从 2 个随机放置的图块开始,然后反复移动并放置另一个图块,因此大约有 1022 个“回合”(一个回合包括移动和放置一个图块),直到我们得到总和 2048 ,然后再转10圈得到2048格。

在每一轮中,我们有 4 次移动,并且可以将两个图块中的一个放置在 15 个位置之一(30 种可能性),所以这是 4*30 = 120 种可能性。

这总共会给我们 1201032 个可能的状态。

如果我们假设总是放置一个 4,我们会得到 120519 个状态。


计算准确的数字可能会涉及到所有这些状态,这实际上是不可行的。

【讨论】:

  • 我有点困惑。我认为随机的 2 或 4 会大量增加决策树的潜在分支。在您的假设中,您谈到只坚持一个 - 没有改变价值使其成为一个更复杂的问题吗?
  • 我认为一个更安全的假设是任何时候一半的广场都是开放的,而不是 15/16
  • 仓位的数量比这要少得多。我为此写了一篇文章。 mathb.in/14315
  • o.O 认真的兄弟?为什么要花太多时间来回答这个没用的问题。它是多项式的。结束!
猜你喜欢
  • 2012-09-01
  • 2015-02-10
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
相关资源
最近更新 更多