0

私はこのプログラムをpythonで実行しようとしています。これは、宇宙を行き来する無知な存在をシミュレートし、それがターゲットに到達するかどうかを確認します..しかし、実行するたびにメモリエラーが発生します..--

init_posn=[0,0]
posn_final=[2,2]

obs = [[-1,1],[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1]]

# algo can be improved

def obs_det(posn_x,posn_y,obs):
    for e in obs:
        if e[0]==posn_x & e[1]==posn_y:
            return 1
    return 0

posn=[]
posn.append(init_posn)

def posn_progress(posn,posn_final,obs):
    i=0
    non=0
    while (non==0 | (posn[i][0]==posn_final[0] & posn[i][1]==posn_final[1])):
        l=posn[i][0]
        m=posn[i][1]
        if obs_det(l,m+1,obs) == 0:
            posn.append([l,m+1])
        elif obs_det(l+1,m,obs) == 0:
            posn.append([l+1,m])
        elif obs_det(l,m-1,obs) == 0:
            posn.append([l,m-1])
        elif obs_det(l-1,m,obs) == 0:
            posn.append([l-1,m])
        else:
            non=1
        i=i+1
    if non==1:
        return 0
    else:
        return posn

print posn_progress(posn,posn_final,obs)
4

3 に答える 3

0

これがいくつかのサンプルコードです。基本的に、開始点から終了点に到達するまでフラッドフィルを実行します。すでに行った場所()を追跡seenするため、それらを際限なく再探索することはありません。

dir = [(dx,dy) for dx in (-1,0,1) for dy in (-1,0,1) if (dx,dy)!=(0,0)]

def backtrack(b, seen):
    if seen[b]==0:
        return [b]
    else:
        seek = seen[b]-1
        x,y = b
        for dx,dy in dir:
            p = (x+dx, y+dy)
            if p in seen and seen[p]==seek:
                return backtrack(p, seen) + [b]

def find_path(a, b, dist=0, here=None, seen=None):
    if here is None: here = set([a])
    if seen is None: seen = {a:0}

    next = set()
    for x,y in here:
        for dx,dy in dir:
            p = (x+dx, y+dy)
            if p not in seen:
                seen[p] = dist+1
                next.add(p)

    if b in seen:   # found it!
        return backtrack(b, seen)
    else:
        return find_path(a, b, dist+1, next, seen)

def main():
    print find_path((0,0), (2,2))

if __name__=="__main__":
    main()
于 2012-05-08T17:05:49.797 に答える
0

これは宿題のように見えるので、ヒントを 2 つ挙げて答えます。

  1. 障害物検出ルーチンが意図したとおりに機能しているかどうかを確認する単体テストをどのように記述しますか?
  2. 論理演算子とビット演算子について読んでください。
于 2012-05-08T14:19:30.190 に答える
-1

あなたの愚かな存在はぐるぐる回っていると思います。

元の場所に戻らないように教えることができます。その後、ループしませんが、道が存在する場合でも道を見つけることができない場合があります。

または、もっと賢くして、戻ってきたら次回は別のルートを試すように指示することもできます。

于 2012-05-08T14:23:39.257 に答える