パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

アルゴリズムの高速化

2019-07-14 | プログラムをマスター計画2020

 

以前作成した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

 


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。