システマティック麻雀工学:
1:他家必要メンツのモデル化理論と実装(MJ-0ルーチン)





人間の読みと少なくとも同等か、それ以上に精確でしかも高速な「他家の構成メンツ読み(必要牌読み)」プログラムを作る。

他家必要メンツモデルの着想:

麻雀における重要な技術要素として主要なものは、「メンツ構成」「降り」「点数別行動選択」などが挙げられるが、局単位で考えたときに非常に重要になるのは「どの牌を引く可能性が高いか」「相手の待ちはどれになるか」などの判断である。この判断の差は和了率・放銃率いずれにも大きな差を与え、局単位のゲームとして麻雀を見た時の技術要素の大部分を占めていると言っても良い(降りる技術のほとんどと、上がる技術の一部を占める)。
例えば2が3枚切れており、誰もトイトイを狙っていないとき、1は場に出やすいし、場に出ていなければツモりやすい。そして、他家リーチに対して1が通る確率は他の無スジに比較して高くなる。
しかしこの種の判断はこれまでほとんど全てが小学生レベルの経験からの判断と、中学生レベルの簡単な計算と、それからいい大人の妄想によってしか語られてこなかった。
それというのも麻雀の他家の挙動は数値化が困難で、また牌の構成を解析的あるいは統計的に解くことは非常に莫大な計算を要するからである。結果として、印象に異常に左右される経験や、そこから導かれる妄想が、その判断の全てになってしまっていた。
ところが我々は思い起こしてみよう。ほとんどどんな状況であっても、リーチに対して地獄待ちの西を切ることは、無スジの5を切ることより安全なのである。これは全ての上級者にとって当然の認識であり、背景に統計的な洞察があるにもかかわらず、このような単純な状況を離れて複雑になると全て「状況による」としか答えられない打ち手の姿がそこにあった。
複雑化された場合にも「状況による」として漠然とした直感に逃げて上級者ぶるのはやめて、「リーチに対して地獄待ちの西を切ることは、無スジの5を切ることより安全」と自信を持って言い切れたように、「このリーチに対してこの牌を切ることはこの牌を切ることよりもこの程度安全だ」と断言できるための工学を作ろうと思う。
背景は「地獄待ちの西は安全」であった根拠であるところの「牌の組み合わせ(統計学的アプローチ)」である。


他家必要メンツモデルの概要:

「どのメンツ(牌)が何枚、他家にとって必要となるか」ということをモデル化しよう。
そうすれば、どの牌が山にどの程度残っているかということが計算できるだろう。他家にとって必要でない牌(不要牌)は通常切られるため、場に出ている枚数と他家が必要とする枚数を除いた枚数が、山に残っている枚数に近い値を示すからである。
また、他家が必要とする牌のうちの1つ(とそのスジや別の待ちコウツなど)は「当たり牌」だから、他家の必要牌を求めることは、他家の待ちを求めるために有益である。
このモデルがもし現実の状況を的確に捉えるようになれば、最初に述べた「局単位のゲームとして麻雀を見た時の技術要素の大部分を占めている」ような判断を、このモデルを元に的確に行うことができるはずである。

では他家が必要とする牌の性質について考える。
1)単純に牌を組み合わせた時の必要牌
「牌空間」を、既に切られた牌や既に他家のメンツに使用されていない全ての牌の組み合わせとする。
他家がテンパイを目指すとき、4メンツと1頭が構成される(チートイは例外)。
牌空間内からの単純な組み合わせのみでメンツを構成するとき、あるメンツ構成を他家がテンパイのために利用する確率は、そのメンツを構成できる牌の組み合わせの多さ(メンツの作りやすさ)に比例する。
(機械が適当に牌を3枚選んでメンツを作るとき、111より123の方ができやすい。また、2が3枚切れという条件付きの牌空間内でなら、123より456の方ができやすい)
2)役を考慮する
・染め手を考慮する
もしある他家が染め手であれば、その他家にとっての必要牌は、機械的な組み合わせの場合と比べて大きく変化する。したがって特定の他家が染め手である確率のパラメータを導入し、染め手であるときにはその他家にとっての牌空間を変更する。
・トイトイを考慮する
もしある他家がトイトイであれば、他家のメンツ構成においてシュンツは構成しないこととする。特定他家トイトイ率のパラメータを導入する。
・食い仕掛けを考慮する
もしある他家がポンやチーを交えることができるならば、他家のメンツ構成においてメンゼンの場合に比較してコウツが構成される割合が増加する。ポンを交えることができる場合、コウツの構成率は4人分の牌を利用するから4倍になり、チーができる場合にはそのシュンツ構成率は2倍になる。特定の他家が食い仕掛けをする確率をパラメータとして導入する。
また、食い仕掛けが入り、かつ染め手でない場合、少なくとも1つのメンツが役牌によって構成される確率は非常に高まる。クイタンや三色やケイテンの可能性もあるので、詳細のパラメータは後に取るとして、もし食い仕掛けが入りかつ役牌がコウツを形成する場合、その影響をモデルに導入する必要がある。ただしこれは現段階ではモデルに含まない。
・その他
基本的には三色やタンヤオ移行などによる補正は入れない。そのために牌効率を大きく犠牲にする打ち方は「強くない」ことが知られているし、そもそも三色に移行することを考えるような組み合わせ自体がまれだから影響が小さい。


他家必要メンツモデルの実装(MJ-0ルーチン):

他家が必要とする牌の性質を、上記2点の性質を考慮しながらモデル化する。
1)初期化
全ての他家のメンツ(およびシュンツ、コウツ、食いシュンツ、食いコウツ、頭)を「非固定」にセット。
一般的な牌空間として、「牌全部-自分から見えている牌」をセットする。
この段階でもしあるメンツが他家に存在することがわかっている場合(ポンなど)、それにしたがって牌空間を変更し、そのメンツは「固定」する。
他家の染め手率やトイトイ率などに応じて他家を「染め手している人」「トイトイしている人」などかどうかを決定し、役を狙っている場合、それに応じてその当人から見た牌空間補正をセットする(例えばマンズ染めの人は、牌空間としてピンズとソーズを持たない)。
2)実際に1つメンツを構成する
当人の牌空間の中から、メンツ構成比率にしたがってメンツを1つ「固定」する。固定されたメンツを構成する牌は全員の牌空間から除去される。
3)繰り返し
2を、12個(3人×4メンツ)のメンツが「固定」されるまで繰り返す。
4)頭を構成する
各他家の頭を構成する。頭の構成のしやすさ(牌空間上の組み合わせの個数比)に応じて頭の位置を固定する。
ただし、メンゼンシュンツが存在するとき、「スジ型」の頭も構成し得るのでそれも考慮する(456とシュンツがあるとき、36や47の組み合わせも頭を構成する)。

以上のモデルをコンピュータ上でシミュレートすることによって、「ある状況における他家の構成メンツの一例」を求めることができる。
これを充分な回数繰り返せば(例えば5000回・・・時間にして0.2秒未満)、「ある状況における他家の構成メンツの確率分布」を知ることができる。
これを行うためのプログラムを以下、「MJ-0」と呼ぶ。


簡単な、モデルの評価例:

このモデルが、実際の麻雀における他家の必要牌を表しているかどうかを検証する。
方法は、「牌山の推測」を用いる。

手順
1)MJ-0による推測
あるプレイヤーから見た「状況」を、MJ-0に与える。自分の牌、捨て牌および他家の使用する牌を除いた牌が等確率で牌山にあると推測できる。
牌山に残った牌の分布は確率的に表せるので、最も残っている確率が高い2牌と、その次に残っている確率の高い5牌を選ぶ。

2)人間による推測
シスマの技術員やアンチシスマメンバーなど、超ラン常勝組メンバーを含む比較的ハイレベルな打ち手に、同様の状況で牌山に「確実に残っているだろう牌」を2牌、「たぶん残っているだろう牌」を、残っている枚数がなるべく多いように5牌指定してもらった。
参加者:バイマンキン BJ 難波-男児 モ娘。なっち 散る桜ゆえ 雀鬼百瀬 疾駆★白馬&みずか 激弱なんし 
     神龍★悪魔 しれん 少年N まんぼう BONY WAve-Model ゆうば 

3)実際の状況の設定
とつげき東北の実戦の牌譜から、適当に状況を取り出す。
山牌が読みによって読まれるようにするため、終順近くで、1家から食い仕掛けが入り、それ以外の家は特に食い仕掛けなどを行っておらず、他家が特にベタオリしていなさそうな一般的な状況を牌譜から適当に取り出し、3つ設定した。

4)推測精度の比較
MJ-0の予測と人間の推測の精度を各々評価する。
予想した牌が実際に山に残っていた枚数を点数とする。また予想したにもかかわらず残っていなかった場合は1点減点とする。
重要な2牌については加点および減点を2倍する。

参加者名   A  B   C  D   E  F   G  H    I   J  K   L  M   N  O  P        MJ-0
問1得点   12  10  12  13  10  14   9   9  10   10  11  12  12  16  9   12        12
問2得点   13  17  10  14  19  11  13       8  14  17  15  13  14  10  13        16
問3得点   11  15  17  15  17  14  22      11   14  17  15  20  10  11  13        22
得点合計   36  42  39  42  46  39  44      29   38  45  42  45  40  30  37        50
誤答減点   -3  -2  -4  -4  -2  -4  -5  -2   -7   -2  -2  -4   -2  -1  -5  -5        -2
最終得点  33  40  35  38  44  35  39      22  36  43  38  43  39  25  35       48

結果(追検証のために名前と点数の対応は非公開としました。Hさんはデータ不足により除外して集計)
スコア 名前
48   MJ-0(上記モデルにしたがって牌を読むコンピュータ)
44   E
43   M
43   K
40   B  
39   N
39   G
38   L
38   D
36   J
35   P
35   F
35   C
33   A
25   O
22   I

人間平均:MJ-0 = 36:48

5)考察
もちろん、より多いデータに基づいて検証できれば良いが、時間等の事情でここでは割愛する。より詳しいモデル検証は機会があれば別に行う。
追試結果はこちら

人間は点数の状況や、他の様々な状況(早い順目の8切りなど)を考慮することができ、MJ-0はそれらを全く考慮していないにもかかわらず、また現段階ではドラなどの有効性や役牌の選択など一切考慮していないにもかかわらず、MJ-0の「余り牌読み」能力はここに回答した人間の中でトップであり、下位とは特に大きな差がついた。1局あたりで、平均と比較して4枚近くも多い残り牌を指定できた(人間のうち上位3人だけの平均に対しても、平均1.5枚以上も多い残り牌を指定できた)。また総合得点だけでなく、正答率の高さ・誤答率の低さいずれにおいてもトップレベルの成績であった。どの人間に対しても、3つの状況のうち少なくとも2状況で高い点を記録した。
わずか3例とは言え、この結果を見る限り、多くの一般的な状況においてMJ-0ルーチンは、人間と同等程度(あるいはそれ以上)の結果を出すことが期待できる。

このことは、上記モデルが「他家が必要とするメンツのモデル」として充分よく機能していることを示している。
麻雀界において初めて「出やすい牌(待ち)はどれですか?」「次にツモる確率が最も高い牌は何ですか?」という問に対して、超ランの平均レベルよりかなり高い精度の、明快な理論的解答を示すことができるようになった。
また第一東風荘超ランで優秀な成績を収めている人たちの「色々な状況を加味した読み」でさえ、コンピュータのそれほど優秀ではないただの計算にも劣る程度でしかないこともわかる。要するに我々は「状況による」と言いながら全て漠然とした感覚のみで、「読んだ」気になっていただけなのだ。・・・そもそも、明確に(自分内言語でもいい)されていないものが、うまく機能するというのは楽観的すぎる思い上がりである。自分のわかっていないものを当てようとするとき、その当たり確率はせいぜい半々である。麻雀の読みにはいくつもの要因があり、それらの大半を半々の確率でしか当てていないなら、多くの場合結果は+と-の要素が半々程度現れるので、結局「明確にわかっている部分までの範囲」だけが平均的に読めることになる。容赦なく本当のことを言えば、我々が「たくさんの要因を考えて」「経験から様々な情報を読んで」いたことは、莫大な量の+と-とを長い時間をかけてただただ並べ続けるという不毛な作業にしか当たらなかったのだ。それが皮肉にも「わかっていることしか言えない」「複雑な現象を解明できない」はずの単純なコンピュータによって示されてしまったわけだ。明確に言語化されていないものは、強くないのだ。


上記の検証結果は、単に「残っている確率の高い牌の推定」でしかなかったが、MJ-0は「もっとも2枚以上残っている確率の高い牌(つまり持ち持ちのチェック)」なども簡単に計算できるし、同じ「確実に残っているだろう」という牌同士でも確率5%などの違いを見分けることができる。
実際、少しテストするだけで、自分が今まで「読んで」いた余り牌の計算がいかにでたらめであったかに気付かされる(少なくとも私は第一東風荘最強水準の雀士であるが)。
改良等の余地は別にあるとして、現段階でこのモデルは麻雀界で唯一の理論的な「他家必要メンツのモデル」であると想像され、(ここで余り牌読みが優れた成績を収めたように)様々な応用において有効利用できるものと思われる。例えば、他家が必要とするメンツを構成する牌のうち一つが、その他家の「当たり牌」であるから、他家のメンツを人間以上に精確に読むコンピュータは、他家の当たり牌を人間以上に精確に読めると考えられる。

6)補記
MJ-0のルーチンはもっとも単純なバージョン0.01を用いた。ドラや現物だとか、最後に出た牌だのは全く考慮しておらず、上記モデルに基づいた牌の組み合わせ方の数え上げだけである。
思考に要する時間は0.2秒未満で、人間と違って時間に追われてミスすることはない。
このルーチンは後々データや他のパラメータなどを加えてバージョンアップできる。他の様々のルーチンは、このMJ-0のバージョンアップがなされるごとに、より有効に機能するようになる。


MJ-0 v0.01 
このバージョンは細かいパラメータ指定はできません。染め手率やトイトイ率を使えません。他家の食い仕掛け率は1家分だけ指定できます。
上の検証に用いた、最も原始的なバージョンです。
使い勝手は死ぬほど悪いです。有用なアプリケーションとしてではなく、研究用・モデル検証用のツールですのでご了承ください。

MJ-0 v0.02 
「47型トイツ」の作成比率でカウントミスしていたので修正。