翻子是一次決策加一次擲骰

暗棋裡一半的著法是翻開一枚背面朝下的棋子。一步棋,兩件事:選哪枚翻,以及翻出來是什麼。揭棋的揭子和翻翻棋的翻子是同一個問題換了棋子;全文用暗棋做例子,因為它的隨機性最純粹。

照搬國際象棋的覆盤會給整步棋的勝率波動打分。翻開角落那枚棋,翻出對方的將,覆盤就記你一個漏著。可那是一枚壞棋子,不是一個壞決策。

這就是 這就是 Mistboard 的暗棋覆盤不顯示釐兵損失的原因:它沒法和翻出的棋子分開,放在那些可以分開的數字旁邊,就只是噪音。 的暗棋覆盤不顯示釐兵損失的原因:它沒法和翻出的棋子分開,放在那些可以分開的數字旁邊,就只是噪音。

西洋雙陸棋幾十年前就解決了這件事

西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 是同一個思路。 都這麼做。撲克裡的 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 是同一個思路。 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 是同一個思路。 都這麼做。撲克裡的 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。西洋雙陸棋的軟體會把每次擲骰和平均擲骰作比較,報告一個剔除運氣後的結果,所以一份戰報可以告訴你:你下得更好,但你輸了。GnuBG 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 和 eXtreme Gammon 都這麼做。撲克裡的 all-in EV 是同一個思路。 都這麼做。撲克裡的 all-in EV 是同一個思路。 是同一個思路。

國際象棋從沒造過這些東西,因為它沒有骰子。暗棋是象棋家族裡帶骰子的一員,卻繼承了國際象棋的工具,而那些工具裡沒有運氣這一欄。

剩下棋子裡的平均一枚

暗棋的隨機性是數得清的。雙方都看得到哪些棋子還背面朝下,整副棋的構成也是公開的,所以任何一次翻子,你都能列出那個格子上可能翻出的每一枚棋。這讓誠實的基準變得可以計算:

對這個格子可能是的每一枚棋:
    把那枚棋放到格子下
    走這步翻子
    評估局面
按數量加權,取平均

這個平均值,就是你的決策在擲骰之前的價值。每次翻子三個數字:

每次翻子含義
played你所選翻子的平均價值
best當前最佳著法的同一種平均
realized實際翻出的棋子帶來的結果
決策損失 decision loss = best - played      (實力,恆 >= 0)
運氣   luck          = realized - played  (骰子,帶符號)

運氣為零,恰好就是翻出剩下棋子裡的平均一枚。這是由構造保證的事實,不是引擎的看法。

開頭那次翻子,逐一列舉

本文開頭那盤棋的第 6 個半回合:我翻開 g3 上的棋子。此時還有二十七枚背面朝下,共十二種身份,每一種都通向一盤不同的棋。

g3 這枚棋可能是什麼數量黑方勝率
黑卒×582%
紅卒×446%
紅車×245%
紅象×244%
紅士×243%
紅炮×241%
黑馬×234%
黑車×231%
黑象×129%
黑士×225%
黑炮×223%
黑將×113%

同一次翻子的價值從 13%(翻出我自己的將,深陷爭奪之地)到 82%(我自己的卒,在那裡既安全又有用)不等。加權平均是 45%。這個數字才是決策本身,準確率打分打的就是它。

高亮的那一行就是實際翻出的結果。實際 82,決策 45,運氣 +37,而這份運氣沒有一點是我掙來的。

引擎對自己的骰子有偏心

最省事的捷徑,是直接問引擎一步翻子值多少,再把差值叫作運氣。我們的揭棋引擎演示了為什麼不行:它高估自己的揭子,下出貪婪、賭博式的著法。而對一組身份已經確定的固定局面取平均,讓機率節點完全不進搜尋,偏心就無處安身。

決定你執哪色的那次翻子

開局第一次翻子決定你執哪種顏色:翻出什麼色,你就執什麼色。這次翻子的反事實會改變你自己的整支軍隊,所以這套拆分把"我分到哪一邊"也計成運氣。乍聽之下不太對勁,想上十來秒就完全對了。

覆盤畫出什麼

+37 的那次翻子 實際對局 每次翻子按平均 累積運氣 紅優 黑優
開頭那盤棋。實線:實際進行的對局,從紅方視角。虛線:同一盤棋,每次翻子都按平均值計。兩線之間的差距就是運氣。

優勢圖多了一條線。實線是實際發生的對局。虛線是同一盤棋,每次翻子都按平均的那一枚計分。兩次翻子之間,兩條線同步移動,因為普通著法對兩個版本的影響完全一樣。每到一次翻子,差距就恰好按那次翻子的運氣變化,所以到終局時,兩線的差距就是整盤棋的運氣總和。

這也是為什麼圖裡的虛線一路朝一個方向走,而實線上下翻騰。我的運氣一次又一次落在同一側,差距只增不減。只看決策的話,引擎幾乎全程佔優;一旦虛線認定這盤棋照理已經完勝,它就頂在最上沿不動了。

著法列表把這份拆分標到每一步上。每次翻子都帶一個骰子標記,寫著它的運氣,就在評估值旁邊;決策則單獨打分:下圖第 3 步就是那次 +37% 的翻子,雖然它幫我贏了棋,作為選擇卻被標為可疑。

覆盤著法列表:每次翻子的評估值旁都有骰子標記標出運氣百分比;第 3 步即 +37% 的那次翻子,作為決策被標為 ?!。
示例對局的著法列表。第 3 步是那次 +37% 的翻子,作為決策被標為可疑。

而準確率只按決策數字打分,翻得走運不會加分,翻得倒黴也不會扣分。這盤棋的總結和故事本身完全一致:引擎下得乾淨,我則不然,而結果卻說了反話。

示例對局去除運氣後的準確率總結:MistyBanqi 準確率 95%,零失誤;dev-testing 89%,九次失準、兩次錯著、兩次漏著。
同一盤棋去除運氣後的總結。同一盤棋去除運氣後的總結。dev-testing 是我,用的是我的測試賬號。 是我,用的是我的測試賬號。

證據

開頭那場勝利:對引擎的 156 個半回合,圖把我供了出來。第 6 個半回合,那次值 45% 的翻子翻出了 82%。整盤棋裡沒有任何一個決策能把指標撥得這麼遠。

總賬:我的翻子+76,引擎的 −12;翻子決策上我送掉 74 個百分點,引擎送掉 0。虛線裡我大半盤都在輸。實線裡我贏了。棋子推翻了棋藝。整盤棋在 總賬:我的翻子**+76**,引擎的 −12;翻子決策上我送掉 74 個百分點,引擎送掉 0。虛線裡我大半盤都在輸。實線裡我贏了。棋子推翻了棋藝。整盤棋[在 Mistboard 上公開,下方可以回放。 上公開](/banqi/game/bq_7e8ce2e7-8e64-4453-b9fd-9dcc4bd52fa9),下方可以回放。

走到第 6 個半回合:平均價值 45% 的那次翻子,翻出了 82%。

反過來也一樣。在我輸掉的另一盤棋裡,光是第 19 個半回合的一次翻子,就燒掉了 34 個百分點的勝率。那盤棋我的決策平平。舊式覆盤會把那次翻子記為致敗漏著。新的覆盤把它記為:勝負在此刻被一件不由你選擇的事定了下來。

五十二盤棋的證據

我們把這套拆分跑遍了站上最近 52 盤人類對 我們把這套拆分跑遍了站上最近 52 盤人類對 Misty 的暗棋。 的暗棋。

52 盤人類對 52 盤人類對 Misty 的對局 的對局數值
人類戰績14 勝 33 負 5 和
勝局中偏向人類的淨運氣平均 +28 個百分點
負局中偏向人類的淨運氣平均 −9 個百分點

引擎更強,贏它通常都借了棋子的力。如果你贏過它,現在覆盤會告訴你借了多少。

揭棋擲的是另一種骰子

揭棋用同一套辦法,只是抽取的範圍不同。揭棋的揭子從你自己剩餘的暗子裡抽,所以你知道顏色,不知道身份。暗棋的棋子對雙方都是暗的,連顏色也是。範圍不同,演算法相同,鬥獸棋的翻棋版本(翻翻棋)是第三家。它們每一個都有那條虛線。

寫給實現者

三個選擇讓這些數字保持誠實。第一,反事實不能改變剩下棋子的構成。把翻開的格子從卒改標成炮,你就悄悄往棋局裡加了一枚炮、拿走了一枚卒,局面因此偏移兩枚棋子的分量,平均值也被抬高。所以實現裡用的是交換:讓反事實身份和一個確實藏著這枚棋的背面格子對調,隱藏棋子的集合始終恰好等於這盤棋的集合。

第二,一把有界的尺子。一切都用翻子一方視角的勝率來計:它可以在整盤棋上累加;直接終局的翻子恰好計 100、50 或 0;而一步翻進殺局的棋本來就沒有釐兵值可言。搜尋預算按節點數而非時間計,同一盤棋在任何機器上打出的分都一樣。

第三,故意往少裡算。決策上限只考慮引擎的第一選擇,被引擎排在第二的更好著法會被漏掉,所以決策損失只會被低估。覆盤可能漏報一個失誤,但絕不會憑空捏造一個。

數字到哪裡為止

這些勝率出自我們的暗棋引擎在固定搜尋預算下的評估,而這個引擎同時也是這些對局裡的對手,所以它自己的翻子被打成近乎完美,部分原因不過是它在認同自己的選擇。看到"引擎零損失"時,請記住這一點。人類一側的數字沒有這個問題。

還有一條誠實的邊界:逐點扣除運氣,等於把勝率當成線性的,而它並不是線性的。方向可信。小數點後第二位不可信。

拿你自己的棋試試

在 在 Mistboard 開啟任何一盤下完的暗棋、揭棋或翻翻棋,你自己的,或觀戰頁上任何人的,然後請求電腦分析。運氣數字會逐翻子出現在著法列表裡,虛線則畫出棋子們本該給你的那盤棋。 開啟任何一盤下完的暗棋、揭棋或翻翻棋,你自己的,或觀戰頁上任何人的,然後請求電腦分析。運氣數字會逐翻子出現在著法列表裡,虛線則畫出棋子們本該給你的那盤棋。

有時它承認你是被搶了。有時它把你的勝利收走。在對我舊棋的一輪掃描裡,這兩件事它都做了。

下暗棋暗棋規則