低自相关二进制序列问题?Python故障排除
我正在尝试解决这个问题(详细信息可以查看这个链接:http://www.mpi-hd.mpg.de/personalhomes/bauke/LABS/index.php)
我发现,对于一个包含10个数字的序列,已知的最小值是13。然而,我的程序似乎经常得到12。这说明我的程序可能有错误。请问在我这段代码中,关于这些求和的部分,有没有明显的错误呢?
def evaluate(self):
self.fitness = 10000000000 #horrible practice, I know..
h = 0
for g in range(1, len(self.chromosome) - 1):
c = self.evaluateHelper(g)
h += c**2
self.fitness = h
def evaluateHelper(self, g):
"""
Helper for evaluate function. The c sub g function.
"""
totalSum = 0
for i in range(len(self.chromosome) - g - 1):
product = self.chromosome[i] * self.chromosome[(i + g) % (len(self.chromosome))]
totalSum += product
return totalSum
2 个回答
1
你的错误出现在这里:
for i in range(len(self.chromosome) - g - 1):
在这个循环中,i的最大值会是 len(self.chromosome) - g - 2
,因为这个范围是开区间的,也就是说不包括最后一个值。所以,你没有考虑到最后一对。这其实和你之前的错误是一样的,只是出现在了不同的地方。
2
我一时半会儿没发现明显的错误,但你写的代码有点复杂,可能有个错误藏在里面。你考虑过
def evaluateHelper(self, g):
return sum(a*b for a, b in zip(self.chromosome, self.chomosome[g:]))
这个吗?它应该能返回你在那个复杂循环中计算的相同值(我觉得里面的 % len...
部分是多余的)。同样,evaluate
方法也可以简化成一行代码。不过,不管怎样……
这里可能有个越界的问题:你提到的文章里的公式是从 1 加到 N-1 包括 N-1,而你用的是 range(1, len(...)-1)
,这样的话 N-1
是 不包括 的。这个问题会不会就是你观察到的错误的根源呢?