我有以下无法解决的问题:使用我在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
- 子句之前计算的,而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 :(得分:0)
我不能百分百肯定,不知道这段代码究竟应该做什么,但最可能的罪魁祸首是:
est[t]
您可能打算发送est
转发的副本,但您实际上正在做的是将est[t]
中的所有子列表引用到< em>相同的列表。因此,当您更改est[t-1]
中的值时,您也会在est[t-2]
,est
等中更改这些值。要查看此操作,请在运行代码后打印{{1}并比较子列表。
试试这个,看看它是否符合您的期望:
est[t+1] = list(est[t])
答案 1 :(得分:0)
在你的代码中,当你写作时:
est[t+1] = est[t]
然后,您实际上在est[t]
中分配了est[t+1]
的引用。因此,est[t+1]
中的任何更改也会反映在est[t]
中。如果要复制列表的内容而不是分配引用,可以将其再次类型化为list()
,如下所示:
est[t+1] = list(est[t])
list()
函数返回一个新列表,不会修改作为参数传递给它的任何内容。