2013年8月25日日曜日

文系がなるべく頑張って理論的に考える麻雀 (1)



僕はまあ、理系か文系かと問われれば完全に文系なんだけど(算数からすでに苦手)、計算機科学を専門に勉強した時期があるので、情報数学を基にした「問題への理論的アプローチ」というのは少しだけ出来る。

そんな文系の私が考えた「確率も期待値も出てこない理論的な麻雀の考察」をここでこっそり発表します。内容が正しいかどうかは知らないですけどね。

ゆくゆくはこの「文系理論」を積み重ねて最強の麻雀アルゴリズムを作りたいと思ってます。10年ぐらいかけて。

では、興味ある方は続きからどうぞ。
(ウルトラ長いです)




文系がなるべく頑張って理論的に考える麻雀(その1)

押すのか引くのか?
麻雀において「押し引き」の上手い人は基本的に強い。
では、「押し引き」とはなにか?

まず「押し」から考える。
ものすごく大雑把だが、「自分が和了れると判断した時」か「自分が和了れた場合に得られる得点が極めて多い時」が押す時となるハズである。

すると、流れ図ではこうなる。


では、「自分が和了れると判断出来る条件」は一体なんだろうか?

考えてみるに次の三つはアリだと思う。
  • 巡目が早い
  • 多門張(多面待ち)
  • 出やすそうな待ち

ただし上の三つは、「意味が判るようでいて実は具体的な内容が定義されていない」ので条件としては本当は不十分である。しかし、単に理論的な思考ルーチンを構築する場合、このような未定義項目があってもさして問題にはならないのでこのまま進める(以下、未定義項目やマジックナンバーは赤のボールド文字で示す事にする)。

2つ目の条件「自分が和了れた場合に得られる得点が極めて高い」であるが、ここで出てくる「極めて高い得点」も個人の価値観によって揺れがあるので、未定義項目となる。

以上の条件「巡目が早い」、「多門張」、「待ちが良い」、「打点が高い」を「自分が和了れると判断した時」or「自分が和了れた場合に得られる得点が極めて多い時」という条件ボックスに代入し、展開すると次の図のようになる。


これらはすべて「OR演算」なので、押すのは

巡目が早い」か「多門張」か「待ちが良い」か「打点が高い

時で、つまり条件にどれか一つでも合致した場合は押せる事になる。

逆に押せない時は、

「巡目が早くない」上に「多門張じゃなく」さらに「待ちが悪く」て「打点が低い」

時、つまり全ての条件がNOの場合は押せないことになる。

※条件 A, B, C, Dとある時
(A or B or C or D) の複合条件の逆は NOT(A or B or C or D) = NOT A and NOT B and NOT C and NOT Dとなる(ド・モルガンの法則)。

以上が、あくまでも理論的に考えた場合の「押せるケース」である(ものすごく単純化したケースではあるが)。
ここまで来たら後は未定義項目の内容を詰めるだけである(「実装」)。

例えば「巡目が早い」を単純に「6巡目まで」と定義しても良いし、「他家の誰も二つ以上副露していない6巡目以内」としても良い。また「多門張」と「待ちが良い」を分けず「良形」という言葉で一本化しても良い(ただしその場合は良形の定義が必要になる)。

この辺のパラメーターを変えることによって、最終的に「いい塩梅」の設定を見つけ出すのである。ただし、これらは実践してみない事には適合性の判断は出来ない。

もちろんパラメーターをいくらいじくっても良い結果にならない場合もある。その場合はこのアルゴリズムが間違っているという事で新たな項目を追加するか、全く別の考え方を導入するしか無い。

例えば「巡目が早い」場合でも、愚形じゃ勝てない場合が多いと判断した場合は、
巡目が早く、なおかつ良形である」
の様に判定基準を変更する事が必要になるかも知れない(「実装から理論へのフィードバック」)。

ともかく、強い人ってのは、この辺の判定基準とパラメーターの設定が上手い人なのだと思う。

<「押し」の項終わり>


えーとですね。
以下は、かなりの余談ですが、個人的にはとても面白い話なのです。
興味のある方はさらに読んで下さい。


さて、ここで不朽の名作「打姫オバカミーコ」の1巻 "押し引きの条件" に出てきた超有名な押し引きの法則に触れてみたいと思う。この回は「押し引きと言えばコレ」的な存在だから、押し引きを語るにはどうしても避けては通れない。

オバカミーコに出てきた押し引きの条件は、「先手良形高得点のこのうち2条件がそろったら押す」というモノで、一見すると単純なように見えるが、これは僕が考えたモノに比べると実は複雑である。

A, B, C とある条件の内、二つがそろう組み合わせというのは "AB", "AC", "BC"の3パターンである。
つまり条件としては、
先手かつ良形」か「先手かつ高得点」か「良形かつ高得点
の場合のみ押す、という事になる。

逆に言うと押せない条件は
後手悪形」かつ「後手安手」かつ「悪形安手
という事になる。

実はこれ、同じページに出てくる「後手悪形安手のこのうち2条件がそろったら引く」とは同じ条件文にならないのである。

引くための条件は
後手かつ悪形」か「後手かつ安手」か「悪形かつ安手」で
後手悪形」かつ「後手安手」かつ「悪形安手」ではないのです!

ところが、「押せない条件」と「引くための条件」は全く同じ答えが出ます。この辺が論理演算の面白いところです(バグが出て困るのもこの辺ですが)。
(※ちなみに実際のプログラムによる実装ではここまで厳密に論理演算を適用する事はないと思います。3つの変数を用意してそれぞれ足しあわせて2以上あればOK、多分そんな判定方法になると思います。それでも、当然結果は同じになります。ちょっと不思議でしょ?)

この「3つのうち2条件がそろわないと押さない(引かない)」という法則は、片山先生の長い実戦経験から見出されたものだと思います。「押す」と「引く」が理論的にも表裏一体ぴったりとなってるところもとてもエレガントです。

ただ僕としては「押し」と「引き」の間に「なにか」が欲しかったので、今回はこのアイデアは採用しませんでした。上に書いてある流れ図でも冗談っぽく「押さずに生きていく」と書いてありますが、実際にこの「押さずに生きていく」方法を今後は探そうと思ってる訳です。
それが何なのかは、今のところ全く解りませんけどね。


<余談終わり>


.

0 件のコメント: