ブログ内検索

2019年12月27日金曜日

17-7 ビンゴバルーンFREE4個解析途中経過(1)

上記のように、とりあえず53130通り中10000通りの(実際は対称など考慮して4000通り)解析が終了した。CPUをほぼフル稼働で回したが、上に書いてある通り、経過時間はおよそ百万秒。
得られたデータを見ていくと、やはり期待値40倍が多い。なぜなら縦または横の7個ラインにバルーンが3個でも発生したら7個ライン確定で、その後はオッズアップ候補が残り20個中4個もあるためである。

さて、残りのデータ解析であるが、とりあえず53130通りのうちの10000通りの中に、スキップできない解析が必要なデータが4138個あった。
なお、10001通り目から20000通り目には解析の必要なデータが2514個、
20001通り目から30000通り目には167個
30001通り目から53130通り目には23個

したがって、この計算はあと8日ほどで終わる見通しとなる。

この計算がすべて終われば、極めて正確なビンゴバルーンのPO率と各配置のFREE別最適解が提供されることになる。
ゆくゆくは画像処理などを使って超マルチ8面で瞬時に配置とFREE可能数を入力して最適解をたたき出すアプリとかを作れば面白そうだとは考えているが、今はいろいろ忙しくその時期ではない。


しかしそれっぽいものを作りつつあるらしい。
を参照。

2019年12月15日日曜日

17-6 ビンゴバルーンFREE3個解析結果

ついにFREE3個による解析結果が判明した。mathematica複数台体制で最後のほうはやることにした。
まず、FREE3個を置ける状況下でのPO率は488.2%。以下に各FREE配置可能個数別のPO率を再度掲載する。
FREE0個配置 7.6%
FREE1個配置 43.8% 
FREE2個配置 189.9%
FREE3個配置 488.2%
配当分布は以下。
もちろんこれより大きな配当もあるが、少ないので割愛している。
これを見ると、2倍以下の配当になることはほぼなく、ほぼ確実に2倍以上の配当が保証されるということであり、FREE3個はすさまじいメリットとなる。

次に具体例を見ていく。例えば以下のパターンではどこに配置するか悩むだろう。
縦の7個ラインリーチを取るか、確定5個ラインをとるか、それとも田の字型の3個ラインを期待するか。
こういうときにこの最適解探索が役立つ。すると以下のように配置するのが最適。
上記のように配置した場合のPO率は612.4%となる。

ほかのパターンでも検証する。
上の状態で、5個ライン確定1つと、もう一つのリーチで5個ライン2つを狙うか、確定4個ラインを1個作り、そのほかの4個ライン成立を狙うか、それとも5個ライン1つとオッズアップを狙うか。
そして最適解は以下。
5個ライン2つを狙いにいく、というのが正解らしい。
ただこれ、期待値でいうと5個ラインオッズアップよりシンキング終了時点での配当が低いので、確定した配当をすぐに得たい、というときは必ずしも上記のように配置するのが絶対良い、というわけではない。
もちろん、長い目で見れば上の配置が最適ではあるが。

次は以下の配置。
このとき、PO率は708.3%で、最適解は以下。
ちなみにだが、もし上のFREE配置をやめて、例えば期待が高そうな真ん中に、最も下の一のFREEを置き換えた場合、PO率は699.8%となり、8.5%くらいPO率が落ちる。
また、最も下のFREEをオッズアップとした場合は、PO率は680.4%となるので、またちょっと落ちる。
ただ、PO率的にはかなり類似しているので、判断は難しいと思われる。

2019年12月8日日曜日

18-3 ヘブンツリーのPO率

おそらくあっているであろうプログラムの元、フロアアップ4種類、そのそれぞれに対してオッズアップの配置15種類を考慮した60パターンのPO率などを求めることにした。
各パターン100000回の試行を行った。だいたい1,2時間程度だっただと思う。
以下、1Fからゲームがスタートするものとする。有効数字そろってないのとかは多めに見てや…。

2FUPのみ→平均3.0F、継続率41.7%
3FUPのみ→平均3.1F、継続率48.8%
2F2F混在→平均3.1F、継続率48.1%
2F3F混在→平均3.18F、継続率54.1%
グラフは上から上記の設定によるフロア別到達確率。初期フロアを1としており、最高フロアは9である。





