我正在尝试对此问题进行建模(有关详细信息,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
答案 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基本相同,只是在不同的地方。