*All archives* |  *Admin*

<<07  2017/08  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  09>>
シャンテン数と一次有効牌枚数と局収支の関係
AI開発の課題の中で、4シャンテン以上だと枚数しか見てなくて、3シャンテンでも2択に絞り込むのに枚数だけを使っているという現状があって、
広さ(一次有効牌の多さ)と初手危険度の間を取り持つ指標が必要になるかと思ってこの2日くらい牌譜解析をやっていました。

他家の高打点仕掛けが入っているのに自手の都合(枚数)しかみないのはちょっと問題であろうと。
というわけで、シャンテン数と一次有効牌の枚数に対応する局収支を実測から取ってみて、そこから初手危険度指数(放銃率×放銃時失点の和)から差し引く…とかでなんとかうまいこといかないかなぁと。

それで牌譜解析をやったんですけど、毎順シャンテン計算と有効牌枚数計算をやるため、かなり時間がかかりました。
その結果がこちら。
左が巡目、上が一次有効牌枚数
集計条件は特になし(他家の挙動は無視)
170618-01.png
同じシャンテン数・巡目では一次有効牌枚数が多いほど局収支も高い傾向にあるようです。

ただ、取ってみたのはいいけれど、これを実際使えるかというとびみょうです。
この数値は何も条件を付けてないので、自手の手牌価値と等価になっていなくて、多くの場合は途中でベタオリに回ることが入っているためです。
ちょっと失敗でしたかね。(数値自体は無意味ではないかもしれませんが。)

そうすると4シャンテン以上と3シャンテンの手牌評価が手詰まり気味です。
初手危険度の評価と安牌(大体の場合、字牌)を手に残す場合の価値の評価とか。
うーん、どうしようか。

とりあえず今考えているのは、いったんこの問題は棚上げにして、前に進めて(再帰パート自分鳴き処理部分)、
AIを実際の牌譜にかけて、その結果をなにかしら頑張って分析して、打牌決定のアルゴリズムを決める、みたいな。
ものすごく行き当たりばったりでまるでできる気がしないなぁ。
分析するにしても方向性がないとどんな数値を出力すればいいのかわからないし。
牌譜の数も多いし、AIにかけるのも1試合当たりに時間が結構かかるから、無駄なことはできないし。

現状は少なくとも細かい押し引き判断(2シャンテン以下)についてはAIで実際の牌譜を計算させてディープラーニングっぽいことをやらせることは確定なので、それがうまいこといってからまた考えようか。(すごくてきとー。)
3シャンテン以上の押し引き、打牌候補選定だとディープラーニングっぽいのをやるのに再帰計算はかけないので、シャンテン計算と有効牌計算だけでまた2日くらい時間を食うんだろうけど、そこまででかいコストではないから試行錯誤でもなんとかならんかなぁ、と希望的観測。
先制両面ダマ4ハンを牌譜解析
昨日出題した先制両面ダマ4ハン手に絡んだ話題で、


シミュレーションではそこそこ大差で、リーチ有利になっているのですが、
170513-02.png
実測値の観点からもどちらが有利かを調べて、裏を取っておこうと思います。

集計条件はちょっと前にやった愚形立直のみのときと似たような感じ。
・自分子で両面ダマ聴牌で(どちらで上がっても)ロンで4ハン30符。
・両面の端寄り・中寄りは問わない。
・誰も動きなし(純先制状態)
・リーチの場合はリーチ宣言時に判定、ダマの時は毎順判定。
・最終局結果をカウントする。

↓結果がこちら
170513-01.png
リーチの方はそれなりに整合しているっぽいですが、ダマの方は実測の方がかなり上目の値になっています。
ダマシミュレーションはかなり過小評価をしているということですね。
とはいえ、まだ局収支ではリーチが有利そうですが、点棒状況が絡めばけっこうびみょうになってきそうです。

ダマシミュレーションが過小評価になっている原因として考えられるのは、

・1順当たり他家からロン率について、1副露の副露ロンと同等と仮定して計算している。
おそらく0副露ダマと1副露だと0副露ダマの方が上がりやすいと考えられる。(実際、和了時ツモ割合を見るとかなりダマシミュレーションの方が高くなってる)

・ダマにしていれば危険牌を引いてきてもメンツのスライド等で対処できるケースがそれなりにあり得る。

・ダマにしていれば最終盤の超危険牌を引いたときに降りることも可能。
(ダマシミュレーションの方はそれを反映してないので、放銃率が高い。)

・サンプル数の偏りの可能性。
場に安いとか誰かがすでに待ち牌を切ってるとか端待ち等で、場況がいいものほどダマにされやすいかもしれない。
(証拠があるわけではないですが。)

というわけで、ダマに関するシミュレーションはけっこう足元があやしいです。
このように実測との整合性をたまにはチェックしないといけなさそうですね。
聴牌打牌と放銃率
ツイッターで聴牌打牌で放銃率が上がる現象について調べてくれ、という質問があったので、今回はそれを調べてみます。

