有沒有什麼書籍是介紹製作棋類遊戲AI的?
象棋、圍棋的這種
大部分人工智慧的書都會講一下棋類對抗的,棋類AI的核心在於棋盤評估和博弈樹,棋盤評估的核心在於建模,而博弈樹的核心在於搜索和剪枝。其中博弈樹是固定的知識,而評估才是最核心的東西,不同的棋類遊戲,主要就是評估方法的不同。
棋盤評估:- 枚舉棋盤上所有位置,判斷該位置所有可能並且打分。
打分規則:
- 我方有必勝走法+10000分
- 對方有必勝走法-10000分
- 我方有次必勝走法+5000分
- 對方有次必勝走法-5000分
- 我方有傷害較大走法+1000分
- 對方有傷害較大走法-1000分
- 我方有普通傷害走法+500分
- 對方有普通傷害走法-500分
- 我方有XXX走法+100分
- 對方有XXX走法-100分
- 我方有YYY走法+50分
- 對方有YYY走法-50分
- 生成我方所有可以移動的位置的可用走法集合
- 枚舉所有可選走法,在棋盤上標註上去
- 遞歸評估棋盤
- 如果已經出現最佳走法,那其他走法就直接丟棄了。
可以參考我先前 900行內實現的一個五子棋 AI:五子棋人機對戰,注釋詳細,簡單明了。
遊戲演示:
命令行下載並運行 python gobang.py:git clone https://github.com/skywind3000/gobang.git gobang
python gobang.py
遊戲開始,出現初始棋盤,"O" 是你,"X" 是電腦:
命令行的五子棋人機對戰玩起來是不是別有一番風味呀?畫面簡陋而充滿「內涵」。如果你能夠戰勝默認難度,那麼可以挑戰高級難度,可以使用 "python gobang.py hard" 來啟動。我自己的記錄是不悔棋的話,普通模式3勝3負,而高級難度下,我自己也只能做到5負1勝。
剛才又玩了一盤 hard 模式,一不小心就又輸了。。。。。其實棋類遊戲的博弈樹搜索演算法是固定的,你能優化的只是剪枝和歸併而已。寫多了你就會發現博弈樹是固定的,真正關鍵的在於 「棋盤評估」,就是你的打分機制,而打分就在於你對棋盤態勢的估計於建模了,打分打的好,AI就厲害,搜索成本就低,打分打不好就會很弱智搜索成本太高。
當你將打分機制調試的差不多的情況下,即便搜索深度只為2,你也會發現水平和你有得一拼,哎喲,我寫出來的代碼居然比我還厲害了。
棋類 AI 比賽中,一般會把兩個 AI 放在一起,用各種初始棋盤讓他們對決,看誰勝多負少。這種比賽會用到更多高級的方法,比如更好的棋盤態勢評估,啟發式搜索,殘局庫,貝葉斯概率統計等。
當然我們自己做個玩具玩玩,或者遊戲裡面給玩家提供個 AI 陪玩的話,這個足夠了。
另,象棋的話,參考:
http://www.xqbase.com/computer.htm很詳細的教程,掌握了博弈樹的搜索和優化後,不同的棋類遊戲,主要就是評估方法的不同。你可以著重看一下它的評估方法。--做了兩年的獨立棋類AI研究,嘗試了部分AI實現方法,下面草談一下。
alpha-beta剪枝自然是需要的,然而這個剪枝只是實用級剪枝的基礎而已,我個人使用的是主變例剪枝,也叫極小窗口剪枝,然而根據不同棋類的特徵,還可以結合許多的輔助剪枝手段,比如空著搜索,即放棄自己的走棋權力,讓對方走,如果對方連走兩步甚至三步,我方都具有優勢,這說明我方的優勢巨大,可以直接認為這是優勢分支,而無需繼續搜索,還有比如基於淺層搜索的選擇性分支擴展等等。本人在中國象棋中嘗試了幾個搜索演算法的結合,好的搜索演算法能成倍地減少收斂時間。接下來我稍微談一下提高搜索速度的幾個方向:
一、數據結構,數據結構決定著收斂速度的上限,我第一次寫的時候,使用最為普通的數據結構,第二次重寫時使用了結合前人智慧精心設計的數據結構,搜索速度提升了10倍有餘。二、棋庫,大部分棋類在開局都具有極大的分支因子,此時僅憑搜索演算法是難以得出好的走法的,基本上所有的棋類軟體都用到了開局庫、殘局庫,甚至全局庫作為解決方法。先搜索棋庫,沒有的再執行搜索演算法。三、多線程,多線程可以成倍地提高搜索效率,這個就不贅述了,顯而易見的事情。本人受限於精力問題沒有完成這個模塊。四、合理的編程,這個其實可以和數據結構並在一塊兒,因為棋類AI是對時間複雜度高度敏感的演算法,而且通常搜索演算法都是一個遞歸函數,所以如果能在這個函數中減少一絲一毫的開銷,都將起到極好的效果,例如儘可能地一次性申請完所有需要使用的內存空間,而不是在函數中動態申請。五、搜索演算法與評估函數的合理結合,搜索到葉子節點時必定是要觸及搜索函數的,而搜索函數的速度也極大地影響著搜索演算法的收斂速度。再談一下評估函數,評估函數是讓我苦惱萬分的一塊,如果只是想走前人的道理,那完全沒有難度,前人已經根據經驗得出了許多實用的靜態評估函數,然而我想能將機器學習與評估函數結合起來,卻屢次失敗。這讓我認識到一點,想要完全脫離棋類知識,讓計算機自己總結和學習棋類知識來作為評估函數,這幾乎是不可能的,因為哪怕是人類自身,其實也並沒有掌握多少棋類知識。
我做的其中一個嘗試是將棋盤作為輸入,3W的樣本量訓練一個神經網路,然而無論我怎麼調節這個神經網路的參數,神經網路的訓練都十分失敗,我思索之後得出結論:棋盤的狀態與勝負毫無函數關係,也就是說,單純地給計算機一個棋盤,它無論怎麼學都不可能能確定這個棋盤的好壞。也有一種已經被實現的自學習方法,是在靜態評估函數中結合遺傳演算法,調整各評估項的權重,來達到自學習的目的。但我認為這依舊依賴於棋類知識,有進展,但沒有突破性的進展。而有些棋類又不太適合普通的博弈樹剪枝,例如圍棋和五子棋,這類棋有一個特點,即落子空間的幾乎絕對收斂,也就是說,隨著棋局的發展,落子的可能性會越來越少,最後幾乎會完全收斂。(圍棋有不收斂的可能,但五子棋是絕對收斂的)此時可以使用蒙特卡洛的方式,結合UCB演算法實現UCT,也就是基於蒙特卡洛思想的動態博弈樹擴展,這種方法不依賴於具體的棋類知識,但要求棋類是完全收斂棋類。現在世界頂級的圍棋軟體都使用了這樣一種演算法,然而這也僅僅是一個基礎,在此智商還可以結合RAVE剪枝,以及分塊蒙特卡洛,又或是其他精妙的演算法。不過我聽說世界第一的圍棋軟體使用的就是最古老的形勢判斷,即依靠棋類知識來評估局面。
過了有些時間了,東西也忘得差不多了,研究棋類AI只是為了在人工智慧上踏出第一步,沒有深入研究,若有不足,還請賜教。
差點忘了,偏了點題,回來點一下,如高票答案推薦的,
http://www.xqbase.com/computer.htm這個確實是入門棋類AI的一個不錯的網站。而PC遊戲編程 (豆瓣)可以算是入門中的入門,其中給出了幾乎全部的代碼,十分適合初學者閱讀,不過為了照顧初學者,其中使用的數據結構就顯得有些欠缺了。下一步建議題主可以大量閱讀論文,有許多優秀的論文對於棋類AI極有幫助。PC遊戲編程 (豆瓣)
想當年我沒事寫個自動玩俄羅斯方塊的AI,就是當方塊出現時,模擬四個方向,並且在各各位置處下落,最後計算在各種嘗試下,能得到得到當前行數最小的那種下法。然後我就開機讓電腦自己玩,結果睡了個覺,發現第二天早上電腦還玩著呢,沒有死。
介紹到棋類程序設計的書有很多,但專門介紹棋類遊戲AI的書實在是難找。我曾搜尋很長時間的棋類遊戲書籍,想借大佬代碼和演算法一步登天,結果還是自己慢慢琢磨著去做了,現在把搜尋的結果分享出來(不介紹其他回答者回答過的書籍)。
- 語言實踐形式的遊戲設計類型書籍。例如,部分介紹C#遊戲設計的書里有介紹黑白棋單機版,和中國象棋的網路對戰版。(這類書竟然神奇般的都包括這兩個內容。)
- 人工智慧類的書籍。人工智慧中一個重要的章節就是搜索技術,搜索技術最後總會提到博弈樹與博弈樹的搜索,它們介紹極大極小搜索和α-β剪枝搜索。如果有案例分析的話,提到的可能會有八皇后問題、黑白棋、一字棋、五子棋等。然而,棋類人工智慧本來就是人工智慧的一個小分支,人工智慧還要介紹像遺傳演算法、神經網路等,章節太多,博弈部分也就介紹得少了。舉幾個例子:
- 陸玲 何月順. 《人工智慧基本方法及程序設計》哈爾濱工程大學出版社 。這本書介紹了一字棋遊戲的程序設計,連界面都有了。
- 賁可榮 毛新軍 張彥鐸 鄭笛 菜敦波 《人工智慧實踐教程》機械工業出版社。這本書較厚,內容較多,在博弈部分介紹了八皇后問題、洞穴探寶、五子棋的演算法設計與實現方法。大部分人工智慧教材
- 《全國大學生計算機博弈大賽培訓教程》(王靜文,吳曉藝)【摘要 書評 試讀】- 京東圖書 還有這本書,只是在搜論文時看到的,就其目錄中看,包括了人工智慧學會舉辦的全國大學生計算機博弈大賽的所有比賽棋類的估值函數設計、程序設計與實現,後邊還有大賽項目規則。它雖是為大賽培訓而生,但它卻是市面少有的書里全是棋類程序設計相關內容的實踐類書籍,適合入門。(請原諒我只發了一個某dong的鏈接)
此外,還可以檢索相關棋類程序設計,博弈相關的論文,論文是大部分專家鑽研人工智慧棋類分支的主要渠道。論文旨在讓讀者學會設計棋類程序,了解棋類規則和棋局分析,學會評估方法、博弈理論和搜索技術。因此內容中更多的是理論,不會有大量可用的代碼。所以越是要想學好製作棋類遊戲,越是要靠自己去動手實踐。樓上大佬們大多沒有給出書籍,他們看過的書籍或查閱的各種來源的資料已經多到沒法推薦,而是直接給出棋類遊戲AI設計的關鍵部分。
C/C++中國象棋程序入門與提高
PC遊戲編程(人機博弈)http://download.csdn.net/detail/fullzzone/1925326
象棋對策論
百度前段時間被弄的那個吳韌是靠電腦下中國象棋發家的 你去查查文獻?
https://github.com/rasefon/gobang
小弟才疏學淺 隨便說一兩句。在我看來棋類ai無非alpha-beta剪枝,這些東西教材上說的已經夠多了。最難的地方在於你如何計算某個步驟節點的得分。
一般的人工智慧書都會介紹一下棋類吧
推薦閱讀:
※汽車類遊戲開發中,是遊戲方給汽車廠商付授權費;還是汽車廠商向遊戲方付廣告費?
※遊戲中連擊操作的發展史是怎樣的?
※有C++的基礎,卻不知道該往哪方向發展?