*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>>
floodgate for mahjong へ参戦その18・バグ潰し中
AI製作の続きです。
テストで1試合分計算させてみたところ変な挙動をしているところがあったので、その原因を調べるのをここ最近やってました。

バグ1・四人リーチ率の異様な高さ
この(↓)局面で打6m立直を打った時の不聴流局率(四人リーチ流局とトリプルロン流局が入る)が0.5%という高い数値がでていたのでどうしてなのかいろいろいじって調べていました。
170606-02.png
最初は他家が無筋を多く切って立直されやすい環境なのかなーと思って切られ率とかを調べていたのですが、この局面については1m序盤外側、1sワンチャンス、3p6p2枚飛びなので、片無筋4pがカベ効果で切られやすいということで無筋に分類される1mと1sと4pが出やすい部類になっているようでした。

ただ、四人リーチ率の実測値を調べると(1軒目の立直がかかった時点で他3人が非リーチ面前のときに局結果が四人リーチかどうかをカウントする)、
170606-01.png
0.05%あたりの数値なので、一けたも違います。
いやいや、いくらなんでも場況的な問題だけで一けたは変わらんだろうと。

実際、他の面前聴牌の局面でもAIの不聴流局率が0.1%はおおむね越えてました。
何か構造的な問題が起きてるんだろうなーと、さんざん悩んだのですが、ようやくバグの原因を特定できました。

「自分が1軒目の立直の時の先制立直からの経過巡目が自分の番が回ってきても正しく+1されていなかった」
そりゃぁ、常にリーチ経過巡目が0(リーチ直後の状態)だったら追っかけリーチ発生率がものすごく高くなるわけです。

バグのやばさ度合い「相手リーチに字牌で放銃したらリーチ一発チートイ裏裏だったとき」


バグ2・1235m445r56p23457s ドラ5mから打2sが推奨される問題。
これは問題が漠然としてるので、原因特定が難しかったです。
再帰パートでブレークポイントを設定して途中で止めるにしても、疑似再帰処理(実際はループで作ってる)がいろんなところを行ったり来たりしているのでデバッグもしづらいと。

とりあえずわかりやすい残り1巡の場合でやってみる。
→それでも2sが局収支高いと出る。(25sで聴牌できる分、打7sが有利なはずなのだが。)

最後の1巡のツモ牌ごとに局収支・和了率・聴牌率を見てみる
→?!なぜか打7sのときツモ2sが聴牌になってない。

1235m445r56p2345sの形での記憶されてる有効牌を見てみる
→やっぱり2sだけ有効牌になってない。

有効牌計算関数の中に入って1行ずつ動かしてみる

とステップを踏んでようやく原因の特定できました。
有効牌計算関数の中の非孤立牌計算(面子手有効牌となりうる距離±2以内のものだけを取り出す)が全くのでたらめなことをやってました…。
Boolean型の判定で数牌のところで間違えてNotをつけてしまっていた+赤5牌の影響でビットシフト演算が一けたずれていた。

有効牌計算とかいう根幹にかかわる関数がまったくでたらめだったという衝撃は半端なかったです。
むしろなんで今までエラーで止まるなどせずに1試合走破できたのかが不思議なくらいです。

ちょっとこれから有効牌計算関数を集中的にテストして方がよさそうです。

バグのやばさ度合い「白ポンの他家がいるときに先制リーチをかけたら発中を続けてポンされた上にツモられてパオで全額払いとなったとき」
まじで狂気じみてるやばさだ…。本当に今の時点で見つかってよかった…。

一見地味に見える違和感が実は超重大なバグだったという。こういうのがあるとまだ見つかってないやばいバグがまだあるんじゃないか、と不安でしょうがないです。
スポンサーサイト
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード