FC2ブログ

*All archives* |  *Admin*

<<07  2017/08  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  09>>
麻雀AI開発その53・評価値関数をAIに搭載(鳴き判断)
前回の続きです。
今度は鳴ける牌が出た時の評価値を同様に調べていきます。


170812-05.png
出5m。
役が見込めないのでスルー。
170812-06.png
出1m。
発対子。どうあがいても鳴くことになりそうなので、1mから仕掛けで問題なさそう。
170812-07.png
出白。
8s対子落としでホンイツ一直線の手もあるけど、2pが苦しいのでまぁAIの回答通り、とりあえず打1pでよさそう。
170812-08.png
出7s。
タンヤオ確定なので、たぶん鳴いた方がいいと思うのですが…。AIはスルーと言ってます。
170812-09.png
まだあまり数はチェックできていませんが、ちょっと気になる点があるのでいったんチェック作業を止めました。

正答率自体はそこまで悪くないですが、ツモへの打牌時と比べて、致命的なミスがちょくちょく見受けられます。
誤答になってるとき、人間(私)が考える最善手とAIの最善手との評価値の開きがかなり大きめになってるケースが多いです。

従前の役なしなのに鳴いてしまってるケースはかなり減ったけれど、まだたまーに散見されます。
全体的に鳴きすぎな感じはあるので、もうちょっとスルー寄り(面前側に有利)に調整した方がいいかもしれません。

具体的には、副露役なしフラグを少し変えようかと思っています。
今だと、手役「あり」と「なし」の2択のみで、
以下の条件のいずれかにあてはまっているときはすべて手役「あり」と判定しています。
・役牌対子以上がある。
・タンヤオ限定シャンテン数が全シャンテン数+1以下
・一色限定シャンテン数が全シャンテン数+2以下
・トイトイ限定シャンテン数が3以下
・三色or一通の出来パーツが7以上
・チャンタ限定シャンテン数が全シャンテン数+1以下

これを手役「確定」、「不確定」、「なし」の3択に変えようかと思っています。
「不確定」の条件は、↑の条件を満たしていてかつ、
・役牌刻子なし役牌対子あり
・タンヤオ限定シャンテン数=全シャンテン数+1
・一色限定シャンテン数=全シャンテン数+2
・チャンタ限定シャンテン数=全シャンテン数+1
のいずれかを満たす場合。

手役「不確定」の場合、単純減算で評価値にマイナス補正をかける方向で考えています。
(手役「なし」なら「シャンテン数と一次有効牌枚数」・「牌エネルギー」・「ドラエネルギー」を完全に0にしているのは変わらず。)

これで鳴きすぎを是正できればいいかな…と。

なので、学習データの取り直しとパラメータの選定(準ニュートン法)からやり直しになります。
まぁ強くするためにはしょうがないですね。
プログラム的にはそこまで大きな変更にはならないですが、単に計算時間(待ち時間)がかかるのが少し気分が盛り下がります。
麻雀AI開発その52・評価値関数をAIに搭載(打牌forツモ)
前回の続きです。

昨晩、1万試合分のcsvファイルで準ニュートン法しようとしたら、OutOfMemoryExceptionが出て止まっていました。
10000試合で3GBもあるcsvファイルを一度に内部変数に落とそうとするのは無理がありましたね。
いちいち手直しするのがめんどうだったので、昨日のうちに終わっていた1000試合分のパラメータでいいことにしておきます。

それで、今日は評価値を計算するパラメータ群をAIに搭載するところ(ツモ→打牌のところだけ)までできました。
実際の手牌に当てはめてみてこのパラメータが妥当かどうかをチェックしてみます。
170812-01.png
孤立役牌より孤立の9mを先に切る。これは正答。
170812-02.png
国士とチャンタが本線なので、4sから切りたいが、AIは7pだと言っている。
たぶんシャンテン数的にチャンタより国士の方が近いので、7pはいらないという判断をしていると思われます。
これは誤答。
170812-03.png
9pを残せば三色が見えるのでオタ風の南を切る。誤答。


という感じで、1試合分の牌譜について、5巡目までの2シャンテン以上の手牌について、AIの答えと人間(私)が考える答えが一致する割合を見てみます。
170812-04.png
サンプルの数(92手牌)が少なくてあれですけど(手作業で評価値とかを書き写してたのでめんどくさい)、正答率76%とまぁまぁいい感じです。思ったよりぽんこつではなかったです。
誤答についても多くの場合は私の答えはAIの次善手となっていることが多く、AIの最善手も人間の感覚と比べて、大きく損をしているようなことは多くはなかったです。
少なくとも手替わり0回再帰計算(2シャンテン)とか1次有効牌の枚数のみ(3シャンテン以上)よりはよっぽど精度は高いです。
うむ、よかったよかった。

次は鳴き判断についても同じようにチェックしてみようと思います。
麻雀AI開発その51・手牌情報と評価値関数作りその5
前回、評価値の正答率が66%はちょっとびみょう、と思ったのですが、
よく考えてみたら2シャンテン以上の手だと孤立字牌が複数とかあってどちらを切るかは指運によるところがある手牌もそれなりに多くありそうなので、正答率80%~90%を望むのはほぼ無理なような気がしてきました。
なので、この数値でまぁいいかと思いました。

ただ、改善した方がよさそうな部分もあったので、微調整を入れます。

・一次有効牌枚数の復活
シャンテン数ごとに係数を分ければ、異なるシャンテン数の有効牌枚数が混じらないからいけるんじゃない?と思いました。
170811-01.png
いまいちよくわかんないけど、シャンテン数が多いほど評価値が下がりそうなのでこの部分はいいことにしておきます。
5シャンテン・6シャンテンはなんか係数がマイナスになってる(有効牌枚数が多いほど評価値が下がる)けど、まぁそんなに遠い手は出現頻度が多くないから放置でいいことにしておきましょうか。

・字牌の牌エネルギーについて
枚数とオタ風役牌を独立扱いにしていたけれど、それに見えてる枚数も加えて分類を増やした。

・晒し牌エネルギーについて
鳴きの種類で分類を増やした。
170811-03.png


それで1000試合分で100回準ニュートン法をやった(約数時間かかる)のですが、まだ不審な点がありました。
一番やばそうなのが、孤立字牌の牌エネルギーの評価。
170811-02.png
普通ならオタ風<役牌<ダブ風の順に手に残されやすいので、牌エネルギーもこの順に大きくなってくれるのが望ましいのですが、1枚見え孤立ダブ風の係数がオタ風の係数にすら負けてるというありさまです。2枚見えシングル役牌もオタ風に負けてます。
さすがにこれはちょっと…ねぇ。
一番比較することが多い孤立字牌どうしの比較なので、あんまりよろしくないですねぇ。
まぁでも、個別のパラメータをひっかき回すよりは、実際にこれらパラメータをAIに搭載して、実際の手牌で評価値を比較して確かめるのがよさそうですが。

1000試合でダメなら10000試合に増やしてみようか。準ニュートン法の繰り返し回数は20回とか50回くらいに抑えればたぶん一晩とかいうレベルで終わりそうなので。
計算時間さえ許せば試合数が多くなることは数値の安定性とかの面で正義でしょうから。

麻雀AI開発その50・手牌情報と評価値関数作りその4
前回の続きです。

前回で、評価値関数の理論とプログラムを組めたので、最急降下法で繰り返しをやってみました。
しかし、最急降下法の欠点(収束が遅い)が露呈して、損失関数の減り方が遅かったです。

なので、準ニュートン法のBFGS公式を前に作ったエクセルマクロから移植して、プログラムを組みなおして使うことにしました。
BFGS公式でそれなりに収束速度が速く、局所的な停留点に行くことは保証されますが、ヘッセ行列の逆行列を計算するパートが新たに発生します。
これにかかる時間はO(M^2)≒1000^2なので、100試合のO(N)≒10万回に比例よりも時間がかかります。
また、M次元行列の情報を保持したり、出力したりしないといけないので、O(M^2)のスケールで容量をすごく食うというのもあります。(今のところは問題は顕在化してませんが。)

これでとりあえず100回繰り返したらこんな感じになりました。
損失関数(losssum)が最小となるようなパラメータを見つけるのが目的ですが、これでは具体的にどの程度合ってるかが体感でわかりにくいので、
学習データと評価値を比較した正答率(選択された打牌・鳴き等の評価値が他の取り得る選択の評価値のどれよりも高い時に「正答」とみなす。)を測定することにしました。
170810-01.png
損失関数の具体的な値はよくわからんのでおいておくとして、正答率66%というのはちょっとびみょうではないですか?(まぁランダム打牌の14分の1よりかははるかにマシですが。)
80%~90%くらいは正答してほしいイメージがあったので、ちょっとがっかりです。

具体的に出てきた最終のパラメータについても
ダブ風対子の役牌力がなぜか負の値になってるとか、不審な数値が多数出てきています。


まず、対処法として思いついたのが、あくまでBFGS公式は局所的な停留点を見つけることしかできなくて、最小値とは限らないので、与えた初期パラメータの値によって最小ではない停留点に引っかかっている恐れがある、
なのでいろんな初期値(ランダムに決める)からスタートしてみて複数の停留点っぽい点の損失関数(と正答率)を調べて、同じ点に収束しそうかどうか、とか、具体的に最小の損失関数を与えるパラメータ群を採用する、とか。

全パラメータについて[-2,2]の一様分布から選んだ乱数を初期値として与えてみてとりあえず20回繰り返してみたのがこちら↓。
170810-02.png
まだ収束しきってなさそうですが、劇的に改善する感じは今のところなさそうです。

後は、学習データそのものの問題もあるかもしれません。
学習データをcsvに出力する条件は
・シャンテン数が2以上(鳴きがからむときは鳴く前のシャンテン数が2以上)
・他家最大攻撃が2以下、つまりリーチやドラポンや染め副露や3副露がいない。
でやってたのですが、
終盤とかだと2副露以下とかでも安全度を重視するケースがあるかもしれない(自分が聴牌や一向聴ではないのでなおさらそういうケースが多発するかも。)ので、例えば10巡目以降の場合はばっさりカットしてしまうのもありかなーとは思っています。

それとコメントで教えてもらったのですが、ニューラルネットなる手法があるみたいです。
情報を漁ってみたけど、いまいちよくわからなかったです。(中間層?みたいなやつへの出力の方法とか。シャンテン数とか牌エネルギーみたいな全然関係ない特徴量的なものも重み?とやらを付けてで一括で処理していいものなのか、とか。中間層に排出された出力値を新たに重みを付けて関数に入れて評価値とする、的なところもいまいちよくわからなかった。)

というわけで今のところ若干手詰まり気味です。正答率66%で満足できるならこれでもいいのですが。
とりあえずプログラムを走らせて微修正していじってるうちにいいアイデアが浮かぶor教えてもらえばいいなぁ。
麻雀AI開発その49・手牌情報と評価値関数作りその3
評価値パラメータに関するプログラミングをしながら、またネットの情報を漁って数式をいじってると、なんか思ってたより簡単にできそうなことが判明しました。

入力する手牌1個x(xはInteger型配列orベクトル)とパラメータの群p_1~p_M(M≒数百クラス)に対して、評価値を次のように定義(というかモデル化)します。
170809-01.png
g_j(x)はjとxには依存するけど、pには依存しない関数とします。(例えば、シャンテン数ならg_1(x)=(6-手牌シャンテン数)など、どのjについても割と簡単な式で書ける。→1件あたり計算時間はそこまで多くない。)
つまり、fはpの一次式で書けるということです。

それで、損失関数(学習データとの不一致の度合い)として、
max(0,f(x_1)-f(x_0)) (ただし、x_0は実際に選択された手牌、x_1は選択可能だったが実際には選択されなかった手牌)
を当初使うつもりでいましたが、(つまり、実際に選択されなかった手牌の評価値の方が実際に選択された手牌の評価値より高くなる逆転現象が起きているときのみ、正の値を取る関数)
これよりもロジスティック損失関数なるものを使うといいらしいです。(常に正の値、逆転現象が起きてる時ほど大きくなる、微分可能)
つまり、これです。
170809-02.png
これは手牌1組分の損失関数なので、
全パターン(今回は最初の100試合分。N組あるとする。Nは10万前後くらい)の損失関数の積が最小となるようなパラメータ群pを求めます。
170809-03.png
最急降下法を使うために1個のパラメータp_jで損失関数の積を微分します。
170809-04.png
fはpについて1次式になっているので、かなり簡単な形に書けました。
もともとは微分することを想定していなくて損失関数の偏差分を取る必要があると思ってましたが、かなり計算の負荷が小さい関数(分母と分子のfのexp項は、jに依存しないので使い回せる、g_j(x)の計算はかなり簡単。)で偏微分を直接計算できて、とてもラッキーです。

なお、指数関数の計算がからむ関係でオーバーフローさせないために評価値fの計算直後に、100000で割っててきとうに標準化しておきます。このへんは評価値のスケーリングの問題なので大した問題ではないでしょう。

それで今計算した各パラメータごとの偏微分の値を使って初期値で置いたパラメータ群を次の式で更新します。(最急降下法)
170809-05.png
αは学習率(jに依存しないスカラー倍。とりあえず今回はα=0.1にしておいた。)

それでは、実践。
↓の初期パラメータ群が最急降下法1回の試行で、
hyoukatipara_shoki.txt
↓こう変わる。(前半部分が偏微分の値、後半部分が変更後パラメータ群)
hyoukatipara_newpara.txt
(なお、当初考えていた一次有効牌の枚数の項は逆に大きなマイナスになってしまって都合が悪くなったので削除しました。おそらく、手牌を崩してシャンテン数が上がる打牌をすると一次有効牌の枚数が多くなるところに原因がありそう。)
(鳴き可能ボーナスについては実装がめんどうだったので、入れなかった。個々の手役力のところである程度反映されるだろうから、まぁいいか、と。)

かかる時間
・元CSVファイルのリストを読み込んで内部変数に保存する…2~30秒
・手牌1組に対して評価値fと偏微分(M個分)を計算…1秒当たり数千組くらい。N≒100000くらいで全部で1分弱程度。
・パラメータの更新とかファイル書き込み…ほぼ0

思ったよりもかなり早くできそうです。
リストの内部変数保存は最初に1回必要なだけ(ただしO(N)の時間がかかる。)なので、
実質はfと偏微分の計算にかかる時間(こちらもO(N))だけで、最急降下法をどの程度繰り返せば損失関数が最小値に収束するかにもよりますが、理論的に破たんをきたすほどの時間がかかるわけではなさそうなので、ほっとしました。
収束が遅くて無理そうなら前みたいにBFGS法を頑張って適用してみてもいいですし。
ある程度収束したら試合数(つまりNの数)を増やして正確さを増やしていく感じになるでしょうか。
麻雀AI開発その48・手牌情報と評価値関数作りその2
前回、評価値関数を作る!って言って高らかに宣言したのはいいですが、作業はなかなか難航しています。

とりあえず今回は牌譜を読み取って各プレイヤーの選択ごと(つまりツモ→打牌と鳴き→打牌と他家出→スルーの3種)について、
実際に選んだ選択に対し、評価値の計算のもとになる数値の書き出し、および選ばれなかった選択に対しても同様に書き出しするところまでできました。
(チャンタ限定シャンテン数の計算が地味に難しかった。)
170808-01.png

1行に対し、maxで812列というとんでもないCSVファイルが誕生してしまいました。
実際に処理するのは計算機だとしてもちょっとげんなりしますね。

とりあえずまずは最初の100試合分だけ書き出してみたら、行数が17778行のデータになりました。(書き出すだけでも1秒で5試合くらいのスピードなので、通常の牌譜解析に比べてやや低速。再帰計算に比べればはるかに高速。)
パラメータの仮置きのためならまずはこのくらいのデータ数から解析するくらいでいいでしょう。
あまりに多すぎると時間がかかりすぎるかもしれないので。

次は、
・パラメータの初期値をテキスト形式で入力して読み込ませるプログラム作り
・パラメータと書き出した手牌情報1個分を入力値として、評価値を返すプログラム作り
・パラメータを入力値として、損失関数を返すプログラム作り
・パラメータを少し動かして、損失関数の偏差分を求めるプログラム作り
・動かしたパラメータ群を再びテキスト形式に戻すプログラム作り

まだまだ道は長そうです。
麻雀AI開発その47・手牌価値と評価関数作り
AI開発の続きです。

聴牌や一向聴なら再帰関数による全数探索とシミュレーションで十分早い計算時間で計算できますが、
2シャンテン以上に遠い手だと変化も含めた全数探索は計算時間的に困難です。

このネックを解消するために手牌(+晒した牌)を入力値として、全部を探索せずに簡易的な評価値を出力する関数を作るのがよかろうと思いました。
いろいろネットの情報の海をさまよっていたらこんな記事を見つけました。
http://qiita.com/sakuramaru7777/items/0d20cf6605bd6d762671
私でもわかりそうな平易な文章でかつ、活用できそうです。

アイデアとしては入力手牌についてシャンテン数とか牌の前後関係とかの特徴量?みたいのをたくさん取ってきて、
その特徴量に対してこのパターンに当てはまる場合は何点みたいな点数をつけて、それを全部加算したものをその手牌の評価値とする、
学習用の牌譜に対して、損失関数(選んだ選択(ツモに対する打牌、鳴き&鳴き後打牌)の評価値が、選ばれなかった選択の評価値よりも小さい場合、その差分、そうでないとき0)の総和が一番小さくなるようなパラメータ(それぞれのパターンの点数)の組をもって評価関数を決定する、的な感じです。

特徴量として考えている候補は、
・シャンテン数
・一次有効牌枚数
・牌の相互関係による牌エネルギー
・ドラエネルギー
・手持ち赤枚数
・役牌力
・タンヤオ力
・一色力
・チートイ力
・国士力
・トイトイ力
・三色力
・一通力
・チャンタ力
・一盃口力
・面前ボーナス
・役なし副露ペナルティ
・鳴き可能ボーナス

項目自体は多いですが、それぞれの項目の定義が簡単ならば全数探索よりもはるかに短い時間で計算可能になるはずです。

・シャンテン数
(6-シャンテン数)×10000点(初期設定のパラメータ。よりよい損失関数にするために変動させる。以下、同じ。)を付与

・一次有効牌枚数
枚数×100点を付与

・牌エネルギー
13枚の牌それぞれについて、牌種類と該当牌の手持ち枚数(4枚持ちは3枚持ち扱いとする)と±2の距離にある牌の有無(複数枚数かどうかは問わない)によって以下の点数を付与する。
170806-01.jpg
170806-02.jpg

以下は手役関連の付与点数。とりあえずは確定1役につき+5000点付与くらいのイメージ。
・ドラエネルギー
牌エネルギーと定義はほぼ同じ。
基本は現在手持ち枚数×5000点で、ドラ受けがある場合は500点とか1000点ボーナスを付与している感じ。

・赤枚数
枚数×5000点を付与

・役牌力
所持役牌に対して以下の点数を付与する。(ダブ風は2倍する。)
刻子-5000点、対子-1000点、孤立牌-10点
対子以上のとき、役なし副露ペナルティ回避と鳴き可能ボーナス付与の属性を与える。

・タンヤオ力
タンヤオ限定のシャンテン数-通常手シャンテン数に対して点数を付与する。
0-5000点、1-2500点、2以上or端シュンツあり-0点
端シュンツなしで1以下のとき、役なし副露ペナルティ回避と鳴き可能ボーナス付与の属性を与える。

・一色力
一色手限定のシャンテン数-通常手シャンテン数に対して点数を付与する。
0-10000点、1-5000点、2-1000点、3以上-0
2以下のとき、役なし副露ペナルティ回避と鳴き可能ボーナス付与の属性を与える。

・チートイ力
チートイシャンテン数‐面子手シャンテン数に対して点数を付与する。
-1以下-10000点、0-5000点、1以上-0点

・トイトイ力
トイトイ3シャンテン以下に対して点数を付与し、役なし副露ペナルティ回避と鳴き可能ボーナス付与の属性を与える。
刻子数×2500点+対子数×1000点

・国士力
足りないヤオ九牌の種類数に対して点数を付与する。
0-100000点、1-50000点、2-30000点、3-10000点、4-2000点、それ以上-0

・三色力、一通力
それぞれの構成部分(234三色とかピンズ一通とか)に対して、できているパーツによって点数を付与する。
9枚-10000点、8枚-8000点、7枚-4000点、6枚-1000点
7枚以上のパーツがあるとき、役なし副露ペナルティ回避と鳴き可能ボーナス付与の属性を与える。

・チャンタ力
チャンタ限定シャンテン数-通常手シャンテン数に対して点数を付与する。
0-10000点、1-1000点、2以上-0
1以下のとき、役なし副露ペナルティ回避と鳴き可能ボーナス付与の属性を与える。

・一盃口力
できているパーツに対して点数を付与する。
6枚-5000点、5枚-3000点、4枚-500点

・面前ボーナス
5000点を付与する。(シャンテン数と鳴き可能ボーナスの有無によって変動?)

・役なし副露ペナルティ
牌エネルギー、ドラエネルギー、赤枚数点数を0とする。
シャンテン数、一次有効牌点数も減少させる?

・鳴き可能ボーナス
牌エネルギーに対して別途上方修正を設ける。


付与点数の具体的な値はてきとうなので、損失関数を各パラメータで偏微分(計算上は1つのパラメータを少しだけ動かした偏差分を計算することで対処すると思われる。)して、それに学習率αを掛けたもので補正しつつ、最適なパラメータに近づけるみたいなイメージです。
パラメータの数(特に牌エネルギー関連)が多すぎて泡吹きそうですが。

まずは鳳凰卓牌譜からそれぞれの選択(打牌とか鳴き)ごとに選んだ選択の入力値(各牌エネルギーを求めるための牌組み合わせとか、一色力のための一色限定シャンテン数とか)と選ばなかった選択の入力値の組をcsvでずらーっと書き出すところから始めないといけません。
とにかく書き出す項目数が多いので、プログラミングは難航しております。
麻雀AI開発その46・現在のAIの実力
ここ数日ブログの更新をサボって何をやっていたかというと、
今のAIの実力を測るため(+ソフトの試験も兼ねて)に100東風戦を目標にひたすらAI相手に麻雀を打ちまくっていました。
人生で一番麻雀ばかりをやっていたといっても過言ではなかったです。

現在、69試合まで完了したのですが、だいぶ麻雀打つのに飽きてきてしまいました。詰め込みすぎはあんまりよくなかったです。
ソフトの動作的にかなり安定してきましたし、これから取り組むべき課題も見えてきたので、鬼打ちモードをやめて開発に戻ろうかと思います。

↓こちらが69試合の成績です。
170805-01.png
私からみるとAI3体相手に平均順位2.35、AI側から見る(3体の平均値)と私一人を相手に平均順位2.55という成績になりました。
私の現在レートが2千0百台の後半くらいなので、私の安定レートを仮に2050と置いたときに、このような平均順位になる卓平均レートを計算し、そこからAIのレートを逆算で計算すると、1888という数値が出てきました。
なので、現状のAIの強さは仮にこのままの順位分布で多試合打っても推移する場合、四段くらいの強さ、ということになります。

かなり計算が粗いところもあるわりには思っていたよりは強かったですけれども、AIに打牌をチェックしてもらう、という観点からは四段程度の実力ではぜんぜん弱いです。特上下位レベルの人(この場合機械ですが)に打牌を見てもらってこっちの方が評価値が上です、とか言われても説得力としては非常に弱いでしょうから。

各種数値を見てとか、実際に打ってみての感想。

・かなりの頻度(2~3試合に1回)で、面前ではかなり苦しい手とか点差の離れたオーラスやラス前で序盤なのに役なしの仕掛けを入れてくることが多々ありました。
評価値を見るとかなり低い和了率とか順位逆転率にかけるよりも聴牌流局で局収支を稼ぐorこの局は完全にあきらめて次局に逆転するために聴牌流局でつなぐ、という思考らしいのですが、さすがにこれはないですね。
打ちながらこんな役なしの仕掛けを入れてくるようなAIごときに負けてられるか、みたいな感情はありました。ただ、たまに隠れ役牌暗刻とかドラ対子暗刻が混じっているのがたちが悪いところでしたが。

聴牌から遠い段階(具体的に3シャンテン・2シャンテン)の評価は計算時間の問題で変化を考慮できないので、スルーして面前でがんばる方が過小評価されがち(実際は手牌が変化してより聴牌や和了までいきやすい)ということもあるかと思います。
序盤で役なしの仕掛けはさせないように強制するのは簡単ですが(例えば和了率5%未満ならスルーさせるとか)、今後のことも考えてやはり序盤について打牌ごととか鳴きについてスコア化する(機械学習的なもので)的な抜本的な改革が必要かと思います。

・和了面について。
AIの和了率が21.6%なので、平均順位が2.55ということから考えればそこまで際立っておかしい感じではないです。
和了時平均点を見るとロン和了時平均点は私とほぼ同じですが、ツモ和了時平均点が私よりかなり低いです。おそらくは副露を多用するので面前ツモがついて高くならないとかかなーと想像しています。

・放銃率について。
現状、リーチに対しては手をバラバラにして降りることは考慮していますが、フーロ手については牌の危険度は考慮する(危険度が高い場合は評価値的にマイナス評価)けれども、手を崩す(シャンテン戻しをする)ことはしないようになっています。
このようなアルゴリズムなので、放銃率はかなり高くなるだろうと予想していましたが、69試合の平均だと13.7%ということなので、そこまで際立って高いということではないみたいでした。
ただ、放銃時失点を見ると、私の方は-5000点弱に対して、AI側は-5600点くらいなので、おそらく高い手(ドラポン・染め手・親のダブ東+ドラ含み仕掛け)へのケアができてない分が出ているのだろうと思います。
逆に言えばそういう高い手さえケアしていればそこまでひどくはならなさそうなので、この前詳細押し引きの基本データを取ったのはいいですが、取り組むべき優先順は低いのかもしれません。

・流局時聴牌率について。
私の聴牌時流局割合は約3分の1なので33%ちょっとなのに対し、AI側は12分の7なので58%と明らかに違います。
私の一人ノーテンになる局面もけっこう多くありました。
おそらく動き出しが早いとか放銃の危険を冒している(手牌を短くすることにあまり抵抗感がない)というところも関係していると思いますが、この分野についてはAIの方が一枚上手なのかもしれません。

・染め手について。
攻防どちらにおいても染め手を考慮できてない影響はかなり大きいように感じました。
攻撃面については、ホンイツやチンイツといった役があって点数的に高い、というところまでは認識していますが、聴牌から遠い段階で一色手決め打ちで他色の塔子や対子を崩す(シャンテン戻しをする)、という発想まで考えることができていません。唯一、聴牌からの一向聴戻しは考慮しているので、他色が2枚だけある聴牌から聴牌崩しで染め手移行という攻撃だけは見せていましたが、それ以外はできないので、一色手和了を逃しているようなロスをしているようにかなり感じました。
相手の染め手に対する防御面についても、染め手専用のパラメータを置いてないので、通常のフーロと同じような感覚で染め色を切っているようなケースがかなり多くありました。
これらは必要になるパラメータが多くなりそうなので、敬遠していましたが、これも優先順位は高くした方がよさそうです。

・カンについて
他家AIはカンを全くしません。
プログラム的に複雑になるので後回しにしていて、もちろんこれはあまりよくないのですが、打っている限りそこまでカンができないことによる損失はそこまで大きくなさそうでした。少なくとも染め手よりは明らかに優先順位は下です。

・雑多なルールについて
途中流局・流し満貫・パオについてはまだできていませんが、これも優先順位は下なので後回しでいいでしょう。

というわけで、先に取り組んだ方がいい課題、後回しでもいい課題が浮き彫りになってきたので、
これから改善に取り組んでいきます。
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード