*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>>
floodgate for mahjong へ参戦その13・計算時間短縮その2
前回に引き続き、AIの処理速度改善の話です。

やったこと
・内部変数のうち副露以外手牌、副露手牌、見えてる枚数、有効牌について、Integer型配列で扱っていたのをLong型(もしくはビット数の都合で、Long型2個組の構造体)に変更
・引数の型が変わったので、それに合わせて関数の中身も変更
・関数のうち、シャンテン計算関数と和了処理関数のアルゴリズムを速度改善の方向に抜本的に見直し
・変えた部分のテストとバグ潰し

設計思想として、
・なるべく加算減算とビット演算のみで処理を行う。
・乗算はなるべく使わない。(Modでの剰余計算なんてもってのほか。)
・配列をなるべく使わない。(初期化とか参照に時間がかかると思ったので。後は参照型配列のクローン作製の処理にも時間がかかるので、構造体の値型で、数値コピーにかかる手間を省く。)
・コードの長さは長くなってもいいけど、ループとか分岐で判定する回数をなるべく減らす。(分岐判定や乗算剰余の使用の回避を優先する。)
・可読性や保守はしにくい(Long型変数から手牌とか枚数の形が瞬時に判断しにくい)けど、速度優先。
という考え方でやっています。

かなり全面的な改訂になったので疲れました。
けれど、それに見合った成果はでました。

前回と同じ手牌をAIにかけてみると、
170521-01.png

パーツごとの途中経過時間も測定するタイプで、全部で16秒。
さらに、途中経過時間を呼び出す関数(Timegettime関数)でけっこう時間を食ってることが判明したので、
その部分をカットしたタイプだと、9秒まで時間を減らすことができました。
これくらいだとまぁなんとか実戦には耐えることができそうな感じです。
ここから鳴き判断とか他家和了考慮のシミュレーションパートとかも入れたらまた増えるんでしょうけど。

パーツごとの時間を見る限りは明らかにボトルネック的になってる箇所はなくて、ある程度分散しているのが分かります。
まだ改善できてないところ(捨て牌とか現物・筋の変数とかがまだListや配列のまま)も残っているので、それを見直したらまた早くなるかもしれませんが、今のところはそれ以外でここを良くしたら劇的に速度改善する、というところはないですね。
とりあえず改善のネタが尽きてからまた考えることにしましょう。
スポンサーサイト

コメントの投稿

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

コメント

プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード