以前作成したA*アルゴリズムを使った迷路作成と解法
高速化版
これを作るために改良しました。
迷路作成部分の方はどうもいまひとつ遅い。設計上の最大のサイズだと10s以上かかる。
if文でinを条件にするときlist型よりset型の方が全然速そうな記事を見つけて
それなら検討していた別のアルゴリズム使えるかもと実装してみる。
アルゴリズムの速度を比較するために
import time
st=time.time()
ルーチン
print(time.time()-st)
を入れてみる。
新しいアルゴリズムは遅くなってしまう。
しかし、迷路作成部分はもともと、0.5sしかかかっていない。
では何が
壁と動ける所を1と0で表現していてそれをそのまま縦横3倍にするルーチン
これが大量に無駄な時間を取っていました。
ナノブロックで同じような倍加の写真(ソラマチでナノブロックの期間限定ショップより)
一次元化されたデータの枠を3x3の9倍を1で埋めたデータを作成
元の各点を調べ0のときは9点を0にするルーチン
def mz33(mz,wx):
wx3=wx*3
rmz="1"*len(mz)*9
for p,c in enumerate(mz):
if c=="0":
px=(p%wx)*3
py=int(p/wx)*3
p=px+py*wx3
for d in [0,1,2,wx3,wx3+1,wx3+2,wx3*2,wx3*2+1,wx3*2+2]:
np=p+d
rmz=rmz[:np]+"0"+rmz[np+1:]
return rmz
これが10秒
常に横3点は同じなので見直しで5秒ぐらい
def mz33(mz,wx):
wx3=wx*3
rmz="1"*len(mz)*9
for p,c in enumerate(mz):
if c=="0":
px=(p%wx)*3
py=int(p/wx)*3
p=px+py*wx3
for d in [0,wx3,wx3*2]:
np=p+d
rmz=rmz[:np]+"000"+rmz[np+3:]
return rmz
最終的には、1行分をreplace3倍して、それを3行にする。これで0.5秒
def mz33(mz,wx,wy):
rmz=""
for y in range(wy):
l=mz[wx*y:wx*y+wx].replace("0","000").replace("1","111")
rmz+=l*3
return rmz