*All archives* |  *Admin*

<<09  2017/10  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  11>>
floodgate for mahjong へ参戦その15・シミュレーションパートの導入(自分他家とも鳴き無し)
前回に引き続き、麻雀AIの話です。

再帰計算(鳴き無し・他家和了考慮なし)で最適打を出すところまで前回できたので、今回からは他家和了や点棒状況を考慮するために、シミュレーションパートの作成に入ります。

今回できたのは、
・自分のツモ牌と打牌と和了・立直判定(再帰パートで計算した最適打に従って打牌する。)
・自分の打牌に対して他家聴牌者のロン和了(自分から見れば放銃)判定
・他家ツモ牌と打牌と和了・立直判定(乱数とパラメータ表から算出。)
・他家打牌に対して、自分のロン和了判定と他家聴牌者のロン和了(自分から見れば横移動)判定
です。

前の計算機だとグローバル変数で全部書いてたのを、機能ごとにパーツでばらすためにローカル変数に置き換える作業と、
配列操作メインで変数を扱っていたのをビット演算で高速計算するために、Long型(の組)の変数で全部書き換える作業がメインでした。


それで、バグを取りつつテストをしてみたところ、計算時間が遅いことこの上なかったです。
各打牌候補に対してシミュレーション回数は1万回でやったのですが、1打牌候補につき5秒くらいかかっていました。
実戦譜を読み込ませて、各プレイヤーのツモ番ごとにAIの評価値を出していく工程で、1局10~20分かかったのでこれはつらいです。
まだ、まともな動きをするかどうかの確認をしている段階で、現時点では高速化についてはあまり考えていないのですが、変数はほぼLong型の組に置き換え済みだからこれ以上短縮ってどうすればいいのか…と途方に暮れています。
今回は自分と相手4人分の情報を詰める必要があるので、どうしてもプレイヤーごとの情報は配列にせざるを得ません(Cloneメソッドで時間を食うと思われる)。

一番手っ取り早いのはシミュレーション回数を減らすことです。1万回を1000回に減らせば計算時間はほぼ10分の1なので、かなり待ち時間は少なく感じると思います。
ただ、こうするとばらつきが激しくなって正確性が減るので、これは最終手段として取っておきたいです。
(ただし、ばらつきが激しくなることはAIが同一局面で同じ打牌を返すとは限らない、という乱数の余地が入ることで人間側からすれば読みにくくなるということにもつながるので、完全なデメリットとは言い難い側面はあるかもしれない。実際にAIが打つ時は少ないシミュレーション回数、検討モードのときは多いシミュレーション回数と使い分けることも可能かも?)

次に考えるのは、全部の打牌候補に対して計算するのではなく、再帰パートで明らかに劣っている初手打牌は計算から除外する、というもの。他家無視の段階で一番いい打牌と二番目にいい打牌、もしくは他家攻撃に対してベタ降り(最も安全な牌を切る)との決選投票みたいに考えるとか。これはかなり有力です。

そういう小手先のテクニックに頼るのもまぁやむを得ないのですが、できれば基礎体力的な部分でより高速に計算できるに越したことはないです。
とりあえず他家の鳴きまで考慮したものを作った段階で考え得る限りの高速化のギミックを詰め込んで、
そのうえで、パーツごとに計算にかかった時間を測定しながらボトルネックになってるところを改善する、みたいな方針で頑張って作っていきたいと思います。
スポンサーサイト

コメントの投稿

Secret
(非公開コメント受付中)

コメント

プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード