*All archives* |  *Admin*

<<10  2017/11  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  12>>
麻雀AI開発その67・染め手率と機械学習
今回からは染め手について考えてみようと思います。

従前の局収支シミュレーションだと、ある一定の条件(6巡以内の捨て牌に染め色がない、など7条件)に当てはまる仕掛けを入れている他家を「染め模様者」として、別のパラメータを使っていました。

ただ、この方式だと「染め模様」の定義に当てはまるかそうじゃないかの、0か1かしかないのがネックです。
捨て牌が1枚だけ違って「染め模様」の定義に入るか、入らないかで大きく挙動が異なるのは、実際の牌を使ったシミュレーション(逆に言うと従前の局収支シミュレーションでは、全部確率処理で、具体的に牌を使ってるわけではない。)ではちょっとよろしくないです。

できれば、この捨て牌・晒し牌から見て、実際に染め手である確率○%である、というのを(短時間で)計算できる評価関数を作ることができればベストです。

例えば初期状態(シミュレーション開始時点)で染め手である確率40%という予測値が分かれば、10000回シミュレーションのうち40%を染め手に向かっているものとして、そういう挙動(例えば非染め色を多く切る傾向にある、とか非染め色の仕掛けは入れないとか、上がった時の打点が染め手で高いとか)をさせ、残りの60%は染め色でない通常の仕掛けとして、それ相応の挙動をさせる、というような使い分けをさせることが可能になると思われます。

というわけで、課題は2つあります。
・染め手率を求める評価関数を作る。
・染め手に向かった者の挙動の元になる各種パラメータを取って、実際にシミュレーションに組み込む。

とりあえずは1個目の染め手率から考えてみることにします。
まず一つ問題になるのは、どのようなときに「実際に染め手に向かった」と判断するかです。
これは簡単そうに見えて実はそんなに単純な問題ではないです。

「上がった時に実際に一色手の和了である」という定義では、上がりまでたどりつかなかったケースがすべて非染め手と判断されてしまいます。
次に「局終了時に手牌が一色になっている」という定義も考えられますが、これも例えば途中でリーチが入って降りに回った場合が染め手でないと判断されてしまいます。
「手牌中の非染め色の枚数が単調非増加(つまりイコールか減少)」でも、途中で降りた場合が該当しないのでダメ。

今のところ自分の中で有力と考えているのは、「局終了までに非染め色の枚数が1枚以下である状態が1巡でもあった」という定義です。
1枚以下ならば非染め色で塔子や対子を構成できない(もちろん面子やポン・チー・カンも排除できる)ので、確実に染め手に向かっているだろうと判断できるだろうと思います。
これでも、非染め色を落としきる前に早いリーチがかかって染め手を諦めた場合が集計から漏れますが、まぁそういうケースは大して重要でないと思うのでいいことにしましょう。

これで、学習データで実際に一色手に向かったかそうでないかの判別がつけられる(と思う)ので、
今度は入力値としてどのようなものを入力すればいいか、という点を考えてみようかと思います。

○基本情報
・巡目
・副露数
・染め色はどの色か
・ドラ色か
・リーチ者有無(あるいは先制リーチ巡目)

○副露関連
・役牌のポン・カンがあるか
・タンヤオの可能性があるか

○捨て牌関連
・k巡目の牌区分(役牌・オタ風・染め色19・28・3~7・非染め色19・28・3~7)

特に処理が大変そうなのが、捨て牌関連ですかね。
9巡目あたりまでに絞ったとしても、9×8で72次元用意しないといけないので、ぷにゃー、となりそう。
OutofMemoryの影もちらついてきそうです。

まずはこれで学習データを準備するところから始めてみましょうか。
スポンサーサイト
麻雀AI開発その66・近況報告
麻雀AIの話の続きです。

あまり目立った進展はないですが、近況報告だけしておきます。

まずは鳴き判断の評価値関数の計算について、ニューラルネットに変更してパラメータを取り直しました。
あんまり従前と大きく変わることはなかったです。

