2017-02-22 54 views
0

我有以下問題,我解決不了:我在更新使用兩個變量for循環,我從其他減去一個計算值當我在我的代碼中的不同點進行計算時不同,即使兩個變量之間沒有變化。計算錯誤在我的代碼做在不同的點計算時

特別,我計算值co[t] = max([0, est[t][ch] - est[t][sug] + eps]),前一次爲我設置est[t+1]價值觀和後一次。下面是一個示例輸出,其中問題可以看出:

494: Accepted 
494: co[t] pre = 2.11863208054 
494: co[t] post = 1.69490566443 
494: est[t][ch] = 2.49012790412 
494: est[t][sug[t]] = 0.805222239686 

顯然,值co[t] post是正確的,而co[t] pre不正確。下面是用來產生該輸出的代碼:

sug = [0 for i in time] 
co = [0 for i in time] 
est = [[0 for i in op] for j in time] 

eps = 0.01 
alph = 0.2 

for t in time: 
    ch = random.choice(op) 
    sug[t] = random.choice(op) 
    co[t] = max([0, est[t][ch] - est[t][sug[t]] + eps]) 
    if t < T-1: 
     est[t+1] = est[t] 
     if ac[ch] >= ac[sug[t]] + co[t]: 
      print '%s: Declined' % t 
      est[t+1][ch] += alph*co[t] 
     elif ac[ch] < ac[sug[t]] + co[t]: 
      print '%s Accepted' % t 
      est[t+1][ch] -= alph*co[t] 
    else: 
      break 

    print '%s: co[t] pre = %s' % (t, co[t]) 
    print '%s: co[t] post = %s' % (t, max([0, est[t][ch] - est[t][sug[t]] + eps])) 
    print '%s: est[t][ch] = %s' % (t, est[t][ch]) 
    print '%s: est[t][sug[t]] = %s' % (t, est[t][sug[t]]) 

如可以看到的,co[t] pre被計算之前if t < T-1 -clause,而co[t] post之後計算的。請注意,if-clause中不會更改est[t][ch]est[t][sug]

我無法解釋爲什麼會發生這種情況!

我道歉,如果這個問題已經被問過。在尋找它,我只發現其中大量的浮點數引起的問題的問題,但我不認爲這是與此有關,因爲我使用的是完全相同的變量(est[t][ch]est[t][sug])兩次我計算co[t]

任何幫助非常感謝!提前致謝。

編輯:道歉,代碼的缺失部分是:

import random 

op = [i for i in range(4)] 
ac = [3, 2, 1, 0] 

T = 500 
time = range(T) 
+0

代碼中'time'和'op'的值是多少? –

+0

...和'T' ..... – glibdud

+0

時間設置爲'時間=範圍(T)',其中'T = 500' – Anwa

回答

0

我不能100%肯定,不知道究竟這是什麼代碼是應該做的,但最有可能的罪魁禍首是:

est[t+1] = est[t] 

你可能打算,要送複製的est[t]前鋒,但你實際上在做什麼是使所有在est引用的子表來相同列表。所以,當你在est[t]改變價值觀,你也在改變他們est[t-1]est[t-2]等。要看到這個動作,你運行你的代碼,打印est後比較子列表。

試試這個,看看它做你期待什麼:

est[t+1] = list(est[t]) 
+0

非常感謝,這確實是錯誤的! – Anwa

0

在你的代碼中,當你寫:

est[t+1] = est[t] 

那麼你實際上是分配的est[t]參考在est[t+1]。所以est[t+1]的任何變化也反映在est[t]中。如果你想複製一個列表的內容,而不是分配基準,您可以再次強制轉換它作爲list()這樣的:

est[t+1] = list(est[t]) 

list()函數返回一個新的列表,並且不修改任何傳遞給它作爲參數。

+0

非常感謝,這確實是錯誤!另外,感謝解釋,來自Matlab這對我來說是新的。 – Anwa