概要
このページでは、和了形に対する裏ドラ期待値の計算方法を説明します。
裏ドラ表示牌を開く前の時点では、和了形に裏ドラが何枚乗るかは分かりません。そこで、裏ドラ枚数ごとの確率を求め、各枚数での和了点を重み付き平均します。
基本方針
裏ドラ期待値は、次の 2 つを組み合わせて計算します。
- 裏ドラが何枚乗るかの確率分布
- 裏ドラがそれぞれの枚数だけ乗った場合の和了点
裏ドラの枚数を $u$、裏ドラが $u$ 枚乗る確率を $p_u$、そのときの和了点を $\text{score}_u$ とすると、裏ドラ込みの期待和了点は次のようになります。
$$ \sum_{u = 0}^{12} p_u \cdot \text{score}_u $$
ただし、$u = 12$ は「裏ドラが 12 枚以上乗る場合」を表します。
計算で使う情報
ここでは、立直して和了し、裏ドラ表示牌を開く前の状態を考えます。
この時点で分かっているものは、和了形、表ドラ表示牌の枚数、まだ見えていない山の構成です。分からないものは、裏ドラ表示牌としてどの牌が開かれるかです。
計算では、次の情報を使います。
- 裏ドラ表示牌の候補牌ごとの山の残り枚数
- その候補が裏ドラ表示牌になった場合に増える裏ドラ枚数
- 開かれる裏ドラ表示牌の枚数(表ドラ表示牌の枚数と同じ)
裏ドラ表示牌の候補ごとに「その牌が裏ドラ表示牌になった場合に裏ドラが何枚増えるか」を数えます。この値は、その牌を裏ドラ表示牌に選んだときに裏ドラ合計へ加える枚数として使います。
裏ドラ枚数は 0 枚から 12 枚以上までの分布として扱います。立直して和了した手は少なくとも 1 翻あるため、裏ドラが 12 枚以上乗ると合計 13 翻以上になり、数え役満に到達します。数え役満より上は点数が変わらないため、12 枚以上はひとまとめにして扱います。
また、裏ドラ枚数を数えるときは、赤 5 と通常の 5 を同じ 5 として扱います。
裏ドラ表示牌が 1 枚の場合
まず、裏ドラ表示牌が 1 枚だけの場合を考えます。
裏ドラ表示牌は、まだ見えていない山から 1 枚選ばれるものとして扱います。山の総枚数を $S$ とすると、ある牌が裏ドラ表示牌になる確率は、その牌が山にある枚数を $S$ で割った値になります。
たとえば、手牌と副露牌に 4m が 2 枚あるとします。このとき、裏ドラ表示牌が 3m なら裏ドラが 2 枚乗ります。山に 3m が 3 枚あり、山の総枚数が $S = 100$ 枚なら、裏ドラが 2 枚乗る確率は次のようになります。
$$ \frac{3}{100} $$
このように、裏ドラ表示牌が 1 枚なら、裏ドラ枚数ごとに「その枚数になる候補牌が山に何枚あるか」を数えて、山の総枚数で割れば確率が分かります。
裏ドラ表示牌が複数枚の場合
裏ドラ表示牌が $d$ 枚ある場合、合計の裏ドラ枚数は、選ばれた $d$ 枚の裏ドラ表示牌それぞれが乗せる裏ドラ枚数の合計です。
山の総枚数を $S$ とすると、裏ドラ表示牌 $d$ 枚の選び方の総数は次のようになります。
$$ \binom{S}{d} $$
裏ドラ表示牌の選び方ごとに裏ドラ枚数が変わるため、裏ドラ枚数ごとに「何通りの選び方があるか」を数えます。
組み合わせ数を数える
裏ドラ表示牌が複数枚ある場合、すべての選び方を直接列挙すると扱いにくくなります。そこで、山にある同じ牌をまとめて、組み合わせ数を数えます。
裏ドラ表示牌の候補 $i$ が山に $c_i$ 枚あり、その牌が裏ドラ表示牌になったときに裏ドラが $g_i$ 枚乗るとします。
この牌を裏ドラ表示牌として $k$ 枚選ぶ場合、選び方の数は次のようになります。
$$ \binom{c_i}{k} $$
ここで、すでに選んだ裏ドラ表示牌の枚数を $r$、裏ドラ表示牌の枚数を $d$ とすると、$k$ の範囲は次のようになります。
$$ 0 \le k \le \min(c_i, d – r) $$
このとき、裏ドラは次の枚数だけ増えます。
$$ k \cdot g_i $$
DP の状態
DP では、次の状態を持ちます。
$$ dp[x][u] $$
これは、
ここまで処理した牌だけを使って、
裏ドラ表示牌を x 枚選び、
裏ドラが合計 u 枚乗る選び方の数
を表します。
- $x$ は、これまでに選んだ裏ドラ表示牌の枚数
- $u$ は、これまでに乗った裏ドラの合計枚数
- $dp[x][u]$ は、その状態になる裏ドラ表示牌の選び方の数
です。
裏ドラ枚数 $u$ は 0 から 12 までで管理します。ただし、$u = 12$ は「12 枚以上」を表します。
初期状態は次のようになります。
$$ dp[0][0] = 1 $$
これは、「まだ何も選んでいない状態が 1 通りある」という意味です。
DP の状態遷移
牌 $i$ を処理する前の表を $dp$、牌 $i$ を処理した後の表を $dp_{\text{new}}$ とします。
まず $dp_{\text{new}} = dp$ として、牌 $i$ を 0 枚選ぶ場合をそのまま引き継ぎます。そのうえで、牌 $i$ を 1 枚以上選ぶ場合だけを $dp_{\text{new}}$ に足し込みます。
現在の状態が $dp[x][u]$ だとします。
ここで、牌 $i$ を裏ドラ表示牌として $k$ 枚選ぶと、選んだ裏ドラ表示牌の枚数は $x + k$ 枚になります。
また、裏ドラ枚数は $k \cdot g_i$ 枚増えるため、合計は $u + k \cdot g_i$ 枚になります。
ただし、12 枚以上はまとめて扱うため、更新先の裏ドラ枚数は次のようにします。
$$ \min(12,\ u + k \cdot g_i) $$
$k \ge 1$ の場合、状態遷移は次のようになります。
$$ dp_{\text{new}}[x + k][\min(12,\ u + k \cdot g_i)] \mathrel{+}= dp[x][u] \cdot \binom{c_i}{k} $$
この式の意味は、次の通りです。
すでに dp[x][u] 通りの選び方がある。
そこに、牌 i を k 枚選ぶ方法 C(c_i, k) を掛ける。
その結果を、新しい状態に足し込む。
擬似コード
処理の流れは次のようになります。
# まだ何も選んでいない状態
dp[0][0] = 1
for each 裏ドラ表示牌の候補 i:
dp_new = dp
for x = 0..d:
for u = 0..12:
# 牌 i を 1 枚以上選ぶ場合だけ足し込む
for k = 1..min(c_i, d - x):
nx = x + k
nu = min(12, u + k * g_i)
dp_new[nx][nu] += dp[x][u] * C(c_i, k)
# 牌 i を処理した後の表に更新する
dp = dp_new
内側のループで 1 枚以上選ぶ場合だけを足し込むのは、0 枚選ぶ場合を dp_new = dp で先に引き継いでいるためです。
すべての牌を処理したあと、最終的に見るのは次の値です。
$$ dp[d][u] $$
これは、
裏ドラ表示牌をちょうど d 枚選んだとき、
裏ドラが u 枚乗る選び方の数
を表します。
簡単な例
たとえば、裏ドラ表示牌を $d = 2$ 枚開くとします。
山に次の牌が残っているとします。
| 牌 | 山の枚数 $c_i$ | 表示牌になったときに乗る裏ドラ枚数 $g_i$ |
|---|---|---|
| 3m | 3 | 2 |
| 7p | 2 | 1 |
| 東 | 4 | 0 |
3m が表示牌になると裏ドラが 2 枚乗り、7p が表示牌になると裏ドラが 1 枚乗り、東が表示牌になっても裏ドラは乗らない、という例です。
初期状態は次の通りです。
$$ dp[0][0] = 1 $$
まず 3m を処理します。3m は山に 3 枚あるため、0 枚、1 枚、2 枚のいずれかを選べます。
3m を 0 枚選ぶ場合は状態が変わらないため、dp_new = dp によってすでに引き継がれています。
3m を 1 枚選ぶ場合は、
$$ dp_{\text{new}}[1][2] \mathrel{+}= dp[0][0] \cdot \binom{3}{1} $$
です。3m を 1 枚選ぶ方法は 3 通りあるため、$dp_{\text{new}}[1][2]$ に 3 が足されます。
3m を 2 枚選ぶ場合は、
$$ dp_{\text{new}}[2][4] \mathrel{+}= dp[0][0] \cdot \binom{3}{2} $$
です。3m を 2 枚選ぶ方法も 3 通りあるため、$dp_{\text{new}}[2][4]$ に 3 が足されます。
このように、牌を 1 種類ずつ取り込みながら、
選んだ表示牌枚数
裏ドラ合計枚数
その状態になる組み合わせ数
を更新していきます。
たとえばその後、7p を 1 枚選ぶ場合を考えると、すでに
$$ dp[1][2] = 3 $$
という状態があるなら、そこから 7p を 1 枚選ぶことで、
$$ dp_{\text{new}}[2][3] \mathrel{+}= dp[1][2] \cdot \binom{2}{1} $$
となります。
つまり、
$$ dp_{\text{new}}[2][3] \mathrel{+}= 3 \cdot 2 = 6 $$
です。
これは、
3m を 1 枚選ぶ方法が 3 通り
7p を 1 枚選ぶ方法が 2 通り
合計 3 * 2 = 6 通り
という意味です。
この処理をすべての牌について行うと、裏ドラ枚数ごとの組み合わせ数が得られます。
確率への変換
ここまでは確率ではなく、組み合わせ数を数えています。
裏ドラが $u$ 枚乗る選び方の数は、DP で求めた次の値です。
$$ dp[d][u] $$
表示牌 $d$ 枚の選び方全体は、
$$ \binom{S}{d} $$
通りです。
したがって、裏ドラが $u$ 枚乗る確率 $p_u$ は次のようになります。
$$ p_u = \frac{dp[d][u]} {\binom{S}{d}} $$
期待和了点を求める
裏ドラ枚数ごとの確率が分かったら、各枚数での和了点を求めます。
裏ドラが $u$ 枚乗った場合の和了点を $\text{score}_u$ とすると、裏ドラ込みの期待和了点は次の重み付き平均です。
$$ \sum_{u = 0}^{12} p_u \cdot \text{score}_u $$
ただし、$u = 12$ は「裏ドラが 12 枚以上乗る場合」を表します。この場合は合計 13 翻以上になるため、$\text{score}_{12}$ は数え役満として計算した和了点になります。
計算手順
裏ドラ期待値は、次の手順で計算します。
裏ドラ表示牌の候補を牌ごとに洗い出す
-> 各候補について、山の枚数 c_i と裏ドラ増加枚数 g_i を求める
-> DP で裏ドラ枚数ごとの組み合わせ数 dp[d][u] を数える
-> 組み合わせ数を確率に変換する
-> 裏ドラ枚数ごとの和了点を求める
-> 確率で重み付き平均する
何切るで裏ドラを考慮したほうがよいか
何切る問題で打牌を選ぶとき、裏ドラの乗りやすさまで考慮するべきかを次の手牌で考えます。
手牌以外に、場には白や發が見えていないものとします。 この形では、白を切って發待ちにしても、發を切って白待ちにしても、受入枚数と和了確率は同じです。ただし、和了したときに裏ドラが乗る確率は少し変わります。
發を切って白で和了する場合、白が裏ドラになるための裏ドラ表示牌は中です。中はまだ4枚残っています。一方、白を切って發で和了する場合、發が裏ドラになるための裏ドラ表示牌は白ですが、白は手牌に1枚見えているため残り3枚です。そのため、發切りのほうがわずかに裏ドラを期待できます。
## 場況
東一局0本場 東家 3巡目 ドラ: 南
123m999p789s北北北白發 聴牌 (一般手: 聴牌 七対子: 4向聴 国士無双: 6向聴)
## 計算結果
打: 發, 受入枚数: 1種3枚, 有効牌: 白
期待値: 4281点, 和了確率: 33.49%, 聴牌確率: 100.00%
打: 白, 受入枚数: 1種3枚, 有効牌: 發
期待値: 4264点, 和了確率: 33.49%, 聴牌確率: 100.00%
發、白どちらを切っても和了確率は同じですが、裏ドラが乗る確率が發切りのほうが少し高いため、期待値は17点高くなっています。
ただし、17点差は実戦判断ではほとんど差がないと言える大きさです。このような場面では、裏ドラの乗りやすさよりも、他家への危険度、他家からの出やすさ、鳴かれやすさ、河に残す牌の見え方などを優先して打牌を選ぶほうがよいでしょう。

コメント