在我的代码中的不同点进行计算时python中的计算错误

时间:2017-02-22 13:16:12

标签: python-2.7

我有以下无法解决的问题:使用我在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)

2 个答案:

答案 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()函数返回一个新列表,不会修改作为参数传递给它的任何内容。