*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>>
麻雀AI開発その45・点棒状況判断
今回は点棒状況判断(試合終了時収支)を入れました。

関数自体は既存の局収支シミュレーションをそのまま流用しただけです。
170731-01.png
判断基準を「半荘収支」・「平均順位」・「段位pt」・「局収支」から選べるようにしました。
とりあえずデフォルト値は平均順位にしました。
今までは局収支が最も高くなる打牌候補、だったのが、平均順位が最もよくなる打牌候補を選ぶようになりました。(ただし、シミュレーション可能な2シャンテン以下に限る。)

表示する内容が増えたので、評価値の表示の画面がだいぶ横長になってしまいました。これはやむなしかなぁ。


当分の間はソフトのテストを重ねるため、前まで天鳳打ってた時間をAI相手に対局するのに充てることにしました。私の実力が安定7段と仮定した場合に、AIがどの程度健闘できるかを見たいところです。
とはいっても、100試合くらいじゃ、偶然性が強すぎて参考にならんかもしれないので、やっぱり実力測定のためにはfloodgateでいっぱい打たせるしかないんだろうなぁ。そうなると、floodgate専用の2台目のパソコンが欲しくなってくる今日この頃。
スポンサーサイト
麻雀AI開発その44・実戦譜と打牌選好力
昨日の続きです。
昨日求めた打牌選好力関数を実際の局面に当てはめて調べてみます。
170730-01.png
一向聴VS1副露。
再帰局収支が高く、危険度がそこまででもない9sが一番選ばれやすい。6mが次点。
170730-02.png
二向聴VS1副露。
再帰局収支に大差がないので、いろいろな打牌候補に切られ率がばらけている。
手をそこまで崩さず、安全度も高い9sが優勢。
170730-03.png
聴牌VS1軒リーチ。
7s押しもないわけではないが、1sか9sで降りるのが優勢。
170730-04.png
一向聴VS1軒リーチ。
押すのにほとんど価値がない(再帰局収支が大差ない)ので、だいたい降りる打牌になる。筋3mも切らない。
170730-05.png
一向聴VS1軒リーチ。
ここも7pは押さない。大半は現物の3m。
170730-06.png
一向聴VS2副露。
MAX押しの2pか、完全安牌でシャンテン戻しの6sか。
170730-07.png
一向聴VS2副露。
MAX押しの8sが優位。次点が5m。
170730-08.png
一向聴VS1軒リーチ。
4mも2sもリーチに対しては現物。普通の完全一向聴の2sか、フリテン三面張を残す4mか。
170730-09.png
一向聴VS1軒リーチ。
三色を残して目いっぱいの8m(序盤外側+カベ効果でかなり危険度が低い。)か、現物の1sか。
170730-10.png
一向聴VS2副露。
MAXに押す9mか4sの2択。

実際にこれを導入するときは完全下位互換(再帰局収支も危険度指数もどちらもある候補より悪い候補の牌)については切る牌候補から除外するなどの工夫はやった方がいいかもしれません。(完全下位互換ではあるが、最善手よりほんのわずかに悪いだけの牌がそれなりの打牌選好力を獲得しているので。)

次やることリスト。
・シミュレーションパートに点棒状況判断を入れる。
・シミュレーションパートで押し引き判断に打牌選好力を導入する。
・AIの強さ測定のためにfloodgateに接続する関数を整備する。(しばらく前から放置していたので、鳴き判断を中心に整備する必要がある。)
・序盤手組の理論作りとデータ取り。
麻雀AI開発その43・打牌選好力パラメータと等高線グラフ
昨日の続きです。シャンテン数と他家最大攻撃で振り分けたcsvデータに対して、それぞれ準ニュートン法のマクロを使ってa~eのパラメータを求めます。

結果がこちら。
170729-04.png
とはいっても、これだけだとどの程度適合しているかはわかりませんね。

そこでグラフにして可視化してみようと思います。
入力値は(x,y)に対して出力値f(x,y)の3次元データです。
ですので、等高線グラフとしてみてみたいと思います。
ただし、出力値については式の形が指数関数で、打牌として適してない入力値に対しては極めて小さな値になって比較しづらいので、対数をとったもの(つまり指数の肩の二次関数)で代用します。
170729-01.png
グラフの見方を説明します。
縦軸(-3000~3000)が再帰局収支(x)、横軸が(0~2000)
同色になっている帯は出力値が同程度(とはいってもその間でもeの6乗というかなり大きな差がありますが)になる(x,y)の組です。

