Stockfish

国际象棋引擎

Stockfish,是一個自由及開放源碼國際象棋引擎英語Chess engine軟件,可用於各種桌面和移動平台。可通過通用國際象棋接口英語Universal Chess Interface國際象棋軟件中使用。

Stockfish
開發者Marco Costalba
Joona Kiiski
Gary Linscott
Tord Romstad
Stéphane Nicolet
Stefan Geschwentner
Joost VandeVondele
首次發佈2008年11月2日,​15年前​(2008-11-02
當前版本16(2023年6月30日,​10個月前​(2023-06-30[1]
原始碼庫 編輯維基數據鏈接
程式語言C++
作業系統Microsoft Windows
macOS
Linux
iOS
Android
類型象棋引擎英語Chess engine
許可協議GPL-3.0-or-later[2]
網站stockfishchess.org/ 編輯維基數據

Stockfish持續在大多數國際象棋引擎排名中排在首位或接近首位。截至2022年10月,Stockfish是世界上最強大的CPU象棋引擎[3]。它共計贏得了最強象棋引擎錦標賽英語Top Chess Engine Championship13次以及Chess.com計算機象棋錦標賽19次。

Stockfish由Marco Costalba、Joona Kiiski、Gary Linscott、Tord Romstad、Stéphane Nicolet、Stefan Geschwentner和Joost VandeVondele開發,此外開源社區開發者也作出了許多貢獻[4]。它從2004年發佈的Tord Romstad開發的開源象棋引擎Glaurung派生而來。

特性 編輯

在多處理器系統中,Stockfish可以使用至多1024個線程。它的已訪問位置表英語transposition table的大小可達32TB。Stockfish通過位棋盤英語bitboard實現了高級的Alpha-beta剪枝。部分上由於進行了更激進的剪枝以及後期移動縮減英語late move reductions,與其它象棋引擎相比,Stockfish可以進行更深的搜索[5]。截至2022年7月 (2022-07),Stockfish 15 (4線程)在CCRL 40/15評測中達到了3540+16
−16
等級分[6]

由於其從Glaurung派生而來,Stockfish支持Chess960[7]。曾在羅納德·德曼維護的分叉中實現的Syzygy殘局數據庫英語endgame tablebase於2014年被併入Stockfish中[8]。在7個棋子的Syzygy殘局數據庫發佈之後不久,Stockfish於2018年增加了對其的支持[9]

Stockfish在很多平台上受歡迎。在桌面端,它是互聯網國際象棋俱樂部英語Internet Chess Club界面程序BlitzIn和Dasher默認的象棋引擎。在移動端,它是Stockfish、SmallFish和DroidFish等APP內置的象棋引擎。其它兼容Stockfish的圖形用戶界面包括Fritz英語Fritz (chess)、Arena、Stockfish for Mac以及PyChess[10][11]。Stockfish可以被編譯為WebAssemblyJavaScript,從而在瀏覽器中運行。在伺服器端程序以外,Chess.comLichess英語Lichess都以這種形式支持Stockfish[12]。Stockfish的正式版本和開發版本均以在WindowsmacOSLinux32位/64位和Android上的編譯版本和C++原始碼的形式發佈。

歷史 編輯

Stockfish起源於Romstad編寫並於2004年首次發佈的開源國際象棋引擎Glaurung。四年之後,Costalba受這一強大的開源引擎啟發,決定分叉此項目。他將其命名為Stockfish的原因是它「於挪威生產而於意大利被烹飪」(Romstad是挪威人,而Costalba是意大利人)。首個版本Stockfish 1.0於2008年11月發佈[13][14]。有一陣子,新想法與代碼變更在兩個程序之間雙向流動,直到Romstad考慮到Stockfish在當時更加先進而決定不再開發Glaurung[15]。Glaurung的最終版本(2.2)於2008年12月發佈。

約於2011年,Romstad決定不再參與Stockfish的開發以專注於開發他的新的iOS國際象棋應用[16]。2014年6月18日,Marco Costalba宣佈他已經「決定不再維護Stockfish」並讓開源社區建立其當前版本的分叉並繼續開發它[17]。不久之後,一個由Stockfish的核心開發者組成的志願者團隊建立了一個官方代碼庫並管理此項目至今[18]

Fishtest 編輯

自2013年以來,Stockfish的開發運用了名為「Fishtest」的分佈式測試框架,志願者可以捐贈CPU時間以測試對程序的改進[19][20][21]

對博弈算法的修改會應用序列概率比例測試英語Sequential probability ratio test分析在Fishtest框架上與該程序的「對照」版本對弈數萬局的結果而被接受或拒絕。在框架上的測試會以卡方檢驗驗證,僅當結果在統計意義上顯著時才會被認為是可靠的並用於修改軟件代碼。

Fishtest出現後,Stockfish的等級分在僅僅12個月內增加了120,使其在所有主流象棋引擎排名中上升到頂部[22]。在Stockfish 7中,作為對Fishtest的作者Gary Linscott對Stockfish的棋力的貢獻的承認,他的名字被加入到正式的作者名單中。

截至2022年12月 (2022-12),Fishtest框架總共用9850多年的CPU時間下了57億多局象棋[23]

可高效更新神經網絡 編輯

 
Stockfish的可高效更新神經網絡的可視化

2020年6月,Stockfish的開發者討論了一個由計算機日本將棋英語computer shogi程式設計師編寫的名為Stockfish NNUE的可高效更新神經網絡分叉[24][25]。2020年7月,國際象棋新聞報導說「Stockfish NNUE通過將神經網絡加入本就十分強大的Stockfish象棋引擎里,在計算機象棋中開闢了新天地」[26]。之後,開發者宣佈將會把NNUE合併入Stockfish中並發佈了開發版[27][28]

「由@nodchip維護的可高效更新神經網絡分支展現了很好的效果並有極大的潛力,我們接下來會合併……這一合併會將機器學習引入到引擎中,從而擴大開發者的範圍並吸引更多有能力的人。我們渴望所有人——包括所有的開發者和各種硬件的用戶——的支持並旨在成為一個包容的社群……所需的具體措施在未來會逐漸明朗,我期待與社群合作以實現這一目標!」

——Joost VandeVondele,2020年7月25日[27]

2020年9月2日,實現了前述神經網絡的Stockfish第12版發佈。根據發行公告,這一新版本「棋力明顯比它之前的任何一個版本更強」,與第11版對弈時平均每贏10個回合才會輸掉1個回合[29][30]

比賽結果 編輯

最強象棋引擎錦標賽 編輯

主條目:最強象棋引擎錦標賽英語Top Chess Engine Championship#Tournament results

Stockfish曾多次獲得最強象棋引擎錦標賽(TCEC)冠軍,目前是獲得冠軍次數最多的。自TCEC於2013年重啟以來,Stockfish僅在一個賽季中未能取得前兩名。在TCEC第4和第5賽季,Stockfish均獲得第二名,其在總決賽中均以23–25的成績先後負於Houdini英語Houdini (chess)Komodo英語Komodo (chess)。值得注意的是,在第5賽季中,Komodo的原作者唐·戴利英語Don Dailey在賽事的最後階段因病去世,因此獲勝的Komodo開發團隊是在他死後代他領獎的。為了紀念他,在賽季結束後不久發佈的Stockfish版本以「Stockfish DD」命名[31]

2014年5月30日,Stockfish 170514(一個支持殘局數據庫的Stockfish 5開發版)在總決賽中以35.5–28.5的比分擊敗了Komodo 7x,從而決定性地贏得了TCEC第6季[32]。Stockfish 5的正式版於次日發佈[33]。在TCEC第7季中,Stockfish又一次晉級總決賽,但以30.5–33.5的比分輸給了Komodo[32]。在TCEC第8季中,儘管代碼缺陷使其損失了比賽時間,Stockfish也再一次晉級總決賽,但在100個回合的總決賽中以46.5–53.5的比分輸給了Komodo[32]。在第9季中,Stockfish以54.5–45.5的比分擊敗了Houdini 5[32][34]

在TCEC第10季中,Stockfish獲得第三名,是2013年以來其未能晉級總決賽的唯一賽季。Stockfish沒有輸掉任何比賽,但仍然因為未能擊敗評級更低的引擎足夠多次而被淘汰。Stockfish在這一程序性淘汰後的很長一段時間不斷獲勝,其贏得了第11季(以59–41比分擊敗Houdini 6.03)[32][35]、第12季(以60–40的比分擊敗Komodo 12.1.1)[32][36]和第13季(以55–45的比分擊敗Komodo 2155.00)[32][37][38]。在TCEC第14季中,Stockfish面對新的競爭對手Leela Chess Zero英語Leela Chess Zero,以相差一局的比分(50.5–49.5)險勝[32][39]。它的連續獲勝終於在TCEC第15季中結束,因為Leela再次晉級總決賽並以53.5–46.5的比分擊敗了Stockfish[32],但不久之後,Leela在TCEC第16季中未能晉級總決賽,而Stockfish以54.5–45.5的比分擊敗了AllieStein[32]。在TCEC第17季中,Stockfish再次於總決賽對戰Leela,以47.5–52.5的比分落敗。然而,在接下來的四次總決賽中,Stockfish均決定性地擊敗了Leela,比分分別為53.5–46.5(第18季)、54.5–45.5(第19季)、53–47(第20季)和56–44(第21季)[32]

Stockfish也參加了TCEC杯的比賽。它贏得了第一次杯賽,但在第二次杯賽的半決賽出人意料地被Houdini擊敗[32][40]。在三四名決賽中,Stockfish棋力有所恢復,擊敗了Komodo[32]。在第三次杯賽中,Stockfish晉級了決賽,但在7枚棋子的殘局數據庫英語endgame tablebase和局中失誤後被Leela Chess Zero英語Leela Chess Zero擊敗。在第四次杯賽中,Stockfish逆轉了這一結局,在決賽中以4.5–3.5的比分擊敗了Leela[32]

錦標賽
賽季 年份 時間限制 排名 參考
1 2010 100+10 第3名 [41]
2 2011 150+30 第5名 [42]
4 2013 150+60 第2名 [43]
5 2013 120+30 第2名 [44]
6 2014 120+30 第1名 [45]
7 2014 120+30 第2名 [46]
8 2015 180+30 第2名 [47]
9 2016 180+15 第1名 [48]
10 2017 90+10 第2名[note 1] [49]
11 2018 120+15 第1名 [50]
12 2018 120+15 第1名 [51]
13 2018 120+15 第1名 [52]
14 2018 120+15 第1名 [53]
15 2019 120+10 第2名 [54]
16 2019 120+10 第1名 [55]
17 2020 90+5 第2名 [56]
18 2020 90+10 第1名 [57]
19 2020 120+10 第1名 [58]
20 2020 120+10 第1名 [59]
21 2021 120+10 第1名 [60]
22 2022 120+12 第1名 [61]
23 2022 120+12 第1名 [62]
杯賽
場次 年份 時間限制 排名 參考
1 2018 30+10 第1名 [63]
2 2019 30+5 第2名[note 1] [64]
3 2019 30+5 第2名 [65]
4 2019 30+5 第1名 [66]
5 2020 30+5 第1名 [67]
6 2020 30+5 第3名 [68]
7 2020 30+5 第1名 [69]
8 2021 30+5 第1名 [70]
9 2021 30+5 第1名 [71]
10 2022 30+3 第1名 [72]
菲舍爾任意制象棋(FRC)
場次 年份 時間限制 排名 參考
1 2019 30+5 第1名 [73]
2 2020 30+5 第1名 [74]
3 2021 30+5 第2名 [75]
4 2022 30+5 第1名 [76]
5 2022 30+3 第1名 [77]
瑞士制
場次 年份 時間限制 排名 參考
1 2021 45+7 第2名 [78]
2 2021 45+7 第2名 [79]
3 2022 45+4.5 第1名 [80]
雙重菲舍爾任意制象棋[note 2](DFRC)
場次 年份 時間限制 排名 參考
1 2022 30+3 第1名 [81]

Chess.com計算機國際象棋錦標賽 編輯

自從Chess.com於2018年首次舉辦Chess.com計算機國際象棋錦標賽英語Chess.com Computer Chess Championship(CCC)以來,Stockfish是該比賽中最成功的引擎。它在早期比賽中佔有優勢,在前六次錦標賽中均取得勝利,而在第七次錦標賽中獲得第二名。自此以來,它的支配地位受到了基於神經網絡的象棋引擎Leelenstein和Leela Chess Zero英語Leela Chess Zero的挑戰,但它仍然表現良好,在CCC11之前的每次比賽都能晉級總決賽。CCC12改用了淘汰賽制,抽籤時Stockfish和Leela被分到了半決賽的同一組。Leela在半決賽中將Stockfish淘汰。然而,在賽後相同形式的比賽中,Stockfish戰勝了決賽的輸家Leelenstein。

主賽事
場次 年份 時間限制 排名 參考
CCC 1:快速打群架 2018 15+5 第1名 [82]
CCC 2:閃電戰 2018 5+2 第1名 [83]
CCC 3:快速重現 2019 30+5 第1名 [84]
CCC 4:子彈喧鬧 2019 1+2 第1名 [85]
CCC 5:升級 2019 10+5 第1名 [86]
CCC 6:冬季經典 2019 10+10 第1名 [87]
CCC 7:快速發達 2019 5+2 第2名 [88]
CCC 8:深潛 2019 15+5 第1名 [89]
CCC 9:嚴酷考驗 2019 5+2, 10+5 第1名 [90]
CCC 10:兩位數 2019 10+3 第2名 [91]
CCC 11 2019 30+5 第2名 [92]
CCC 12:子彈瘋狂! 2020 1+1 第3名 [93]
CCC 13:七邊形 2020 5+5 第2名 [94]
CCC 14 2020 15+5, 5+2, 1+1 第4名 [95]
CCC閃電戰2020 2020 5+5 第1名 [96]
CCC速戰2021 2021 15+3 第1名 [97]
CCC閃電戰2021 2021 5+5 第1名 [98]
CCC Chess960閃電戰 2021 5+5 第1名 [99]
CCC 16:速戰 2021 15+3 第1名 [100]
CCC 16:子彈 2021 2+1 第1名 [101]
CCC 16:閃電戰 2022 5+5 第1名 [102]
CCC 17:速戰 2022 15+3 第1名 [103]
CCC 17:子彈 2022 2+1 第1名 [104]
CCC 17:閃電戰 2022 5+5 第1名 [105]
CCC 18:速戰 2022 15+3 第1名 [106]
CCC 19:閃電戰 2022 5+5 第1名 [107]
CCC 19:速戰 2022 15+3 第1名 [108]