*All archives* |  *Admin*

<<09  2017/10  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  11>>
floodgate for mahjong へ参戦その8・バグ取りとかテストとか
昨日の赤5の危険度のバグは既存部分(カベ効果補正のパラメータで引数の順番を間違えてた)に潜んでいて、発見するのに苦労しました。

円滑にデバッグをするために、コンソール上で表示してる文字列をログのテキストファイルに出力して、
さらに、そのログをファイルから読み取って前の試合の局面を再現できる機能をつけました。

今日もAIに打たせた後、ぼーっとログを眺めていると、なんか聴牌なのにリーチを打ってくれないケースがちょこちょこ見受けられたので、検証してみます。

今日の問題の局面はこちら。
170217-03.png
聴牌なので、ベタ降りはしなくて、ダマ・立直・聴牌外しのどれかを選択するところです。

上家の立直を無視するならドラ2sがあまり残ってなくて、3sは見た目は4枚生きてるので、7mか西を切って3s待ちリーチするところ(ツモで点パネのため打7mか)…と思いきや、AIは4s切りダマを選択しました。

この局面について、各選択肢ごとに局収支・和了率・和了時平均得点をウォッチしてみます。
170217-04.png
観測された値を見てみると、
確かに打4sダマが一番局収支の数値が大きくなってます。

ただ、和了率(ここでは他家を無視した一人麻雀再帰計算におけるツモだけの和了率)では打7mリーチが23%くらいで、
上がれない確率が77%もあるので、リーチ棒を失う影響がかなり大きく(1000点×77%で770点分)、リーチによる打点上昇の影響よりも大きいということが表れている、のだと思います。

ただ、これは一人麻雀の結果であって、他家からのロンを一切考慮してない(特に今回はダマだと役がないので、リーチで1ハン縛りを解消してロン和了も狙うメリットが大きい)のはやっぱり問題ですね。
現状は他家からのロンをまだ実装できてないので、この結果はまぁしょうがないということにしましょう。

次は他家からのロンを加味させるのをやることにしましょう。
その前に、ベタ降り移行するアルゴリズムをただの「1シャンテン以上」からちゃんとしたものにしようかと思っています。

具体的には今自作AIのテスト相手である「manue」というAIの思考パターンをちょっと拝借しようかと思っています。
それは、他家の攻撃を一切考慮しない時の局収支(これは今の再帰式で求めることができる)と切ろうとしてる牌の危険度と放銃時失点(これもベタ降りプログラムで関数化している)の3つの数値から以下の値を計算して、
(1-危険度)×(他家無視局収支)-(危険度)×(放銃時失点)
この値が最大となる打牌を選ぶというアルゴリズムです。

これによって、最大限攻めるパターン(危険度は高いが他家無視局収支も高い)とベタ降り(危険度はほぼ0だが、他家無視局収支はノーテン罰符と同等レベルのマイナス点)とその中間パターンで一番よさそうなものが自動的に選ばれると思われます。

このアルゴリズムのいいところはそれぞれの打牌候補について再帰計算ができていれば、追加の計算時間はほぼ0で攻守のバランスがある程度考えられるという点です。

ただ、悪いところもあります(参考にさせていただいて自分で使う上での課題を述べているだけで、manueの悪口をことさら喧伝しようという意図ではないです)。
それは、
・被ツモを全く考慮してない。(本家manueの方に入ってるかどうかは不明)
・瞬間の危険度のみを考えているので、将来の他家の挙動の要素が全く入っていない
・鳴かれる可能性の多寡が入っていない?(これは未確認)
・点棒状況判断ができない。
ということです。

2つ目について補足すると、押した場合と降りた場合では平均局終了巡目が変わってくるのに、この巡目以降に引いてくる危険牌のことや被ツモのことを考えてないのはどうかということです。
一般には降りる方が局が長引きやすく、将来の失点が大きくなると考えられます。

このへんを全部考慮するにはシミュレーションで挙動を確認するのが一番いいのですが、
シミュレーションの欠点として、計算時間が余分に(それもそこそこのお時間)かかってしまうということです。
打牌候補が多いほど、線形的に計算時間は増えていくので、
現実的にはmanue方式で簡易的に瞬間的危険度を入れた局収支を計算した後、
上位2つの打牌候補とか、局収支が微差の打牌候補についてのみ、正式なシミュレーションをやるというのが落としどころでしょうかね。

どっちにしても他家からロン・鳴きの影響は重大なので近いうちに実装を試みます。
他家の将来の挙動についてはどうしたものかなぁと考えています。

再帰計算だと流局までツモれるのが前提としていて、これはあんまりよくないのですが、
他家状態(非リーチ面前・立直・副露)についてまで分類を増やして、全数探索で再帰計算すると同一局面が発生しにくくなって計算時間が爆発的に増えてしまうので、そういう方向性はとれません。

今プランとして考えているのは、現在の局面における他家状態の組み合わせに対して、自分が和了しないという条件付きでの局終了巡目と局終了時得失点(自分の和了がないのでだいたいマイナス)を実測値から測定して、その確率に応じて途中で局の打ち切りを行うというのを考えています。
うまくいくかはよくわかりません。

とまぁ、いろいろと考えるべきことはありますが、ちょっとずつ消化していきましょう。
スポンサーサイト

コメントの投稿

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

コメント

プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード