Python递归树或fowards?修复并简化代码

时间:2016-06-24 18:05:42

标签: python recursion tree minimax

我最初使用递归到minimax我的树叶,只有我评分得分,但因为我需要知道深度知道是否最小或最大,我切换到depth=0开始。但是,有时会出现currentRoot.ia = None错误,因为那里没有得分。我想要的是跟踪深度,找到已经评估currentRoot.ia的最深叶子,并从每个叶子的深度找到最小值。

我检查是否有孙子孙女,因为当我评估一个得分的位置时,我还会添加一个给出该分数的移动节点,所以叶节点上不应该有任何分数。分数来自引擎的观点,所以我必须在奇怪的深度否定,尽管如果我总是最高分,我可能不会侥幸逃脱。

def minimax(currentRoot, depth):
    if len(currentRoot.children) > 0 and len(currentRoot.children[0].children) > 0: #There are grandchildren
        for child in currentRoot.children:
            minimax(child, depth+1)
    else:           
        if depth%2 == 0:
            currentRoot.score = currentRoot.ia
        else:
            currentRoot.score = -currentRoot.ia
        return currentRoot.score

    measure = min if depth % 2 else max
    currentRoot.score = measure(c.score for c in currentRoot.children)
    return currentRoot.score

1 个答案:

答案 0 :(得分:0)

我认为这可能会解决我的错误,但我不觉得它很优雅。我递归,直到找到一个值,所以ia不是None,我走得更深,直到我发现我在树上没有进一步评估树。

def minimax(currentRoot, depth):
    notAtLeaf = True
    if currentRoot.ia is None:
        notAtLeaf = False
        for child in currentRoot.children:
            minimax(child, depth+1)
    else: #currentRoot.ia is not None
        for child in currentRoot.children:
            if child.ia is not None:
                notAtLeaf = False
                minimax(child, depth+1)

    if notAtLeaf:
        if depth%2 == 0:
            currentRoot.score = currentRoot.ia
        else:
            currentRoot.score = -currentRoot.ia
        return currentRoot.score

    measure = min if depth % 2 else max
    currentRoot.score = measure(c.score for c in currentRoot.children)
    return currentRoot.score