koba::blog

小林聡: プログラマです

麻雀の打牌選択アルゴリズム(6)

麻雀 傑作「何切る」300選 からの出題。*1

ドラ __s3____
m1m2m3p1p2p3p4p7p8p9s3s3s8 s8

から何を切るか?

p1p4 でテンパイだが、三色、一通の可能性を残し、打 s3 でテンパイとらずが正解のようだ。今回はこのシャンテン戻しについて検討する。

麻雀の打牌選択アルゴリズム(4) - koba::blog麻雀の打牌選択アルゴリズム(5) - koba::blogアルゴリズムにしたがえば、打 p1 もしくは p4 の評価値は以下となる。

No聴牌待ち枚数打点評価値
1m1m2m3p2p3p4p7p8p9s3s3s8s8
m1m2m3p1p2p3p7p8p9s3s3s8s8
s3 1 2000 6,000
s8 2 2000

一方、打 s3 とした場合の聴牌形とその評価値は以下となる。

Noツモ 枚数打牌 聴牌待ち枚数打点 評価値
1p1 3 s3m1m2m3p1p1p2p3p4p7p8p9s8s8p1 2 2000 8,000
s8 2 2000
2p2 3 s3m1m2m3p1p2p2p3p4p7p8p9s8s8p3 3 2000 6,000
3p3 3 s3m1m2m3p1p2p3p3p4p7p8p9s8s8p2 3 270021,400
p0 1 5200
p5 3 2700
4p4 3 s3m1m2m3p1p2p3p4p4p7p8p9s8s8p4 2 2000 8,000
s8 2 2000
5p0 1 s3m1m2m3p1p2p3p4p0p7p8p9s8s8p3 3 520063,600
p6 4 12000
p5 3 s3m1m2m3p1p2p3p4p5p7p8p9s8s8p3 3 270040,100
p6 4 8000
6p6 4 s3m1m2m3p1p2p3p4p6p7p8p9s8s8p0 1 800031,700
p5 3 7900
7s1 4 p4m1m2m3p1p2p3p7p8p9s1s3s8s8s2 4 790031,600
8s2 4 p4m1m2m3p1p2p3p7p8p9s2s3s8s8s1 4 800052,800
s4 4 5200
9s3 1 p1m1m2m3p2p3p4p7p8p9s3s3s8s8s3 0 2000 4,000
s8 2 2000
10s4 4 p1m1m2m3p2p3p4p7p8p9s3s4s8s8s2 4 520044,400
s0 1 8000
s5 3 5200
11s0 1 p1m1m2m3p2p3p4p7p8p9s3s0s8s8s4 4 790031,600
s5 3 p1m1m2m3p2p3p4p7p8p9s3s5s8s8s4 4 400016,000
12s8 2 s3m1m2m3p1p2p3p4p7p8p9s8s8s8p1 3 200012,000
p4 3 2000

(赤牌を区別しなければ)12種39枚で再度テンパイとなり、ツモ p2s3 の引き戻し以外で元の評価値を上回る聴牌形となる。テンパイとらずが有利なことは自明と思えるが、プログラム化するためには数値で比較する必要がある。

評価値の正規化

現在の評価値計算方法は単純に

  • (評価値 × 待ち枚数)の総和

再帰的に繰り返しているため、テンパイから遠い(向聴数が大きい)ほど評価値が大きくなってしまう。これでは異なる向聴数の牌姿の善し悪しを比較できない。「待ち枚数」の部分を「ツモる確率」とすれば評価値は期待値と等価となるが、正確な確率を求めるのは難しい*2ため、適当な数値で除算し正規化することとした。具体的には、

0向聴(テンパイ)
12 で除算
1向聴
12 × 6 (= 72)で除算
2向聴
12 × 6 × 3 (= 216)で除算

としてみた*3。この方法で計算すると、冒頭の牌姿では打 p1 は評価値 500、打 s3 は 1231.13 となる。

これで異なる向聴数であっても牌姿が比較できるようになったので、1向聴以降についてシャンテン戻しを仮実装した。

ただしこの方法には問題があることが分かっているので、次回改善する。

*1:すでに続編の 麻雀 定石「何切る」301選 が出ているが、中国では手に入らぬ😢

*2:巡目によって確率は変わるし、そもそも何巡目以内にツモる確率を求めればよいのか

*3:各向聴数ごとの待ち枚数を考慮はしたが、具体的な数値に根拠はない😁