如何使用negamax算法
我想知道如何使用negamax算法。 我正在尝试在C#中为游戏mancala编写一个代理。 当给定游戏节点时,该算法给你一个单一的数字。
假设我的AI玩家想要采取行动。 negamax函数返回一个单一的数字。 所以它告诉我从这一点来看,最佳举动的得分是多少。 我怎样才能使用这个号码?
如果是玩家A,我会试着做出可能的动作并检查每个人的负值。 但是,如果我首先进行移动并检查negamax,那么当negamax运行时(让我们假设我们仍然只有1个深度),它将评估移动,然后下一步必须是玩家B的移动。
我对此感到非常困惑。 当我看到negamax伪代码(例如在维基百科页面上)时,它说要尝试该玩家的移动。 如果我这样做,它会返回最高分,但不会告诉我哪一次得分。
negamax应该如何使用?
这是一个有趣的。
这是关于探索可能移动树中的每个节点的全部内容。 如果使用alpha-beta修剪,可以通过“修剪”(不评估)树的某些分支来使算法更高效。 我假设你没有使用修剪,并且要看完整的树。
如果Mancala是一个非常简单的游戏,就像Tic-Tac-Toe一样,你可以在不需要“评估函数”的情况下实现算法。 用井字游戏,如果你玩完所有可能的动作,你可以获得胜利,失败或平局。 你将在那里执行一个negamax算法,而不考虑游戏的中间状态(即,在最后一个之前的任何移动),因为可能的移动数量非常有限,并且AI引擎将容易地计算所有的一直到最后的可能性。
另一方面,在国际象棋中,一个“评估函数”(EF,以下)是必不可少的,因为这个星球上没有任何硬件可以计算每一个可能的棋盘移动序列,直到游戏结束。 因此,大多数国际象棋AI将进入12-14级的深度,然后评估结果的位置,为女王分配8点,为白嘴鸦分配5点,为主教或骑士分配3点,为典当分配1点,像广场控制的东西(控制中心广场的点数多),国王安全等等。
对于Mancala,据我所知,可能需要一个评估函数,这可能很复杂,但也许这个评估函数很简单,比如仍然拥有的种子数量,还可以为种子添加点数一个先进的位置。 (我查阅了Wiki Mancala,它看起来有很多可能的变体 - 我不确定你在使用哪一个。)
因此,negamax算法需要实现一定的深度(即,直到游戏结束时使用所有可能的游戏)以及简单的EF。 让我们假设你将执行AI看5次深入。 negamax的好处在于它是完全对称的和零和; 换句话说,如果AI的位置评估为5,则对于人类玩家评估为-5。 如果对于人类运动员评价为13,则评价为AI的-13。 这是讨论的“单数”。 考虑到这一切,人工智能算法看起来像这样(再次,没有修剪):
1)检查每个可能的AI动作
2)对于每一个动作,检查每个可能的对手反应
3)对于每一种可能的反应,检查每个可能的AI动作
4)对于每个可能的AI动作,请检查每个可能的对手反应
5)最后,对于每个可能的对手反应,检查每个可能的AI动作
现在我们已经达到了深度5,并且您已经构建了一个具有5个级别的树,并且可能有数千或数百万棵树的叶子(底层节点)。 您可以用这样的方式编码,即每个节点都引用其父节点,并引用其所有子节点,以便您可以轻松遍历树,从父节点到子节点,然后返回。
一旦树已经正确设置,现在是时候实施negamax算法,如下所示(让我们假设对AI玩家来说更高的分数更好):
6)对于每个4级对手的反应,找到所有AI儿童移动中的最高评估,并修剪所有其他孩子。 你正在决定从现在开始移动你的AI,以响应每个可能的第4个对手的反应。 所以现在每个4级响应恰好有一个假设的5级响应。 现在,您将您所做的五级孩子的评估分数分配给四级家长。 这就是说,如果你达到第四级的对手移动,AI会让这个特定的第五级移动,并且董事会将评估该分数。
7)接下来,你评估每个第3级AI动作,并且对于每个第4级从现在的对手动作中找出最低评估值,修剪所有其他的孩子,并分配第4级评分(来自最高第5名级别节点)到第三级。 除了使用LOWEST子分数(b / c这是一个AI动作而不是对手动作)之外,您的步骤与步骤6相同。
8)对第2级进行与第6步相同的操作,在所有第3次从现在的移动中找到最高评估,并将这些最高评估分配给第2级节点。
9)对第1级进行与第7步相同的处理,在所有第2次从现在的移动中找到最低评估值,并为第1级节点分配最低评估值。
10)看看所有的第一级节点,你的AI应该打出最高分。
显然,你可以使深度不被硬编码为5,而是一个参数,并且你将使用递归(如在Wiki中)来实现这一点。 要选择深度,请查看运行需要多长时间,并将n设置为等于最高深度,仍然可以实现快速AI响应。 一旦你在这里建立基础知识,你可以在稍后添加修剪策略,通过不评估树的整个分支来实现更大的深度,这显然不是正确的行为,但是这是我为你规划的完整的基本负分。
祝你好运,它应该是一个有趣的编程!
Onemancat给出了一个非常详尽的解释 - +1。
对你的问题的简短回答是,negamax返回特定位置的分数,所以你要做的是在第一层进行每一步动作,对每个得到的位置调用negamax来评估它,然后选择最佳分数作为结果。
链接地址: http://www.djcxy.com/p/9633.html