【问题标题】:Too Long recursion to generate game tree of Tic Tac Toe太长的递归生成井字游戏树
【发布时间】:2014-05-31 13:03:28
【问题描述】:

我正在尝试生成完整的井字游戏树。我假设玩家 1 为 1,玩家 2 为 -1。我使用了以下代码:

nodeDict = {}
nodescore = {}
succDict = {}
def buildTree(S, p, node):
    succ = []
    succScore = []  

    if move_was_winning_move(S, p):
        print "It is a winning move for\n",S,p,node
        return
    elif move_was_winning_move(S, p*-1):
        print "It is a winning move for\n",S,p*-1,node
        return
    elif not move_still_possible(S):
        return

    # if S is not terminal: switch player & compute successors
    if not move_was_winning_move(S, p):
        rs, cs = np.where(S==0)

    for j in range(rs.size):
        Ssucc = np.copy(S)
        Ssucc[rs[j],cs[j]] = p
        newnode = max(nodeDict.keys())+1
        nodeDict[newnode] = Ssucc
        succ.append(newnode)
    succDict[node] = succ

   nextPlayer = p * (-1)

   for s in succ:
        buildTree(nodeDict[s], nextPlayer, s)

   return

当我从一个状态开始代码时:

0  0  0
0  0  0
0  0  0

运行时间过长。我发现,最多应该有 9 个!节点数,运行时间不宜过长。

如果我的代码有误,谁能告诉我?或者有什么办法可以优化递归?

【问题讨论】:

  • 出于好奇,以nextPlayer = p... 开头的代码在您的本地文件中是否正确缩进?
  • 什么是“太长”?因为它是9!并且每次迭代中的计算都不是微不足道的(可能需要一毫秒或更长时间),它可以轻松运行数分钟。
  • 它像一小时一样运行。我觉得,这是在无限情况下的某种方式。

标签: python recursion tic-tac-toe


【解决方案1】:

几个cmets:

在你检查你是否在你的树中一个分支的末端之后,你不需要重新检查 S 是否是终端:

# if S is not terminal: switch player & compute successors
    ##if not move_was_winning_move(S, p):   THIS LINE IS NOT NECESSARY
    rs, cs = np.where(S==0)

另外,在我看来,由于您的 move_was_winning_movemove_still_possible 函数在每次迭代中至少调用一次,它们可能会显着影响运行时间,但您没有向我们展示该代码,所以我们可以不能帮你优化。

您真正需要做的是查看cProfile module 并找出代码中的瓶颈。

【讨论】:

    【解决方案2】:

    您总是可以对程序进行多线程处理,尽管这种方法可能有点矫枉过正。多线程是一种使用多个内核来运行程序的方式,而不仅仅是一个内核,这是 python 程序运行的默认方式。这确实加快了程序的运行时间,虽然我不能说多少。 Python 文档比我更好地解释了如何进行多线程,因此我会首先查看有关如何多线程的说明。

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2016-06-24
      • 1970-01-01
      • 2015-06-19
      • 2022-07-18
      相关资源
      最近更新 更多