2020年12月26日土曜日

赤バルーン→IDへの変換

 そうや…最適解のデータは重複のない辞書式組み合わせの昇順に一次元のIDとして並んでいるんやった…。つまり、このIDを配置すべき組に変換する必要がある。

悲しいことに、これを行うプログラムはmathematica上で実行していた。そしてそのmathematicaが現段階では使えないという悲劇。おまけにエクセルもライセンス云々でオンラインのアレでないと使えない。

なんとかエクセルに{1,2,3,4,5}をID1として、{21,22,23,24,25}をID53130とする変換を簡潔にやってくれるコードは存在しないのかなと思っている。

まてよたしかウディタにはCSVファイルとして結果を放出する機能があったはず!

そしてウディタにはこの1次元と5次元の相互変換を行うプログラムを組んでいるのでそれの流用ができるやん!

そのウディタで何をやっていたかというと、ビンゴバルーンの最適解の視覚化。

普通にやるならこれでいいが、やはり自動化を目指しているのでこれでは物足りない。

なお我がウディタで初めてCSV化できるコマンドを使ったのはゴブリンが提供するお楽しみ広場。あの当時はわけもわからずなんとなくしょぼいRPGを作って自分で遊んでたらしい。中学校入って1年くらいと思われる。

CSVの書き換えはライセンスがないためできないが、ウディタ上で計算してそのデータをCSVに移動させることはできる。そして結果はエクセルオンラインのほうに書き込めばいいし、これは最適解を求めるというよりは結果を記録するという少々逸脱した話なので後回しでもよい。

ちなみに、以前作ったビンゴバルーン解析プログラムはウディタ製で、以下。

上記の画像のように、5球後どこにFREEを配置すればよいかを教えてくれるツールである。ちなみに、下2つはFREE2個配置可能な場合である。
中央上の表は、8面バルーンをやっていたときに、各番号に入ったときの期待値を示している。例えば6球目に22という番号に入れば、以降2ゲームの条件付き平均POは162%ということである。この値が高いのは、右上のバルーンで7個ラインがわずかながらでも存在するということに由来する。

実はこのプログラム、mathematicaによって容量の縮小化を図るために最適解の組をIDに変換しており、このウディタでまた別のプログラムを作ってそれを以上の画像のように組へと再変換している。そのシステムをID1~53130などに順次実行させ、その組をエクセルにCSVとして保存させればこの問題は解決されると見た。

余談だが、おそらくビンゴバルーンを最適解(りんごやボールの偏りを考慮しない場合での、FREEを様々な番号に配置した中で最高の期待値を与える配置)として、配置可能FREE個数0,1,2,3,4とすべての場合で網羅したのはたぶんネット上を見たところ現時点では我のみらしい。なにしろこの作業、ものすごく時間を食うからである。CPU100%近くで計算をさせても何週間もかかったような記憶が。これでもmathematicaのカーネルを増やしてそれぞれに並立計算をさせたり、できる限りの処理の簡略化(回転、対称移動で同一となるものはそれ専用の簡易処理を行うなど)をしているんだが…。

さて…。

5つの組からIDへと変換するのは、たしかにCSVにIDと組の対応関係を等しい行に作ればそれでいいのだが、もし位置{21,22,23,24,25}にHITしてしまうと、探索に53130回もの処理が必要となり、非常に効率が悪い。となれば、UWSC上で計算させたほうがIDに関しては手っ取り早いだろう。そしてそのIDに対して、FREE1,2,3,4個のIDを組みに変換して横に並べたCSVを用意し、それの数値を読み取って最適解をコナステ側に入力する、というのが処理速度的に適切かと思われる。
 |■変数操作: CSelf26 = CSelf21 - 1 
 |■変数操作: CSelf27 = CSelf22 - CSelf21 
 |■変数操作: CSelf27 -= 1 + 0 
 |■変数操作: CSelf28 = CSelf23 - CSelf22 
 |■変数操作: CSelf28 -= 1 + 0 
 |■変数操作: CSelf33 = CSelf24 - CSelf23 
 |■変数操作: CSelf33 -= 1 + 0 
 |■変数操作: CSelf30 = 0 + 0 
 |■変数操作: CSelf29 = 0 + 0 
 |■回数付きループ [ CSelf26 ]回
 | |■変数操作: CSelf29 += 1 + 0 
 | |■変数操作: CSelf31 = 25 - CSelf29 
 | |■変数操作: CSelf31 *= 24 - CSelf29 
 | |■変数操作: CSelf31 *= 23 - CSelf29 
 | |■変数操作: CSelf31 *= 22 - CSelf29 
 | |■変数操作: CSelf31 /= 24 + 0 
 | |■変数操作: CSelf30 += CSelf31 + 0 
 | |■
 |◇ループここまで◇◇
 |■変数操作: CSelf29 = 0 + 0 
 |■回数付きループ [ CSelf27 ]回
 | |■変数操作: CSelf29 += 1 + 0 
 | |■変数操作: CSelf32 = CSelf29 + CSelf21 
 | |■変数操作: CSelf31 = 25 - CSelf32 
 | |■変数操作: CSelf31 *= 24 - CSelf32 
 | |■変数操作: CSelf31 *= 23 - CSelf32 
 | |■変数操作: CSelf31 /= 6 + 0 
 | |■変数操作: CSelf30 += CSelf31 + 0 
 | |■
 |◇ループここまで◇◇
 |■変数操作: CSelf29 = 0 + 0 
 |■回数付きループ [ CSelf28 ]回
 | |■変数操作: CSelf29 += 1 + 0 
 | |■変数操作: CSelf32 = CSelf29 + CSelf22 
 | |■変数操作: CSelf31 = 25 - CSelf32 
 | |■変数操作: CSelf31 *= 24 - CSelf32 
 | |■変数操作: CSelf31 /= 2 + 0 
 | |■変数操作: CSelf30 += CSelf31 + 0 
 | |■
 |◇ループここまで◇◇
 |■変数操作: CSelf29 = 0 + 0 
 |■回数付きループ [ CSelf33 ]回
 | |■変数操作: CSelf29 += 1 + 0 
 | |■変数操作: CSelf32 = CSelf29 + CSelf23 
 | |■変数操作: CSelf31 = 25 - CSelf32 
 | |■変数操作: CSelf30 += CSelf31 + 0 
 | |■
 |◇ループここまで◇◇
 |■変数操作: CSelf30 += CSelf25 - CSelf24 
このIDへの変換は四則演算で行うことができる。結構ややこしいが。
この方式は、やはり我がいろいろ紙に書いて探りながら楽な方法を考えた。
昔の我の働きのおかげで助かるわ…。
これをuwsc用に単純に変換したものがこれ。
c21=list[0]
c22=list[1]
c23=list[2]
c24=list[3]
c25=list[4]
c26=c21-1
c27=c22-c21
c27=c27-1
c28=c23-c22
c28=c28-1
c33=c24-c23
c33=c33-1
c30=0
c29=0
for a=1 to c26
c29=c29+1
c31=25-c29
c31=c31*(24-c29)
c31=c31*(23-c29)
c31=c31*(22-c29)
c31=c31/24
c30=c30+c31
next
c29=0
for a=1 to c27
c29=c29+1
c32=c29+c21
c31=25-c32
c31=c31*(24-c32)
c31=c31*(23-c32)
c31=c31/6
c30=c30+c31
next
c29=0
for a=1 to c28
c29=c29+1
c32=c29+c22
c31=25-c32
c31=c31*(24-c32)
c31=c31/2
c30=c30+c31
next
c29=0
for a=1 to c33
c29=c29+1
c32=c29+c23
c31=25-c32
c30=c30+c31
next
c30=c30+c25-c24
これで赤バルーン5つが1~53130までのIDに変換されたことになる。
あとはCSVを作ってそこの最適解(組)を参照し、再びUWSC側に舞い戻り、あとはそれをコナステに入力する。




悲しい

 確かにチェーンボンバーの配列や配当を記録し、ついでに番号もしっかりと記入できるプログラムの性能が高まってうまく作れたのは良いが…。 この前スーパーJP4500とダイレクトJP10000が立て続けにきてクレジットが15000になって有頂天になっていたがKMPが100%から動かない...