低自相关二进制序列问题? Python故障排除

时间:2010-02-16 00:08:53

标签: 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 个答案:

答案 0 :(得分:2)

我无法发现任何明显的错误,但是你让事情变得非常复杂,所以也许是一个潜伏着并隐藏在某个地方的bug。

怎么样?
def evaluateHelper(self, g):
  return sum(a*b for a, b in zip(self.chromosome, self.chomosome[g:]))

这应该返回您在该微妙循环中计算的相同值(我认为% len...部分可证明是多余的)。同样,evaluate方法对于类似的1-liner来说似乎已经成熟。但是,无论如何......

有一个潜在的一个一个问题:你指出的文章中的公式是g从1到N-1 包括的总和 - 你正在使用range(1, len(...)-1)N-1 排除。这可能是你观察到的问题的根源吗?

答案 1 :(得分:1)

你的错误在这里:

for i in range(len(self.chromosome) - g - 1):

i的最大值为len(self.chromosome) - g - 2,因为范围是独占的。因此,你不考虑最后一对。它与你的其他bug基本相同,只是在不同的地方。