翻子是一次決策加一次擲骰
暗棋裡一半的著法是翻開一枚背面朝下的棋子。一步棋,兩件事:選哪枚翻,以及翻出來是什麼。揭棋的揭子和翻翻棋的翻子是同一個問題換了棋子;全文用暗棋做例子,因為它的隨機性最純粹。
照搬國際象棋的覆盤會給整步棋的勝率波動打分。翻開角落那枚棋,翻出對方的將,覆盤就記你一個漏著。可那是一枚壞棋子,不是一個壞決策。
這就是 這就是 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 這枚棋可能是什麼 | 數量 | 黑方勝率 |
|---|---|---|
| 黑卒 | ×5 | 82% |
| 紅卒 | ×4 | 46% |
| 紅車 | ×2 | 45% |
| 紅象 | ×2 | 44% |
| 紅士 | ×2 | 43% |
| 紅炮 | ×2 | 41% |
| 黑馬 | ×2 | 34% |
| 黑車 | ×2 | 31% |
| 黑象 | ×1 | 29% |
| 黑士 | ×2 | 25% |
| 黑炮 | ×2 | 23% |
| 黑將 | ×1 | 13% |
同一次翻子的價值從 13%(翻出我自己的將,深陷爭奪之地)到 82%(我自己的卒,在那裡既安全又有用)不等。加權平均是 45%。這個數字才是決策本身,準確率打分打的就是它。
高亮的那一行就是實際翻出的結果。實際 82,決策 45,運氣 +37,而這份運氣沒有一點是我掙來的。
引擎對自己的骰子有偏心
最省事的捷徑,是直接問引擎一步翻子值多少,再把差值叫作運氣。我們的揭棋引擎演示了為什麼不行:它高估自己的揭子,下出貪婪、賭博式的著法。而對一組身份已經確定的固定局面取平均,讓機率節點完全不進搜尋,偏心就無處安身。
決定你執哪色的那次翻子
開局第一次翻子決定你執哪種顏色:翻出什麼色,你就執什麼色。這次翻子的反事實會改變你自己的整支軍隊,所以這套拆分把"我分到哪一邊"也計成運氣。乍聽之下不太對勁,想上十來秒就完全對了。
覆盤畫出什麼
優勢圖多了一條線。實線是實際發生的對局。虛線是同一盤棋,每次翻子都按平均的那一枚計分。兩次翻子之間,兩條線同步移動,因為普通著法對兩個版本的影響完全一樣。每到一次翻子,差距就恰好按那次翻子的運氣變化,所以到終局時,兩線的差距就是整盤棋的運氣總和。
這也是為什麼圖裡的虛線一路朝一個方向走,而實線上下翻騰。我的運氣一次又一次落在同一側,差距只增不減。只看決策的話,引擎幾乎全程佔優;一旦虛線認定這盤棋照理已經完勝,它就頂在最上沿不動了。
著法列表把這份拆分標到每一步上。每次翻子都帶一個骰子標記,寫著它的運氣,就在評估值旁邊;決策則單獨打分:下圖第 3 步就是那次 +37% 的翻子,雖然它幫我贏了棋,作為選擇卻被標為可疑。

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

證據
開頭那場勝利:對引擎的 156 個半回合,圖把我供了出來。第 6 個半回合,那次值 45% 的翻子翻出了 82%。整盤棋裡沒有任何一個決策能把指標撥得這麼遠。
總賬:我的翻子+76,引擎的 −12;翻子決策上我送掉 74 個百分點,引擎送掉 0。虛線裡我大半盤都在輸。實線裡我贏了。棋子推翻了棋藝。整盤棋在 總賬:我的翻子**+76**,引擎的 −12;翻子決策上我送掉 74 個百分點,引擎送掉 0。虛線裡我大半盤都在輸。實線裡我贏了。棋子推翻了棋藝。整盤棋[在 Mistboard 上公開,下方可以回放。 上公開](/banqi/game/bq_7e8ce2e7-8e64-4453-b9fd-9dcc4bd52fa9),下方可以回放。
反過來也一樣。在我輸掉的另一盤棋裡,光是第 19 個半回合的一次翻子,就燒掉了 34 個百分點的勝率。那盤棋我的決策平平。舊式覆盤會把那次翻子記為致敗漏著。新的覆盤把它記為:勝負在此刻被一件不由你選擇的事定了下來。
五十二盤棋的證據
我們把這套拆分跑遍了站上最近 52 盤人類對 我們把這套拆分跑遍了站上最近 52 盤人類對 Misty 的暗棋。 的暗棋。
| 52 盤人類對 52 盤人類對 Misty 的對局 的對局 | 數值 |
|---|---|
| 人類戰績 | 14 勝 33 負 5 和 |
| 勝局中偏向人類的淨運氣 | 平均 +28 個百分點 |
| 負局中偏向人類的淨運氣 | 平均 −9 個百分點 |
引擎更強,贏它通常都借了棋子的力。如果你贏過它,現在覆盤會告訴你借了多少。
揭棋擲的是另一種骰子
揭棋用同一套辦法,只是抽取的範圍不同。揭棋的揭子從你自己剩餘的暗子裡抽,所以你知道顏色,不知道身份。暗棋的棋子對雙方都是暗的,連顏色也是。範圍不同,演算法相同,鬥獸棋的翻棋版本(翻翻棋)是第三家。它們每一個都有那條虛線。
寫給實現者
三個選擇讓這些數字保持誠實。第一,反事實不能改變剩下棋子的構成。把翻開的格子從卒改標成炮,你就悄悄往棋局裡加了一枚炮、拿走了一枚卒,局面因此偏移兩枚棋子的分量,平均值也被抬高。所以實現裡用的是交換:讓反事實身份和一個確實藏著這枚棋的背面格子對調,隱藏棋子的集合始終恰好等於這盤棋的集合。
第二,一把有界的尺子。一切都用翻子一方視角的勝率來計:它可以在整盤棋上累加;直接終局的翻子恰好計 100、50 或 0;而一步翻進殺局的棋本來就沒有釐兵值可言。搜尋預算按節點數而非時間計,同一盤棋在任何機器上打出的分都一樣。
第三,故意往少裡算。決策上限只考慮引擎的第一選擇,被引擎排在第二的更好著法會被漏掉,所以決策損失只會被低估。覆盤可能漏報一個失誤,但絕不會憑空捏造一個。
數字到哪裡為止
這些勝率出自我們的暗棋引擎在固定搜尋預算下的評估,而這個引擎同時也是這些對局裡的對手,所以它自己的翻子被打成近乎完美,部分原因不過是它在認同自己的選擇。看到"引擎零損失"時,請記住這一點。人類一側的數字沒有這個問題。
還有一條誠實的邊界:逐點扣除運氣,等於把勝率當成線性的,而它並不是線性的。方向可信。小數點後第二位不可信。
拿你自己的棋試試
在 在 Mistboard 開啟任何一盤下完的暗棋、揭棋或翻翻棋,你自己的,或觀戰頁上任何人的,然後請求電腦分析。運氣數字會逐翻子出現在著法列表裡,虛線則畫出棋子們本該給你的那盤棋。 開啟任何一盤下完的暗棋、揭棋或翻翻棋,你自己的,或觀戰頁上任何人的,然後請求電腦分析。運氣數字會逐翻子出現在著法列表裡,虛線則畫出棋子們本該給你的那盤棋。
有時它承認你是被搶了。有時它把你的勝利收走。在對我舊棋的一輪掃描裡,這兩件事它都做了。