2017-05-22 3 views
0

私はPythonでA *アルゴリズムを作成しています。私のアルゴリズムが以前に訪れた場所をバイナリ配列の中に保存する方法を見つけようとしています。 1つ下に。Python:AStarのバイナリ配列の以前に訪問した座標を保存する

nmap = np.array([ 
    [0,0,0,0], 
    [1,1,1,0], 
    [0,0,0,0], 
    [1,0,1,1], 
    [0,0,0,0] 
    ]) 

私が考えることができる唯一の方法は、以前に訪問した2進数の位置を座標で保存することです。たとえば、

nmap[0][0] 

は、最初の2進数をリストまたは辞書に保存するため、再訪されません。問題は、これを達成する方法がわかりません。アルゴリズムを実行しているときに座標を保存しておき、以前に座標を書き出すのではなく、私が推論する理由は、何千もの整数を持つ配列を持っていて、以前はこのコードを書いているのはかなり面倒かもしれません。私はこれをどのように達成することができるか知っていますか?

+0

はそれについて考えてみよう。地図上に壁や障害物があることはどうでしたか?クローズリストのノードは壁に相当すると考えることができます。 –

+0

@EvenYoung私は自分のアルゴリズムに障害物を取り入れるつもりでした。なぜなら、各ノードに特定のキーを割り当てずに以前に訪問したノードで状態を保持する方法を考えていたら、私の主な問題です。 – bnicholl

+0

私の以前の質問はヒントです。最初に訪問したときに地図上のノードを1に設定してから、それを障害物として扱います。 –

答えて

0

あなたは簡単にそのためのタプルのリスト内の座標にインデックスを保存することができます:

visited = [(0,0), (2,0)...] 
+0

以前に座標を書き出すのではなく、アルゴリズムを実行しているときに座標を保存しておきたい。私が推論する理由は、何千もの整数の配列を持っていて、以前はこのコードを書いているとかなり面倒かもしれないということです。 – bnicholl

+0

@bnicholl、私はあなたが次に達成しようとしていることを理解できません。 – Netwave

1

最も明白な選択はSetです。それはamortized O(1) lookup performanceを与える。あなたはaddメソッドを使用してvisitedSetに訪れたノードを追加することができ、およびノー​​ドがあなたのvisitedSetにある場合、あなたはin演算子を使用してチェックすることができます。

>>> from sets import Set 
>>> visitedSet = Set() 
>>> visitedSet.add((1,2)) 
>>> print((0,0) in visitedSet) 
False 
>>> print((1,2) in visitedSet) 
True 
関連する問題