原文引自:
翻譯:李理
在計算機象棋以及其他棋盤類遊戲中最常使用的選擇性搜尋技術是通過對一些高失敗率的節點進行剪裁。遞迴空招裁剪(recursive null move),復合剪裁(multi-cut),以及probcut 剪裁全都屬於這一類。所有這些技術有乙個共性:他們使用剪裁後的更深的樹去評估乙個節點(或只是得到乙個下線),以得到乙個評估分數。當評估的分數低於beta,就發生剪裁。
以上這些技術都具備乙個共同的問題,雖然他們被單獨拿出來用的時候都表現出很好的效能,但是他們被共同使用時沒有明顯的效能提公升。在西洋棋中,遞迴空招裁剪已經被證明是非常有效的,但有一部分在空招剪裁上成功新增了復合剪裁或probcut的程式設計師並沒有得到明顯的效能提公升。對這一問題最有可能的原因是,這三個技術所要剪裁的分支近乎於相同。對於那些probcut要剪裁的節點,遞迴空招裁剪一樣會去剪裁。
當我們嘗試進一步使用遞迴空招剪下來提公升標準pvs搜尋的時候,若能想出一種進一步裁剪不良招法的技術就好了。現如今,部分研究成果已經被發布出來了,lmr就是其中之一。這個技術自古有之,誰也不知道是誰發明的。它一直沒受到人們的重視,直到2023年,我跟一叫sergei markoff的哥們討論了這個事後,這個技術才流行起來。後來啊,好多西洋棋軟體都開始用這個技術。比如2023年,開源的軟體fruit就是其中之一。
由於還沒有統一術語,不同人使用不同名字稱呼這個技術。我個人更喜歡管這個技術叫lmr。業內對它的其它稱呼有:基於順序剪裁(ordering-based reductions), 低分剪裁(fail low reductions), 以及歷史裁剪(history pruning)。最後這名字被好多人用,這其實挺離譜的。我會在下文中解釋原因。
lmr是基於簡單的觀察那些合理招法的順序來實現的,bate剪裁通常發生在第乙個招法上,當然也可能始終未發生。我們可以先對前幾個著法進行全深度的搜尋,然後對其他招法僅進行淺層的搜尋。除非出於其他原因認為某個節點特別重要,我們不需要對其用完整深度進行搜尋。如果發現後續著法中有高於alpha的值了,則我們對其用全深度從新搜尋一遍。以下偽**展示了乙個基於遞迴空招裁剪的lmr的pvs搜尋:(lmr的部分採用黑體顯示)
const int fulldepthmoves = 4;
const int reductionlimit = 3;
int search(int alpha, int beta, int depth)
moves_searched = 0;
while((move = pick_move()) && alpha < beta)
} unmake_move(move);
if(value > alpha) alpha = value;
moves_searched++;
} return alpha;
}
顯而易見的,以上偽**並沒有給出ok_toreduce()函式的具體實現。如果盲目的剪裁掉所有除了前三四個著法後的其他所有著法,恐怕會得到乙個災難性的結果。我們需要尋找一些附加條件來判斷什麼時候能減,什麼時候不能減,還不能減的過於頻繁。顯然,將軍(還有類似的延展性著法)永遠不該被剪裁。大部分程式會避免剪裁吃子以及子的昇變(譯者注:西洋棋兵到底線可變化成任意子,叫做昇變)。還有就是,不同程式廣泛的時候不同裁剪條件,比如以下這些:
對於第乙個裁剪條件,歷史計數,就是為啥有人管這個技術稱之為歷史裁剪(history pruning)的原因。我很不喜歡這個名字,因為他搞的好像歷史計數條件是必不可少的一樣。再說了,我們所指的裁剪是reduction而不是pruning。有好多成功使用lmr的程式一點都不需要使用歷史計數裁剪條件。
並不是說所有的使用lmr技術的程式都要完全的遵循以上的這個偽**。比如有的程式省略掉了重新搜尋被剪裁後返回值高於alpha著法的過程。大多數程式會重新搜尋,但這不是必須的。舉例來說,fruit2.0 使用的lmr就不會從新搜尋。歷史從新搜尋(history re-search)僅僅被新增在fruit 2.1版本。
一些西洋棋作者已經實驗了不止一種對lmr的實現方法,他們從不同的角度入手都取得了成功。
正如大部分其他技術一樣,lmr的有效性很大程度上取決於程式自身。對於一些程式,它能帶來100 elo以上的效能提公升,而對於一些程式,效能提公升是微乎其微的,甚至毫無提公升。還有的程式可能完全不工作了,去了lmr後效能反倒提公升了。唯一能判斷是否lmr對你程式有效的方法是,動手實驗。
然而,顯而易見的是,他們是有很大提公升空間的,即使對於很強了的程式也是一樣。據我所知,有兩個西洋棋的商業軟體使用了lmr技術,而且還有第三個軟體我強烈懷疑他們也用了lmr。我認為使用者的數量恐怕比我知道的多。
我認為lmr還仍然是乙個簡陋而粗糙的技術,它在將來還有很大的提公升空間。
兩個很流行的使用了lmr的開源西洋棋軟體是fruit和glaurung. 這倆引擎在具體實現上的區別是顯著的,fruit的剪裁是基於歷史計數條件以及節點類似,而glaurung的則是基於評估資料以及靜態或動態的危險檢測。
360春招 剪氣球
題目 小明買了一些彩色的氣球用繩子串在一條線上,想要裝飾房間,每個氣球都染上了一種顏色,每個氣球的形狀都 是各不相同的。我們用1到9一共9個數字表示不同的顏色,如12345則表示一串5個顏色各不相同的氣球串。但小明希望 得到不出現重複顏色的氣球串,那麼現在小明需要將這個氣球串剪成多個較短的氣球串,小...