1

我正在尝试了解基本的国际象棋算法。我还没有深入阅读文献,但经过一番思考,这是我的尝试:

1)为棋子分配权重值(即主教比棋子更有价值)

2) 定义将值附加到特定移动的启发式函数

3) 构建极小极大树来存储所有可能的移动。通过 alpha/beta 修剪修剪树。

4)遍历树为每个玩家找到最佳移动

这是国际象棋算法的核心“大局”思想吗?有人可以向我指出有关国际象棋算法的更深入的资源吗?

4

1 回答 1

5

以下是国际象棋引擎开发的概述。

1. 创建董事会代表。

在面向对象的语言中,这将是一个表示内存中棋盘的对象。此阶段的选项是:

  1. 位板
  2. 0x88
  3. 8x8

由于许多原因,Bitboards 是推荐的方式。

2. 创建评估函数。

这只是将棋盘和边评估作为 agruments 并返回一个分数。方法签名将类似于:

int Evaluate(Board boardPosition, int sideToEvaluateFor);

这是您使用分配给每件作品的权重的地方。如果您愿意,这也是您可以使用任何启发式方法的地方。一个简单的评估函数将添加 sideToEvaluateFor 的权重并减去对面的权重。这样的评估函数对于真正的国际象棋引擎来说当然过于幼稚。

3. 创建搜索功能。

就像你说的那样,这将类似于带有 Alpha-Beta 修剪的 MiniMax 搜索。一些流行的搜索算法是:

  1. NegaMax
  2. NegaScout
  3. MTD(女)

基本思想是尝试所有不同的变化到某个最大深度,然后选择变化推荐的移动,从而获得最高分。每个变化的分数是评估方法返回的最大深度处棋盘位置的分数。

有关 C# 中国际象棋引擎的示例,请查看我最近整理的https://github.com/bytefire/shutranj 。一个更好的开源引擎是用 C++ 编写的StockFish ( https://github.com/mcostalba/Stockfish )。

于 2013-08-27T15:19:37.227 回答