*All archives* |  *Admin*

<<05  2017/06  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  07>>
麻雀AI開発その26・自分鳴き処理、中身多分できた
麻雀AI開発の続きです。
再帰パートとシミュレーションパートで自分鳴き処理のところまでたぶんできました。

テスト風景はこんな感じ。
まずは2m3m4m6m7m5p5p6p7s8s9s白白北 ドラ東 1巡目
で、白のポンテンが効く完全一向聴でやります。
170628-01.png
一番左が巡目で、その次が鳴く前の手牌、手牌の次が他家から出て鳴く牌(牌番号1~37)、その右が鳴く対象の相手(自分が0、下家が1、対面が2、上家が3)、最後が鳴き方(100の位、100番台がポン、200番台が出た牌の下二つを晒すチー、300番台がカンチャンチー、400番台が出た牌の上二つを晒すチー、500~700番台が赤を含むチー)と鳴いたときに打つ牌(10の位1の位、牌番号1~37)

再帰パートで上のような鳴く牌リストを作って、シミュレーションパートではその表に載っている牌姿と他家から出た牌の組み合わせが来たら鳴く(載っていなかったらスルー)というような作りです。

この場合だと終盤は全部鳴く、8巡目くらいなら白(牌番号35)だけ鳴く、7巡目以前は白も鳴かないというような鳴く牌リストです。


続いて2m3m4m6m7m4p4p5p8p8p6s7s8s北
タンピンの完全一向聴。

170629-01.png
通常のポンテンチーテン取るのは10巡目くらいから、赤は2巡目とかでも鳴く、的な感じ。
まぁ、そんなところでしょうね。

途中でやっぱりバグが出たのを直しつつ、それっぽい結果が出てきました。

次は二向聴の手牌で、
170629-02.png
まずは手替わり0回の再帰計算。まぁこれはいいとします。
続いて手替わり1回の再帰計算。…、結果が出るのが遅い…。最後まで行くのに30秒とか1分とかかかりました。
ログを見てみて、15万7千行、なんじゃこりゃぁ、多すぎです。そりゃぁ時間かかるわけです。
これを実戦で配備するのは無理っ☆ですね。やっぱり当初の通り、手替わり1回再帰計算はどうしても精密に求めたいとき限定にとどめるのがよさそうです。

まぁ今のところは直すのがきつそうなバグは出なくて済んでいます。
次に手を付けるのは実際に他家から鳴ける牌が出た時にアクションを起こすための関数作りです。
(これは新規作成になるので、設計に少し時間かかるかもしれない。)
それができたらまた例のごとく実際の試合をAIに計算させてのチェック作業ですね。(他家からの鳴きが増えるのでチェックすべき量がえらいことになりそうな気はするが。)
スポンサーサイト
AI開発その25・ダブリーのテストと自分鳴き処理はじめ
今日はダブリー判断について、題材をいただいたので、AIのテストがてらにやってみます。

牌姿は
2m3m4m5m2p4p5p6p7p3s3s3s4s5s ドラ東
2m3m4m5m4p5p6p7p9p3s3s3s4s5s ドラ東

聴牌外しても4連形2つくっつきなので、張り返すのは容易ですが、ダブリーを打つかどうかというものです。
上はすでにタンヤオがついてる、下は聴牌外せばほぼ一方的にタンヤオがつきそう。
170627-01.png
上のタンヤオつく方ならダブリー有利、下のタンヤオつかない方なら聴牌外し有利と出ました。
まぁ、当初の期待通りで満足。


それで、今日あたりから再帰パートで自分の鳴き処理の部分を作り始めています。
前の四麻計算機から構造はほぼそのまま持ってきていますが、変数の型とか使い方が異なるので、そこの部分を現在の仕様にうまく対応させて作っていきます。
まだコードを書いてる段階で、テストできるにはもうちょいかかりますが、
バグがまた発生するだろうし、計算時間がどの程度増えるかも未知数なので怖いですね。
まぁシャンテン数が下がる鳴きしか考慮しないので、そこまで膨大に計算時間が増えることはないと信じてますが。
まずはまともに動くことを祈るのみですね。
麻雀AI開発その24・途中打ち切り処理導入
麻雀AIの続きです。

