*All archives* |  *Admin*

<<06  2017/07  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  08>>
全ツ型四人麻雀計算機その3・自家他家とも面前リーチのみ
四人麻雀計算機の続き。

ものすご~く苦労してようやく自分も相手も面前リーチのみを考慮した場合のそれらしいのができました。
エラーで止まったり変な値が出まくったりしてここまでいくのが大変だった。

方式は前に述べた通り、
第一段階。(手替わり1回とか0回を上限として)今後取り得るすべての(14枚)手牌と巡目ごとに一人麻雀計算で最適打を決定させておく。
第二段階。前の局収支シミュレーションと同様、100000回シミュレーションを行う。自分の挙動は第一段階で求めた最適打テーブルから検索して淡々と摸打して、面前聴牌したらリーチする。他家の挙動はだいたい局収支シミュレーションと同様の予定。
です。

ただ、ちょっとつまづいた点があって、それは
第一段階で記憶させる情報は巡目&14枚手牌&リーチフラグ&残り手替わり回数ごとに最適打を1枚、なのですが、
前に調べたのと同じ情報が出てきたら上書きするような仕組みになっています。
この中に入ってない情報として捨て順(およびツモってきた牌)があるのですが、同じ巡目とか同じ手牌でも捨て順だけが異なっている状況がたびたび訪れ、そのたびに上書きされていきます。
捨て順が異なると見えてる枚数、ツモ率に影響が及んで、返す値が微妙に異なってくるので少々やっかいです。(変動幅はそこまで大きくはありませんが。)

捨て順によって局収支等(もしくはごくまれに最適打が変わることもあり得なくはない)が異なるものを使うのがちょっと気持ち悪いので、思い切って第一段階の計算ではツモってきた牌を見えてる枚数にカウントしないという処置を取りました。これなら捨て順が異なっても返す値は同じものになるので上書きによって結果が変動するということはおそらくないと思います。その一方、一度ツモってきた牌が見えてる枚数にカウントされないので、同じ牌をツモる率が正確なものより高くなります。極端なケースだと1mを5回以上ツモるということも低確率ながら起こり得るので、そのへんはあんまりよろしくないです。苦悩の末の決断です。

とまぁ、いろいろ考えながら作っているのですが、現状はこれだけのことを第二段階のシミュレーションで考慮しています。
今現在、前の局収支シミュレーションから移植したパラメータは「リーチ発生率」だけで、他はパラメータがないか、移植を後回しにしたかの理由で仮置きのパラメータにしています。

・自分のツモ番
聴牌で上がり牌を引いたら得点計算して上がる。
上がれなかった時、一発状態を解除、自分が先制リーチ者なら経過巡目+1
第一段階で求めた最適打を検索してその通りの打牌をする。(面前でテンパイしたらリーチ宣言、残り手替わり回数に応じて手替わりも考慮する。)

・自分の切り順
他家リーチ者への放銃判定。(放銃率は一律5%、放銃時失点6000点。)
ダブロン、トリロン流局を考慮する。
放銃がなくてリーチ宣言状態ならリーチ成立として局収支-1000点させる。
四人リーチ流局を考慮する。

・相手のツモ順
リーチ状態なら被ツモ判定。(ツモ率は一律5%、被ツモ時失点2000点。)
先制リーチ者なら経過巡目+1。切る牌はツモ切り。
リーチ状態でないならリーチ宣言判定。(リーチ発生率に基づく。)
切る牌は他家切る率パラメータに基づく。

・相手の切り順
自分が聴牌の時、ロン和了判定。
他の他家がリーチの時、横移動判定。(横移動率は一律3%。)
ダブロン、トリロン流局を考慮する。
ロンがなくてリーチ宣言状態ならリーチ成立させる。
四人リーチ流局を考慮する。

今のところこれだけです。

それで、捨て牌をランダム生成して(自分の捨て牌については現在の有効牌は除外してもう一度乱数を振りなおすようにした。)、
プログラムを走らせる。そしてようやくまともそうな値が出てくる。
161112-01.png
和了時ツモ割合はほぼ5割。良形リーチだともうちょっとツモ割合高かったような気はするのだが。
他家被和了率もまだ自手一向聴の割にはちょっと低くない?


この牌姿は複雑なので、それよりもっと簡単なノーマル両面両面一向聴でやってみて、従前の局収支シミュレーションと比較してみます。
161112-02.png
やっぱり1順当たりロン和了率はもっと低くて、他家被和了率はもっと高いですなぁ。数値の信頼性が高いのは従前の方です。

こうなった原因として考えられるのは、
・他家切る率は見えてる枚数と現物筋無筋くらいのざっくりした分け方なので、実際のプレイヤーは同ランクの牌でもカベとか外側牌とかの読みを使って、より通りやすい方を選んで切ることが多い。
・他家の挙動について、面前リーチのみを考えていて、鳴きを考慮してない分、実際は今の仮定よりは鳴きで攻めてくる。

てきとうなところでプログラムを止めて他家切る率などを観測したのが↓の表になります。
161112-03.png
リーチの待ちが58sでそのどちらかが他家の1回の切り順で切られる確率はおよそ1.8%くらい。

それに対し、従前の局収支シミュレーションで使ってる1順当たりロン和了率のパラメータがこちら。
161112-04.png
両面25,58の出る率は1.4%なので、今回の四人麻雀計算機では出る率を過大評価してるというのが分かります。

とりあえず同ランクの牌同士で、実際に当たりの牌とそうでない牌を比べてどのくらい出る率に差が出るかを別途取る必要がありそうですね。
その他に今思いついてる中で取らなければいけないパラメータの種類はこんな感じ。
・牌を切った時の放銃率
・他家リーチに対してある牌が上がり牌である確率
・リーチ宣言牌種類分布
・ドラのツモりやすさと出にくさ
・先制リーチと追っかけリーチの打点分布
・実際の上がり牌の出にくさ
・切った本人がすでに同じ牌を切ってるかどうか

リーチ系統だけでこれだけなので、副露とか染めはもっと多くなるだろうなぁ。

プログラムのコーディングについては最難関の最適打テーブルからの呼び出しは終わってるので、後は単調な工程をいかに集中力を切らさずに正確にできるかですね。

後は計算速度面も課題です。
第一段階で全部のツモと全部の手替わりを巡回して、情報の登録・上書きをしないといけないので、その分の時間が余計にかかるのと、第二段階のシミュレーションのスピードが0.1秒で100~300回くらいで、10000回なら10秒くらい×打牌候補の数だけかかるので、かなりおそいです。トータルで30秒とか1分とか。ちょっとこれだときついなー。
ただの牌譜検討として使う分には我慢できるレベルですが、
AIとして動かすことを考慮するのは速度面が改善されなければちょっと難しそうです。
スポンサーサイト

コメントの投稿

Secret
(非公開コメント受付中)

コメント

プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード