0

私は非常に単純なランダム・ウォーク機能を作成しています。全体のコードは以下の通りです。私は、現在のコスト関数が以前のものよりも小さい場合に、配列を使ってパラメータ値を追跡しています。しかし何らかの理由で、出力を追跡している配列が書き換えられていますか?前のエントリ。私はそれが "c"としてパラメータを追加することと関係があると思うので、cの値の代わりに "c"が追加されているのでメモリ割り当ての問題がありますが、これを修正する方法、意図したようにその値を付加して維持するコスト関数値psiとは異なるであろう。配列内の前の項目のループ・ライティング用(すべてではありません)

私のようなものを作成しようとしている

代わり
input: 
for n in N: 
if cost < previous cost: keep current parameters 
write current parameters & cost to tracking list 

output: 
n = 0, parameters = [1,2,3], cost = 4.5, track = [([1,2,3], 4.5)] 
n = 1, parameters = [1.1,2.4,2.7], cost = 3.9, track = [([1,2,3], 4.5), ([1.1, 2.4, 2.7], 3.9)] 
etc 

を、私が取得していますと、それはパラメータを置き換えますが、以前のコストを保っています

output: 
n = 0, parameters = [1,2,3], cost = 4.5, track = [([1,2,3], 4.5)] 
n = 1, parameters = [1.1,2.4,2.7], cost = 3.9, track = [([1.1,2.4,2.7], 4.5), ([1.1, 2.4, 2.7], 3.9)] 

です。これは、トラック関数が成功(低コスト)if文の外側にある場合に発生します。

help?

#pure random walk where all c parameters are randomly updated at once; no restrictions on pos/neg of parameters 
del track 
del bigtrack 

c = [5,5,-5] 
cp = c 
kB = -8 

M = 10 
N = 5000 
bigtrack = [] 

psip = cost(LN, LB, dldtN, dldtB, c[2], kB, c[0], c[1]) #cost using initialized parameters 

for m in range(M): 

    track = [] 
    for n in range(N): 

     for i in range(len(c)): 
      rand = np.random.uniform(-1,1) 
      c[i] = c[i] + rand 
      #print(c[i]) 
     #print("parameters = ", c) 

     psi = cost(LN, LB, dldtN, dldtB, c[2], kB, c[0], c[1]) 
     #print("new cost = ", psi) 

     if psi < psip: 
      cp = c 
      resp = res 
      psip = psi 
      track.append((c, psi)) 
      print("tracking function: \n", track) 
     else: 
      c = cp #keep prior 
      res = resp 
      psi = psip 

     if psi <16: 
      print("VICTORY") 
      break 


    #print(track) 
    #if track != []: 
    bigtrack.append((track, m)) 

、ここでは、挿入の間にそれを修正しながら、あなたは結果に同じlistを挿入しているサンプル出力

tracking function: 
[([4.145180382591114, 5.194803875207629, -5.77417154313107], 457.37070071446328)] 
tracking function: 
[([4.366620027701061, 5.610886161756634, -6.300451985366614], 457.37070071446328), ([4.366620027701061, 5.610886161756634, -6.300451985366614], 406.27520117896)] 
tracking function: 
[([4.294900222966394, 6.104004008230176, -6.636360393709489], 457.37070071446328), ([4.294900222966394, 6.104004008230176, -6.636360393709489], 406.27520117896), ([4.294900222966394, 6.104004008230176, -6.636360393709489], 377.1702411076343)] 

答えて

0

です。効果的に、あなたは次のことをやっている:

>>> track = [] 
>>> c = [1, 2, 3] 
>>> track.append(c) 
>>> track 
[[1, 2, 3]] 
>>> c[1] += 2 
>>> track.append(c) 
>>> track 
[[1, 4, 3], [1, 4, 3]] 

をリストにそれが結果に追加されますたびにコピーすることができ、問題解決のために:

track.append((c[:], psi)) # instead of track.append((c, psi)) 
+0

ああ!ありがとうございました!それを固定した –

関連する問題