2010-02-16 60 views
0

我試圖模擬這種問題(有關其詳細信息,http://www.mpi-hd.mpg.de/personalhomes/bauke/LABS/index.php低自相關二元序列問題? Python的故障排除

我已經看到,對於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

我不能發現任何明顯的錯誤,但是你讓事情變得非常複雜,所以也許是一個bug潛藏在某個地方。什麼

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

,應返回你在一個微妙的循環計算的值相同(其中我認爲% len...部分可證明是多餘的)。同樣,對於類似的單線型,evaluate方法似乎已經成熟。但是,無論如何...

有一個潛在的off-by-一個問題:你指向正在總結對於G從1到N-1 文章包含在公式 - 你使用range(1, len(...)-1),從而N-1,不包括。這可能是你觀察到的問題的根源嗎?

+0

對不起,也許我錯過了一些東西,但是當我讀到公式時,我仍然看到g從1開始?另外,感謝zip功能上的指針:) – Chris

+0

@Chris,你是對的 - off-by-1的問題是不同的,讓我相應地編輯A. –

+0

奇怪的是,關閉的東西肯定是一個錯誤。我修好了,仍然有錯誤。然後我用sum語句替換了我的求和循環,它似乎是固定的。不過,我看不出它們實際上有什麼不同。奇怪。謝謝! – Chris

1

你的錯誤是在這裏:

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

對我的最大值爲len(self.chromosome) - g - 2,因爲範圍是排他性的。因此,你不會考慮最後一對。它基本上和你的其他bug一樣,只是在不同的地方。