上記のフロア到達確率を利用すれば、ヘブンツリーで35Fに行く確率も計算できるが今はやらないでおく。

上のグラフは上から1~15行目が最下段2FUPのみのもとで、
オッズアップの配置の組が{なし},{0,2},{0,3},{0,4},{0,5},{2,2},{2,3},{2,4},{2,5},{3,3},{3,4},{3,5},{4,4},{4,5},{5,5}の時の各種回数を与えている。
16~30行目は最下段に3FUP、31行目~45行目は最下段2FUP、2段目2FUP、46行目~60行目は最下段3FUP、2段目2FUPを表している。

横の列は右から配当獲得率(継続率)、1倍以上、3倍以上、5倍以上、10倍以上、30倍以上、50倍以上を100000回中の成立回数で表している。例えば41745と書かれていたらおよそ確率は41.7%であるとわかる。
最後の右の列はPO率を割合で表したものであり、例えば0.745903ならPO率74.6%程度を意味する。

ちなみに、AnimaLotta@2chwikiによると、アニマツリーは以下のPO率らしい。

アイテム別ペイアウト理論値


ODDS無 ODDSx2 ODDSx3 ODDSx4 ODDSx5
2FUP 65.11% 81.38% 97.65% 113.92% 130.18%
3FUP 73.28% 90.22% 107.16% 124.09% 141.03%
表はwikiのものをそのまま貼り付けた。
これと比較すると、一応ヘブンツリーのほうが総じて当たりやすい、ということが分かる。我のプログラム等に間違いがなければ。

間違いがないであろうことを確認するため、念のため上の表と同じデータが得られるかチェックする。ODDS無の2FUPのとき、我のプログラムによると、PO率は65.7%と出た。これは非常に近い値になっている。次にODDS5倍が配置され、かつ3FUPが配置されているときも計算してみたら、140.9%となった。これはわずか0.1%程度(100000回中100回程度の違い)しか違わないため、プログラムの正当性がほぼ担保された。
なのでだいたいPO率をパーセンテージで出したとき、一の位までは信頼度がかなり高いことが分かる。

上の表から結論を言わせてもらうと、ヘブンツリーは「ほぼ増えない」。
アニマツリーのシークレットゲームであるが、最下段にオッズアップがない場合はいくらフロアアップが発生していようがPO率53%である。これはアニマツリーの最低PO率65%より明らかに少ない。また、最下段に×2と×3あたりが両方ついたとしても、PO率は70%程度であることが多いなど、総じてPO率は低めである。
なにしろ最下段に×5が2つついており、さらに3FUPが最下段に、2FUPが2段目についているというおそらく最高の設定ですらPO率は122%と、アニマツリーのオッズアップ×4がついている場合とあまり変わらないからである。
あと、フロアアップが最下段に2FUPのものしかないとどんなオッズが出ようがPO率は100%を割ると思われる。

いやしかしこうしてみると、確かに設定や配置によってはPO率100%を超えるゲームもあるが、これまでの結果を総攬すると
ビンゴガーデン、チェーンボンバー→最大でもPO率90%台と思われる
アニマツリー、ビンゴファーム、ヘブンツリー、サンダースマッシュ、ビンゴバルーン、ハッピーフラワー、アニマドロップ、クラッシュドロップ→PO率100%超えの設定は可能
ハニーエイト、ハニーファイブ→最大PO率100%に届かない説濃厚
サンダーブレイク→不明


なお、現時点でインターネット上に公開されているアニマロッタの確率に関する情報は、メダルゲーム掲示板とアニマロッタのWiki(マイナーだが)であり、ここにビンゴガーデン、チェーンボンバー、アニマツリー、ワンダーチャンス、JPCのPO率が掲載されている。
ハニーエイトはたまにPO率が60%ちょっと云々とかいう話を聞く。
ただこれ以外、PO率に関する情報はアニマロッタではないと思われる。
カラコロッタではバブルクラップとあにまだま以外、たしか求めていた人がいたと思う。
あにまだまはかなり昔、我が消し玉出現率と配当出現率ごとに集計させたがなんか需要がなさそうだったので公開はやめた。


