我正在尝试理解基本的国际象棋算法。我还没有深入阅读文献,但经过一番思考后我才尝试:
1)为碎片分配重量值(即主教比棋子更有价值)
2)定义将值附加到特定移动的启发式函数
3)构建minimax树以存储所有可能的移动。通过alpha / beta修剪修剪树。
4)遍历树以找到每个玩家的最佳移动
这是国际象棋算法的核心“大局观”吗?有人能指出我对棋算法更深入的资源吗?
答案 0 :(得分:5)
以下是国际象棋引擎开发的概述。
<强> 1。创建董事会代表。
在面向对象语言中,这将是一个代表内存中棋盘的对象。这个阶段的选项是:
出于多种原因,推荐使用Bitboard。
<强> 2。创建评估功能。
这只需要一个董事会并将其评估为评估并返回分数。方法签名看起来像:
int Evaluate(Board boardPosition, int sideToEvaluateFor);
这是您使用分配给每件作品的重量的地方。如果您愿意,也可以使用任何启发式方法。一个简单的评估函数会增加sideToEvaluateFor的片段的权重并减去对方片段的权重。对于真正的国际象棋引擎来说,这样的评价函数当然太天真了。
第3。创建搜索功能。
就像你说的那样,这将是使用Alpha-Beta修剪的MiniMax搜索。一些流行的搜索算法是:
基本思路是尝试所有不同的变化到一定的最大深度,并选择变化推荐的移动,从而获得最高分。每个变化的得分是评估方法在最大深度处的板位置返回的分数。
有关C#中国际象棋引擎的一个例子,请查看我最近放在一起的https://github.com/bytefire/shutranj。要查看的更好的开源引擎是StockFish(https://github.com/mcostalba/Stockfish),它是用C ++编写的。