このブログ内を検索可能

2022年1月18日火曜日

処理時間の短縮案

DDのおまかせ最適化の処理時間をなんとか軽減できないか現在考えている。

鏡像、対称移動などは他のカードパターンで対応できないことが見込まれるのでなしとする。そこで最初の5球で同じグループに属するかを判定する方法があるのではないかと考えた。

たとえば{1,2,3,4,5}は{1,2}の部分を{1,3}{2,3}に、{4,5}の部分を{4,6}{5,6}に変えられることで他のパターンを短縮することができる。ちなみに最初からこれを考慮にいれたグループごとのパターンを考えても良かったが、それぞれの確率が異なって後で処理が面倒なため省略した。

たとえばグループ{1,2,3,4}といっても、カードの性質から{1}のところに2マス入っていたり、{3}のところに3マス入っていたり(SP1球が入った場合)などとこの{1,2,3,4}への写像が多すぎて困る。しかしマス(=番号と同意)の場合は単純にすべてのパターンの確率が等しいので処理しやすい。

これを実装した結果、全部で2429パターンだけで良いことが分かった。

ちなみにFREEの配置可能個数が違うものはもちろん最適解は違うので別物としている。

例えば{1,2,3,4,5}と{1,2,3,4,8}はINしたマスは同じであるが前者はFREE0個、後者はFREE1個なので異なるものとしている。

具体的には各マスのIN状況は入っている又はそうでないの2通りなので、これを2進数の考え方で10進数表記する。例えば1マス目からIN状況が1,0,0,1…のとき、

2^0*1+2^1*0+2^2*0+2^3*1+…となる。これは1対1対応なので、同じ表記に至る移動もとはない。あとはこれにFREEの個数を2^23あたりで規定する。

これによりidentityと名付けた10進数の値をそれぞれのカードは持つことになる。このidentity値が同じものは最適解が一致するので、過去に求めた最適解を使用できる。

そして2429パターンの計算という結果を得る。

これを行う手順は何気にちょっと行が多くなるが…。

一応カウンターを付けて必要な2429個をカウントするようにして実質推定時間もprintさせるようにしていよいよ稼働。これで大幅な時間短縮が見込めるのである。


一番上の列はそれぞれのマスのHIT状況を数値で表すものを重複なくならべていったものである。2つ目の列は1つ目の列で出てきたidentity値の場合は過去のどこの番号を参照すればよいかを示すもの。

3つ目の列はそれぞれの番号において参照すべき番号が記されている。ちなみに自分の番号と一致した場合はそれが自分で初めて出てくる、ということなので計算が必要。この条件に合致するものを53130通り調べると2429パターンとなった。