見出し画像

麻雀研究を始めるには

目次
1 はじめに
2 麻雀研究をスタートする場合、何から始めるべきか
3 牌譜解析をするために学ぶべきこと、すべきこと
4 シミュレータ作成をするために学ぶべきこと、すべきこと
5 おわりに


1 はじめに

 今日は質問箱に寄せられた質問に回答したい。
 質問の内容はこちら。

 これについては、過去ブログで書いた文章をコピペすればいいかと思っていた。
 しかし、過去のブログを読みなおしたところ、全面的に文章を書き直した方がよかろうということになったので、書き直す羽目になった。
 もっとも、書き直しても大差ないかもしれないが。
 ただ、関心があるなら、スカイプで会話した方が10倍早いので、ツイッターのDMで連絡を取ってくれた方がありがたいとは言っておく。


2 麻雀研究をスタートする場合、何から始めるべきか

 先に、「テーマ設定などを変える必要があるか」について返答したい。
 これは「必要ない」と思う。

 麻雀研究の手法として

①、牌譜解析によって生データを得て、そのデータを基に戦術論を構築する(私のアプローチ)
②、麻雀をモデル化し、かつ、牌譜解析によってパラメータを集め、よって、シミュレーションによってデータを取り、そのデータを基に戦術論を構築する(凸、nisiさん、昔の私のアプローチ)
③、優れたAIを作る

などの方向性がある。
 そして、基本的には麻雀研究の方向性としては②か③がメインとなる(①は『「統計学」のマージャン戦術』クラスのことならできるが、それ以上細かいことには対応できない)。
 質問者さんの目的が②にあるならば、それでいいと思う。

 ただ、いきなりシミュレータを作りにいくことはあまりお勧めしない。
 わずかな期間でもいいので、シミュレータ・計算によってどんな感じで数値が出るのか体験することをお勧めする。
 プログラミングを組んでシミュレータを作る・パラメータを牌譜解析で集めるのはその後でいいと思う。
 なお、体験用のシミュレータが欲しいのであれば、

疑似麻雀シミュレータ
局収支シミュレータ(ただし、自分と相手の挙動は常に一定)

は提供できるので言ってもらえれば提供する。

 なぜか。
 私自身

凸理論局収支シミュレータ
疑似麻雀シミュレータ
段位変動シミュレータ

など、いくつかのシミュレータを作ったが、そのプロセスは後述のとおり大変である。
 苦労してシミュレータを作ってみたが、その作った成果が作る前に思っていたものと違っていたらどうであろう。
 その苦労は無駄になるかもしれない。
 とすれば、その前にシミュレータを使ってみて、自分の方向性があっているか確認した方がいい。
 それが私の意見である。


3 牌譜解析をするために学ぶべきこと、すべきこと

 では、牌譜解析をするために何を学ばないといけないか、何をすべきかということを考えてみる。


(1)数学・統計

 まず、数学・統計についてはある程度知らないとまずい。
 ただし、基本的に必要なのは高校レベル、余裕を見たとしても大学教養レベルの統計で足りる(というか、私自身、大学教養レベルの統計に関する知識すら怪しい)。
 具体的には、

 順列・組み合わせ・確率・期待値・分散・標準偏差(高校レベル)
 信頼区間・正規分布・中心極限定理・仮説検定(大学レベル)

を把握しておけば十分のように思う。
 あとは、必要になった場合に参照すれば良い。


(2)プログラミング

 プログラミングの知識も知らないのはまずい。
 特に、計算機に牌譜解析・計算・シミュレーションさせる以上、その知識は不可欠と言ってよい。

 なお、プログラミングをするにあたっては多少早い言語を選んだ方が良い。
 特に、スクリプト言語を使うのはお勧めしない。
 というのも、私は最初はPERLで局収支シミュレータを作っていたが、あまりに遅かったのでったので途中からC++に乗り換えたという経緯があるからである。
 ちなみに、PERLからC++に変えただけでシミュレーションのスピードが数十倍になった。

 ただ、かなりたくさんの知識が必要かと言われればそうではないように思う。

 具体的には、
① 環境の導入
② 数と文字列の知識
③ 配列(PERLの場合、ハッシュも含む)に関する知識
④ 条件分岐・繰り返し
⑤ 文字列の操作(牌譜からデータを取る際に必要)
⑥ 関数(サブルーチン)
⑦ ファイルのオープン・クローズ

あたりができれば十分ではないかと思われる。
 別に、作ったプログラムを他人に渡すわけではないので、ソースが多少ごちゃごちゃしていてもよい。
 また、高速化・最適化させる必要もない。
