当前位置: 首页 > 知识库问答 >
问题:

如何在象棋类游戏中实现极大极小算法?

温浩大
2023-03-14

我目前正在尝试写一个能玩象棋游戏的人工智能。为此,我使用了minimax算法的一种变体,该算法迭代每一个可能的移动,然后假设深度为N时,对手(和他们)将以最佳方式进行N个移动。此外观的伪代码如下所示:

public string GenerateDepth1Move()
    {
       
        int max = -INFINITY;
        string bestMove;
        List<string> moves = PossibleMoves(colour);
        foreach (string s in moves)
        {
            int temp += Move(s, colour);
            if(temp > max)
            {
                max = temp;
                bestMove = s;
            }
        }

       return bestMove;

    }

当调用“移动”时,它会检测是否拍摄了一幅作品,然后为该作品生成一个分数,该分数被保存到变量“温度”中。对于深度为2的情况,我简单地调用另一个Depth1方法,但改变颜色。对于深度为3的情况,我再次调用这个方法,以进行人工智能将做出的下一个理论移动。这工作得很好,但在深度为4的情况下,它不再以逻辑方式运行。

这是因为算法假设“最佳”移动是贪婪的(即,最佳移动是获取价值最高的棋子,这不一定是游戏本身的最佳移动,因为你可能会立即被收回,并在过程中失去一个更有价值的棋子)。为了解决这个问题,我尝试在Depth3或Depth4方法中调用我的Depth2方法,但它产生的结果同样不合逻辑,在游戏中也很糟糕。我不知道为什么会出现这种情况,但如果不是这样的话,把它留在Depth3会产生最强大的人工智能。

我是否未能理解类似极大极小算法的本质?如何改进算法,使N值越高,游戏效果越好?

共有1个答案

戎元忠
2023-03-14

MiniMax很适合递归实现。你可以在这段精彩的视频中找到一个例子。迭代地实现Minimax,并为depth n编写n次depth 1函数,该函数不遵循不重复自己(DRY)规则。Python实现:

def minimax(pos, depth, alpha, beta, maximizingPlayer) :
# maximizingPlayer = True if White2Play and False si Black2Play

if depth == 0 or game_is_finished(board) or can_t_move(board) :
    return evaluate(board)                                     # <- zero ground for recusivity

if maximizingPlayer :
    maxEval = -infinity
    for child in child_of_position(board) :
        evalu = minimax(child, depth - 1, alpha, beta, False)  # recursivity
        maxEval = max(maxEval, evalu)
        alpha = max(alpha, evalu)
        if beta <= alpha :
            break
    return maxEval

else :
    minEval = infinity
    for child in child_of_position(board) :
        evalu = minimax(child, depth - 1, alpha, beta, True)    # recursivity
        minEval = min(minEval, evalu)
        alpha = min(alpha, evalu)
        if beta <= alpha :
            break
    return minEval

在开始时,用alpha=-infinity和beta=infinity调用minimax。要生成最佳移动,请使用minimax_根算法。注意:你可以使用比Minimax更短的NegaMax算法(但需要从玩家的角度来评估位置,而不是像Minimax那样从white的角度)。

 类似资料:
  • 我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事! 根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。 如果一行有5个,我们应该分配一个高值,比如9999,因为这是一个胜利的举动 当我们必须在Java中实现这一点时,我的问题来了! 我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应

  • 我做了一个Tic-Tac-Toe游戏,使用Minimax和Alpha-Beta修剪。我想为Tic-Tac-Toe(10x10)游戏制作一个计算机AI,但它的游戏树大得离谱。 我的代码是这样的,我只需要更改两个变量就可以更改一行中所需的板大小单元格。例子: 和 我希望你明白了。 所以,我把我的计划从10x10改为3x3,效果很好。 然后我改变和,使其成为(4x4)井字游戏。 现在,我认为使用Alph

  • 极小极大算法的一个缺点是每个板状态必须被访问两次:一次查找其子级,第二次评估启发式值。 极小极大算法还有其他缺点或优点吗?对于像象棋这样的游戏,还有更好的选择吗?(当然是带有α-β修剪的极小极大算法,但还有其他吗?)

  • 计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子,最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏,程序趋向于遵循一个被称为Minimax算法,伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法,并通过实例分析帮助大家更好的理解。 一、概念 Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两

  • 本文向大家介绍java实现五子棋小游戏,包括了java实现五子棋小游戏的使用技巧和注意事项,需要的朋友参考一下 java实现五子棋小游戏 演示图: 以上所述就是本文的全部内容了,希望能够对大家熟练掌握java有所帮助。

  • 本文向大家介绍JavaScript实现五子棋小游戏,包括了JavaScript实现五子棋小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了JavaScript实现五子棋小游戏的具体代码,供大家参考,具体内容如下 HTML部分 JavaSrcipt 更多有趣的经典小游戏实现专题,分享给大家: C++经典小游戏汇总 python经典小游戏汇总 python俄罗斯方块游戏集合 Java