国际象棋算法概述

时间:2013-08-23 20:26:37

标签: algorithm chess

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

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

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

3)构建minimax树以存储所有可能的移动。通过alpha / beta修剪修剪树。

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

这是国际象棋算法的核心“大局观”吗?有人能指出我对棋算法更深入的资源吗?

1 个答案:

答案 0 :(得分:5)

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

<强> 1。创建董事会代表。

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

  1. 位棋盘
  2. 均为0x88
  3. 8×8
  4. 出于多种原因,推荐使用Bitboard。

    <强> 2。创建评估功能。

    这只需要一个董事会并将其评估为评估并返回分数。方法签名看起来像:

    int Evaluate(Board boardPosition, int sideToEvaluateFor);
    

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

    第3。创建搜索功能。

    就像你说的那样,这将是使用Alpha-Beta修剪的MiniMax搜索。一些流行的搜索算法是:

    1. NegaMax
    2. NegaScout
    3. MTD(F)
    4. 基本思路是尝试所有不同的变化到一定的最大深度,并选择变化推荐的移动,从而获得最高分。每个变化的得分是评估方法在最大深度处的板位置返回的分数。

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