(時間が長くかかるなら寝る前に仕込んで、寝ている間に牌譜解析をさせればよい)

 例えば、私はC++とPERLの二つの言語を使って麻雀研究に関するプログラムを書いている。
 今の段階では、PERLを使って天鳳牌譜のダウンロードを行い、牌譜解析・疑似麻雀シミュレーション・段位変動シミュレーション・局収支シミュレーションについてはC++を用いている。
 しかし、C++なら絶対習うと言われている、ポインタ・クラスについて一切使ってない。
 使わなくても麻雀研究ができる以上、学ぶインセンティブもない。
 というわけで、私のプログラミング技術レベルは多分ほとんどないだろう。
 それでも、麻雀研究ができ、本まで出せた。
 というわけで、あれやこれややる前からレベルを気にする必要はないと思う。
 数学同様、後は必要になったら学べばよいと思う。

 以上は、牌譜解析をするために必要な知識を書いた。
 これからは牌譜解析をするために必要なことを考えていく。


(3)牌譜の取得

 まず、牌譜解析をするのだから、牌譜を得ることが必須の条件になる。
 具体的には、天鳳の鳳凰卓の牌譜(秋刀魚・四麻あわせて約200万試合)をダウンロードする必要がある。

 まず、ダウンロードの条件(物理的条件・社会的条件)を満たさないといけない。
 天鳳のサイトを読み、ダウンロードの条件を満たすことが必要である。

 その上で牌譜ダウンロード作成プログラムを組む必要がある。
 これについては個人的に相談していただければ、プログラムを組むために必要なメモをお渡しするので、それを参考にしてほしい。


 なお、天鳳以外の牌譜、特に、赤ナシの牌譜として、東風荘の牌譜が欲しい場合は、こちらを参考にするといい。


 これらの牌譜をつなぎあわせることで、かなりの試合数の牌譜を入手することができる。
 もっとも、第一東風荘の牌譜はクイタンなしであることに注意が必要である。
 また、第二東風荘は東南戦・クイタンありであるが、流局総流れとなっていることに注意が必要である。


(4)牌の書式の理解

 牌譜解析というのは「一定の牌譜を満たしたとき」の回数、そのときの点数などを把握する必要がある。
 そのため、牌譜の書式を理解する必要がある。

 例えば、トップの終局時の点数分布が知りたいとする(私は既に持っているが)
 そうすると、トップの終局時の点数がどこに書いてあるか、どのように書かれてあるかを把握しなければならない。
 そのために牌譜の書式を理解する必要があることは理解できるだろう。

 ちなみに、この作業は結構大変である。
 トップの終局時の点数分布くらいなら簡単であるが(最初は大変だが)、牌の危険度を調べる際の「立直者に通った牌のリスト」とかなると容易ではない。
 というわけで、牌譜解析プログラムを組むときに大変なのはこの作業かなあ、という気がする。

 なお、私はこの作業がめんどくさいので、対局の情報を書き直した牌譜データベースを作成し、それを使って牌譜解析をしている。


(5)牌譜解析プログラムの作成

 これについては説明不要であろう。
 実際は、これも結構大変である。


 というわけで、牌譜解析に必要なことを書いてみた。
 個人的には、高校クラスの順列・組み合わせ・確率の知識と最低限のプログラミングの知識があるなら、さっさと簡単な牌譜解析プログラム(例えば、ラス親の平均持ち点を調べるといったものでもよい)をどんどん書いていく方が良いと思われる。
 シミュレータをする際にも

シミュレーション結果と実測値が照合するか否かのチェック
パラメータを牌譜解析結果から取得する

観点から牌譜解析は必要になる(詳細は後述)ので、牌譜解析は麻雀研究にとって必須と言ってもよい。


4 シミュレータ作成をするために学ぶべきこと、すべきこと

 では、シミュレータ作成にあたり必要なことは何か。
 ちなみに、シミュレータ作成の方が牌譜解析だけをやるよりもやるべきことが多い。
 それは、牌譜解析の場合は、

①、牌譜の取得
②、(欲しいデータを得るための)牌譜解析プログラムの作成、実行

だけでいいのに対し、シミュレータ作成の場合は

①、作りたいモデルの作成
②、モデルを具体化したシミュレータ(プログラム)の作成、実行
③、シミュレーションパラメータを得るための牌譜の取得
④、シミュレーションパラメータを得るための牌譜解析プログラムの実行
⑤、シミュレータを得た値の整合性を比較するための実測値を得るための牌譜解析プログラムの実行

となるからである。

 例えば、所謂、先制リャンメン立直の和了率を求めるとしよう。

 牌譜解析で同数値を求めるならば、

牌譜を取得して、和了率を求める牌譜解析プログラムを作成して実行

すれば足りる。
 他方、シミュレータから和了率を求めるとすると(モデルは凸理論を採用するものとする)、

①、凸理論局収支モデルの作成(これは凸理論を理解するだけで良く、自分でモデルを作る必要はない)
②、凸理論局収支モデルを具体化するシミュレータプログラムの作成
③、凸理論局収支シミュレータのパラメータを得るための牌譜を取得
④、凸理論局収支シミュレータのパラメータを得るための牌譜解析プログラムの作成
⑤、シミュレータの数値が正しいことを確認するための実測値の取得

という作業が必要になり、その作業量は牌譜解析よりも多い。
 もちろん、シミュレータには細かい応用が利く、現実性のない場合(レアケース)における数値予測が可能であるというメリットがあるのでシミュレータを作成することは有用であり、コストをかける価値もある。
 ただ、シミュレータ作成には多大なコストがかかることは覚えておいてほしい。
 私が、先に、「作る前に、シミュレータと戯れて感覚をつかめ」といったのもこういう事情があるからである。

 さて、このような事情を踏まえて、学ぶべきこと、やるべきことを考えてみよう。


(1)数学・統計

 例えば、凸理論局収支モデルを理解するならば、数学の理解は不可欠である。
 具体的には、

数式に関する理解(計算自体はエクセルやプログラムにやらせるのでさておき、式を作ったりする作業が必要になるため)
順列・組み合わせ
確率
数列(場合によっては行列)

の理解が必要になる。
 その負担は牌譜解析よりも大きい。
 シミュレーションをするというのは単に検索にヒットした個数を数える、検索にヒットした場合の点数を数えるだけの牌譜解析とは複雑さが異なるのである。


(2)プログラミング

 当然プログラミングの知識も必要である。
 ただ、私が知る限りだと、牌譜解析以上のプログラミングが必要とは思わない。
(必要な知識の程度は牌譜解析と同程度である)

 以上が必要な知識である。
 では、シミュレータ作りでやるべきことは何か、以下、検討する。


(3)モデルを理解する、自分でモデルを作る

 牌譜解析ではやらず、シミュレーションで必要なことの一つにモデルの作成というのがある。
 それをやらなければならない。

 最初から自分でモデルを作るのは大変なので、そこは他人の理論を借りればいい。
 例えば、凸理論。
 講談社の『科学する麻雀』に最低限のことが書いてある。
 この辺からじっくり取り組むのがいいだろう(分からなければ私に質問すればよい)。

 そうしているうちに、自分でモデルを作る必要が出てくる。
(私が作った凸理論局収支シミュレータにも自分なりの修正を加えている)
 その場合、自分でモデルを作る必要がある。


(4)モデルを具体化するシミュレータを作る

 さらに、モデルを作成した以上、モデルを具体化するシミュレータを作成する必要がある。
 これもやらなければならない。


(5)牌譜解析によるパラメータを取得する

 モデルを作り、そのためのプログラムを作成したとしても、結果を出すためにはパラメータを求める必要がある。
 そのための苦労は牌譜解析に書いたとおりである。

 ちなみに、パラメータを牌譜解析から取らない(あるいは取れない)こともある。
 しかし、その場合、シミュレーション結果が正しいことを確認するために次の作業は必須になる(もっとも、パラメータを牌譜解析からとった場合であっても次のチェックは極力行いたいが)。


(6)実測値とシミュレーション結果の整合性のチェック

 シミュレーションはモデルに基づく計算結果に過ぎないので、その結果を実測値と照らし合わせることで、モデルの妥当性を調べる必要がある。
 その場合、モデルが想定しているケースに対応する牌譜解析結果を用意し、牌譜解析結果とシミュレーション結果を比較する必要がある。

 もちろん、全てのケースにおいて牌譜解析結果が出るとは限らないため、必ずしもこのチェックができるとは限らない。
 しかし、極力この確認はした方が望ましい。
 そのために、余計な牌譜解析結果が必要になるとしても。
 

5 おわりに 
 
 以上、シミュレーションをする際に必要なこと、牌譜解析結果をするために必要なことを書いてきた。
 なお、nisiさんも私も牌譜解析結果とシミュレーション、両方を使っている(私もシミュレーションと牌譜解析結果を使いながら色々見ている)。
 だから、牌譜解析とシミュレーションは両方必要と思った方が良い。


 なお、色々書いてみたものの、まだまだ書ききれていない部分が多い。
 例えば、

牌譜のダウンロードの方法
牌譜の書式
凸理論局収支モデルは何か

などなどなど

 さすがに、これらを全部文章に起案するのは大変であり、口頭で表現した方が早いので、そういう質問はツイッターのDMにて質問されたい。
 極力対応する予定である。


 それでは。

もし気が向いたら、サポートしていただければありがたいです。 なお、サポートしていただいた分は、麻雀研究費用に充てさせていただきます。