1. 程式人生 > >【國象AI】評估函式(三)StockFish 評估概覽

【國象AI】評估函式(三)StockFish 評估概覽

簡要介紹

國際象棋基本常見的幾種評估有Material子力、Space空間、Mobility機動性、Tempo著法、Threat威脅、Shape形狀、Motif圖案等,而在具體的確定的時候還有很多不同的表現形式。一個棋子的移動往往是影響多個評價指標之後得到的綜合結果。但是往往這些的計算不會嚴格按照這樣的框架,比方在Stockfish中這些型別的劃分就沒有那麼的死板。
評估和棋盤表示關係非常的大,棋盤的結構(和對棋盤結構的理解)非常影響寫評估的手感。而且對模板的數量應用可以減少很多的工作量。這點相比起來Stockfish就做的非常的優秀(結構真的非常的漂亮但是有的時候也會找不到要用的東西)。
比如說取一個函式。

  template<Tracing T>  template<Color Us>
  Score Evaluation<T>::evaluate_space() {
    const Color Them = (Us == WHITE ? BLACK : WHITE);
    const Bitboard SpaceMask =
      Us == WHITE ? CenterFiles & (Rank2BB | Rank3BB | Rank4BB)
                  : CenterFiles & (Rank7BB | Rank6BB | Rank5BB);
    //…

可以通過模板和這些引數的設定,來減少對我方顏色棋子的重複判斷。而且變數名非常的清楚。

技巧

首先這裡用到的一個概念是局勢。對於開局/中局和殘局,往往有不同的評價。比方說,往往在殘局兵由於可以升變作用會更加明顯;在中局的時候王非常容易受到攻擊所以一些防禦措施,比如王前面有兵遮擋(常見的一個防禦方式)給的加分會比較多,而在殘局的情況下由於王需要積極的行動作為戰鬥力,這種加分就幾乎不可見。
在這裡,主要是用非兵的棋子總的子力來體現局面(中局/殘局),這兩者之間是線性插值。局勢的儲存用32位,前16和後16分別記錄中局/殘局的情況。這樣通過一次加減可以完成同時對中局/殘局評價的處理。這樣記錄可能由於借位等造成前面的儲存有一的偏差,但是在整個評估中影響不大。

constexpr Score make_score(int mg, int eg) {
  return Score((int)((unsigned int)eg << 16) + mg);
}

關於藐視因子,藐視因子在這裡用的是0,它在評估函式中的作用直觀理解是直接加在最後的評價中,而實際應用的話他會讓評價提前退出:當局面完成Material、Imbalance、Pawn的評價之後,會判斷當這個值是不是超出一個LazyThreadhold,如果超出的話會提前退出。因為在這種情況下評估判斷已經做得足夠好而不再做細節的搜尋。這個帶來的影響就是,在雙方的差距非常明顯的時候,AI的評估會做的比較簡單——只保留關鍵的影響比較大的因子,或許從某種程度上是認為此刻加深搜尋的深度比評估包含更多的細節更加重要。
此外該引擎中還用到了大量的Hash表的加速。兵和其他棋子的hash表區別存放。而且比較奇怪的是這一部分的種子是人工給定的不知道是不是經過測試得出的結果。但是這一部分我們還有待完善。
還有一些基本的功能是在評估外的。比如SEE,可以在搜尋樹生成的時候就減少一些不必要的送子/交換。但不在評估的模組所以不做詳細說明。

具體說明

接下來分類對於每一類評估所做的事情進行說明。

Material

Material是子力價值,這一部分的價值應該是直接存在棋盤內,每次移動的時候就做加減的更新,而不需要不斷的掃棋盤重新計算。它對於每個棋子給定了在不同位置上的價值(不變的基礎價值和棋盤各個位置的價值)。對於象和馬這種攻擊範圍和位置關係非常大的棋子,各個位置上的變化相對就會比較大。
然後Material上還有一塊就是,對於殘局的判斷。在人類學棋的時候殘局也是單獨會拎出來訓練的一塊,在這種情況下的子力評價無法像之前那樣做判斷,就好像比較經典的剩單兵的情況,能否升變和雙方王的位置關係非常的密切,而這種勝負/平手的評價沒有辦法用和之前一樣的確定方法。此外還有如果棋子少的話P的數量和位置能夠起到的影響是和之前完全不一樣的體系了。而對於剩下BB/BN/NN的情況,也需要單獨的考慮。

Imbalance

Imbalance,考慮的主要是棋子數量的相互影響。雖然這個很直覺的例子就是比如兩隻馬的作用會比單獨相加要大。但是這個他就比較誇張了……把我方棋子和對方棋子的數量相當於是種類對種類建立起來關係。

具體棋子

Pawn,兵的評估,這一部分涉及的孤兵、疊兵、落後兵的懲罰,連通的兵的獎勵,和其他棋子的關係來說在這部分主要考慮到了兵對王的保護和對對方王的威脅(兵風暴,兵向王的移動可能帶來很大的威脅)。
接下來的幾個計算是對各種棋子的計算,同時更新被雙方棋子威脅的位置。都要計算的是對王的保護,其他對於不同的棋子有一些不同的值。比如Knight和Bishop會考慮被我們的兵保護或是在兵後面的加分,Bishop會有能掌控長距離的斜線的加分,Rook會考慮佔據通路半通路等,而Queen會考慮到牽制半牽制等危險的情況。

Mobility

Mobility的計算和之前的子力計算同時進行,計算的是能夠安全移動到的位置。這個的定義是與棋子型別和移動到的位置有關的二維陣列。

King safety

King safety計算王的安全性。根據王周圍一圈被威脅的情況來確定該值。

Threats

Threats用來計算威脅的情況。根據被什麼棋子攻擊、被什麼棋子保護之類的資訊,來確定具體數值。

Passed pawns

Passed pawns用來計算兵的運動是否受到阻礙。

Space

Space是隻用於優化開局的一個函式(參考之前對局面的定義),是根據在兵後面的安全的棋子的數量給出的一個評價(這個有點難說清……這個值也經常是0)。

相關推薦

AI評估函式StockFish 評估概覽

簡要介紹 國際象棋基本常見的幾種評估有Material子力、Space空間、Mobility機動性、Tempo著法、Threat威脅、Shape形狀、Motif圖案等,而在具體的確定的時候還有很多不同的表現形式。一個棋子的移動往往是影響多個評價指標之後得到的綜

AI評估函式

先做個框=感覺有些是應該由搜尋樹去考慮的、也沒做過這些所以有點困擾 思路有點亂一邊整一邊寫…… 在很努力把每種情況分開來但感覺還是蠻難的- -而且某隻鳥不下棋也很久了(咳咳)本來也下不好…… 一邊寫一邊聽歌“棋局與人生,哪個更多劫?”迷之滄桑感。sigh

AI開局庫

表格形式 白起點x y 白終點x y 黑起點x y 黑終點x y 最好的定開局庫的方法應該是大資料(然而不會!不會!不會!)所以手動輸入了一些。 然後因為還沒有具體的確定形式(雜湊表還沒測完 - -)所以 開局庫這裡先大致的給個框架。也不

C++學習筆記虛擬函式

虛擬函式與過載函式的關係 我們現在來比較一下規則比較多的虛擬函式和規則比較少的過載函式之間的差別: 普通函式過載時,其函式的引數個數或者引數型別必須有所不同,函式的返回型別也可以不同。(這個不同是比較嚴格的不同,是涉及本質的) 過載函式: 要求函式名、返回型別、引

C++學習筆記虛擬函式

12.3 昨天居然斷更了,唉,寫部落格真是很需要毅力呀,更新上今天的學習筆記。 上次我們講到多型性的定義以及簡述了實現方式以及靜態編譯和動態編譯的概念。這次,我們來具體講一講虛擬函式。 什麼是虛擬函式 在某基類中宣告為 virtual 並在一個或多個派生類中被重新定義的成

第16天Java集合---Set介面實現的HashSet集合

1 HashSet簡介 2 基本用法與特點 3 HashSet的唯一性 4 增刪改時需要注意 1 HashSet簡介        作為Set介面的一個實現類,特

PP生產訂單入門介紹

建立生產訂單的方式: 手動建立方式:指定訂單型別,定義訂單專案(一個只會有10),複製工藝路線,複製BOM(“提前期偏置量”和“工序提前期偏置”),計算進度,有效性檢查(後臺配置可選),可選功能,新增修改,儲存。 有效性檢查(可選): 新建的時候不做

許可權管理系統Spring security---認證過程原理解析,demo

  在前面兩節Spring security (一)架構框架-Component、Service、Filter分析和Spring Security(二)--WebSecurityConfigurer配置以及filter順序為Spring Security認證作好了準備,可以讓我們更好的理解認證過程以及專案程式

函式C語言

函式是一組一起執行一個任務的語句。每個 C 程式都至少有一個函式,即主函式 main() ,所有簡單的程式都可以定義其他額外的函式。  定義函式 return_type function_name( parameter list ) { body of the

18.10.22雜湊Hash函式

雜湊資料結構是一種非常簡單,實用的資料結構。原理是將資料通過一定的hash函式規則,然後儲存起來。使查詢的時間複雜度近似於O(1)。進而大大節省了程式的執行時間。 雜湊表的原理如圖 原來的資料可以直接通過雜湊函式儲存起來,這樣在搜尋的時候,等於每一個數據都有了自

Kaggle-MNIST之路CNN+改進過的損失函式

簡述 在上一個版本上的家裡CNN的框架。 呼叫了上面的框架。 目前: 分數:0.9160 排名:2400+ 框架程式碼 import pandas as pd import torch.utils

JMeter學習元件的作用域與執行順序

ces ner 處理器 規則 fig 子節點 控制器 conf 節點 1.元件的作用域 JMeter中共有8類可被執行的元件(測試計劃與線程組不屬於元件),這些元件中,取樣器是典型的不與其它元件發生交互作用的元件,邏輯控制器只對其子節點的取樣器有效,而其它元件(config

SQL server初級SQL索引

定位 統計表 cut 語法分析 man net 程序代碼 源配置 amount         SQL索引【一】(此文章為“數據庫性能優化二:數據庫表優化”附屬文章之一)   SQL索引在數據庫優化中占有一個非常大的比例, 一個好的索引的設計,可以讓你的效率提高幾十甚

大話存儲學習筆記,數據保護

clip 調度員 系統管 區域 工具 管理軟件 安裝 inf 利用 第一章 數據保護 所謂數據保護是指對當前位置上的數據進行備份,不一定是實時的。這樣帶來的好處是如果發生磁盤損壞或者說被修改了,可以通過備份數據找回 1.1 文件級備份 文件級備份:將磁盤上所有文件通過調用文

大話存儲學習筆記,磁盤

關註 安裝程序 參數 使用 tle 外部 相互 瓶頸 代碼 第一章 計算機的IO世界 1.1 總線 1.1.1 總線的概念 計算機中所有的IO都通過共享總線的方式來實現。 總線實際上就是一條或多條的物理導線。密密麻麻的印到電路板上,而且為了避免高頻振蕩的幹擾,一般都會分組

洛谷P1168中位數Splay/主席樹

一個 void urn can oid 介紹 初始化 長度 while Description 給出一個長度為N的非負整數序列A[i],對於所有1 ≤ k ≤ (N + 1) / 2,輸出A[1], A[2], …, A[2k - 1]的中位數。即前1,3,5,……個數的中

JavaScript動畫基礎學習筆記-- 旋轉箭頭

-- turn 我們 math class pla document new lose 隨著鼠標的移動旋轉箭頭。 requestAnimationFrame 在requestAnimationFrame之前我們可以用setInterval來實現動畫的循環:

日常刷題搭積木貪心

宋榮子搭積木 根據題意,你一定很快就能夠想到作為列積木,越下面越大。 其實這個思想對應了一個貪心演算法,我們自然要進行排序。 我們列舉的方式是先列舉頂層的再逐漸向下進行列舉,只要列舉到的能放就放。此時你可以聯絡一下程式碼參考一下具體的思路究竟是怎麼樣的。 #include<

JZOJ A組輕功qinggong

Description 題目背景: 尊者神高達進入了基三的世界,作為一個 mmorpg 做任務是必不可少的,然而跑地圖卻令人十分不爽。好在基三可以使用輕功,但是尊者神高達有些手殘,他決定用梅花樁練習輕功。 題目描述: 一共有 n 個木樁,要求從起點(0)開始,經過所有梅花樁,恰好到達

2018.11.07NOIP2017洛谷P3953逛公園DP魔改最短路計數

傳送門 解析: 首先這鬼畜的最短路肯定你是要自己跑一遍的。 但是我是在反圖上面跑。。 因為我的DP策略表示在當前點 u u