牌譜解析の集計条件は、
・自分以外の3人のうち一人がリーチしている(他二人はリーチでなければ他の状態は問わない)
・自分は聴牌している。
・自分が牌を切った時に分母にプラス1、そのときにロンの声がかかった(立直者以外からのロンも含む)時に分子にプラス1
・分類は巡目と牌区分(対象は一人いる立直者に対して)と自分が前巡の段階ですでに聴牌しているか否か

結果がこちら。
170509-01.png
全部の牌トータルで見ると、前巡で既に聴牌している場合より、前巡は不聴(つまり聴牌打牌)の場合の方が放銃率はやや高い傾向にあるようです。
なので、張った瞬間に当たり牌になりやすいというのはある意味正しいです。

しかし、それぞれの牌の区分ごとで言うとすでに聴牌のケースも聴牌打牌のケースもほとんど変わらないので、
同じ無筋同士なら、特別聴牌打牌の方が当たりやすいとは言えないです。

おそらくは、聴牌打牌の方がリーチ者の無筋(危険牌)になってるケースが多い(全体から見た割合が多い)ため、個々では放銃率が変わらなくても、トータルでの放銃率が上がる、とかそんな感じでしょうか。

このテーマはこんなところにして、後は雑談。

1週間くらい前から1日1問ツイッターで押し引きを中心に何切る問題を出して、シミュレーション結果を正解として出していますが、そこそこ好評いただいているようです。フォロワー数も順調に伸びつつあります。
まぁ、見た目地味な研究よりはみんな実際の何切るの方が好きなんだろうなーとは思います。(別にそれが悪いと言いたいわけではないです。)
でも、今シミュレーション結果が手軽に出せるのも、基礎研究の積み上げのたまものなので、まぁそういう背景もあるということでひとつ。

後は(シミュレーション結果を正答としたときの)みなさんの正解率がかなり高いのはすごいですね。こちらとしては多数派とシミュレーション結果が一致しているということはそれなりにみなさんの感覚と適合しているということだと思うので、一安心です。

今問題の正答用に使っている局収支シミュレーションだとある程度の制約があります。
・基本的に二向聴以上の手はできない。
・変化を考えるのは少し手間がかかる。(日1で次々出題することを考えると、あまり手間はかけたくない)
・他家の打点はかなり大雑把(赤ドラの所在は考えてるけど、表ドラは平均のパラメータの中に全部押し込めてる。)
・聴牌気配の濃さ薄さ(特にダマテン)についてはあまり考えられない。(これも平均値そのまま。)
こういう制約に引っかからないような状況を問題として選んでいます。
次世代のシミュレータができたらこういう制約(特に前者2点)はなくなって、作問の幅と質が大幅に広がるのですが、やるには頑張って基礎研究しないといけないですね。
基礎研究の間はブログの記事は単調になりがちですが、その分を毎日の何切る出題で補えばまぁ研究サボってる感はあまりでないかなーとか思ってます。(むしろ両方ともやるので相当頑張ってる方。まぁ何切るの方は出来合いのシミュレータにパパッと入力値放り込んで10秒くらい待つだけなんでそっちはそんなに難しくない。むしろペイントとかエクセルで加工する方が時間かかるくらい。)

後はちょっと前までは技術的な問題でfloodgate for mahjongに接続することができなかったのですが、その問題がクリアできて無事接続できたので、もうそろそろAI作り(≒次世代シミュレータ)に取り掛かろうかなーと思って、今日ひさしぶりにプログラムを開いて、コードをちょっといじりました。
スタックオーバーフローのエラー回避のために全体的にコードを書きなおさないといけないのですが、まぁ宣言している変数の数が無駄に多いこと多いこと。スタックの自己管理のためにほとんどすべての変数をまるごとスタックに詰め込んでは取り出しての繰り返し、みたいな感じでとっても大変です。
スタックの自己管理にあたって、私にとっては新技術となるクラスの宣言というのをやっています。今まで自作クラスを全く作らずにやってきたというのもある意味すごい話だけど、今回そこは避けて通れなさそうです。まだ作りかけだけど、その部分がうまくいくかどうかが気が気でないです。またどうせ、大量のバグ祭りになるんだろうなぁと思うとちょっとゆううつ。

クラスの宣言と言えば、floodgate for mahjongのツモ切りプレイヤーのサンプルプログラムを見て活用しようとしたけど、たくさんのクラスとかコンストラクタ?みたいなのとかポインタ?とか、わたしのおつむではわかりませんのー、みたいな感じで撤退したりとか。まじでプログラミングスキル低いわーみたいなのですね。他の人が作った高尚なプログラムが理解できず、自作のおもちゃしか扱えないかわいそうな子です。

自作のおもちゃと言えば、(たぶん)高速シャンテン計算関数(笑)とか公開したら誰か使う人いるかな?
AI製作にあたってグローバル変数を極力使わないで、単純に引数渡しの戻り値返しの単純なシャンテン計算関数はできてるから一応、その部分だけ切り取ってお見せするとかはできるけど。まぁ、手牌とか鳴き牌とかのパラメータ指定の方法がくせがあるだろうから、他の人は使いにくい可能性はかなり大きいけど。
まぁ、たまにはスキルの自慢もしてみたい(プログラミングスキル低いわーと言ったとたんこの発言なので、とても支離滅裂感あるけど。)のと、将来の麻雀研究者が参入してきやすいみたいな高尚っぽい名目も添えて。たまには麻雀界に貢献?でもしてみようか。めっちゃ上から目線だけど。

ぐだぐだ書くのはこの辺にしておきましょう。では今回はこんなところで。
三元牌が切られた巡目と被ポン率
前回(三元牌が切られた巡目と山残り枚数の関係)に引き続き、最序盤の字牌の比較の話です。

今回は防御面についての話で、どの順番で牌を切ったら他家にポンされにくいかということを考えます。

条件は
・全員非リーチ面前。
・n巡目に1枚切れ(切れている巡目m巡目)1枚持ちの三元牌を切った時、分母に+1
・その時、誰かからポンされたら分子に+1

つまり、動きがない状態で1枚切れ1枚持ちの三元牌を切った時のポンされる確率です。
(今回はドラ表示牌で1枚見えてるケースは除きました。)

170506-01.png
表の見方は前回とほぼ同じ(行がn、列がm)です。

前回の例でも出した、3巡目に白と発を1枚ずつ持っていて、白が第一打、発が2巡目に切れてるケースを考えてみます。
このときに3巡目打白→4巡目打発と切るのか、3巡目打発→4巡目打白と切るのか、ポンされる確率がどちらが低くなるかを考えます。

前者は白と発、両方とも他家に重ねられる猶予が1順だけあるのでポンされる確率はどちらも中程度です。
具体的なポン率の数値だと、白はn=3、m=1で1.38%、発はn=4、m=2で1.45%で合わせて2.84%です。

後者は発は直前に切られているので、ほぼポンされない一方、白は2巡、他家に重ねられる猶予を与えるので、ポンされる確率は小+大です。
具体的なポン率の数値だと、白はn=4、m=1で1.96%、発はn=3、m=2で0.85%で合わせて2.81%です。

その差は0.03%だけ発→白の順番の方がポンされる確率はわずかに低くなります。
この数値の差がほぼ無視できる差ととらえるか、微差でも一応は差として存在するととらえるかが問題です。

サンプル数は10万~20万くらいで標準偏差√(p×(1-p)/n)を取ると、0.03%くらいか。
というわけで、0.03%は2σより小さいので、この差が出たのはたまたまである(統計的に有意差であるとは言えない)ということにしておきます。(いかにもあやしげな論理ではあるが。)

自分で重ねる狙いにしても、他家のポンを防ぐ狙いにしても、今回はあんまり差が大きくなくてしっかりとした結論は出せない感じです。
三元牌が切られた巡目と山残り枚数の関係
今回は字牌(三元牌)の切られた巡目と山に実際に残ってる枚数を見てみます。

最序盤でよくある風景として、1,2巡目はオタ風端牌を処理して、3巡目くらいに白と発を1枚ずつもっている、
他の人の捨て牌を見ると白は1巡目に切られているが、発は2巡目に切られている、
さて、どちらを残そうか、という問題。

攻撃面を考えるなら山に残ってそうな方を残したいですよね。
というわけで、「自分のn巡目のツモ番において」「1枚切れ1枚持ちの三元牌について」「該当する三元牌が他家からm巡目に切られている」という条件で山に実際に残ってる枚数を牌譜解析で調べようと思います。
なお、集計の都合上、ドラ表示牌でめくれてる場合は1巡目に切られたものとして扱います。

170503-01.png
横ラインがn(自分のツモ巡目)で、縦ラインがm(他家が切った巡目)です。

例えば自分が3巡目のツモ番において、1巡目に切れている三元牌が山に残ってる枚数は1.616枚で、2巡目に切れている三元牌が山に残ってる枚数は1.646枚です。(サンプル数は100万くらいあるので、たぶん十分)
なので、直近で切られた方を残す(冒頭の例なら発を残す)とよいでしょう。
1巡目に切られた方(冒頭の例で白)は3巡目が回ってくるまでに重ねられている可能性が高いということかと思います。

一方、自分5巡目については第一打三元牌は1.670枚、2巡目三元牌は1.741枚、4巡目三元牌は1.710枚で、
2巡目にピークがあります。2~3巡目くらいだと、もし他の人がその三元牌を1枚だけ持っていたら、1枚切れ三元牌が出てきやすい巡目であるが、2枚目以降が3巡目以降に顔を出さないということはその可能性が低くなる、
逆に4巡目三元牌切りなら生牌三元牌は2~3巡目くらいでも温存されることが多く、4巡目に1枚目が切られた後に他の2者のツモ順が回ってくる前に自分の5巡目が回ってきた場合は、まだ他2者に孤立で手残りしてるケースがある(山にいる枚数が少ない)ということだろうと推測されます。(このへんは他家との位置関係も絡んできそうですが。)

いろいろ考えるのがめんどくさければ「2巡目に切れてる三元牌を優先して残す」でもいいかと思います。
プロフィール

nisi5028

Author:nisi5028
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
フリーエリア
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード