*All archives* |  *Admin*

<<11  2016/12  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  01>>
全ツ型四人麻雀計算機その30・ベタ降りの挙動1・放銃時失点
前回までで平場における全押しはできたので、次は自分がベタ降りしたときの挙動をやっていきます。

初めは「現在最も安全な牌を選択して切る」という簡単なアルゴリズムにします。
具体的には
Σ((プレイヤーiの聴牌率)×(切る牌のプレイヤーiへの放銃率)×(その牌が当たった時の放銃時失点))
(Σはi=1~3の和)
が最小となるような牌を選択します。

これだと、以下の要素が入っていませんが、それはいったん出来上がってから考えることにします。
・対子落とし暗刻落としによる安全牌の水増しが入っていない。(むしろ暗刻筋効果で同じ無筋の中でも後回しにされるまである。)
・リーチ者一人、他二人非リーチ面前の状況で、同じ現物の中でも他二者にも確実に通る牌が優先されるので、2軒目のリーチに備えて共通安牌を後回しにするという発想がない。

後は掛け算の要素のうち、3つ目の当たった時の失点については、
1打ごと、14牌すべてを毎回いちいち計算するのが計算時間的に大変だと思われるので、平均失点の実測値をそのまま使うことにします。
↓この数値です。
161230-01.png
牌ごとの比較ができれば十分なので(せいぜい親への放銃や役牌とかドラで当たればちょっと高いという程度)、まぁ毎回精密に計算しなくてもいいでしょう。

これで必要になりそうなパラメータは出そろったと思うので、ベタ降りの挙動を作ってみましょう。
それができたら途中押しについてもそんなに手間ではないと思うので、それで平場判断が一通りできることになります。
スポンサーサイト
全ツ型四人麻雀計算機その29・自手チー処理
前回のポン処理に引き続き、チー処理についても考慮できたっぽいのでテストしてみます。
(ポン処理のコードをかなりの部分使い回せて、予想以上に早く簡単に出来上がった。バグも1個も出なかった。)

自手タンヤオ(低確率で三色もあり)の手牌を想定します。
161229-01.png
前回のダブ東のときとは違ってどこからでもチーポンできる割には鳴きなしとあんまり変わってないな…と思って、
ログを見てみると、
まず下家・対面からポン材が出た時(牌姿の画像のすぐ下から18巡目までの部分)は12巡目以前だとポン材の出をスルーするのが優位となっていました。赤5pの出だともっと鳴く巡目は早くなるが、それでも8巡目までは鳴かないとなっています。

また、上家から鳴ける牌が出た時(画像後半部分)についても似たような傾向になっています。赤が出た時と三色がつく可能性のある7pあたりは若干鳴く巡目が早いですが、それ以外は13巡目以降鳴くという風になってます。
(なお、1列目が巡目、2列目が他家から出た牌番号、4列目が-1のときはスルー、100の位が1の時はポン、100の位が2以上ならチー(晒す牌の種類によって100の位の数字が異なる)という意味です。)

従前の局収支シミュレーションと比較しようと思ったけれど、従前のは鳴きなしか鳴きありの2択しかできないので、
今回みたいな繊細(?)な対応はできないから似たような状況が作れずに比較ができません。

全巡目で鳴き有利にするためにドラ暗刻にしてもう一度やってみます。
161229-02_201612291638055cb.png

ログを見るとちゃんと全部鳴き優位になってくれてますね。

それで今回の計算機と従前のシミュレーションを比較すると、
まぁだいたい同じような感じの数値が並んでいます。
ポンチー考慮の終局時リーチ率が低めで、終局時副露数が高めに出ている気もしますが、このくらいなら許容範囲だと思います。

放銃時平均失点と被ツモ時平均失点がかなり低く出てるのは自手ドラ暗刻(さらに場にもドラ4mが1枚切れてる)で他家にドラがないのが影響している(逆に言うと従前のシミュレーションではその要素が入ってない。)のだと思います。


それにしても手牌と捨て牌を入力すれば各種確率等の数値が出てくる便利な時代になったものですねぇ。
後はベタ降りの挙動と点棒状況判断(試合単位の収支)までできれば、かなり多くの局面について何切る・リーチ判断・鳴き判断・押し引き判断ができるようになります。(現状できないのは染め手関連とカン判断と序盤の手組(シャンテン数が多すぎると計算時間的にきつくなってくる)くらい。)
そこまでいったら一回、大量の立体図を用いてテストして、正常に動くかどうかのチェックですね。
チェック作業の中でいろんな状況で打牌とか判断の優劣がついていくので、とても楽しみです。

