如何增加国际象棋引擎考虑的总位置

How to increase total positions considered for a chess engine

我正在 Java 中编写国际象棋引擎并使用位板来表示棋盘(12 个 64 位数字)。根据 IntelliJ 调试器,此 class 实例的大小(其保留大小)为 152 字节。 当试图看到头部的几个动作时,我认为我为每个动作创建一个新实例来表示新的 Board 状态。下面是董事会 class 的大致样子。

public long WP=0L, WN=0L, WB=0L, WR=0L, WQ=0L, WK=0L, BP=0L, BN=0L, BB=0L, BR=0L, BQ=0L, BK=0L;
long NOT_WHITE_PIECES;
long WHITE_PIECES;
long BLACK_PIECES;
long OCCUPIED;
long EMPTY;

public void updateBitboards() {}
public void updateMailbox() {}
public void movePiece(Move move) {}
public void drawBitboard() {}

其他字段和方法是静态的,所以我认为它们不会影响实例的大小。 问题是,即使我只想考虑国际象棋的前 4 步,也有大约 8,000,000 种可能的步法组合。所以我最终要存储总共 8,000,000*152B = 1,216,000,000B... 即 1.2GB。

我觉得我在这里遗漏了什么。如何增加一次考虑的职位数量?

首先,您不想每次移动都创建棋盘状态的新实例。如果您正在使用例如Minimax 然后你移动,进行递归调用,然后取消移动。这样你总是只有一个它考虑的棋盘状态。

然后,为了尽量减少您需要考虑的移动次数,您需要对算法进行改进。最常见的开始是 alpha-beta 修剪,您可以在此处阅读更多信息:https://www.chessprogramming.org/Alpha-Beta。 Alpha beta 修剪将始终产生与 minimax 相同的结果,但您考虑的位置更少,因为您不搜索无望的位置。

然后,您可以使用大量其他修剪技术来减少搜索树。其中大部分不会产生相同的结果,因为您“手动”选择切断您“认为”会变坏的某些位置。这可能是假设做某事总比什么都不做好(空着法修剪)。

您可以做的其他可以加快算法速度的简单事情是查看移动顺序。为了使 Minimax 最有效,您总是希望首先查看每个位置的最佳着法。这样你会得到更多的截止点,而不是搜索那么多的动作。您可以在 https://www.chessprogramming.org/.

找到您需要了解的有关国际象棋编程的所有信息