余談:アニマロッタとはあるラウンドワンで遭遇した。そのラウンドワンはもう閉店したが。メダル30枚無料チケットで興味をひかれたカザーンをやっており、その隣にアニマロッタ(初代)があった。カザーンに飽きた後、アニマロッタにはまったのがきっかけ。たぶん2012年だと思われる。

18-2 ヘブンツリーのプログラム

ビンゴバルーンを待っている間に、ちょっと合間に作った程度なのでプログラムに誤りがあるかもしれない。よって以下に示す情報はシミュレーション結果といえども、確実ではないことに注意。間違いに気づいたらこの記事は取り下げるつもりである。
ただ、いろいろなパターンでちゃんとオッズが計算されていることを確かめたので、たぶん正しいはず…。

プログラムは以下。まずは各種操作の定義。

 oddsmakingという関数は、フロアがアップしていくとき、出現フロアの階層に応じて何倍のオッズが出現するかを規定している。
oddsupという関数は、各フロアのHIT状況を判定し、HITかつそのマスにODDSUPがあればその倍率が加算される。なおその後加算された倍率値は初期化される。でないと毎回その値が加算されてしまうからである。ちなみにFor文でi=1からi=1と一見意味のないことをしているように見えるが、これは関数をひとまとめとして処理するためにやむなく付け加えている。そうしなければセミコロン以降の次の処理が無視されるためである。たぶんこれについてはもっといい方法があるはずだが安直にこれを採用しておいた。
floorup1は現在フロアから何フロア上昇するかを判定する関数。これは途中に出てくる2FUPや3FUPに対してもうまく動くのは一応確認しておいた。
Normというのが中にあるが、要するにNormが0でない、というのはいずれかのマスは必ず0でない、つまりそのフロアから次のフロアへ上昇できる、ということを意味している。
別に愚直に書いても良いが…。(「または」の記号を3つ使うことになる)
floorup2はfloorup1にて取得した上昇階数分、フロア上昇処理を行う。このときにオッズアップマスが生成されるのでoddmakingが役に立つ。また番号はアニマツリーの番号配置の定義に従っている。つまり、次のフロアに出てくる候補の番号は現時点までにすでに出ていない番号であってかつフロア移動後真ん中と下の段と番号がかぶらない番号の中から2つ昇順に選ばれる。この辺りの条件はComplement(補集合)とUnion(和集合)などを使って書いている。


そして用意が整ったのでいよいよゲーム処理実行。
最初の番号を固定しているが、これは別にほかの番号にしてもたぶん確率は変わらないのでこのままでよい。
上の画像ではヘブンツリーなのに中段と上段に番号が4つ配置されているがこれは後で修正した。
あとはまあ特筆すべきことはない…と思う。

これらのプログラムが正しいことを仮定して、以後はシミュレーションの話に移る。
一応いろんなパターンでうまく動作していることを確かめたのでおそらくあっていると思うが…。

18-1 ヘブンツリーについて

自作アニマロッタ側でヘブンツリーは当面の間作らない予定だが、まだヘブンツリーに関する情報がインターネット上で現れていないので、ちょっと片手間にプログラムを書いてみようかと思っている。スマッシュやハニーエイトはもうとにかく定義する部分が多すぎて面倒なのでやる気が起こらない。

すでにアニマツリーは、メダルゲーム掲示板みたいなところで確率が出されている。我も中学生の頃はこれすごっと思い参考にさせていただいた。こういうシミュレーションはどうやっているのか、と思った。

ヘブンツリーも、実際はアニマツリーと似たような処理であるから、できる人がいないはずがない…が、それでも確率がいまだ求められていないので、求めてみようと思う。

そのためにはヘブンツリーの初期配置の特徴等を観察しなければならない。
どうもPO率の調整は最下段にどんな倍率やフロアアップが配置されるかに起因していると思われるので、その配置を以下に動画を見て記していく。
以下、スタートフロアを1Fとする。まず固定で以下。
1F左 なし 番号4つ
2F左 2倍 番号3つ
3F左 2倍 番号3つ
4F左 3倍 番号2つ 0.3倍
5F左 4倍 番号2つ 0.6倍
6F左 5倍 番号2つ 1.2倍
7F左 5倍 番号2つ 2倍
8F左 5倍 番号2つ 3倍
9F左 5倍 番号2つ(実質意味なし) 5倍

次にランダムで以下の配置など。
パターン1 最下段なし 1Fに2FUP
パターン2 最下段なし 1Fに3FUP
パターン3 最下段なし 2Fに2FUP
パターン4 左2に2倍 1Fに2FUP
パターン5 左2に5倍 1Fに2FUP
パターン6 左2に2倍、左3に2倍 1Fに2FUP
パターン7 左2に3倍、左3に3倍 1Fに2FUP
パターン7 左2に3倍、左3に2倍 1Fに2FUP
パターン8 左2に2倍、左3に4倍 1Fに2FUP
パターン9 左2に4倍、左3に5倍 1Fに2FUP
パターン10 左2に5倍、左3に5倍 1Fに2FUP
パターン11 左2に4倍、左3に5倍 1Fに2FUP 2Fに2FUP

以上の配置から、2FUPと3FUPと2F3FUP同時出現の3パターンを考え、
そのそれぞれに対してオッズアップの配置がせっかくなので全部のパターンを考えようと思う。すなわち{左2つ目のオッズ、左3つ目のオッズ}として、
{0,0},{0,2},{0,3},{0,4},{0,5},{2,2},{2,3},{2,4},{2,5},{3,3},{3,4},{3,5},{4,4},{4,5},{5,5}の倍を考える。

2019年12月7日土曜日

17-5 同一パターン補間のプログラム

これまでに、回転や鏡像移動で同じものとみなせる配置はPO率計算を飛ばしても良い、としてきた。せっかくなので、どのようにプログラムしているかを解説する。
toID1という関数は、25個の中から5球取り出した組を、重複なく昇順に並べたものの順番付けをするものである。例えば{1,2,3,4,5}というベクトル値を受け取ると、1という値を返す。toID2はFREE2個の配置用で、toID1の2個取り出すバージョンである。
sgn0はある番号に対して90度回転を与える関数、mir0は左右反転を与える関数である。
最終的には集合を回転させたので、そのためには要素の回転が先に必要になるであろうということから、これを関数化する有用性が見て取れる。
toID11からtoID8は、toID1とかの11,10,9,8球バージョン。それぞれあらかじめオッズを格納したベクトルの指定用。
なにしろいちいちオッズの判定をしていると時間がかかるから…。
sgnとmirは、与えられた集合(長さは任意)を90度回転、左右対称反転するもの。
具体的に言うと、引数として指定した集合を要素ごとにバラバラにして各種回転、反転操作をかけて、それをまた集合に再構築し、さらにそれをsortすることによって昇順にする、というもの。Sortを使わないと例えば{1,2}を引数として渡すと{16,9}となってしまい、先述の重複なく昇順に並べる、という規則に反するので非常に不都合になってしまう。

最後にcheckは、与えられた引数(集合)の回転や対称反転を行った先の組み合わせのIDを順次7個、ベクトルとして返す関数である。

こういった先に関数を指定して後でそれを使うというアイデアはウディタのコモンイベントに引数があるのを見て、それを使うと楽になるのではないかと知ったのがきっかけ。
まだこれを知らなかったころ、自作アニマロッタ風ゲームなどですごく手間な入力をしていた時代があった。


これらで準備が整って、以下のようにプログラムを組む。
といっても思いつくままに書いて、後で修正をするやり方なのでプログラムのミスが頻発するが後で直すのであまり仰々しく丁寧に入力してはいない。
やっていることとしては、5000回に1回進捗状況を示して、という最初の命令と移動先を移動元に直すためには逆演算をする、ということを記述している。
例えば反転→回転→回転→回転でデータを見つけた場合、戻すためには回転→反転としなければならない。

この操作は十数秒程度で終わったと思う。

これでようやく、保留しておいた部分を埋めることができ、ようやくFREE2個のデータが完成するわけである。



17-4 ビンゴバルーン最適解適用例

せっかくなので、ここで得たデータを実際に適用してみようと思う。

http://s0531033.blog.fc2.com/blog-entry-14.html
上にあげるブログに、ビンゴバルーンの攻略法が載っている。

たぶん普通は我のブログ以外を参照したほうが直感的でしかも理解しやすいから良いと思う。だが我のブログは、数値の解析重視で話が進んでいるため、たぶん一般受けしない。がやってて楽しいので休憩がてらにやっているだけ。

さて、上記URLを参照すると、ある最初の5球の組が与えられたとき、どのように配置をするのが適切か、という問題が提起されている。

その中の「パターン1」では、我のブログでいうところの組{6,11,16,18,22}に相当し、これはID40393である。この時23マス目に配置するのが最適であり、払い戻し率は44.324%である。
あちら側でも、最適は9と書かれている番号、すなわち23マス目に入れるのが適当といっており、これは最適解の数値的検証により裏付けられた。

では次に「パターン2」を見てみる。これは組{17,18,20,21,23}でIDは53021。
これの最適解はID131で、{17,19}の組が最高配置を与えて、その払い戻し率は442.5439%と実に4.4倍。
これもやはり考察が正しいことが裏付けられている。

最後に「パターン3」についてこれは{4,6,8,13,20}の組で、最適解は{14,24}であり、その払い戻し率は289.7807%である。これはどうやら5個ラインを狙いに行ったほうがいいらしい。ここだけは「最適」とした結果が異なる。

このようにして、悩ましいパターンを解決していくことができる…がこれを使うかと言われれば我は使わないだろう…。

17-3 ビンゴバルーンFREE2個解析結果

ついにFREE2個による最適解の構成が終了した。1日と半分くらいで終わったと思われる。やはり予想通り20~30時間程度かかった。
なお、FREE3個は25C2のFREE配置が25C3となるため、およそ8倍弱に膨れ上がるので1週間以上はかるくかかるため、やるかどうかは不明。

さっそくお楽しみのデータ開帳である。

最高配置はID2423などであり、{1,3,7,13,19}で、最適解はID299、つまり{23,25}。
これは縦の7個ラインを意味する。そして期待値は3151.23%となり、平均31.5倍の払い戻し率。

最低配置はID17412など、つまり{2,9,13,17,24}で最適解はID72、つまり{4,7}であり、
この時の払い戻し率は23.0702%である。

FREE2個を得たときのPO率は189.8806601%であり、以後はこれを190%とする。

するとFREE1個とFREE2個ではPO率が45%と190%と、極めて大きな差異がみられる。

FREE3個の場合は、FREE2個+oddsupの配置を必ず取ることができるので、PO率は少なくとも380%を超えることは確定である。この上にさらに赤バルーンと被らないようにFREE3個を置けるので、最初5球での最適解はそのオッズアップ1個とFREE2個の配置か、それともその3個の配置の最大を取ることができるためである。
むろん、FREE4個の場合のPO率は確実に570%を超えると思われる。

するとここである案が浮かんでくる。
ビンゴバルーンの初期FREE設置数で勝てるか負けるかを判断できるのではないか?と。
以下、+FREEが1個配置される確率をx、+FREEが2個配置される確率をyとする。すると確率の定義から自動的に+FREEが3個配置される確率は1-x-yとなる。

さて、+FREEが1個設置された場合、FREE2個となる確率は、その+FREEにHITする確率なので、25C5通りの中から、その+FREE1個を含むため残り4球を24個から選ぶので24C4通り。この確率は24C4/25C5=1/5となる。
次に+FREEが2個配置される場合も同様に考えて、FREE3個を得る確率は1/30,FREE2個を得る確率は1/3,FREE1個のままの確率は19/30である。
最後に+FREEの3個配置も同様に考え、FREE4個を得る確率は1/230,FREE3個を得る確率は2/23,FREE2個を得る確率は19/46,FREE1個のままの確率は57/115である。

これらをまとめると、最終的に獲得できるFREEの個数は、
FREE1個がx*(4/5)+y*(19/30)
FREE2個がx*(1/5)+y*(1/3)+(1-x-y)*(19/46)
FREE3個がy*(1/30)+(1-x-y)*(2/23)
FREE4個が(1-x-y)*(1/230)
となっている。
今、FREE1個のPO率は45%、FREE2個のPO率は190%、FREE3個のPO率は380%以上、FREE4個のPO率は570%以上であるので、期待値は1.14-0.4x-0.095y以上、ということになる。

これからわかることは、0.4x+0.095y<0.14ならば、全体のPO率としては100%を超えるため、一応理論上は勝てる計算になる。
なお0.4x+0.095y>0.14ならばPO率100%未満、というわけではない。なぜならFREE3個とFREE4個の場合はおそらくもっとPO率が上がるとみているからである。

というわけで、全体としてのPO率は100%を超えるためには、例えばx=0.2,y=0.6ならば、
0.08+0.57=0.65となり、PO率100%を超えるかどうかは怪しい。不等式を満たさないが、先述の仮定から100%を超える可能性もある。

適用例としては、ビンゴバルーンを8面にして+FREE1個が5面、+FREE2個が2面、+FREE1個が1面で出た場合はx=5/8,y=1/4を代入してみるとよい。

ただやはり、FREE2個の適用パターンを暫定的に3、4個に適用しているのでx,yが満たさなければならない条件が厳しいのが問題。
これはもう、FREE3個などの計算が終わるのを気長に待つしかない。

最後に配当分布を載せておく。
上は全部のデータでは無く、だいたいの範囲を載せたもの。横軸は倍率、すなわち払い戻し率(PO率)、縦軸は53130通り中その範囲に収まったパターン数を表している。
例えば横軸の値が30を超えるものもあるが、ごく少数なので範囲に入れていない。
いれてしまうとなんかわかりにくいグラフになるためである。
すなわち縦軸の値を53130で割れば、その階級の確率が出てくる。

さて次はFREE3個の最適解構成だが、1週間以上PCに作業をさせるかどうか…。

なお最近はまったくアニマロッタ5をやっていないが、当時はビンゴバルーンを8面でよくやったものだった。これはやはり経験がものをいう。

2019年12月5日木曜日

17-2 ビンゴバルーンFREE1個解析結果





いやなんか、何度も記事の削除と作成を繰り返しているのは、いろいろとこちらにも事情があって…。つまり一筋縄ではいかないということ。
結局普通の総当たり法に行き着いた。

ここでは、比較的処理数が少ないFREE1個配置の場合を見ていく。
まず、FREE1個のもとで、最適解を選んだ場合のPO率は44.0738196%である。
これは、FREEの追加がなければものすごいスピードでメダルが減っていく、ということである。

ほぼすべての場合において、この場合に黄色バルーンを赤バルーンに重ねてオッズアップすることは期待値が下がるが、初めの53130パターンのうち189パターン、つまりわずか0.03557%である。

左上から順番にマスに番号1,2,3,4,5…とふる。

最初の5球で最も期待値が低いものは組{1,6,14,15,24}などであり、PO率は4.7472%。

逆に最も期待値が高いものは{2,6,12,18,22}でオッズアップを踏むパターンで、PO率は401.7544%である。

以下は配当分布。
ちなみに、わからない配当を仮定しており、とりあえず3個ライン7個は50倍、4個ライン4個は30倍としている。ただ、これが成立するのは前者はFREE3個以上、後者はFREE4個のときに限る。



縦軸が1の部分より高さの高い部分、すなわち小さいほうから数えて44000あたりから53130個目が払い戻し率が100%を超える。
なお、最大値が401.7544と低い理由は、7個ラインビンゴをシンキングタイム時に確定構成できないからである。これらは25倍であるといえども、残り1個に入賞する確率は15%なのでPO率は395.9752%となり、実はわずかに5個ライン確定の組み合わせのPO率に届かない。

もちろんFREE2個になれば確定7個ラインを成立させられるので、上のグラフの最大値は25以上になることは確実。

FREE2個も最終的には53130*2個のデータになるが、そのデータの貴重性がまるで違ってくる。

なお、学生用のmathematicaを自宅のPCにインストールしたので、これで12時間制限はないうえ、仮想サーバーより速く動くようになったので、たぶん20~30時間あればFREE2個のパターンは終わると思われる。

2019年12月4日水曜日

17-1 同一配置を与える置換

ビンゴバルーンのマスの定義の仕方から、{1,2,3,4,5}と{21,22,23,24,25}は180度回転を通じて同一パターンである。また最適解の組にもこの180度回転が適用できる。
このような同一パターンを見つけ出し、ビンゴバルーンの最適解の処理軽減を図りたい。
現状のプログラムでは、相当処理に軽減をする工夫を加えたもののFREE2個程度ですでに推定30時間となってしまっているためである。

まずは鏡像対称を考える。そこから90,180,270度までの回転を考える。これによってだいたい1/8くらいに軽減される。するとおやすみしているうちにFREE2個は完成するだろう。

どうすれば効率よく既に数値計算された組を見つけ出せるかが課題となる。
とりあえず各番号がどのように推移するかを考える。
例えば90度ずつ回転させると
1→16→25→10→1と循環する。ほかも同様に考えて、
2→9→24→17→2
3→15→23→11→3
これになんとか規則性を見出そうとがんばってみると、
とりあえず上の例では3つ目の数は初めのものを引数xとすると明らかに26-xである。
2つ目の数字が自明でない。その理由は同じ回転でもマスの定義の仕方と回転の相性が悪いからと思われる。そこで式にすることはあきらめて、とにかく地道に1~25まで書いていく。
がしかし、上を見てわかる通り25などは90度回転で10に移動するように、これは結局1からの回転の途中を開始としたものとみなせるので、実質
1→16→25→10→1
2→9→24→17→2
3→15→23→11→3
4→21→22→5→4
6→8→20→18→6
7→14→19→12→7
13→13
と上記7つに絞られる。
というわけで、例として5つ組{13,17,20,21,22}を考える。
すると13はいくら移動しても恒等置換なので意味がない。
17は上の推移により2というよりわかり番号へ行く。これはこの組の先頭が(=最も低い番号が)13であるため、この時点で目的は達成される。
するとこれは90度回転をすることになるので13→13、17→2、20→18、21→22、22→5となり、これを昇順に並べ替えて{2,5,13,18,22}となり、最適解も同様に移動したものが新しい組の最適解である。もちろん最高期待値も同じ。

このように順次変換をしていき、もともとの最小番号より小さいものが現れればその移動先を参照するプログラムを作ればよい、ということが分かる。
ただ、これでは組{1,3,4,7,8}のようなものは同一パターンが見つけられない。一応鏡像として{1,2,3,6,7と}という組があるが。
そこで上の話に鏡像パターンを組み込めば、とりあえず1/8くらいに処理が軽減されるのではないかと期待する。
具体的には先ほどの例{13,17,20,21,22}で鏡像を考えて{13,17,18,21,24}を得てどちらが先かをチェックする。
この場合は3番目の数が推移先のほうが若いのですでに数値は得られていることになる。

このようにして、鏡像と4回で恒等置換になるような回転の置換を考えて、その中から自分より順番が若いものを探すプログラムを作成する。順番が若い、というのは各要素の大小を順次判定しても良いが、普通に{1,2,3,…25}の5個の要素からなる部分集合族を与える関数Subsetsを利用できるため、そちらを使う予定。53130個の集合を持つ集合族なのでもしかすると要素抽出に時間がかかる恐れがあるが。

これで処理軽減はできると思うが、FREE3個以上になるとこれをもってしても厳しい可能性がある。が正直FREE3個や4個を配置できるような現場に遭遇することはたぶんあまりないし、FREE4個とか超レアなので確率は(5C3)/(25C5)で1/5313なのでほぼ0。しかもFREEが3個候補としてでるとも限らないので。
目標としてはFREE3個までを求めたいと思っている。

とりあえずはこの方法によりFREE2個の処理軽減を図ることにより、実際には、
1回あたりの処理がなんとか工夫を凝らして12秒まで減らすことができ、これを53000回繰り返すと10600分かかる。ただし、先述の対称、鏡像配置により1/8に単純に減らせると考えられる。もちろん{12,13,14,15,16}などの組は{3,7,13,19,23}が2つしかなかったりするのでこの例にはあてはまらない。
しかし、ざっくり1/8と考えてみることにすると、1325分。これは22時間程度相当。実際には上の例外があるので、たぶん1日~2日程度かかるのではないかとみている。