問題になりそうなのはテスト用立体図をいかにして集めるかくらいですかね。
自分で打った牌譜から気になった局面をピックアップしようと思ったけれど、予想以上に早くできそうなので、それだけじゃ追いつかないかもしれないです。昨日の2試合でピックアップしたのは3局面だけだから、このペースだとベタ降りと点棒状況判断が終わるころでは全然分量が足らないです。(点棒状況判断は従前のものを移植するだけだし、ベタ降りも今考えてるだけだとそんなに難しくはなさそう。)

テストだから、優劣が明らかで特に気にはならない状況も入れて分量をかさ上げするか、ツイッターで話題の牌姿を使わせてもらうか、募集をかけるか、まぁいろいろ方策はありそうです。
全ツ型四人麻雀計算機その28・自手ポン処理3
前回までで再帰計算パートのポン処理(最適打決定)ができて、今回は再帰パートの最適打に基づいてシミュレーションパートでポンをさせる処理を入れました。

ちょこちょこバグに悩まされながらもなんとかそれっぽいのができたので、テストしてみます。
(前回よりかはかなりプログラミングの難易度は下がった。)

想定する牌姿は前回と同じ(東1局東家7巡目、444m556789p67s11z9s ドラ9p)です。捨て牌状況は4pが1枚切れてる以外は関連牌が出てない捨て牌にしてます。
161227-01.png
まずは一人麻雀(再帰計算パート)から。

ロンとポンを考慮しない一人麻雀だと和了率25%くらいになってます。
聴牌時良形割合が100%でないのは、58sが埋まった場合にダブ東含みのシャボに取る関係だと思います。

ここから他家からのロンとポンを考慮すると和了率が50%に増えてる一方、
和了時平均点と和了時一発割合が下がってるので、ポンが考慮されているのだろうと推測できます。


次にシミュレーションパートについて。
いつもの基礎データに加え、終局時自分リーチ率と終局時自分副露数の平均値と各結果別の平均得失点を付け加えてます。

鳴きを考慮しないときの終局時リーチ率が67%に対し、
ポンを考慮した時の終局時リーチ率が52%に下がる一方、副露数平均が0.26回という感じになってます。
前回だとダブ東は常にポンで、5pは終盤からポンするのが最適打になっていたので、それらをミックスすると副露数平均はリーチ率の半分くらいに落ち着くと。
そのへんの途中経過はブラックボックスですけど、まぁそんなに違和感はないとは思います。

さらに従前の局収支シミュレーションについても同等のデータを取り揃えて比較してみます。
(形テンは考慮しない。鳴くのはダブ東のみ。58sが埋まればシャボに取る。他家攻撃に対して全ツする。)
だいたい同じような結果になってくれてとりあえず一安心です。

これで自手ポンまで終わったことにして、次からチーの処理に移りたいと思います。
こちらは晒す塔子が異なるケースも全部再帰計算する必要があるので難易度が上がって大変そうですが、
前回と今回のポン処理の知見を活かせるのでちょっとは気が楽です。
全ツ型四人麻雀計算機その27・自手ポン処理2
自手副露処理のうち、再帰計算パートでポンを加味させるところまでできました。
バグが大量に出て大変だった…。

現状の成果はこんな感じです。
161225-01.png
自手はダブ東のポンを含みにした完全一向聴。

5p、赤5p、東についてポンした場合とスルーした場合の局収支を比較し、
ポンの方が局収支が上の時は最適打を返します。

リストボックスの中身のうち、左から、
巡目、ポンしようとしている牌の番号(15が黒5p、20が赤5p、31が東)、ポンする前の手牌、最適打(-1ならスルー優位、100+牌番号ならポン優位)と並んでいます。

このケースだと東(牌番号31)をポンするときは全部の巡目においてポンが優位(もちろんドラを使い切るため打6p)となっていますが、
5p・赤5pは役なしなので、巡目が早いうちはスルー優位(-1)となっています。
ただし、終盤は形テンのために役なしの5pもポンが有利になっています。(海底での上がりの可能性はあるので、一応最適打は打6p)

と、まぁそんな感じの出力になっています。

これがダブ東でなくてただの役牌だったら、
161225-02.png
こんな感じで7巡目は中(牌番号37)が出てもスルー優位(-1)となっていますが、8巡目以降はポン優位という感じになってます。


ただし、再帰計算パートについては他家の現巡目以降の捨て牌とリーチや仕掛けや和了の可能性が加味されてないという点はちょっとよくないです。

特に他家和了の可能性を見込んでいないので、実際の四人麻雀だとポンするかどうかも含めた最適打が一人麻雀+他家からの出上がり・ポンだけ考慮してるものとの乖離が出てきそうな気がします。
具体的には真の最適打は他家の上がりの可能性がある分、一人麻雀+αの最適打より早めにポンテンを取った方が有利になるとか。

全探索的なプログラムなので、他家の動向まで記憶を保存すると計算時間が発散してしまうため、どうしても他家の和了の可能性を外さざるを得ませんでした。
この最適打テーブルをシミュレーションパートにも持ち込む予定なので、真の最適打との間に乖離があるのがちょっといやーな感じですが、なにもないよりはましということで妥協しておきます。

全探索ではなくて、将棋AIみたいに盤面の評価関数とかが導入できたら、こんなびみょうな問題は出てこないとは思うのですが、それは私の技術不足ということですね。ちょこっと調べたけど評価関数の仕組みは全く理解できませんでした。
学のない者は力でごり押しするしか能がないです。

いやー、それにしてもまともに動くの作るだけで相当苦労したなー。バグだらけで苦しみました。
次はシミュレーションパート側に自手ポンの処理を書くところですな。とりあえず一番しんどいところは突破できたっぽいのでよしとしましょう。

全ツ型四人麻雀計算機その26・自手ポン処理1
今回からは自手副露処理の部分を作っていってます。

ただ、本体のコードを書く前にいろいろと下準備がいることに気付きました。
具体的には、
・再帰計算パートで自手副露数が変動することを想定して作ってなかったのを調整。(かなり多くの関数について引数を追加することをやったので、時間がかかった。)
・再帰計算パートで鳴きによってツモ山がずれる(特に海底関連)ことを想定してなかったのでその部分もこまごまと変更。(引数を巡目から残り山枚数に変更したことにより、かなり多くの箇所をいじる必要が出てきた。)

ようやく下準備が(たぶん)できて、さっきまで本体のコードを書いていました。

手順としてはまず自手ポンの方が簡単なので、そちらから手を付けます。(チーだと牌の晒し方とかが絡んでくるのでちょっと難易度が上がる。)
簡単のため、とりあえずは以下のケースのみを考えます。
・シャンテン数が減る可能性のある牌(ツモにおけるシャンテンが下がる有効牌)でかつ対子以上で持ってる牌のみポンを考慮する。シャンテン変わらずの鳴きやシャンテン数を増やしてタンヤオ移行とかは考慮しない。
・黒5をポンするときに赤5が手牌にあったら必ず赤5を含めて晒す。
・現物食い替え禁止を考慮しない。(打牌候補の中に現物食い替えに該当するものが含まれていても特に候補から除外とかはしていない。)

シャンテン変わらずの鳴きや現物食い替え禁止についてはわりと重要度が高い気がしますがある程度作り終えてからにします。

まだ作ってる途中なので、特に今日はデータはありません。
またこれからがんばります。
全ツ型四人麻雀計算機その25・テスト6
聴牌率の齟齬についてあーだこーだとこねくり回してて、さきほどようやく原因を見つけました…。

対リーチに対して無筋現物数で補正するところで、参照してるパラメータの変数が1個ずれてるという致命的なバグが原因でした。
全然違う数値を参照してたらそりゃ違う結果にもなろうものですわ。

もう一度テストやり直し。
161218-01.png
だいたい合ってくれたのでとりあえず一安心です。

ようやく他家の挙動の調整が終わったので、次は自手副露に移りたいと思います。
これは相当難航することが予想されますが、がんばりましょう。

Part25までで自手のツモと他家の挙動全般(染め手は除く)まで終わったので、Part100までかかるかも、と前に書いたのよりかは早くできそうな感じではありますが。
全ツ型四人麻雀計算機その24・テスト5
いろいろと鳴き関連について試行錯誤中です。

リーチ者ありの状況のチー発生率を晒し方と周りの牌の見え方別(リーチ者なしの時と同じ区分)で取ってみます。
161217-02.png
従前のパラメータだとリーチ者ありのチー発生率はリーチ者なしの時の6~7割くらいとなっていましたが、
今回細かく分類してみると明らかに6~7割よりは大きくなっています。ほぼ同等と言ってもいいくらいです。

おそらく、リーチが入ってる状況だと字牌(チー不可の牌)が切られる割合が大きくて、その分で全体のチー発生率を押し下げていたのだろうと推測されます。

その点を修正して、もう一度テストをやってみます。

でき面子部分は面前なら444m456789p99s、副露なら456789p99s;111z、待ちが両面なら67s、愚形は57s、リーチ宣言牌はいずれも5pとしています。
対1副露については下家が役牌ポンしてるものとしてます。
161217-01.png

鳴き発生回数が前のテストより大きくなって、近い結果が出ています。
リーチ宣言牌が5pという真ん中の牌かつ下家は5pを切っていない(チーされる可能性がある)捨て牌を想定してるので、
チー発生回数が従前局収支シミュレーションより大きめに出るのは想定の範囲内です。

チーが多くなった分、聴牌率は前よりやや下がっています(リーチ者ありならポンの方が聴牌率が高いため)が、それでもまだ高水準です。
まだもうちょっと聴牌率にかかわるところをチェックする必要がありそうです。
対1副露については1副露の中でも初期聴牌率の高い役牌仕掛けの設定にしてるためだと思うのでさほど問題ではないですが、
3人非リーチ面前についてはもうちょっと合っててほしいところ。

後は終局時リーチ割合もやや高めに出てる感じはありますが、
高めに出てるところは捨て牌の分布の違いによって鳴き発生率が低めに出てる箇所(特にポンは自分1枚持ちの打5pだからポンされにくい)なので、
おそらくそこまで問題ではないです。(リーチ発生率は同じパラメータを使ってるからむしろ問題があったら困る。)
全ツ型四人麻雀計算機その23・いろいろ試行錯誤
前回から、副露不聴割合が低めに出てる現象について、あれこれと悩んで試行錯誤してるところです。

検証その1。
リーチ者ありのときに0副露者が鳴いたときの聴牌率を実測、従前の局収支シミュレーション、新しい四麻計算機のそれぞれで取ってみます。

分類は先制リーチからの経過巡目のみで取ってみます。
まずは実測から。
161216-01.png
先制リーチが7巡目とすると、経過0巡(先制リーチ者の一発順)の鳴き発生時の聴牌率が19%、それ以降は30%~40%の間です。

次にシミュレーション側です。自手で想定する牌姿は444m456789p5799s5pで5p切ってリーチの場合です。捨て牌はランダム生成したもの。(自分は3s9sを切ってなくて、下家が5pを切ってない捨て牌を選んだ。)
他家3人は非リーチ面前で、0副露者が鳴いた回数とそのときの聴牌回数をカウントします。シミュレーション回数はいずれも10000回です。
161216-02.png
まず、鳴いた回数が従前と新しいので全然違いますなぁ。約1.5倍差だからかなり大きい。

聴牌率については実測と比べて、新しい四麻計算機が高く出てて、従前の局収支シミュレーションが低めに出てる。うむむむ。

前回の結果と合わせて考えると、
鳴きのうち、チー発生回数が小さく出てる傾向があって、
パラメータを見ると、特に先制リーチの一発順(無筋0枚現物0枚状態)における聴牌率がチーよりポンの方が高くなっています。
(おそらくポンは安牌2枚を消す行為になるので、聴牌が近くないと鳴きにくいが、チーなら多少遠くてもやることがある分の影響かと。)

↓ポン時聴牌率
161216-03.png
↓チー時聴牌率
161216-04.png

チー発生回数が少ないということは鳴き時にポンである割合が高いということで、つまり聴牌率が高い仕掛けの割合が増える、という感じで新四麻計算機の聴牌率が高く出てるのかなーと。少なくとも要因の一つにはなっていそうです。

それで、肝心のチー発生率のパラメータですけど、0副露についてはパラメータ採取時に全部副露不聴扱いにしてカウントしていたのですが、
シミュレーションではダマ聴牌者は鳴きを入れないという作りにしてるので、そのへんで齟齬が出てるのかなーと思って、
今、ダマ聴牌を除外して、パラメータの取り直しをやってるところです。

後はチー発生倍率で、一か所計算式をミスってるところがあったので、そこも差し替えをしてみてどうか、といったところ。
(Excelの絶対参照と相対参照ってちゃんと注意しとかないとミスりやすいですよねー。)

それでうまくいったら万々歳なんですが…。
途中経過を見た感じ、そんなに劇的にパラメータが変わる、みたいな雰囲気はなさそうなので、また別の要因があるのかもしれないです。
また、何かしら別の検証作業が必要になりそう…。
全ツ型四人麻雀計算機その22・テスト4
ロン和了関連と横移動関連のパラメータについて、実際の当たり牌が切られる確率が通常より下がることまで反映できたので、もう一度テストしてみます。
161213-01.png
前回(全ツ型四人麻雀計算機その20・テスト3)と比べて、
だいぶ旧局収支シミュレーションの結果に近くなってるような気がします。

ただ、まだ改善の余地がありそうです。

・自手愚形リーチのときのロン和了率が高めに出てる。
・他家副露(特に1副露)について1副露聴牌率が高く、1副露不聴率が低めに出てる。

愚形リーチは両無筋カン6sの想定なので、聴牌者からはそれなりに出るけど、不聴者からはほとんど出ない待ちです。
おそらく副露聴牌の割合が大きい影響とリンクしてるのだと思います。

とりあえず、副露初期聴牌率と1順当たり聴牌化率のパラメータをチェックしてみようか。
その結果を見てから考えてみましょう。
全ツ型四人麻雀計算機その21・当たり牌切られ率補正
ここのところ進捗は微妙な感じです。

前回、テストでロン和了・横移動関連を大きく見積もりすぎてたので、その辺の修正を試みてみます。

例えばこんな感じのパラメータ。
161211-01.png
実際の当たり牌が切られる確率÷全体の切られる確率の比率です。
放銃者(牌を切った人)は非リーチで副露数と聴牌かどうかの別、
和了者(ロン可能な人)はこの表だと副露聴牌者で、
自分(和了者でも放銃者でもない)から見た、見えてる牌手持ち枚数別で分類してます。
牌の種類は面倒だったので、筋と字牌でひとまとめにしてます。
後は巡目も。

同じ片無筋の牌でも実際に副露聴牌者に当たりになる牌が切られる確率はおよそ6~7割まで減るということが分かります。

字牌、特に多く見えてるor持ってる場合の倍率がかなり小さくなってますが、
これは字牌が当たりになってる場合は多くの場合はその字牌が2枚和了者に持たれている(単騎なら1枚)という条件なので、
条件なしのときより関係ない他家から切られる確率が小さくなるということです。
極端な例だと2見2持の場合、多くの場合自分と和了者で対子になってて持ち持ちになってるケースが多いので、関係ない他家からその字牌が切られる確率は0になるということが影響してます。

これの他家→自分バージョンとダマ聴牌とリーチの出る率倍率を今取ってるところです。

自分が和了者の場合は自分の有効牌(上がり牌)が他家から切られる確率にこの倍率を掛けていますが、
他家が和了者の場合は待ち(有効牌)が不明なので、ある牌で横移動になる確率にこの倍率を掛けて補正してみてます。

放銃・被ツモ・横移動に関しては従前のシミュレーションと似たような形式(確率的に当たりになるかどうか決めている)でやっているのですが、これだと直前に切られた牌ほど当たりにくい、筋の本数が減るほど放銃率が上がるみたいなことが反映されないんですよねー。
これを自手と同様、他家の聴牌時点で待ちを分布から確定させておく、みたいなことができないかどうか考え中です。
これなら先述の問題は解消されますし、当たり率補正みたいなよくわからんこともしなくてよくなります。

ただ、そうするといかにして待ち分布を作るかどうかがかなり難しいです。(捨て牌・自分の手持ち牌の状況によって分布を変える必要がある)
それだけで1個の大研究テーマになりえます。
また、聴牌からの手替わりや鳴いて待ち変えみたいな問題もあるので、ちょっと現状ではこの件は後回しにしておこうかという気になってます。
プロフィール

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

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

この人とブロともになる

QRコード
QRコード