【发布时间】:2021-06-04 05:00:49
【问题描述】:
我已经使用 alpha beta pruning 实现了一个 NegaMax 算法(它只是 minimax 算法的一个较短版本)。现在我想实现迭代深化,以便我可以找到每个深度的最佳移动,然后根据前一层的分数对树下的节点重新排序,以便我的字母修剪更有效。
这是我到目前为止所做的:
InitialDEPTH = 1
def findBestMove(gs, validMoves):
global nextMove
global InitialDEPTH
nextMove = None
for d in range(2):
CurrentDEPTH = InitialDEPTH + d
findMoveNegaMaxAlphaBeta(gs, validMoves, CurrentDEPTH, -CHECKMATE, CHECKMATE, 1 if gs.whiteToMove else -1)
return nextMove
这里的 gs 是随着每一步移动而变化的游戏状态,它包含关于该点游戏的所有信息,例如是否可以进行易位或是否有可能的过路移动。我的 negamax 算法如下所示:
def findMoveNegaMaxAlphaBeta(gs, validMoves, depth, alpha, beta, turnMultiplier):
global nextMove
if depth == 0 :
return turnMultiplier * scoreBoard(gs)
maxScore = -CHECKMATE
# I have a felling i need to add some code here to make it work
for move in validMoves :
gs.makeMove(move)
nextMoves = gs.getValidMoves()
score = -findMoveNegaMaxAlphaBeta(gs, nextMoves, depth - 1 , -beta, -alpha, -turnMultiplier)
if score > maxScore:
maxScore = score
if depth == DEPTH :
nextMove = move
gs.undoMove()
if maxScore > alpha: # This is were pruning happens
alpha = maxScore
if alpha >= beta :
break
return maxScore
如何将时间约束函数添加到此代码中,以便它仅在提到的时间结束时返回最佳移动,而不是在此之前。
此外,我如何在每个深度之后对节点重新排序,以便在下一个深度进行有效修剪。我为此编写了某种函数,但我不知道如何实现它。我写的函数:
def sorting(move):
gs.makeMove(move)
score = scoreBoard(gs)
gs.undoMove()
return turnMultiplier * score
validMoves.sort(key = sorting)
【问题讨论】:
-
您能否就您在实施迭代深化时遇到的特定问题提出问题?在您的问题中,我没有看到实施它的尝试。你肯定在网上找到了所有的信息和伪代码……问题出在哪里?
-
我编辑了我的问题并尝试实施它。
标签: python chess minimax alpha-beta-pruning