【发布时间】:2013-12-03 00:14:44
【问题描述】:
我正在尝试用一个 for 循环在 python 中编写 minimax 算法(是的,我知道维基百科说 min 和 max 播放器通常是分开处理的),我正在使用变量 turn 来跟踪min 或 max 播放器当前是否正在探索选项。然而,我认为,当轮到O 玩家时,代码错误地评估X,而当轮到X 玩家时,代码错误地评估O。
这是源代码 (p12):http://web.cs.wpi.edu/~rich/courses/imgd4000-d10/lectures/E-MiniMax.pdf
您可能想知道的事情:
-
b是列表列表;0表示可用空间 -
evaluate既用于检查胜利(默认情况下),也用于为特定玩家在棋盘上打分(我们在棋盘上寻找单元格值的位置)。 -
makeMove返回该块所在列的行(用于后续删除)
任何帮助将不胜感激。如果有什么不清楚的地方请告诉我。
def minMax(b, turn, depth=0):
player, piece = None, None
best, move = None, -1
if turn % 2 == 0 : # even player is max player
player, piece = 'max', 'X'
best, move = -1000, -1
else :
player, piece = 'min', 'O'
best, move = 1000, -1
if boardFull(b) or depth == MAX_DEPTH:
return evaluate(b, False, piece)
for col in range(N_COLS):
if possibleMove(b, col) :
row = makeMove(b, col, piece)
turn += 1 # now the other player's turn
score = minMax(b, turn, depth+1)
if player == 'max':
if score > best:
best, move = score, col
else:
if score < best:
best, move = score, col
reset(b, row, col)
return move
@seaotternerd。是的,我想知道这一点。但我不确定这是问题所在。这是一份打印输出。如您所见,X 已被 AI 删除到第四列,但正在从最小玩家的角度进行评估(它在最右边的列中计算 2 个O 单位)。
这是评估函数确定的内容,具体取决于片段:
if piece == 'O':
return best * -25
return best * 25
【问题讨论】:
-
你能澄清一下这些列是什么吗?另外,这是在更改回合更新后吗?最后,您能否发布其余的评估功能? (例如,“最佳”从何而来?)
-
@seaotternerd:可以查看完整代码here(约200行)。我认为这将回答您所有的问题,但如果您还有更多问题,请告诉我。
标签: python algorithm artificial-intelligence