前回、再帰パートにおいて18巡目までツモれる前提はどうなのか?(それによって愚形役なしドラ3をダマにしてしまう)というのがありました。

なので、再帰パートにおいて一定確率(実測値からパラメータ取得)で他家和了が発生するという処理を新たに加えました。
分類は現在巡目・開始巡目・開始時点他家状態(0~4副露とリーチの5種類)・自分がリーチかどうか・ツモ和了or横移動の5次元です。
自分→他家の放銃については(切る牌に関係なく)ツモ和了率と同等とみなします。
また、他家和了時の失点はすべての和了の平均点(親子のみ分ける)とします。
かなり粗っぽいですが、再帰パートは最適打を求めるためだけにあって、シミュレーションパートでどうせ正確な計算はするので、そこらへんはラフに構えます。

というわけでできたので、テスト。
ペンチャンVSカンチャンの比較です。
170623-01b.png
赤丸が再帰パートの局収支で、黄色丸がシミュレーションパートの局収支です。

ちゃんとペンチャン落としが有利になってくれました。わっふるわっふる。
再帰パートとシミュレーションパートでかなり和了率とか局収支に差がありますが、再帰パートでは他家の攻撃の程度がかなりてきとーなのと、全ツする事前提とか、そのへんじゃないですかね。

次に3p1枚切れのケースにしてみます。
170623-02.png
打2pがいいと出ています。
打2pの後、なにか変化する牌を引くまでは浮いた4pを保持する前提なので、このような結果になっているのかと。ダイレクトペン3s4枚は残したまま、5p引き変化も逃さない、的な。

次に索子面子を788sに変えます。(2シャンテン)
2シャンテンについても変化を考えつつシミュレーションができるのは研究の進歩を感じますね。
170623-03.png
再帰パートでは似たり寄ったりだが、シミュレーションパートでは2p有利らしい。理由は不明。

さて、もうそろそろ自分鳴きを導入するお時間になりますかね。
麻雀AI開発その23・まだまだテストは続く
今日のAIのバグ情報。

(1)牌姿「1278889m12p12789s」を入力値として入れる
→どのペンチャン落としも似たようなもののはずなのに、なぜか打1mor打2mの和了率・局収支が他よりかなり悪い。

原因
再帰パートの処理の順番的にマンズの1mからのツモが先に処理される
→再帰処理の初っ端で4mのツモandツモ切りが連続してノーチャンス壁ができてペン3mの他家からの出上がり率が高いと勘違いしたものが記憶される
→それ以降ピンズソーズツモのときに同じペン3mの牌姿が出てきたときも不当に高いロン和了率の分がそのまま参照される。
というもの。

対処法
再帰パートではツモってきた牌を見えてる枚数+1カウントさせないよう変更。
→無事にどのペンチャン落としでもほぼ同じになってくれた。


(2)牌姿「1278889m24p12789s ドラ8m」を入力値として入れる
→なぜか打2p(カンチャン落としでペンチャン残し)が一番有利と言われる。

原因
残り手替わり回数1回でカン3pの聴牌のときにダマで手替わり待ちをしたがっているご様子。
殿、ご乱心なさいませぬよう。困ったちゃんですねぇ。

対処法?
再帰パートでは18巡目までツモれることが前提になっている。
なので、悠長に手替わりを待つようなダマテンの選択が有利になりやすくなっている。
今後、鳴き判断のことも考えると、途中の巡目で他家の和了が発生する事象まで考慮した方がいいか。
ただし、記憶情報を再利用するため(計算時間短縮のため)に途中の他家の状態変化までは考慮できない。
→何巡か前の状態だけ(現在巡目の状態は問わない)を参照して、現在巡目に他家和了が発生する確率というのをパラメータとして採取する必要がありそう。

これでダマテン病が治ればいいなぁ。
そして、なかなか次の段階に進めず、ストレスがたまる展開です。
麻雀AI開発その22・ログの調査中
AI製作の続きです。
引き続き、1試合通しで計算させたログ(1打1打ごとの評価値)を見て、バグ潰しとかをしていきます。

1試合分のログ16000行のうち6000行くらいまでチェック終わりました。
とりあえず今日のところは重大なバグは出ていなくて小康状態といったところです。

ログをゆっくり眺めているとAIの特徴とか改善点がちょっとずつ見えてきます。

・かなり守備型のAIである。
上がりの可能性が薄い状況で、字牌とか2者に対する端牌現物とかを残したがる傾向がかなり強いです。

例えば次のような状況です。普通なら手牌に何の関係もない1mはツモ切りなんですけど…
170615-01.png
再帰パート(他家和了無視)では余剰牌なしで1mを切るのが圧倒的によくなっていますが、(この段階で1mと3sの二択に絞られる)
シミュレーションパートでは逆転して打3sが有利という結果を返してきます。

中身の数値を見てみると、和了率は7%前後ともともとの数値がかなり低いので、両者そこまで差がつかない一方、
放銃率では1.5%くらい打3sの方がいいということになっています。

現状は全員動きなしなので1mも3sもほぼ通るという一方、聴牌打牌が異なるので、将来の危険牌である3sを先に処理する方が放銃率的に有利である、という計算だと思われます。

ダイレクトのカン2s受けがある場合でさえこれなので、ただの変化(例えば両面+愚形+真ん中浮き牌)でしかない場合はよけいに字牌を残して浮き牌が切られる傾向が強いです。

これだけならまぁそういう(守備型)傾向がある、というだけで済む話なのですが、
さすがにドラの浮き牌とか23赤5s北とかからでも字牌を残してドラを切ろうとするのはいかがなものか、という気がします。
まぁ理屈はわからんでもない(上がりの可能性が低いので打点UPよりも将来の危険牌先切りを優先)のですが、ちょっと釈然としないものがあります。
局収支等の数値の求め方自体はがっちり決まってしまっているので、どうにも修正のしようがない感じです。


・シミュレーションパートの結果のばらつきが結構激しい。
10000回の試行だと局収支で±数十点はふつうにばらつくのですが、細かい牌効率系だと局収支の差がその誤差の範囲内(±数十点)での勝負になることがかなり多いです。
なので、人間の目から見れば明らかな上位互換になる打牌(例えば孤立役牌>孤立オタ風)でもその影響度が小さいと、
ちょっとシミュレーションで片側に上振れ下振れを引くと逆転してしまうケースがかなり多くみられます。
これも構造的な問題なので、すぐに解決はできそうにないです。(シミュレーション回数を増やすのが一番手っ取り早いが、計算時間がかなり増える)


・序盤の手組が実際の打牌となかなか一致しない。
3シャンテン(枚数の多い2打牌候補について手替わり0回再帰計算+シミュレーション)とか4シャンテン以上(一次有効牌の枚数のみ)とかの実際の打牌との一致率が極めて低いです。(体感でたぶん5割もない)
上がりまで遠いので、この時の方がむしろ実際の打ち手は字牌を残して端寄りの浮き牌とかから処理していく傾向が強いです。
また、他家に仕掛けが入った後についても、3シャンテンとかの枚数で2択に絞るところで、枚数のみなので危険度が低い牌を優先して切るみたいなことはできていません。

これについては枚数と危険度の比較なので、一見難しそうですが、手がないわけではないです。
「シャンテン数」と「一次有効牌の枚数」ごとに局収支の実測値をパラメータとして取って、そこから危険度指数(Σ(放銃率×放銃時失点))分だけ差し引けば、危険度との兼ね合いを測ることができる…かもしれないです。

字牌を残す問題については孤立字牌に対して守備力を評価して±何枚かの補正をつける、とか。


現状、こんなところですかね。いつになったら自分鳴き処理に入れるんでしょうね。
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード