【问题标题】:How can I programme a minimax algorithm for nim game python?如何为 nim 游戏 python 编写极小极大算法?
【发布时间】:2018-02-23 23:00:16
【问题描述】:

我尝试在 python 中编写一个极小极大算法。但这太令人困惑了。我是递归函数的新手。我的思维结构在某处有一些错误,但我无法解决。我的极小极大树返回“-100”,必须为 100 才能获得真正的答案。如果有任何遗漏或不清楚,请告诉我。谢谢

def startposition():
    return 2, 'max'


def terminalstate(state):
    if state == (0, 'min') or state == (0, 'max'):
        return True
    else:
        return False


def minimax(state):
    if terminalstate(state):
        return utilitystatic(state)
    else:
        if state[1] == 'min':
            value = -250
            for x in successorsgenerator(state):
                value = max(value, minimax(x))
        elif state[1] == 'max':
            value = 250
            for x in successorsgenerator(state):
                value = min(value, minimax(x))
    return value
def utilitystatic(state):
    assert terminalstate(state)
    if state[1] == 'max':
        return -100
    elif state[1] == 'min':
        return 100
    assert False


def successorsgenerator(state):
    successors = []
    state = toggle(state)
    newstate = decrease(state)
    i = 0
    while newstate[0] >= 0 and i < 3:
        successors.append(newstate)
        i += 1
        newstate = decrease(newstate)

    print('successors:', successors)
    return successors


def toggle(state):
    state = list(state)
    state[1] = 'min' if state[1] == 'max' else 'max'
    state = tuple(state)
    return state


def decrease(state):
    state = state[:0] + (state[0] - 1,) + state[1:2]
    return state


stick = startposition()
exit = minimax(stick)
print('last result', exit)

【问题讨论】:

    标签: python recursion tree minimax


    【解决方案1】:

    如果最小玩家先行,那么从最大玩家的角度来看,代码是正确的。 minimax 的工作方式,min 层应该返回所有可能状态的最小值(因为 min 玩家也在优化他们的移动)。所以你不应该切换你的最小和最大调用,而是哪个玩家先去。

    这是可视化的状态树:https://imgur.com/a/0iRFc.jpg(我显然没有足够的代表来显示图像)。您的递归顶层将采用

    max(-250, -100)
    

    并返回 -100。因为游戏开始时最大玩家以 2 的筹码完成他的移动,所以这是有道理的。如果要将返回值切换为 100,则需要将游戏更改为最大玩家先行(因为在此游戏场景中,先行者获胜)。

    【讨论】:

    • 我认为 min state 必须使用 min() 函数解决, max state 必须解决 max()。我编辑了我的代码,它们运行良好。
    【解决方案2】:

    我解决了我的问题。我需要将 value = min(value, minimax(x)) 更改为 value = max(value, minimax(x)) 并将 250 更改为 -250。问题解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多