*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>>
一人麻雀計算機その11・テストと改善その3
今日の成果はこちら。

2016年11月6日 ver1.05
9の牌が孤立対子・暗刻のときにパーツ切り分けできなかったバグを修正。
出力値に聴牌時良形割合を追加。
ハッシュテーブルの内容を変更。(計算スピードアップ。)

1個目はシャンテンチェックの関数内で孤立の9の牌が対子・暗刻のとき、それをメンツ・メンツ候補として認識しないというかなり重篤なバグがあったので、それを修正しました。
現在ウザク本の牌姿をテストデータとしてかたっぱしから入力している中で、このバグが引っかかりました。早期に見つかってよかったです。あぶないあぶない。やっぱりテストは重要ですね。現在Q057まで走破したので、このまま300問までテストを続けていこうと思います。
これは放置するのがまずそうなので、後で最新版をアップしておきます。

2個目は出力値について。
従前は局収支・和了率・聴牌率・和了時得点・和了時一発割合を出してましたが、テストデータを眺めてる中で、聴牌時良形割合が欲しいなーと思ったので、それも同時に出すようにしました。

こんな感じです。ウザク本Q057。
161106-03.png
一応、今回は打4pより打7pの方が聴牌時良形割合が高くてやや局収支で上回ってます。
ただ、
・他家の和了を考慮してない。(スピードが遅い手が過大評価されやすい。)
・鳴きを考慮してない。(役牌対子・タンヤオが過小評価されやすい。)
・テンパイしたら即リーチで他家からの出上がりを考慮しない。(良形(特に平和)の方が4人麻雀の感覚より評価が高く、愚形(特に19字牌待ちと七対子)の評価が下がりやすい。)
というので、あんまりあてにはできないかもしれません。
そこはごめんなさいと頭を下げて、今のところはただの参考値で、今後の4人麻雀への拡張をこうご期待ください、くらいでお茶を濁す感じですかね。

3個目は計算スピード関連の話です。
とてもいい情報をコメントでお寄せいただきました。

ハッシュを探索する時間に悩まれているようですが、
1-9の数牌が0枚から4枚の組み合わせの全パターン(=5^9=1953125パターン)を9桁の5進数と考えて面子、ターツ数を順番に配列に入れておけば、
新たに面子、ターツ数を求めたいパターンから5進数に変換する計算コストだけで答えが得られるようになります。


初見ではこれをやると、配列の見た目サイズがバカでかくなって(実際に5進数に直すと1562500という大きさになった。)、配列への参照が時間かかるのでは?と思ったので敬遠していましたが、
まぁ戻すのはいつでもできるし、試しにやってみようか、ということでやってみたのがこちら。
(ウザク本Q032から。シャンテンを維持できる7p以外のすべての牌についてそれぞれ計算した時間の合計です。)

161106-02.png
左が変更前。右が変更後。手を入れたのは「12:ハッシュテーブル検索」の項目ですが、効果は一目瞭然です。かなり早くなってます。
従前だとString型リストにハッシュ値で割り振って文字列検索をかけてましたが、
新しいのだとコリジョン(衝突)なしのハッシュ値なので、検索の手間がいらないという利点が配列の見た目サイズのでかさを上回ってるんだなーと思います。小難しいこと考えずにさっさとこっちの方法でやっとけばよかったですね。

この方式だと検索する必要がないので、使用頻度が多いものを前方に持ってきた、最適なハッシュテーブルを作るみたいな発想はまったくの不要となります。喜ばしいことだとは思うのですが、苦労して作ったコードがあんまり意味ないものとなってしまうことへのむなしさはちょっとあります。この作業のためにウザク本300問走破を目指してたのですが、ちょっとモチベーションは下がりますね。まぁテストの重要性は先ほど再認識したので、黙々とやりますけれど。

シャンテンチェックの方は十分早くなったので、今度は記憶検索の方を早くしたいなーと思うのですが、こっちは13枚とか14枚、(もしくは37種類の牌ごと)の手牌情報を参照するので、コリジョンなしのハッシュ値に変換するのは相当困難な気がします。
37種類の牌を単純に5進数変換とかにすると7.27596E+25という天文学的な数値が。うへぇ、これは無理じゃー。実際はmaxで14枚なのでそれよりは圧倒的に少ないでしょうが、うまいことコリジョンしないハッシュ関数を見つけるのはしんどそうです。
あんまり難しいハッシュ関数にしてもハッシュ値の計算に時間がかかっては元も子もないし。
現行の手牌以外の情報+最初の2牌の情報でグループ分けしたString型のリストを前方検索するくらいしか能がなさそうです。
それともまだ何かいい方法が眠っているのか…。


今後の改善予定。
打牌固定しないときはシャンテン数を維持できるすべての牌を切るという想定ですが、明らかに不利な打牌、例えば両面をカンチャンにするとか、黒5を持ってるのに赤5を切るとかも入っていて、計算に時間がかかって非常にかったるいので、さすがにそういうのは省こうかなーと思ってます。
具体的にはこの程度の条件が当てはまるなら計算を省く方向で考えてます。
・黒5を持ってるのに赤5を切る場合。
・手替わり1以上かつ一向聴のとき、先に手替わり0の計算をしてから(一向聴ならすぐ終わるので問題にはならない。)、局収支が最善より500点以上低い打牌は本題の手替わり1以上の計算を省く。

他はノープランです。のんびりテストを続けていきます。


最新版をアップロードしようとしたけどなんかうまくいかないので今日は上げるのやめときます。
スポンサーサイト

コメントの投稿

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

コメント

プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード