Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python alpha-beta搜索中的beta_Python_Chess - Fatal编程技术网

Python alpha-beta搜索中的beta

Python alpha-beta搜索中的beta,python,chess,Python,Chess,嗨!我试图实现一个alpha-beta搜索,但我首先想了解它背后的所有逻辑,而不仅仅是使用某种伪代码实现它 我的理解是:一个白人玩家做出了一个动作(我们称之为move1)。第一步保存为alpha(玩家保证的最小值)。现在,如果我们转到怀特的下一个可能的移动(move2),并且看到黑人玩家的第一个响应导致的估值比alpha差,我们可以跳过所有可能的黑人的反移动,因为我们已经知道,当白人做出move2时,最坏的可能结果比move1的最坏可能结果更糟 但是,我不明白的是贝塔变量。我在国际象棋编程维基上

嗨!我试图实现一个alpha-beta搜索,但我首先想了解它背后的所有逻辑,而不仅仅是使用某种伪代码实现它

我的理解是:一个白人玩家做出了一个动作(我们称之为move1)。第一步保存为alpha(玩家保证的最小值)。现在,如果我们转到怀特的下一个可能的移动(move2),并且看到黑人玩家的第一个响应导致的估值比alpha差,我们可以跳过所有可能的黑人的反移动,因为我们已经知道,当白人做出move2时,最坏的可能结果比move1的最坏可能结果更糟

但是,我不明白的是贝塔变量。我在国际象棋编程维基上读到:“最小化玩家可以保证的最大分数”。但我真的不明白背后的想法


有人能用非常简单的语言解释一下吗?非常感谢。

在国际象棋中,没有简单的方法可以判断move1是否优于move2(从您的示例中)。通过查看“硬”参数可获得近似值:工件的数量和值、双棋子或自由棋子的存在。。。通常,这种近似被插入到极小极大算法中

极小极大 简单地说,这个想法如下:首先,所有可能的移动都被扩展(黑白-…),直到达到预定义的深度或时间限制。这将创建一个板位置树(以移动作为边),并使用启发式方法(如上所述)评估树叶。然后,树被折叠,导致最后对move1和move2进行评估

崩塌是如何工作的?它从树的叶子开始,为每个节点分配一个值(也称为板位置)。对于所有子节点的值已知的每个节点,将聚合子节点的值:如果轮到怀特,则取怀特的最佳值(最大值);如果轮到布莱克,最坏的(分钟)。因此命名为minimax。重复此操作,直到到达根为止

假设以下董事会职位树:

 A
|  \
B1  B2
|   |  \
A11 A21 A22
现在假设以下计算:A11=0,A21=-1,A22=+1(正值适用于白色)。根据我们的近似值,我们假设位置A21比A22好(对于黑色),因此我们将-1分配给节点B2。对于B1,这是明确的,其值为0。现在我们假设B1比B2更适合白色,因此A的值为0,白色应该移动到B1的位置

这里的想法不是构建整棵树,而是对更有希望的动作进行深度优先搜索,以实现早期切断。在上面的例子中,如果我们先从左向右走树的深度(A-B1-A11-B2-A21-…),我们在评估A21后知道,对于白色,位置B2比位置B1差。因此,不再需要评估A22。Alpha和beta只存储当前已知的白色最佳可能移动的评估,以及当前已知的黑色最佳可能回复的评估。树节点的行走顺序(初始顺序)决定是否可能以及可能的截断次数。来自维基百科:

通常在阿尔法-贝塔期间,子树暂时由第一玩家优势支配(当许多第一玩家移动良好,并且在每个搜索深度,第一玩家检查的第一个移动足够,但所有第二玩家响应都需要尝试找到反驳),或者反之亦然

如果排序是次优的,则必须完全探索更多的子树

另见

优化
严格地说,树是一个树,因为相同的板位置可以通过不同的移动组合实现(例如)。使用a来检测相同的位置,这将节省大量的计算工作量。

基本上,根据游戏树中已探索的内容,alpha和beta是最佳结果的上下限,因此超出这些边界的任何内容都不值得探索

我已经有一段时间没有详细了解极小极大和阿尔法-贝塔修剪了,但这里是我记得的要点

正如你所说,如果我们已经知道怀特的
move1
得分为10,而在检查
move2
时,我们发现黑人的反应方式是白人被迫获得8分的最佳得分,那么就不值得再检查
move2
;我们已经知道,我们所能做的最好的事情比我们所知道的另一个选择更糟糕

但这只是极大极小算法的一半。假设我们现在正在检查怀特的
move3
,并查看布莱克的所有反应。我们研究了black的moveX,发现white的一个回答至少可以得到15分。如果我们接着开始探索布莱克的《代码》moveY(仍然是对怀特原著的《代码》move3的回应),发现怀特对《代码》moveY的回应会迫使得分至少达到18分,那么我们马上就知道源于布莱克的《代码》moveY的整个游戏树是毫无意义的;黑色永远不会使
moveY
,因为
moveX
只强制黑色允许白色得分15,而
moveY
强制黑色允许白色得分18

阿尔法代表了一个我们已经知道的最低分数,怀特可以通过做出不同的选择来达到我们正在探索的点。因此,一旦我们知道不可能获得超过阿尔法的能量,就不值得继续探索任何路径,因为怀特不允许我们到达那条路径


Beta代表了一个我们已经知道的最高分数,黑人可以通过做出不同的选择来达到我们正在探索的点。因此,一旦我们知道不可能低于beta,就不值得继续探索任何途径,因为black不允许我们走这条路。

谢谢,但我认为你有点错过了这个问题。或者我只是不够清晰。但我知道这是一个错误