【五子棋AI】啓發算法——開局庫

         開局庫不是我本身製做的,是在網上下載的「十四地毯普」,而後我把它解析出來,去掉無用信息,進行壓縮做爲資源放在軟件中。由於是執黑必勝的地毯,因此軟件執白時不多用到開局庫,除非開局庫中的局面被證實是好局面(其實無禁手來說,黑棋控盤稍強白棋就沒有好局面——即便在地毯普中)。數組

        下面說一下解析LIB類型的地毯普,其實解析LIB根本沒有什麼難度,RENLIB是開源的,除了它使用的第三方bestmove.dll以外。只須要在它的主頁上下載源碼看一下就知道了,它是按位記錄信息類型的,我用VB.NET復原了一部分解析代碼,而後去掉對軟件無用的部分。函數

        開局庫的重點除了獲取以外(五子棋的比較容易,由於有地毯普,不要介意禁手問題)就是保存,這裏的保存不是指文件(保存爲文件只須要用先序遍歷保存,讀取時設置一個後進先出記錄就很容易復原樹),而是指在內存中保存的形式——這種形式要便於根據局面取得招法,並且還有就是局面的對稱、旋轉局面都要易於查找。開始時我寫了一系列的函數來完成這些工做,並且至今這些對稱、旋轉局面的方法依然存在在代碼中。其主要緣由就是把對稱、旋轉局面合併須要的解析時間太長了…………簡直就是久遠……但旋轉走法很是簡單。編碼

        不要嘗試用樹的形式保存,而後去遍歷,你會發現當局面上的棋子達到必定數目以後(例如十個),要搜索每種排列將是耗時很是長的。因此咱們使用一個key/value集合來記錄走法。而其中的key就取自局面key,這並不意味着搜索開局庫還須要addpipe,咱們只須要直接計算key就能夠了。這樣一來,就避免了全排列——key與順序無關。value是一個走法數組,個人代碼中用了一個list(of integer),由於4字節記錄座標以外,我還記錄了其餘一些信息——例如走法的好壞。ip

        因而,搜索開局庫時,傳入當前走法路線mvs(),而後把他們用轉換函數轉換獲得用於搜索的8個key,依次搜索,在最好的一組結果中隨機取一個並逆轉換便可。內存

        對於五子棋來說,執黑必勝地毯普咱們能夠更深刻的利用:樹上的葉節點即VCF/VCT的起點。固然也能夠這樣理解:不管下一步白棋走哪裏,黑棋也有VCF或VCT。之因此這樣說,是由於在編碼時即便知道當前走了葉節點,也不能立刻搜索,固然若是你非要這麼作將面臨搜索對方全部可能走法或者提早一步進行VCF/VCT搜索,這樣作無疑效率低太多。因此個人作法是識別上一步的上一步是葉節點走法,亦即上一步的上一步的上一步在開局庫中獲得了葉節點走法——也許你會考慮到,這不嚴格,但實際上若是考慮到走法有好壞記錄以及白棋脫譜的狀況,能夠說這是嚴格的——這個嚴格是指必定存在VCT或VCF。資源

        具體實現來講,就是把走法路線的後幾步去掉,而後在開局庫中搜索,看看是否達到葉節點,若是是,則進行VCF/VCT搜索找到路徑。get


所有文章和源碼整理完成,之後更新也會在下面地址:源碼

http://www.vbdevelopers.orgpip

http://www.softos.org效率