我最初使用递归到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
答案 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