Artificial intelligence 在国际象棋Alpha-Beta搜索中实现Killer启发式

Artificial intelligence 在国际象棋Alpha-Beta搜索中实现Killer启发式,artificial-intelligence,chess,alpha-beta-pruning,Artificial Intelligence,Chess,Alpha Beta Pruning,我理解杀手启发法背后的想法,以及为什么它有帮助。我正在努力解决的是如何在Alpha-Beta搜索例程中实现它。特别是,如何确保首先只尝试兄弟节点的致命移动?伪代码将非常有用。在搜索树的许多部分,杀手级的移动可能是一个很好的反驳移动。所以,尝试其他位置的杀手招式可能是个好主意 你可能有不同的阵型,每层都有不同的杀手招式,进入(层)时清除(层+1)阵型,这将给你一个“仅兄弟姐妹”杀手。我想说,“+1”偏移量类似于一个要调整的参数:尝试清除(ply+N)的数组,看看性能最好的地方(我想增加N会改善情况

我理解杀手启发法背后的想法,以及为什么它有帮助。我正在努力解决的是如何在Alpha-Beta搜索例程中实现它。特别是,如何确保首先只尝试兄弟节点的致命移动?伪代码将非常有用。

在搜索树的许多部分,杀手级的移动可能是一个很好的反驳移动。所以,尝试其他位置的杀手招式可能是个好主意

你可能有不同的阵型,每层都有不同的杀手招式,进入(层)时清除(层+1)阵型,这将给你一个“仅兄弟姐妹”杀手。我想说,“+1”偏移量类似于一个要调整的参数:尝试清除(ply+N)的数组,看看性能最好的地方(我想增加N会改善情况)


顺便说一句,对引擎性能的评估是一项不同的相当耗费资源的任务:通常一个引擎试图解决一个测试套件,或者两个具有不同参数的引擎在它们之间进行匹配(匹配应该足够长,例如100个游戏),以确定哪一个更好。

我将讨论实现。要获得兄弟节点的致命移动,请使用如下方案

killerMoves[ply][slot]
其中
ply
是与根的距离(而不是搜索深度),而
slot
是您想要的杀手移动次数。这可以确保首先尝试同级节点,因为同级节点位于同一层

当你得到一个beta截止值时,要插入一个致命的移动,你需要将给定层的移动移到右边,可能会放弃一个旧的移动,然后插入新的移动。通常情况下,您不会将捕获或散列移动存储为杀手移动,因为它们是通过其他机制排序的

for (int i = killerMoves[ply].Length - 2; i >= 0; i--) 
    killerMoves[ply][i + 1] = killerMoves[ply][i];
killerMoves[ply][0] = move;
现在,当您执行移动排序时(在遍历移动列表之前),您可以确定移动是否是致命移动:

for (int slot = 0; slot < killerMoves[ply].Length; slot++) {
    int killerMove = killerMoves[ply][slot];

    for (int i = 0; i < movesCount; i++)
        if (moves[i] == killerMove) {
            // moves[i] is a killer move so move it up the list
            break;
    }
}
for(int slot=0;slot
你不需要为一层或类似的东西清除杀手级动作,因为杀手级动作很可能是在同一层出现的一系列类似位置上的好动作

由于另一个答案提出了它,您可能不需要执行严格的测试,因为杀手启发式理论上是合理的。你可以尝试你使用的杀手招式的数量(2或3是标准)以及它们相对于其他好招式的顺序,比如捕捉