2013-08-23 39 views
2

我想了解基本的國際象棋算法。我沒有深入閱讀文獻還沒有,但經過一番這裏cogitating是我的嘗試:國際象棋算法概述

1)分配權重值,以件(即主教比棋子更有價值)

2)定義啓發式功能將值附加到特定的移動

3)構建極大極大樹來存儲所有可能的移動。通過alpha/beta修剪修剪樹。

4)遍歷樹找到每個玩家

這是核心的國際象棋的算法「大局」思想的最好的舉動?有人能夠指出我更深入地瞭解國際象棋算法的資源嗎?

+0

您的問題可能過於寬泛,但A.I. Russell和Norvig的書是一篇很棒的介紹。 – sdasdadas

+0

在您決定沿樹遍歷足夠多之後,您需要採用某種啓發式方法來評估董事會。 –

+2

這裏有一個很好的資源:http://chessprogramming.wikispaces.com/ – harold

回答

5

以下是國際象棋引擎開發概述。

1.創建董事會代表。

在面向對象的語言中,這將是一個代表內存中棋盤的對象。在這個階段的選項是:

  1. 位棋盤
  2. 均爲0x88
  3. 8×8

位棋盤的原因是多方面的推薦方式。

2.創建一個評估函數。

這隻需要一個董事會和邊評估作爲agruments並返回一個分數。方法簽名將如下所示:

int Evaluate(Board boardPosition, int sideToEvaluateFor); 

這是您使用分配給每件的權重的位置。如果你願意,這也是你可以使用任何啓發式方法的地方。一個簡單的評估函數將增加sideToEvaluateFor的棋子的權重,並減去對方棋子的權重。這樣的評估功能對於真正的國際象棋引擎來說當然太天真了。

3.創建搜索功能。

這就像你說的那樣,用Alpha-Beta修剪技術進行MiniMax搜索。一些流行的搜索算法是:

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

基本想法是嘗試各種不同的變化,以一定的最大深度,並選擇推薦的舉動通過導致得分最高的變化。每種變化的分數是評估方法在最大深度處的棋盤位置返回的分數。

對於C#中的國際象棋引擎的例子看看我最近放在一起的https://github.com/bytefire/shutranj。要看的更好的開源引擎是用C++編寫的StockFish(https://github.com/mcostalba/Stockfish)。

+0

官方的stockfish repo在這裏:https://github.com/official-stockfish/Stockfish – Matteo