例えば、聴牌・対1軒リーチで(-500,0)の点(攻めに関してはあまり価値が高くないが切る牌は完全安牌)は黄色と緑色の境目ですが、同じ黄色と緑色の境目をたどっていくと、(500,800)の点(初手切る牌は通常無筋程度で、攻めに関する手牌価値はさきほどの+1000点分)とか、(1300,1500)の点(初手切る牌は無筋456程度で、攻めに関する手牌価値はさきほどの+1800点分)が同程度の打牌選好力になる点になります。

同じ高さ(y)である点から右側に進むほど、同じ初手危険度に対して再帰局収支が上がっていきます。
もちろん、yが同じならば再帰局収支が高いほど打牌選好力は高いのですが、グラフを横に見た時に等高線が密である(等高線の間隔が狭い)ほど、再帰局収支が少しでも上がると急激に打牌選好力が上がる(下位の牌が乱数によって選ばれる余地がほとんどなくなる)、
逆に等高線が疎であるほど、同じ程度打牌選好力を上げるためには多くの再帰局収支が必要ということです。

また縦方向(初手危険度)についても同様のことが言えます。

打牌選好力は他の牌との相対的なものなので、具体的な値(色)はそこまで重要ではなく、それぞれの牌ごとの点の色域を比較してどちらがより右側に当たる色域になるか、境界線の傾き(押しと降りのバランス)、また境界線を何回またいだかどうか(両者の差)、が重要になります。

では、具体的にグラフを見ていきます。
聴牌についてはどのグラフもそこまで大きな差ではなさそうです。
強いて言えば、対1副露だと他のグラフより縦方向に疎なので、危険度より自分の手牌価値を重視する、という感じでしょうか。
一向聴とか二向聴のグラフよりは等高線の感覚が疎なので、各打牌候補ごとに差がつきにくいということかもしれません。聴牌なので、再帰局収支がmaxになる打牌と手牌を崩すような打牌で再帰局収支が大きく差がつく、ということも大きいです。

続いて一向聴のグラフ。
170729-02.png
・対1副露2副露は縦方向が疎、横方向が密なので、初手危険度より手牌価値の方が重要。
・対1軒リーチは聴牌対1軒リーチと同じようなグラフ形状。一向聴では再帰局収支が聴牌より低く、手牌を崩す打牌の再帰局収支の差が小さいことからすると、一向聴で粘ってちょっとの再帰局収支プラスさせるよりは初手危険度が低いことの方が重要。
・対2軒リーチだとよりその傾向が顕著。(極論すれば手牌価値を上げることにほとんど意味がなく、ひたすら危険度の低い牌を探すことになる。)

続いて二向聴のグラフ。
170729-03.png
二向聴はほとんど再帰局収支マイナスなので、その部分だけに着目すると、
・1副露2副露で手牌価値の高い手に関しては一向聴と同じような感じ。
・1副露2副露で手牌価値の低い手(-1500~-3000点あたり)は一転して危険度重視になる。
・対リーチでは一向聴の時以上に再帰局収支のプラスが全く関係なくなり、危険度重視になる。

というわけで、今のところは直観に反するような事実は出てきていません。
次回は実際の局面を用いて具体的に打牌選好力と切られ確率を見ていきたいと思います。
麻雀AI開発その42・数学的なお話その2
前回(麻雀AI開発その32・数学的なお話(実データから押し引き基準を決める関数を策定))の数学的なお話の続き。
検討ソフトの外形を作っている裏で、押し引きに関する実データを取っていました。取れたのは5000試合分で、目標10000試合にはちょっと届かないけれど、ひとまずこれだけのデータで解析をやってみます。

まずは、実データをシャンテン数と他家最大攻撃ごとに別のデータテーブルに振り分けます。
とりあえず今回着目したのは0シャンテンで他家1軒リーチの場合です。
この場合、全部で45488行のデータになりました。

前回のおさらいから。
入力値(再帰局収支x(14),牌危険度指数y(14),実際に切られた牌番号i)に対して、打牌選好力f(x,y)という関数を定義して、以下で示す対数尤度を最大化するf(x,y)のパラメータを決定するのが目的です。
170728-01.png
前回は打牌選好力の性質から2次関数の形にするのがいいだろうというところまで議論が進みましたが、
170728-02.png
これだと、対数の真数条件(f(x,y)が常に正の値)を満たすために不等号制約条件が必要になるので問題が難しくなります。

・常に正の値を取る関数
・できれば極端な値になるほど急激に値が大きくなる関数
という条件でなんとかならないか、と考えていたら、指数関数を使えばうまいこといくんじゃない?と思いつきました。

つまりは、こういうことです。
170728-03.png
expのべき乗なので、どのようなx,yに対してもf(x,y)は確実に正の値です。
expの中身は1次関数にしてもよかったのですが、「極端な値になるほど急激に値が大きくなる」というのを表現したい(1次関数だと低攻撃力低危険度・高攻撃力高危険度・中攻撃力中危険度が同じような打牌選好力になりやすい。)ので、2次関数は維持しました。
これだと中途半端戦略な中攻撃力中危険度の牌の打牌選好力を落とすことができるのではないかと考えました。
h(x,y)、g_j(x,y)、g(x,y)を次のように定義しておくと、
170728-04.png
最初の最大化したい関数は次のように変形できます。
170728-05.png
第1項(実際に切られた牌iに関する項)はlogとexpが相殺して簡単に書けます。
第2項についてはexpの中にΣがあるので、簡単にばらすことはできません。

↑の関数をパラメータa,b,c,d,e,fの6変数関数と見た時(逆にx,y,iについては実データそのものを代入して計算する)に、最も値が大きくなるような(a,b,c,d,e,f)の組を求めます。
このような問題は一般的には最適化問題とか最小値(最大値)問題と呼ばれます。

最適化問題を解く解法として、準ニュートン法(BFGS公式)というものを使います。(理解するのが大変だった…。)
準ニュートン法について詳しくは各自で調べてください、ということにしておきます。(ここからはかなり説明を端折ります)

準ニュートン法を使うためには対数尤度をそれぞれのパラメータで偏微分した関数が必要になります。
例えばaで偏微分したものがこんな感じです。
170728-06.png
そこまで難しい関数ではないです。

特に定数項のfで微分した場合、第2項の分子分母にg(x,y)が出て、約分できて、第1項と第2項が全く同じになるので恒等的に0になります。
つまりfはどんな値でも対数尤度に影響しない(実際、定数項のexp(f)を掛け算で外に出せて第1項と打ち消しあってくれる。)ということです。以降はf=0として、変数が6つから5つに減ります。

なお、この計算式をそのまま使うとg_j(x,y)の計算で大きい数字の指数演算を先にするので、計算機上で数値がオーバーフローします。
そのため、次のような工夫を施します。
・入力値はx,yとも±1000前後の値を取るので、数値の入力前にあらかじめ1000で割ってある程度数値を標準化(±1前後の値を取る)する。
・式の形的に指数の内部で定数項を抜き出すと、expとlogが打ち消しあって、抜き出した定数項の引き算が出てくる。
この性質を使ってg_{1}~g_{14}までの中で最も大となるものを定数項として引いて(これによりΣg_jは高々14までで、大半のケースで、2を超えることはない。)指数計算と対数計算を行い、最後に抜き出した定数項を足し算する。

こうした工夫をしたのち、BFGS公式に当てはめます。その結果がこちら。大体、計算終了まで1分くらいです。
170728-10.png
上5行が動かすパラメータで、初期値は全部0からスタートして、そこの偏微分とヘッセ行列の逆行列の近似H_mから次の最小パラメータ組候補(2列目以降)を帰納的に求めていきます。

真ん中行が最大化すべき対数尤度の-1倍(最小値問題として扱っているサイトが多かったので、最大値問題を最小値に置き換えるため-1倍する。)。回数が増えるごとにどんどん値が小さくなっていき、最終的にある点に収束することが分かります。
(何度か別の初期値でやってみたけど、同じところに収束したのでたぶんだいじょうぶそう。)

下5行がそれぞれのパラメータで偏微分した値。最初のうちは±の値が大きめになっていますが、回数が増えるごとにだんだん0に近づいていく(その近傍で曲面が平らになっている)のが分かります。


というわけで無事に尤度が最大となる、パラメータの組(a,b,c,d,e)を求めることができました。
では、実際にこのパラメータと打牌選好力関数f(x,y)を使ってどの程度まともに判断を下すことができるかを見てみます。
170728-07b.png
攻めるなら打1m、守るのも打1mが有利(6pはリーチの現物だが、他の二人に通ってなくて、1mが3巡以内捨て牌の外側&2枚+1枚カベ効果でかなり危険度が低い)です。

これくらい明らかに打1mのケースで、打1mの(他の牌との相対的な)打牌選好力は他の打牌候補の打牌選択力と比べて桁違いになっています。1mが切られる確率(1mの打牌選好力÷全打牌候補の打牌選好力の和)は99.2%ということです。

シミュレーションパートでこれを入れる場合、再帰局収支(上がりや聴牌を考える打牌については再帰パートですでに求められている。手牌を崩す場合はてきとうにマイナスの大きい再帰局収支、例えば-3000点とかにする。)と危険度指数(シミュレーションパートで毎順求める)について全打牌候補に対して計算し、そこで乱数を1回振って打牌を決める(この場合は99.2%の高確率で1mが選択される)、という手順になるかと思います。
現行の手順(総放銃率を計算して定数%より高いかどうかだけを見る)よりは時間がかかりそうです。

次の例。次順に6mを引いたところ。
170728-08b.png
攻めるなら打6mだが、両無筋で危険度がかなり高い。現物は4m・6pだがどちらも切ればほぼ上がりはない。中途半端戦略の打3mもある。

この場合は打6mが40%、打4mが35%、打6pが10%、打3mが6%という切られる確率になっています。
2次関数にしている効果か、最大限攻めの打6mと最大限降りの打4mが選ばれる確率がやや高いです。

実際にシミュレーションで出会ったらどっちを選択するかは乱数の機嫌しだいというところでしょうか。

最後の例。
170728-09b.png
3pが現物…のはずが、なんか反映されてないくさくて、危険度指数がやけに高くなってます。
これはAI側のバグっぽいので修正しておきましょう。(やっぱりテストは大事ですなぁ。)

仮に3pが現物でないとしたら現物はないので(なお赤5切りで7sの危険度が下がるのはAIの思考としてまだ入ってないです。)、最大限に攻める打6pの打牌選好力・切られ率が高いということです。


今回は自手聴牌・対1軒リーチですけど、他にも一向聴・二向聴と他家1~4副露・ドラポン・2軒リーチがあるので、21パターンのうちまだ1パターンしかやっていません。
すでに準ニュートン法のマクロは組めていて、データテーブルを変えてからマクロを起動して1分待つの×20回なので、まぁほどなくパラメータは求まるでしょう。
麻雀AI開発その41・グラフィックの作成その3
麻雀AIの続きです。
昨日、今日と、わりとがんばったので、グラフィックがかなり進展しました。

他家の手牌と捨て牌部分を自分と同じように作って、中央に局情報(局・本場・供託・残り山・ドラ表示牌)と各人の情報(風・得点・名前)を置きました。
卓のサイズはやっぱりほぼ正方形のでかいサイズが必要になったので、メインフォームのサイズをでかくして、いらないテキストボックスとかを横によけておきました。
挙動が安定したら手牌とか捨て牌のテキストボックスはリストラできるでしょう。
また、1順前の捨て牌について、手出し牌は牌の下に水色線を引きました。(1順回ってきて捨て牌の画像が更新されるタイミングで、水色線の手出し情報は見えなくなる。)
170725-01.png
やっぱり実際の牌の画像を使うと麻雀をやってる感が出てとても良いです。

従前のように切ることができる牌をリスト化したコンボボックスから1牌選択して「切る」ボタンを押すのが手間なので、
自分の手牌の画像を直接クリックして切ることができるようにしました。
また、グラフィック化したので、他家の切った牌と自分のツモ牌の情報をメッセージボックスで逐一出していたのをやめました。
(鳴きとリーチについては従前通り、メッセージボックスを出す。)
ちょっと対局がさくさく進む…かもしれないです。ただ、肝心のAI本体の計算時間がかなりかかるので、全体としてはそんなにスピードアップはしてないかもしれないですが。

また、鳴き無しボタン、自動和了ボタン、リーチ後ツモ切りボタンといった細かいオプションも用意。
170725-02.png
この局は手が悪かったので回し気味に聴牌取りにいってたら、なんか知らないけど、上がりまで拾えた。
170725-03.png
東3局、自分の親番で満貫被ツモ親かぶり。ダマ愚形5200をしっかりダマにしてくるAIちゃん。
170725-04.png
オーラスもドラポンと親リーチに囲まれて無筋をたくさん引かされて大変だったけど、無事に上がって2着。
牌譜の出力も成功。
170725-05.png

挙動が安定するまでしばらくテストは必要になるだろうけれど、とりあえず牌譜検討ソフトとして、AIとの対戦機能・牌譜の再生機能・AIの評価値を表示する機能の骨組みはこれでできたことになります。
画像処理とかでもっと手間取るかと思ってましたが、ものすごく順調に進んでいます。

それで、検討ソフトの骨組みを作る作業と並行して細かい押し引きを決めるための基礎データ集めをやっているのですが、こっちの方はなかなか進まないです。1日に300試合くらいしか進まなくて、今のところもうちょっとで目標の半分である5000試合が見えてくるというところです。
(グラフィックのコード作りとテストの試合をがりがりやってたせいか、今日は特に進みが遅いです。今晩は天鳳できなさそう。)
ずっと何もせずに待ってるだけというのも退屈なので、目の前に見えてる5000試合でいったん妥協してcsvファイルの振り分けとエクセルソルバーにがんばってもらうのをやろうか。それで使えそうなデータだったら詳細押し引きを組み込むと。
ダメそうならもうちょっと試合数を追加すると。

その次は序盤(2シャンテン以上)の手組をどうするかを考えたいです。3シャンテンのほぼ受け入れ枚数だけのてきとうな打牌選択とか、2シャンテン手替わりなし再帰計算の全数探索でかなり時間を食うのがストレスなので、そこをうまいこと改善したいです。今のところ考えているのは、牌の種類とかその牌を切ることによる一次有効牌の減少数とかまわりの牌の有無とかで、実測値からスコア化して、そのスコアが一番いいものを打牌として選ぶみたいな。それだけだと手役(特に三色・一通・チャンタあたりの鳴ける手役)がおろそかになりそうなので、そこも多少は考えつつ。(まぁ、これは後で付け足しとかでもいいかな。)
まだ数学的にちゃんとできる目途は立ってないですが。
こっちは理論さえうまいこといければ実測牌譜を再帰計算するみたいな超時間がかかるようなことにはならないはず。
通常の牌譜解析と同レベル、でできればいいなぁ。

検討ソフトの骨組みの方はテストで試合を重ねて挙動を安定させるのとか、まだ考慮できてないルール作り(途中流局とか、パオとか)を作るところとかです。
後は他家がカンすることを考慮してないのもなんとかしないといけないか。

とはいえ、まだ粗いですけど、まぁひとまずはうまくいってよかったよかった。
麻雀AI開発その40・グラフィックの作成その2
麻雀AI開発の続きです。
今回は副露部分手牌と自分捨て牌のグラフィックを作りました。

捨て牌はこんな感じ。
リーチ宣言牌(宣言牌が鳴かれたら次の捨て牌)を時計回り90度回転して、鳴かれた牌は捨て牌の見た目から消しています。
また、リーチ宣言牌が鳴かれて、次のツモ番が回ってくるまで横に曲がってる牌がなくてリーチ状態かどうか判別できないのは困るので、捨て牌1段目のすぐ上にリー棒を置くスペースを作っておきました。
170724-01.png

副露手牌はこんな感じ。

横幅が一番多く必要になるケースは4つ大明槓で晒してかつ、自分のツモ番(手の内の牌は2枚)のケース。
最大横幅に合わせてあるので、普通にポンとかチーの仕掛けだけだとかなりスペースが空いてスカスカに見える。

また、縦幅が一番大きくなるのは加カンが入ったケース(横向き牌2個分)なので、ちょっと上側にもスペースが空いてます。
170724-02.png

始点のx座標y座標が(27,10)で、牌の縦幅と横幅が何ピクセルで…、的な計算が地味にめんどくさいですが、まぁ順調に行ってる感じです。
今の調子で他家の捨て牌とか手牌を作っていくとスペースが足りない可能性が高いので、邪魔になるテキストボックスとかを消したりどっかに移すとかしたり、元フォームのサイズをでかくするとかの工夫が必要になりそうです。
麻雀AI開発その39・牌譜再生機能(評価値の表示その2とグラフィック作成のはじめ)
麻雀AI開発の続きです。牌譜再生機能の続きで、AIの思考関数をかなり作り変えました。

○やったこと
・シャンテンを維持できる全部の打牌候補を計算する
・再帰パートでの結果がいいものから優先して計算して、計算済みのものから順次途中経過を表示する。
・計算の途中キャンセル機能を付ける
・計算した内容をテキストファイルに書き込む機能を付けた。
・現在のツモ番の人を赤文字にして、切った直後の状態(鳴きの考慮中)を青文字にした。

いやー、だいぶがんばったですよ。

天鳳で自分が打った牌譜をテキストに保存して貼り付けた。
牌譜がたくさんあるとなんとなくうれしくなる。
170723-02.png
見た目はそんなに変わってないけど、中ではいろいろ苦労というか改善してます。
この例では2シャンテンで全部の打牌候補を計算。計算の途中キャンセルも可能。
170723-03.png
書き込みボタンを押したら、ここに載ってる情報がそのままテキストファイルに出力される。
170723-04.png
今のところはおかしな挙動は出てなくて、だいじょうぶそうです。もうちょっとテストした方がいいですけど。

続いてグラフィックの作成に移ろうかと思います。
さすがにテキストボックスでの文字列の羅列では麻雀するのにしんどいので。

牌画はこちら(http://majandofu.com/mahjong-images)のものをお借りしました。

画像処理は初めてなので、四苦八苦しながらなんとか自分手牌(副露部分以外)を表示させることに成功しました。
170723-05.png
わーいわーい。
これで、他の部分も技術的になんとかなりそうな目途が立ちました。
後は1個1個個別に作っていけばそれっぽいのができそうです。
麻雀AI開発その38・牌譜再生機能(評価値の表示その1)
麻雀AI開発の続きです。牌譜再生機能の続きで、前回までで牌譜をそのままなぞるところまでできたので、
今回は場面ごとの評価値を表示する機能を作ります。

牌譜再生モードで、直前の行動がツモorチーorポンのときに評価値を計算して別のフォームに計算内容を表示します。
(もともとのフォームの中央部分は後々グラフィックの作成のために空けておきました。)
170721-01.png
とりあえずそれっぽくはなってる。
170721-02.png
呼び出す関数は対局機能のときのAIの思考関数をそのまま流用しているので、今のところシミュレーションパートは上位2つの打牌候補のみしか出てこないです。これだと第三の選択との比較がしづらいので、牌譜再生モード内では全部の打牌候補を計算するようにしようか。
ついでに再帰パートでの結果がいいものから優先して計算するとか、計算できたものから順次表示するとか、計算の途中キャンセル機能を付けるとか、まだ改良の余地がありそうです。

とりあえず技術的なところはなんとかなりそうでなにより。後は地道な改善の作業をしていきましょうか。
1軒リーチに対するチートイ聴牌の挙動
今回は他家リーチが入ってる時に不意にチートイのみ聴牌が入った時の対処を考えてみたいと思います。

次の3つの対処法を考えてみます。

・即リーチ
そのまま。説明は不要かと。

・攻めダマ
この1巡はダマ。次に引いてきた牌がより上がりやすい牌(具体的には(1順当たりツモ率)+3×(1順当たりロン率)の値が今の待ち牌より上がる時)のとき、待ちを変える。
また、ある程度いい手替わり((1順当たりツモ率)+3×(1順当たりロン率)の値が6%以上)である場合はそこでリーチする。
ドラ単騎になった場合も待ち変えしてリーチする。
降りは考慮しない。

・守りダマ
この1巡はダマ。次に引いてきた牌と今の待ち牌を比べて、先制リーチ者に対する危険度が低い方を切る。
切るべき牌の危険度が5%を超える場合はテンパイを崩して降りる。
ドラ単騎になった場合は待ち変えしてリーチする(ただし、切る牌の危険度が5%を超える場合は降りる条件は適用される。)

最初の待ち牌は2枚見え字牌、生牌無筋19、生牌無筋456の3種類で調べてみようと思います。
初手は完全安牌で固定します。

まずは2枚見え字牌単騎の場合。
170720-01.png
ほぼ全ての状況で即リーチするのが有利になっています。

もともと最高レベルに上がりやすい牌なので、(攻める)ダマにしても有効な手替わりはほとんどなく(ドラ単騎くらい)、それなら最初からリーチした方がいいと。

また、守りのダマにするにしても、今の待ち牌(2枚見え字牌)は安全度が高いので、1回までは待ち変えで聴牌維持が効くものの、その後が続かず結局降りに回らされることが多いです。
なので、即ベタ降りよりはちょっとマシ、というくらいの局収支にしかならず、リーチチートイ字牌待ちで十分なプラスがある局収支に比べて大きく劣る、というような感じです。


続いて、無筋19単騎。
170720-02.png
まだ即リーチがいいようですが、かなり攻めダマも接近してきています。

自分の捨て牌にもよりますが、仮に攻めダマにして待ちにできる字牌を引ければ(1順当たり約10%くらい)、無筋19をぶった切って勝負になると。

守りダマに関しては中盤以降は降り移行条件に引っかかって無筋19すら切れなくなる(6巡目で大きな断層があるのはこのため)ので、次に危険牌を引くまでの、この瞬間しか上がりがないので、ベタ降りよりわずかにマシというくらいで、かなり苦しいです。


最後に無筋456待ち。
170720-03.png
序盤は攻めダマ有利、中盤はどちらでも、終盤は即リーチが有利です。

序盤については手替わり牌がかなり多くあり、リーチに行けるくらいいい待ちになる手替わりもそこそこあります。
また、攻めの手替わりのためには無筋456を切る必要がありますが、序盤なら1枚の無筋456の危険度も控えめなので押しやすい、ということも大きいです。

終盤についてはフリテンだったり、場に多く見えてたりして手替わりの質・量が序盤より落ちますし、なにより、危険度が高い無筋456を押さないといけないというのがきついです。それならもう真ん中の単騎でもリーチしちゃった方が逆に安全というところまであります。

守りダマについてはだいたい無筋19と同じで、この瞬間でしか上がりがなく(しかも両脇からはほぼでない待ち)、次に危険牌を引いたら終了なので、やっぱり3200(4800)の愚形即リーチよりは見劣りします。
(ただ、字牌待ちとかと比べるとだいぶ差が縮まってきているので、愚形2600聴牌を追っかけない派の人なら守りダマをするのも一考かと思います。)

対親リーチの場合を追記
そこまで大きくは変化はないです。

170720-04.png
麻雀AI開発その37・牌譜再生機能(局内処理)
麻雀AI開発の続きです。牌譜再生機能の続きで、局内の処理(ツモとか切るとかリーチとか上がりとか)を牌譜を読み込んで追っていくところまでできました。
ほとんど牌譜解析プログラムからの流用で行けたのでわりとスムーズにできました。

牌譜再生モード時に「back」「next」ボタンを追加。
170719-01.png
「next」を1回押すと一コマ分、牌譜を再生する。
「back」を1回押すと一コマ分、戻った場面が表示される。(ただし、内部処理的には「一コマ戻る」のを一から作るのがめんどうだったので、配牌から1個前のところまでを再度再生し直す方式にしておいた。)
170719-02.png
無事に上がりまで再生成功。
「next」ボタンを何十回と連打するのがややめんどうではあるが。
170719-03.png

思った以上に作業が順調に進んでいます。(こういうときに落とし穴が待っているのはありがちなパターンですが。)
次はある局面で止めた時にAIに計算させて結果を表示する機能を作るところです。
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード