*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開発その63・ニューラルネット導入
前回に引き続き、評価関数作りの話です。

パラメータの付け方をいままでは手作業でちょっとずつ入れたり消したりしてましたが、どうにもうまいこといかず、らちが明かなくなってきたので、ついに重い腰を上げてニューラルネットを頑張って習得しようとしました。

ニューラルネット?なにそれ、おいしいの?みたいな全くゼロの状態からのスタートでしたが、
いろいろなサイトを読み漁った結果、↓のサイトが一番わかりやすくて理解しやすかったです。
http://s0sem0y.hatenablog.com/entry/2016/05/22/014656

それで、こんな感じでニューラルネットを組んでみました。
○大分類
・他家最大攻撃
・巡目区分(1~3巡目、4~6巡目、…、16巡目~の6分類)
○入力層
・手牌価値指数
・危険度指数
・自分が親か
・字牌枚数
・定数項
○隠れ層
1層のみ・ノード数10、活性化関数max(0,|x|)
○出力層
1個の浮動小数点型数値を出力。活性化関数恒等関数。
○目的関数
選択された打牌の出力-選択されなかった打牌の出力をシグモイド関数にかけたものを目的関数とし、最小化する。
○重みパラメータの選出方法
遺伝的アルゴリズム(微分情報がいらない、という性質がとても輝く!すばらしい!)

それで一応、パラメータっぽいのは出てきました。
ニューラルネットのダメなところとして、隠れ層なる、人間(わたし)にはよくわからないものを経由するので入力パラメータと出力結果との間にどのような関係があるか(線形の相関関係とか2乗とか指数とか)すぐにつかめない、というのがあります。
完全に中身はブラックボックス状態になっているので、どうしてそのような出力値や重みパラメータが出るのかがわからず、メンテナンス方法もよくわからないです。
逆にいいところはベクトルの内積と簡単な活性化関数の計算の組み合わせだけで、ノード数が十分(何をもって十分とするかは今のところよくわからない。あまりに多すぎても過学習という問題が発生するらしい。)なら複雑な関数でもある程度近似が可能(らしい)ところです。

出てきた重みパラメータを見つめても何が起こってるのかはよくわからんので、さっそく実戦譜で当てはめてチェックしてみます。
例の対1副露序盤の問題について。
170831-01.png
まだ孤立字牌切り推奨になってくれていないが、8m9p切りとの差は詰まっています。
ニューラルネットをやり始めたばかりだが、うまくいく可能性はなんとなく感じますね。

改善点とすると、
・巡目域について。今のままだと巡目域をまたぐ(例えば3巡目と4巡目の間など)と完全に別個のデータになるので、パラメータがかなり非連続ぽくなるのがあまりよくない。なので、巡目域は大分類から外して、入力パラメータの中に入れる。
・字牌の扱いについて。上の例みたいな切れない字牌を抱えると数牌と違って使いようがなくてほぼ降りになってしまうので、切る牌が字牌かどうか、というのを入力層に追加する。
・隠れ層のノード数を調整する。とりあえず今は10から20に増やしてやってみている。(その分、重みパラメータ選出に時間がかかりそう。)
・隠れ層の層の数を増やす?(ノード数が十分なら1層だけでもなんとかなるらしいが、多層にすればより適合の度合いが増すという情報もある。)

・打牌選択がうまくいきそうなら鳴き判断もニューラルネットにしてみる、とか。
スポンサーサイト
麻雀AI開発その62・評価値関数をAIに搭載(通常打牌)その2
前回の続きです。
前回は鳴き判断が片付いて、次は通常打牌について手牌価値と危険度の兼ね合いをやっているのですが、かなり難航してます。

他家攻撃無しとか、対リーチとかはまぁ人間の感覚的におかしくない打牌になってるのですが、対1副露の序盤がだいぶおかしな打牌をやらかしてくれてて困っています。

問題の局面は例えばこんなものとか。
170828-01.png
対1副露序盤に対してはまだ張ってないだろうから自手の都合で東とか中を切ってほしいのに、現物の9pとか8m対子落としをやるとか言ってきます。

遺伝的アルゴリズムで正答率が最も高くなるようなパラメータを求めたもの(一部抜粋)がこんな感じなのですが、
170828-02.png
他家攻撃1の巡目域1(1~3巡目)の評価値比例部分係数が+1.9倍なのに対し、危険度比例の部分が-23倍とかいう極めてでかい値になってます。つまり、手牌価値の高さより危険度の小ささの方をかなり重く見積もっているということです。(序盤にもかかわらず。)

実際の生データ(csvファイル)で確かめてみても、確かにこの計算式だと正答率70%超えていてそれなりに高いので、パラメータの数値の求め方はおそらく間違ってはなさそう。
となると、評価値関数の作り方の問題かもしれません。

序盤で危険度が低いものを重く見ているというのは、序盤は字牌(危険度が低い)が切られることが多いから結果的に評価値の高さよりそっちが優先ということになってるのかも。
とりあえず、危険度比例部分を牌の種類(字牌・端寄り数牌、中寄り端牌)で分けて再度学習データの採取とパラメータの値設定からやり直しをしてみています。

この前の序盤役なし仕掛け多用事件といい、AIに自然な手を打たせることの大変さが身に沁みます。
麻雀AI開発その61・評価値関数をAIに搭載(鳴き判断)その4
前回の続きです。
鳴き判断について、パラメータを付け加えたり削除したり、値の調整とかをやってたのですが、
途中で鳴くのが当たり前な役牌ポンをやってくれなくなったりして、調整に手間取りました。

パラメータ選定の手法の変遷
準ニュートン法…なんかプログラムの調子が悪い。私の理解を超えているのでどこがおかしいかわからない。

最急降下法…理解しやすいけど、収束性が悪い

共役勾配法…若干理解しにくい。これもちゃんと収束しているかが不明。また、局所解に絡まりやすく最小地点になってる保証もない。

ネルダーミード法…微分情報がいらない方法らしいが、次元数が多いと計算時間的に無理らしい。あきらめた。

遺伝的アルゴリズム

いろいろ迷走した末にたどり着いたのが遺伝的アルゴリズムという方法です。
これは親元のパラメータから、2組選んでパラメータを交叉させて子供を生成する、その後評価値のいいものを重点的に選別する(自然淘汰)。
また、親元のパラメータには依存しない突然変異を一定確率で起こす。
…的なものです。専門的なことはみなさんでググってください。

これのいいところは、
・直観的に理解がしやすい理論
・突然変異があるので、局所解に絡まってそこから離れなくなるのが起こりにくい。
・微分情報がいらない。(正答率について、シグモイド関数(指数や対数計算があって時間がかかる)でスコア化していたものを実測正答率そのままを評価関数とすることができる。)

特に1点目2点目が素晴らしいです。

悪いところは
・局所的な最適解に収束するスピードは保証されない。(→2,3回くらい連続でアルゴリズムにかけてみて数値の出具合をチェックすればまぁなんとかなりそう。)
・アルゴリズムの設計の仕方(交叉・選別・突然変異の方法)にかなり依存する。(→数値の出具合を見つつ能動的に調整ができるという意味ではそこまで悪くはない。)


それで、遺伝的アルゴリズムの設計も含めていろいろと試行錯誤して、結局次のパラメータが最後に残りました。
・親番補正
・評価値に対する乗算での補正(定数項+巡目比例項)
・危険度係数に対する乗算での補正(定数項+巡目比例項)
・危険度係数の2乗に対する乗算での補正(定数項+巡目比例項)
・スルーした時の加算補正(役牌or非役牌、副露数、定数項+巡目比例項で分類)

字牌枚数補正は相関的にイマイチだったので外しました。

で、いろいろパラメータの調整とかやってそれをAIに乗っけた結果がこちら。
170826-01.png
なんか役牌ポンはするけれど、他はほとんど仕掛けない(非役牌のスルー補正がかなり大きい)ようなかなり極端な結果になってます。
もうこれ以上は無理ー、というかもう飽きた―。
当分はこれが決定版ということにしておきます。

これで鳴き判断は片付いたので、通常の打牌選択の調整を今やってます。
こっちは楽勝かと思ってたけど、そこまで簡単ではなかったです。正答率を調べてると60%前後になってました。
評価値だけのとき(他家最大攻撃2以下&9巡目以前)より正答率が落ちてるのがうにょーんって感じです。
こっちもいろいろと調整を試みています。字牌補正を加えるとか、巡目で輪切りにするとか。
もうそろそろ飽きてきたので、実戦投入したいんですけどね。
麻雀AI開発その60・評価値関数をAIに搭載(鳴き判断)その3
前回パラメータを出した評価値関数についてAIに搭載して実際の局面に当てはめてチェックしてみます。
170823-01.png
前の時(麻雀AI開発その54・評価値関数をAIに搭載(鳴き判断)その2)より鳴きになる部分が多くなりました。
私の感覚とずれてるところについても、わりとAIの回答も打ち手の個性の範囲内で許容できる(そういう打ち手がいてもおかしくない)ところが多いです。

評価値の桁が2桁くらいまで増えたので、スルー補正の約3ptくらいなら鳴きの手牌価値のみ評価値がスルーよりも十分高ければ吸収できている感じです。

実戦譜で当てはめてみて数値の出方のくせがなんとなくわかってきました。
・巡目がかなり浅いと最終評価値が一けたになることが多くてスルー補正3ptを逆転できずにスルーが選ばれやすい。
・手役確定の鳴きになる場合(役牌ポンなど)がしばしばスルーされて、手役不確定の場合がしばしば鳴かれることがある。
・対リーチなのに危険度が高い牌を切ってしまう

超序盤と対リーチの問題についてはパラメータの問題なので、初期値を都合のいい方にいじって別の停留点を探しに行くのがいいかと思います。

手役確定・不確定については手牌価値のみの評価値の算出関数内でも考えていますが、危険度も加味するパートでも改めて最終評価値にプラスマイナスの補正を与えて調整しようかと思います。


ただ、この問題にばかりかかりきりになるのもそろそろ飽きてきたので、修正が無理そうならあきらめて今のままでもいいことにしましょうかね。
麻雀AI開発その59・評価関数と危険度その2
なんかかなり迷走した感はありましたが、危険度を加味した評価関数がなんとかなりそうになりました。
(前回のデータベースうんぬんの話は結局うまいこと使いこなせなかった。)

今回の話はこちらのサイトを参考にしました。
http://www.anlp.jp/proceedings/annual_meeting/2015/pdf_dir/D3-3.pdf#search=%27%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92+%EF%BD%86%E5%80%A4%27
http://www.procrasist.com/entry/ml-metrics

前までの話は全体正解率(に近いもの)を最大化しようとしていましたが、
これをすると、母集団が多いスルーの方に大きく引っ張られてほぼどんな状況でもAIはスルーと回答するようになっていました。
170822-01.png
この表で言うと、全体正解率は(TP+TN)/(TP+FP+FN+TN)ですが、このうち、TPとFP(鳴くべきなのにスルーと回答)がかなりの部分を占めている形になっていました。
重要と思われるのは、スルーと回答した場合に実際にスルーすべき手である割合(適合率、Precision、TP/(TP+FP))とか、鳴きと回答した場合に実際に鳴くべき手である割合(真陰性と仮に命名、TN/(FN+TN))であろうかと思います。

一般的な機械学習だとF値というもので2値分類器の良し悪しをチェックすることが多いらしいです。
なので、今回は損失関数的なのをやめて、上記サイトの理論を利用させてもらうことにしました。
170822-02.png
入力する情報は、評価値(攻撃面の手牌価値のみ)・巡目・親かどうか・副露数・字牌枚数(この2つは主に守備力関係のつもりで入れた。)・切る牌の危険度指数で、これに対して学習データでは実際に選ばれた行動(スルーとか鳴きとか)が出力値としてあります。
前回は評価値と危険度指数だけで、判断する材料が少なかった、ということが考えられたので巡目とかいろんなものを判断材料として増やしました。

それで、これら入力値に対して危険度を加味した評価値を↑の関数fでモデル化します。

それで、適合率とかは離散的な値でパラメータpで微分できないので、そこを回避するために、
シグモイド関数で微分可能な形に置き換えます。
鳴きについてはその後の打牌候補が複数あるので、そのうちの最も評価値が高いものをスルーとの比較対象にする。

170822-03.png
このとき、目的の関数F値(αはとりあえず0.5にしておいた。)は次のように表すことができます。
170822-04.png
…理論上はpで微分可能かもしれないけど、実際問題これを微分したものを求めるとか極めて無理な雰囲気しかしないです。

幸い、今回は変数の数がそこまで多くない(各30個ずつ)ので偏微分を数式で計算せずに、近似的な偏差分(1個のパラメータを0.0001とか動かしてF値の差分を計算して0.0001で割る。)を計算機に無理やり計算させる方向にしようかと思います。

それで計算した結果がこちら。
(ただし、準ニュートン法のアルゴリズムの調子が悪くて最急降下法に変えたので、収束性はイマイチかもしれない。0副露のみ1000試合分で、それ以外は1万試合分のデータ。)
170822-05b.png

変数が多く、込み入っているので具体的にはわかりづらいですけど、
前回みたいにほぼ全部スルーと回答している状態は脱していそうな感じです。

ただ、実際に出力結果を見たり、この文章を書きながら思ったのはF値の構成要素のうちPrecisionの方はいいとして、Recall(TP/(TP+FN)、実際にスルーされた手を正しく選別できる割合)って別にどうでもよくない?みたいには思いました。(どうでもいいことはないけど。)
それよりは真陰性(TN/(FN+TN))が高い方がうれしいような気がします。これが高いということはAIが鳴いた場合は実際の鳳凰卓の打ち手も鳴いている、ということを表していると思うので。

理論的に意味ある数値かどうかはわからないけど、一回Recallを真陰性に置き換えたバージョンも作ってみようか。

後は準ニュートン法アルゴリズムが壊れた(偏微分の符号とパラメータの修正の方向が逆転して全く収束しない)のもなんとかしないとなぁ。私の理解を超えているアルゴリズムを利用するのはどこらへんがおかしいかが見当つかないから大変です。
麻雀AI開発その58・入力情報のデータベース化
前回で、評価値関数作りが止まってしまったので、現実逃避して別のことをやることにします。

・対染め手危険度指数について。
染め手に対してはまだパラメータを取ってなかったので後回しということにしていました。
さしあたって危険度指数を求めるために、牌ごとの放銃率と放銃時平均失点と聴牌率が必要なので牌譜解析でパラメータを取りました。

取ったのですけど、リーチや副露と比べてサンプル数が少ないので、手持ち枚数と見えてる枚数で分類するとばらつきが激しくて使えなさそうでした。
なので、従前の局収支シミュレーションのパラメータ(枚数分類なし)をそのまま使い回すことにしました。

・入力情報のデータベース化
前に評価値を計算するために必要な入力情報(牌の前後関係とか手役ごとのシャンテン数とか)を10000試合分で計算しようとするとOutOfMemoryのエラーを噴いたのがありました。
1万試合(約3GB)の情報を全部変数に保存して使い回そうとしたことが原因だったのですが(さすがに無理がありすぎた)、
これをしないとなると(前までは他家攻撃について場合分けしたうえで1000試合分に減らしていた)目的関数or偏微分の計算のたびに毎回CSVファイルから読み込み直して…となるとかなり時間を食いそうな気がしました。

なので王道を行くなら一時メモリに保存するのではなく、データベースを作ってそこに保存しておいて、必要な時に一行ごとに読みだして処理する方がいいのかなーと思いました。

データベースはかなり昔にACCESSで触って以来で、今のVB.NETの環境でやるのは初めてだったので、ちょっと手間取りましたが、一応CSVをデータベース(mdfファイル?)に保存するコードは書けました。
で、動かしてみてるのですが、感想。「超遅くない?」
列数が14×61個、行数は10000試合分で約200万行あるのですが、
100行進むのに10秒くらいかかっています。
このペースだと1分600行、1時間36000行、1日90万行、だから丸2~3日かかる計算になります。
待ち時間としてはかなり長い部類ですけど、完全に計画が破たんしているレベルではないという微妙な時間です。

現状だと1行ごとにSQL文でINSERTさせているのですが、なんかバルクコピーなる手法を使うともっと早くINSERTができるらしいです。
ただ、現状で一応は正常にデータベースへの移し替えができていて、作動中のプログラムを止めてまで新しくコードを作り直して正しい動作をしているかをチェックしてから新しいプログラムでやり直す、という手間とうまくいかなかったときのリスクを考えると、まぁ時間かかってもいいから確実に2~3日後にはできる現状のままでいいかな、という感じです。

なんですけども、INSERTだけでこれだけ時間かかるなら解析本番の段階で、DataReaderでデータベースから逐次呼び出しするのと、今のCSVのままでファイル読み出しするのとで、結局あまり時間が変わらない可能性があるという、ちょっと悲しい結末が待ってるかもしれませんね。そうなると頑張ってデータベースのやり方勉強した分が無駄になっちゃうなーとも思うけど、まぁしょうがないか。
麻雀AI開発その57・困った
前回の続き…なのですが、ちょっと詰まってます。

ツモに対する打牌についてはおおむねいいのですが、鳴きについてがうまいこといっていません。

手牌価値評価値xと打牌の危険度指標yの入力値に対して次式が最大化するような関数fの形(もしくはパラメータ群p)を定めようとしています。
170817-02.png
ただし、fの定義は(スルーのときy=-1と固定して場合分けをする、xとyは代入前に100で割って標準化する)、
170817-01.png

これでいちおう、パラメータとして出ることは出るのですが、
170817-03.png
今は他家攻撃なしに注目します。
他家への放銃(危険度指数)はほぼ0なので、yに関する項は極小で、xの項と定数項だけが問題です。

鳴きでもスルーでも同じようなxの値(手牌価値)になる場合、本来は危険度のフィルターを通した後も(今は他家攻撃無しなので)同じような値が出てほしいのですが、だいたいスルーの方がかなり高い数値が出てしまってます。
なので、このままだと手牌だけなら鳴いてほしい場合の大半をスルーしてしまいます。

この原因は定数項p_8がかなり大きな値になっていることです。f(x,y)のスケールは一けた~せいぜい10くらいまでなのに+5みたいなでかい数字を足すとスルーの数値が過剰に高くなってしまいます。

実際に学習データでの正答率をチェックしてみると、正答(実際に選ばれた選択)がスルーのケースだと関数fを通した後もスルーが最も大になる確率は(正答率)は9割なのですが、
正答が鳴きのケースでは2割しかないです。超大差でない限りはでかい定数項のせいでスルーを選択してしまうのが如実に現れています。

言い方を変えれば全体の正答率を上げるために、正答が鳴きであるケースは全部見捨てて、ほぼすべてをスルーだと答えている(正答がスルーのケースはほぼ正解)ような状況に近いです。

困りました。ここ何日か試行錯誤を繰り返しているのですが、現実に即したうまいモデルがなかなか組めません。完全に手詰まりです。ずーっと数式とかプログラムのコードを眺めても妙案が浮かんできません。
麻雀AI開発その56・評価値関数と危険度
昨日の評価値関数→局収支への変換をAIに搭載して、実際どうなってるのかをテストしてたら、
170815-01.png
あ、これは2m中抜きして降りてもらわないといけないやつだ。これはあかんわ。

単に局収支に変換してそこから危険度指数を定数で差し引くのがダメですね。2シャンテン以上に遠い手で先手を取られた時点で、手牌価値指数がプラス5(いい手)だろうが、マイナス5(悪い手)だろうが、関係なく最も安全な牌で降りるのが正着になるので、序盤(他家攻撃無し)と同じロジックは使えません。

そこで、危険度とベタ降りの挙動を入れるためにちょっと前に作った理論(麻雀AI開発その42・数学的なお話その2)を応用します。
xが再帰関数で求めた局収支だったところが、手牌価値評価値にそのまま置き換えただけです。

ツモに対する打牌についてはこのままの式ですが、他家打牌に対する鳴き判断は少し厄介です。
yは初手切る牌の危険度指数ですが、スルーの場合はyに相当するものが存在しません。
そこで、場合分けをして、
・鳴きの場合は同じ式
・スルーの場合はyがからむb,c,eの項の代わり(その項は0とする)に定数項fを加算する。
ということにしました。

というわけで、(紆余曲折ありつつも)係数がこんな感じで出せたことにします。
(4副露はどうせまともな値が出ないだろうから3副露と同じにして、対染め手は危険度のパラメータがまだ取れてないので後回しにする。)
170815-02.png
他家攻撃が強いほど、xの係数が小さくなって、yの係数がマイナス側に大きくなってるので、
より手牌価値指標との関連が薄くなる、より牌の危険度の多寡が重要になる…という理論です。

具体的なテストはまた次回にします。
麻雀AI開発その55・評価値関数を局収支に変換
前回の続きです。

今よりもっと鳴き寄りにするために、鳴き可能ボーナスをつけて再度準ニュートン法でパラメータ推定をやったのですが…。
鳴き可能ボーナス係数…0.05
しょぼいっ。評価値が0.05増えたところで大勢に影響は全然でないです。

なので、鳴き可能ボーナスは却下して、今のままにしておきます。


というわけで(若干不安要素はあるが)、2シャンテン以上の牌姿については評価値によって打牌ごとの手牌価値の優劣だけはできるようになりました。
逆に言えば自分の手牌(と場に見えてる枚数)しか見ていないので、他家の挙動(リーチと副露)には対応できていません。
評価値と他家への牌の危険度(具体的には放銃率×放銃時失点の危険度指数、単位は「点」。)を結びつけるために、評価値を局収支に変換することを考えます。
基本的には評価値がいいほどいい手牌であることがほとんどなので、評価値と局収支は正の相関があると考えられます。

具体的な理論は以下の通りです。(ただし、ところどころ端折っている。)

まずは以下のデータを実際の牌譜から取ってきます。
(前回取ったパラメータから計算した)評価値・現在巡目・親の位置・下家の攻撃度合・対面の攻撃度合・上家の攻撃度合、の組xに対してこの局の収支yを対応させる。
攻撃度合についてはリーチ・非リーチ面前と1~4副露×通常副露or染め余りなしor染め余りありorドラポンの18種類で分類する。

このとき、推定の局収支の値を次式でモデル化する。
170814-01b.png
p_1は評価値に対する倍率のパラメータで巡目と自分が親かどうかで分類します。つまり、18×2で36種類のパラメータになります。
p_2は他家攻撃の強さに関して補正するパラメータ(基本的に負の値を取る。)で、該当他家の攻撃度合と親の場所(自分or該当他家orそれ以外の他家)で分類します。18×3で54種類で、p_1、p_2合わせて90種類のパラメータがあります。

この推定局収支と実際の局結果との誤差(正値にするために2乗する。)の和が最小となるようなパラメータの組p_1とp_2たちを求めます。
最小化する目的関数は次のものです。
170814-02.png

あるパラメータ(90種類のうちの1つ)p_jで偏微分するとこうなるので、
170814-03.png
これ=0となるようなパラメータ群(のうち目的関数が最小となるもの)を準ニュートン法で探していきます。

試合数を増やしたり、繰り返し回数を増やしたりして工夫しながら(なかなか思うような結果が出なくて苦労した)出したパラメータはこんな感じ。

170814-04.png
p_1の方は巡目が遅くなると評価値が高い効果が薄まる(評価値に比例する成分が少なくなる)、自分親の方がより評価値が大きい効果が高い、
というのはいいです。
p_2については攻撃度合が強いほど(例えば0副露→リーチとか)マイナス補正が大きい、自分親の方が(たぶん被ツモ失点の関係で)マイナス補正が大きいというのはいいです。
問題は相手親のケースです。
子VS子よりマイナス補正が大きくなってほしいところなのですが、特に染め副露についてはうまいことマイナスが大きくなってくれていません。染め副露ならリーチでの損失がない分、親が攻めてくる損失が大きくない?とか親は遅い手なので、子の安い上がりが誘発されやすいとか?
ここはよくわかりません。

なんか準ニュートン法のヘッセ行列の逆行列の初期値次第ではうまく収束しないことがある、とか書いてたからその影響なのだろうか?もしくはコードの書き間違いか。
麻雀AI開発その54・評価値関数をAIに搭載(鳴き判断)その2
前回の続きです。

手役不確定について評価値にペナルティを課そうと、いろいろいじくってたら、かなり重篤なバグ(副露時にタンヤオ限定シャンテン数と一色限定シャンテン数が過大評価されることがある)を見つけてしまいました。

そのバグを直した上で、手役不確定ペナルティを加味させた評価値で再度鳴き判断を確かめてみます。
170813-01.png
バグを直した影響(パラメータがだいぶ変わった)で今度はかなりスルー寄りに傾きました。
誤答になってるのはすべて私は鳴いた方がいいと思うところ、AIがスルーと答えた状況です。

まぁ、役なしなどから鳴いてしまうよりは、慎重にスルーに寄りすぎる方がまだ実害は少ないような気がしますが、
私の考える最善と比較すると22個の鳴くべきと思われる手に対してAIは10回もスルーしてるので、副露率は相当下がりそうです。
鳴きすぎになったりスルーしすぎになったりと、なかなか思う通りに調整ができないですね。

というわけで、もうちょっと鳴き寄りに傾くように調整をがんばってみます。
今回は鳴き可能な手牌に対してボーナスを単純加算で付与する方向でやってみようと思います。
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード