棋類遊戲中人機博弈的設計

  以典型的棋類遊戲-象棋爲例,象棋是一種徹底知識博弈(Games of Perfect Information),意思是指參與雙方在任什麼時候候都徹底清楚每個棋子是否存在,位於何處。只要看看棋盤,就一清二楚了。跳棋、圍棋、象棋、五子棋等都屬於徹底知識博弈。撲克遊戲,還有麻將等大都不是徹底知識博弈,由於你不清楚對方手中有什麼牌。算法

  本文將要介紹的技術可或多或少地應用於徹底知識博弈,儘管不一樣的遊戲在細節上有很大差別,但在本文中所介紹的搜索算法上對特定的遊戲知識依賴很少,不一樣於走法的生成,局面的評估,對具體的遊戲規則有極大程度依賴。數組

1. 人機博弈的要點

人機對弈的程序,至少應具有以下幾個部分:數據結構

①某種在機器中表示棋局的方法,可以讓程序知道博弈的狀態。函數

②產生合法走法的規則,以使博弈公正地進行,並可判斷人類對手是否亂走。lua

③從全部合法的走法中選擇最佳的走法的技術。spa

④一種評估局面優劣的方法,用以同上面的技術配合作出智能的選擇。orm

⑤一個界面,有了它,這個程序才能用。遊戲

本文將簡要介紹上面列出的全部內容。開發

1.1棋盤表示(Board Representations)

  棋盤表示就是使用一種數據結構來描述棋盤及棋盤上的棋子,一般是使用一個二維數組。一個典型的中國象棋棋盤是使用9×10的二維數組表示。每個元素表明棋盤上的一個交點。一個沒有棋子的交點所對應的元素是0,一個黑帥對應的元素是1,黑士則用2表示等等,依此類推。棋盤的數據表示直接影響到程序的時間及空間複雜度。爲了追求更高效率,研究人員針對不一樣棋類提出了多種不一樣的表示方法。io

1.2 走法產生(Move Generation)

  博弈的規則決定了哪些走法是合法的。對有的遊戲來講,這很簡單,好比五子棋,任何空白的位置都是合法的落子點。但對於象棋來講,就有馬走日,象走田等一系列複雜的規則。走法產生是博弈程序中一個至關複雜並且耗費運算時間的方面。不過,經過良好的數據結構,能夠顯著地提升生成的速度。

1.3 搜索技術(Search Techniques)

  對於計算機來講,直接經過棋盤信息判別走法的好壞並不精確。除了輸贏這樣的局面能夠可靠地判別外,其餘的判斷都只能作到大體估計。判別兩種走法孰優孰劣的一個好方法就是察看棋局走下去的結果。也就是向下搜索若干步,而後比較發展下去的結果。爲了不差錯,咱們假定對手的思考也和咱們同樣,也就是,咱們想到的內容,對手也想到了。這就是極大極小搜索算法的基本原則。極大極小搜索算法是本書中全部搜索算法的基礎。

  極大極小搜索算法的時間複雜度是O(bn)。這裏b是分枝因子(branching factor),指棋局在各類狀況下的合法走步的平均值;n是搜索的最大深度,也就是向下搜索的博弈雙方的走步之和。例如向下搜索甲乙雙方各走一步的情形,n就是2。顯然對於象棋這種分枝因子在40左右的棋類遊戲,時間開銷隨着n的增大會急劇的增加,不出幾層就會超出計算機的處理能力,這將致使在有限時間內得不到使人滿意的結果。

  人們在開發高效的搜索算法上投入了大量的研究。在過去的幾十年中,一些至關成功的改進大大提升了極大極小搜索的效率。Alpha-Beta剪枝、迭代深化、置換表、歷史啓發等手段的綜合應用將搜索效率提升了幾個數量級。

1.4 估值(Evaluation)

  然而,現有的計算機的運算能力仍然十分有限。不可能一直搜索到分出輸贏的那一步,在有限搜索深度的末端,咱們用一些靜態的方法,來估計局面的優劣。這些方法在很大程度上依賴於具體的遊戲規則和咱們對於該遊戲的經驗知識,其中至關一部分不徹底可靠。例如,中國象棋的程序一般將一個炮賦予遠高於一個兵的價值,但一個兵在高手的運用之下每每能夠產生不次於炮的做用。

  寫出一個好的估值函數並非一件輕鬆的事,它須要你對所評估的棋類至關了解,最好是一個經驗豐富的高手。而後還要進行無數次的試驗,經歷幾番失敗後纔可能獲得一個使人滿意的估值函數。

相關文章
相關標籤/搜索