*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開発その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でずらーっと書き出すところから始めないといけません。
とにかく書き出す項目数が多いので、プログラミングは難航しております。
スポンサーサイト
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード