*All archives* |  *Admin*

<<06  2017/07  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  08>>
floodgate for mahjong へ参戦その12・計算時間短縮その1
floodgate for mahjong へ参戦その11・スタックオーバーフロー撃退
前回の続き。

今回は計算時間的にネックになってる部分のうち和了処理(5番)の計算時間を短縮させました。
170516-01.png

なんとか5秒くらい縮めるのに成功しました。

まず最初は和了ハン数符数の記憶検索のキーをString型からもっと短時間で計算できる型にしてみました。
昨日調べてると、BigInteger型なる、扱える数字の上限がないという夢のような整数型を見つけて、これすごくいいんじゃない?
と思ったけど、実際使ってみるとビットシフト演算するにしても検索のキーにするにしてもちょっと遅かったです。String型と五十歩百歩的な。

次の案で、副露以外手牌は51ビットでLong型で扱える、
晒し部分は鳴いた牌が37種類(7ビット)、鳴きの種類(チーが下2枚・カンチャン・上2枚と赤含みかどうかで6種、ポンが赤含みかどうかで2種、カンが暗槓と明槓で2種の計10種、4ビット)の副露数最大4で11×4=44ビット
と上がり牌37種類が7ビットと偶発役で5ビットなので、44+7+5=56ビットでこっちもぎりぎりLong型で扱える、
この2情報を構造体にまとめてビットシフトと検索のキーとして使います。
最初はこれも遅かったのですが、GetHashcodeなるものを使うと検索が効率的になるらしく、なんかスピードアップしました。

検索キーの問題はこれで済んだのですが、まだ和了処理全体があまり早くなりませんでした。
そこで、さらに小分けにしてネックになってるところを調べていると、
前回に出てきた牌姿についても、見えてる枚数とか巡目とかを参照して毎回裏ドラ計算してるところが遅かったみたいでした。
和了のたびに前の使いまわしができずにツモ率計算とかdouble型の乗算とかやってたので、そりゃぁ遅いわけです。

さすがにこのままだとやってられないので、裏ドラ計算のところを手抜き(単純に(4-手牌枚数)÷122をツモ率にした)して、記憶情報の中に上がり打点も盛り込みました。

すると、5番でかかった時間が1秒ちょっとに減りました。
これでもまだ長いのですが、なんとか最大のネックは解消できました。

さて、次に手を付けるのは12番の他家切られ率と16番その他のInteger型配列軍団の整理ですなぁ。
こっちはさらに影響範囲が全範囲に及ぶのでたいへんです。
スポンサーサイト

コメントの投稿

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

コメント

プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード