2017-02-22 62 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