それで、まだ染め手を入れてないですが、一応一区切りはついたので、
floodgate for mahjongで多数試合対局して、今のところの実力を測ろうかと思っています。

…なんですけど、現在、閑散としていて、自分以外誰もいません…。
全くマッチングしませぬ。(だれかきてほしいなぁ、と期待をこめたまなざしで見つめるわたし。)

「麻雀AIやってる人が全然いなくてうんぬん」みたいな話はよくされますが、ここでそれが露見して、つまづくとは思わなかったです。
誰か来るまで気長に待ちましょうかね。

とりあえず、1試合だけでも完走させて、ちゃんと正常に対局できるかどうかだけでも確かめたいところです。

もしfloodgateが頼れないなら自前で前バージョン(おそらく天鳳レートで1800くらい)と新バージョンを対戦させるプログラムを書かないといけないのかなぁ。
親番連荘の価値について
前回の記事で(染め手まわりの雑多なこと)、
親番の連荘時利益についてなくした方がいいんじゃないか?という疑問があったので、追加調査をしてみました。

点棒状況が同じで、親番を連荘で続行したケースと親番が流れたケースの平均順位等を調べました。
(現局部分は全員不聴扱いで流局させたうえで、次局以降部分のシミュレーションをしました。)
160401-05.png
一番上が残り局数が7で全員原点のケース。(ほんとはトンパツでやりたかったけど、現局を流局させないといけなかったので、できなかった。)
親番続行は前局が南家・残り局数8で流局、親番流れは前局が東家・残り局数7で流局の扱いにしてます。
この場合は親番を続行した方が平均順位が0.03くらいいいです。
つまり、連荘自体の価値はそのくらいであろうと。
ただ、残り局数が7で、親番の回数が違ってて結果は微妙です。

次は残り局数4で全員原点のケース。東風戦のトンパツに相当すると思われます。
このケースだと平均順位の良さは0.005なのでほとんどないといってもいいでしょう。
面白いのは半荘収支だと親番続行のほうがいいけど、段位ptだと親番流れの方がいいというところです。
親番をやった方がトップ率とラス率が高いせいなんだろうなぁと解釈してます。
親番がないとトップ率が低いのはわかりますが、ラス率も下がるのはあまり納得はできません。他家の親番に4000オールツモられたらどうしてくれるんだ、と思ってしまいます。おそらくトンパツで満貫引かれたら親かぶりでラス目に落ちてそこから挽回するのが難しい(ラス目には厳しく打たれる)ということだと推測されます。
パラメータ的には次局以降部分については東南戦のデータだけを使っていて、残り局数4だと点差がある程度あって、暫定順位ごとに和了率や打点が違う風に作ってある(トップ目が高和了率低打点、ラス目が低和了率高打点)ので、東風戦のトンパツとして解釈するのはちょっと危険かもしれません。全員原点で同点時の暫定順位は席順によって決めてるのでそのあたりの兼ね合いからも微妙です。

なので、次は点数をばらけさせて、同じように流局させたときの親番続行と親番流れ時の平均順位を調べてみます。
3つ目は自分30000・27000・23000・20000の並びです。
今度は親番流した方が平均順位は0.06くらいいいという結果に。
現状でトップ目で残り局数が少なく、1局でも消化したほうがいいということなんでしょう、多分。
うーん、この微差だと残り3回、他家に親番をさせるのはちょっと怖い気もしますが。
まぁ実際はノーテン罰符で上下3~4000点の変動が大きいと思うので、大概は聴牌流局で連荘した方がいいと思います。(今回は親番を続行した時も流した時も点棒状況が全く一緒でのシミュレーションという意味で条件が異なる。)

最後が自分20000・27000・23000・30000の並びの時。
この場合はさすがに親番続行の方が平均順位が0.1くらいいいです。かなりの大差。
負けてるので、親の高打点にかなりのメリットがあると言えるでしょう。

というわけで、結果的には状況によって親番の価値は違う、という何とも言えない玉虫色の結果に。

局収支の連荘時利益のところ、どうしようかなぁ。
今のところは親番続行について一律でメリットがあるとは言い難いので、連荘時利益をなくす方向で考え中。
一応、今までの結果のログは残っていて、連荘率(和了率+聴牌流局率)は出せるようにはなってるので、シミュレーションをやり直さなくても連荘時利益をなくすことはできなくはない。
もっとも計算用にマクロを全部作ってく必要があるのでそれなりに面倒ですが。
とりあえず気が向いたときにマクロ作って表の修正かけることにして、次回分からは連荘時利益は0点として処理しようかしら。
ポンテンチーテン率、副露数別リーチロン率、その他もろもろ
今日のテーマ一つ目。
ポンやチーした他家がその時点でテンパイしている確率。
従前の初期聴牌率のパラメータのときと同様、リーチ者の有無とリーチ者に対して切ってる無筋と現物の数の別で取ります。
150921-01.png

鳳凰卓の基礎パラメータその14
従前のパラメータは↑の記事を参照のこと。

前と比べて聴牌率は微増のところが多いです。
2副露とかの聴牌率中程度のところの影響が大きめでしょうか。

リーチ後に1副露して無筋が切られた時(無筋数1以上)は聴牌率は5割程度はあってそれなりに大変ですが、
リーチ後の1副露で無筋が切られてない時は聴牌率は2割とか3割程度でそこまででもないです。

次に副露不聴者の副露数別のリーチロン率を見ようと思ったけど、重大なバグが発覚。
(前巡ノーテンだった人が今の巡目でテンパイしたケースが副露不聴扱いになっていた。)
さすがにこれはまずいので、大元の巡目別待ち種別のリーチロン率から取り直しをします。

なお、0副露非リーチ者についてはシミュレーションでも常に不聴扱いしてる(ダマ和了判定はあるけど。)ので、
今回の取り直しでも0副露非リーチなら全部不聴者からのリーチロンの数に入れることにします。
150921-02.png

鳳凰卓の基礎パラメータその17
従前のパラメータは↑の記事を参照のこと。

もろに影響を受けたのが三面張、両面、無筋愚形待ち。1,2割くらいリーチロン率が下がった。
逆に筋待ちや字牌系統はそこまで変わってない。

データ数がそこまで大きく減っているわけでなく、ここ以外はそこまで影響が大きそうでないので、ドラ補正とか枚数補正のパラメータは前のままにしておきます。

それで、本題の副露不聴者の副露数別のリーチロン率。
データ量がそんなに確保できなかったので、巡目別でとるのはやめて、待ち種と副露数別だけにして、ドラ補正とか枚数補正と同じようにあとから掛け算して補正するような形式にしておきます。
150921-03.png
1副露までだとそこまで影響は大きくない(とはいえ、0副露と比べて1割くらいは違う。)けど、2副露とかになると通常時より放銃率1.5倍とかなり強烈です。
さすがにこれを今まで無視してきたのはまずすぎましたね。

今日取ったパラメータをこれからシミュレーションに入れる作業です。
とりあえずここまでで改善案はすべて出尽くしたので、もう一回他家面前不動のリーチをシミュレーションしてみて、合うかどうかを調べてみます。
続タンヤオがらみのくっつき一向聴
150126-01.png
昨日の続き。
比較対象にタンヤオが崩れやすい3sくっつきも加えてみる。

・索子3678sのくっつき一向聴
5m引き フリテン三面張 平和高めタンヤオ
3m4s引き 両面25 タンピン
2s引き 両面14 平和高めタンヤオ
2m引き カン3 タンヤオ
6m引き カン5 タンヤオ
5s引き カン4 タンヤオ
4m3s引き タンヤオ牌シャボ タンヤオ
2p引き タンヤオ牌単騎 タンヤオ
9m1s引きは聴牌取らずとする。
150126-02.png
和了率。
4678sと比べて、受けが1種少ないのと、4sツモでも三面張にならないのとで、
和了率にして約1~3%劣る。
150126-03.png
期待値。
和了率がちょっと低いのと、2sツモでタンヤオが崩れる可能性がある分、期待値も若干下がる。
それでもなお、中順までは聴牌取らずで手替わり待ちを待てる。
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード