Python 主变分返回。

Python 主变分返回。,python,chess,Python,Chess,嗨!我正在制作一个国际象棋引擎,由于我想实现迭代深化,我需要找到主要的变化(引擎认为是最佳的移动顺序)。但是,我还没有在网络上用python找到任何伪代码示例,因为我的alphabeta函数是递归的,我真的很难理解它 你能给我一些提示或者一个伪代码示例吗?这是怎么做到的?非常感谢。 这是我的alpha-beta函数,它只返回移动的估值,而不是移动本身: def alphaBeta(self, board, rules, alpha, beta, ply, player): """ Imp

嗨!我正在制作一个国际象棋引擎,由于我想实现迭代深化,我需要找到主要的变化(引擎认为是最佳的移动顺序)。但是,我还没有在网络上用python找到任何伪代码示例,因为我的alphabeta函数是递归的,我真的很难理解它

你能给我一些提示或者一个伪代码示例吗?这是怎么做到的?非常感谢。

这是我的alpha-beta函数,它只返回移动的估值,而不是移动本身:

def alphaBeta(self, board, rules, alpha, beta, ply, player):
    """ Implements a minimax algorithm with alpha-beta pruning. """
    if not ply:
        return self.positionEvaluation(board, rules, player)

    move_list = board.generateMoves(rules, player)

    if not len(move_list):
        return self.mateCheck(rules, board, player, ply)

    for move in move_list:
        board.makeMove(move, player)
        current_eval = -self.alphaBeta(board, rules, -beta, -alpha, ply - 1, board.getOtherPlayer(player))
        board.unmakeMove(move, player)

        if current_eval >= beta:
            return beta

        elif current_eval > alpha:
            alpha = current_eval

    return alpha

使用NegaMax搜索。以下是一个例子:

 function negamax(node, depth, α, β, color)
    if node is a terminal node or depth = 0
        return color * the heuristic value of node
    else
        foreach child of node
            val := -negamax(child, depth-1, -β, -α, -color)
            {the following if statement constitutes alpha-beta pruning}
            if val≥β
                return val
            if val≥α
                α:=val
        return α
调用时,参数α和β应设置为任何节点可能的最低值和最高值,颜色应设置为1

(* Initial call *)
negamax(origin, depth, -inf, +inf, 1)
您始终可以使用negamax进行alpha-beta修剪

注:我已经实现了一个在线国际象棋平台。如果您希望获得推荐人:


您总是可以看到客户端代码,但实际的移动和游戏逻辑是在服务器端实现的。

使用NegaMax搜索。以下是一个例子:

 function negamax(node, depth, α, β, color)
    if node is a terminal node or depth = 0
        return color * the heuristic value of node
    else
        foreach child of node
            val := -negamax(child, depth-1, -β, -α, -color)
            {the following if statement constitutes alpha-beta pruning}
            if val≥β
                return val
            if val≥α
                α:=val
        return α
调用时,参数α和β应设置为任何节点可能的最低值和最高值,颜色应设置为1

(* Initial call *)
negamax(origin, depth, -inf, +inf, 1)
您始终可以使用negamax进行alpha-beta修剪

注:我已经实现了一个在线国际象棋平台。如果您希望获得推荐人:


您总是可以看到客户端代码,但实际的移动和游戏逻辑是在服务器端实现的。

为什么要在IDS中使用alpha-beta搜索?ABS将使用启发式方法进行修剪。IDS希望在应用这种启发式方法之前尽可能地深入。如果在ABS中使用启发式修剪,则不会在该分支中进行更深入的搜索。那么,这不再是一个ID了对不起,但我不明白你的意思,也许我自己没有表达我打算做什么,这是可以理解的。我试图用主要变体来完成的是改进搜索的移动顺序。我不明白为什么我不能用alpha-beta修剪来做到这一点。这里有一个更好的解释:也许我错了,但这就是我的意思:看看你维基中树的最后一行。这些分数来自1或1。比赛赢/输2场。一些启发。如果它们来自(1),请继续进行alpha-beta-prune。但是,如果它们来自(2),当您加深地平线(最后一行)时,您必须应用新的启发式方法来确定是否仍应探索/修剪每个分支。但是,你要么不删减(IDS而不是ABS)要么删减(ABS而不是IDS)为什么要在IDS中使用alpha-beta搜索?ABS将使用启发式方法进行修剪。IDS希望在应用这种启发式方法之前尽可能地深入。如果在ABS中使用启发式修剪,则不会在该分支中进行更深入的搜索。那么,这不再是一个ID了对不起,但我不明白你的意思,也许我自己没有表达我打算做什么,这是可以理解的。我试图用主要变体来完成的是改进搜索的移动顺序。我不明白为什么我不能用alpha-beta修剪来做到这一点。这里有一个更好的解释:也许我错了,但这就是我的意思:看看你维基中树的最后一行。这些分数来自1或1。比赛赢/输2场。一些启发。如果它们来自(1),请继续进行alpha-beta-prune。但是,如果它们来自(2),当您加深地平线(最后一行)时,您必须应用新的启发式方法来确定是否仍应探索/修剪每个分支。但是,你要么不删减(id而不是ABS)要么删减(ABS而不是IDS)对不起,但我不太明白你的意思。我已经用alpha-beta剪枝实现了一个negamax搜索。我要寻找的是一种提取主要变量的方法,这样我就可以用它来改进我的移动顺序。你可以对每个父节点进行评估吗?我不理解你的问题,请你解释清楚,我的英语和我对编程习惯用法的理解非常有限:d。我想用我的主要变体做的是:对不起,我不太明白你的意思。我已经用alpha-beta剪枝实现了一个negamax搜索。我要寻找的是一种提取主要变量的方法,这样我就可以用它来改进我的移动顺序。你可以对每个父节点进行评估吗?我不理解你的问题,请你解释清楚,我的英语和我对编程习惯用法的理解非常有限:d。我想用我的主要变体做的是: