中國象棋評估函數建模


  一.簡介:

    最近在做一個lua版的象棋(使用lua也沒有考慮性能的問題,主要是想練習一下lua的使用),在象棋的PVE模式玩法中,AI的落子處理打算采用經典的alpha-beta算法(之后的博客會詳細記錄),采用這種算法的棋類游戲AI的核心是對象棋局面的評估(打分),以便AI能自己計算每種走法得到的結果好壞,比較得到最好的走法,因此必須有一個局面的評估函數。這里記錄一下評估函數的建模方案的學習總結。評估函數的建模方案來自於論文:《中國象棋計算機博弈數據結構與評估函數的研究和實現》,作者謝艷茹,讀者可以自行搜索這篇論文。

    評估函數:在象棋、圍棋、軍旗等等棋類游戲中,一個走法的優劣不是由走法單一決定的,如中國象棋中走了一步炮7平4,這一步可能就將對方將死,也可能剛好將炮送給對方等等。所以評估某一步棋的好壞時,不是評估這步棋本身,而是評估在走完這步棋后形成的局面中雙方的實力對比,這個實力對比和雙方棋子數量及種類、棋子靈活度(可走范圍)、棋子的威脅值(棋子下一步可以吃對方棋子)、棋子的保護值(棋子下一步可以走到的位置剛好是己方棋子,就保護了這個棋子)等等有關,評估函數就是根據當前棋盤上的這些情況給棋盤打分的函數,這個分數就是評估值。評估函數建模的目的就是建立一個根據棋盤棋子分布情況得到評估值的函數公式,接下來我們就可以根據這個數學模型(公式)寫出我們的評估函數代碼。

  二.評估函數建模

    1.評估函數和性能。參考:局面評估函數——簡介(一) (xqbase.com)

      在建立評估函數模型前,有必要了解評估函數和性能的關系。評估函數模型並不是涉及到的變量越多越好(這種評估函數模型中運用到的各種變量和修正等我們可以稱為知識),因為知識的增長會導致評估函數的計算時間變長,但是我們要直到AI的聰明程度不止和評估函數有關,還和搜索的深度(計算的步驟)有關,如果單個評估函數占用時間變長,相同時間內,搜索的深度就可能降低(可以這樣理解,在不精簡的情況下,在象棋中假如一個當前步驟我方棋子總共有35種走法,那么如果搜索深度為1時就需要評估35種棋盤;如果搜索深度為3時,即預測AI-玩家-AI可能的走法,就有35*35*35種棋盤需要評估,這是指數增長的運算量,因此當搜索深度足夠深時,評估函數的運行時間的微小改變會被放大到不能忽視的地步,導致運行效率降低,要在相同時間內完成走法的選擇,知識的增長就會導致搜索深度的降低)。所以在知識量增長到一定程度后,再增加知識量對AI的效率的提高就不再顯著甚至負相關,所以有必要選擇合適的知識量。

      這部分建模實際上是學習已有的建模方案然后對其的總結梳理,因此對知識量的選擇上我不會下功夫,但是了解這部分內容我還是覺得很有必要。

    2.固定子力值。

      玩過象棋的人都知道,在下棋時,我們對有些棋子是格外在意的,如車、馬、炮等,而有些棋子直到棋局的中后部分才開始動,我們開始是很少注意的,甚至會為了其他棋子增加可活動范圍而主動送掉,如兵卒,這和我們對於棋子重要程度的評估有關。在象棋中,不同棋子的存在對棋局的影響是不一樣的,我們用固定子力值來量化每一種棋子存在對棋局的影響,如將帥應該是無窮大的(一般使用一個遠大於其他棋子子力值的值),而車是除將帥外最重要的棋子,所以數值也應該是最大的等。下面是論文中給出的各棋子的固定子力值:車950、馬450、炮450、相200、士200、兵130、帥65536。最終的單方的子力值總分是將其所有棋子的子力值相加。

    3.棋子位置值

      在象棋中,一個棋子的存在會對局面造成影響,它的位置也同樣對局面有影響,而且棋子在不同位置對局面的影響差別甚至可能非常大,如兵卒在未過河前和過河后、在地方九宮格附近和離九宮格較遠時對對方的威脅程度就差別較大,因此不同棋子都有一個位置值得數組來評價其在不同位置對局面得影響。

      下面是棋子的位置值修正,我這里只采用兵的位置值修正,因為兵的位置對局勢影響比較大,沒有采用其他棋子的修正(主要為了精簡算法,因為寫這個項目的主要目的還是練習lua語言,而不是做AI或者人工智能之類的)

    4.棋子靈活度

      棋子的靈活度指棋子的可移動范圍。在象棋中,棋子的可移動范圍大小對於棋子能否發揮能力很重要,如蹩馬腿、蹩象腿等操作都會降低對方棋子的靈活度。每一個棋子靈活度的計算就是計算棋子可走的格子數量,然后乘上這個棋子的靈活度系數(權重,每個棋子的重要程度不一樣,所以提供一個系數對靈活度進行修正)。單方的棋子總靈活度是將所有棋子的靈活度相加。下面是各棋子的靈活度系數參考值:車7、馬13、炮7、象1、士1、兵1.5、帥0。

    5.被威脅值

      被威脅值是指當前這個棋子處在多少個對方棋子的可移動位置上,也就是可能被吃,同樣地,根據當前棋子的重要程度,它應該有一個權重修正,可以使用子力值進行修正。

    6.被保護值

      被保護值是指當前棋子處在多少個己方棋子地可移動位置上,也就是說這個棋子被吃后有多少個己方棋子能為自己“報仇”,這個值同樣可以根據自身的子力值進行修正(同樣被保護或者威脅,棋子的重要程度會對這種威脅或保護有影響)。

    7.棋盤范例

      在開局的過程中,有一些常走的棋盤范例(如當頭炮,馬先跳等),這些范例可以將棋盤保存下來,並保存一個主觀賦予的評估值,然后在遇到相關棋盤時優先調取。也可以采用動態規划的思想,將已經計算過的棋盤評估值保存下來等。這一類的方法我都沒有給予考慮。

    8.其他

  三.總結

    1.在二中我們討論了幾種評估棋盤的方式,實際求得的評估值可以將單方的這些量化數據求和或求差(如威脅值就有必要求差),然后將紅黑方的單方評估值做差,即可得到一個數值作為評估值用於代表當前局面是優於紅方還是黑方的,計算機可以據此作出着法的取舍;

    2.上面列出的評估項目還比較簡要,評估所用的各種數值修正也僅作參考。這些數據往往是一個象棋游戲AI的核心部分,需要大量的實踐讓計算機自己修正或者人工修正,這就涉及到人工智能方面的內容了,所以我覺得沒有必要深入。因為模型的粗糙,所以實際完成的AI很可能會出現智障行為,盡管如此,我也覺得可以了;

    3.我在模型中做了很多精簡,主要考慮到做項目的目的是為了練習lua,沒有必要在這方面耗費太多時間,因此這篇文章僅作為參考文章,也沒有粘貼具體的實現代碼,實際上就是我對於這部分內容理解的一個記錄,所有內容僅供參考。如果您有興趣了解更多關於中國象棋的知識,象棋巫師這個網站中的資料很不錯,我也是主要看這個網站的資料理解象棋AI的算法實現的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM