一人麻雀和了確率計算アルゴリズム まとめ
はじめに
今回はこれまでに議論してきた一人麻雀和了確率についていくつかの問題点・疑問点を解消します。
諸問題
存在確率と和了確率の再定義
前々回の記事のトップダウンとボトムアップの関係についての記述が不十分なので補足します。
向聴の手牌を想定し、からまでの個の状態(手牌)があるとします。状態間の遷移確率を表す以下の確率行列を定義します。
巡目に枚の牌があるとして巡目に和了する確率はの成分なので
と書けます。なお行列とベクトルの添字は0始まりとします。または単位ベクトルです。これを計算する方法は2通りあり、①に左からを繰り返し作用させる方法と②に右からを繰り返し作用させる方法があります。①がトップダウンで②がボトムアップです。それぞれの方法は以下のように書けます。
基底変換(パラメータ変換)
手牌変化が一通りではなく分岐する場合、確率行列としてではなく以下のを考えます。
これをと同じように扱いたいので以下の対角行列を導入して基底を変換します。
ここで例えばを考えると行目はと同じになります。よって
が成り立ちます。とのかわりにによって基底を変換したとを使えば、手牌変化が一通りの場合と分岐する場合の確率の計算をほとんど同じようにできます。
手牌変化のグラフの正確な記述
前回の記事で手牌変化のグラフを導入しました。
一人麻雀和了確率は2次元確率DPで計算できます。それならばグラフは無向グラフではなくDAGとして記述すべきなような気がします。
上の図では簡単のため2つの巡目しか記載していません。また矢印の色と線種については後述します。先述のように和了確率を求めるには各状態での和了確率を知らなければならないので、DPを使って計算する際は矢印の向きを逆向きにたどって各状態を訪問することになります。
緩和順
各状態での和了確率を表す漸化式は以下のようになります(前回の記事を参照)。
添字が手牌方向と巡目方向と2つあるので、どちらをループの外側にするのかが問題になります。手牌変化のグラフを見ると巡目方向がトポロジカル順序になることがわかるので巡目をループの外側にすればよいことがわかります。ここで手牌変化のグラフから赤色の矢印がないとすると手牌方向もトポロジカル順序になります。赤色実線矢印は向聴戻し、赤色破線矢印は手替わりを表していると思ってください。この場合再帰的に手牌を探索しながら各巡目での和了確率を計算できるので、計算速度・メモリ効率ともに向上します。
辺の重み
辺の重みを巡目によらず固定としてよいのかは、和了確率を最大にする打牌をする場合2回以上同じ手牌を訪問しないので固定としてよいです。
おわりに
一人麻雀和了確率についての問題点・疑問点をほぼ解消できたのではないかと思います。