2017-06-22 47 views
1

我剛開始使用DEAP。之前,我使用基於Matlab的遺傳算法,在交叉和變異後選擇具有特定大小的更好的個體,然後更新種羣。但是它是相當我很難理解爲什麼在DEAP的評估個體無效適應的交叉和變異過程後需要:DEAP中無效健身的重要性是什麼?

invalid_ind = [ind for ind in offspring if not ind.fitness.valid] 
fitnesses = map(toolbox.evaluate, invalid_ind) 
for ind, fit in zip(invalid_ind, fitnesses): 
    ind.fitness.values = fit 

我試過了刪除這些代碼,但它似乎算法從不收斂。即使我沒有看到那些可以更新人口/後代的人羣,那麼這些人的用途是什麼。提前致謝!!!

回答

1

經過少數測試,具有有效適應度的個體的評估用於評估交叉和變異程序後個體的適應度。我們可以從代碼中看到:

# Apply crossover and mutation on the offspring 
for child1, child2 in zip(offspring[::2], offspring[1::2]): 
    if random.random() < CXPB: 
     toolbox.mate(child1, child2) 
     del child1.fitness.values 
     del child2.fitness.values 

for mutant in offspring: 
    if random.random() < MUTPB: 
     toolbox.mutate(mutant) 
     del mutant.fitness.values 

交叉-ED和突變使用del刪除其中的個人的適應值。所以invalid_ind = [ind for ind in offspring if not ind.fitness.valid]被用來選擇那些個人進行重新評估,這可以顯着減少計算量。此外,我們還可以重新評估採用全後代:

fitnesses = map(toolbox.evaluate, offspring) 
for ind, fit in zip(offspring, fitnesses): 
    ind.fitness.values = fit 

如說,這可以增加計算負擔。爲了得出結論,需要對每個人進行適應性評估,並根據個體的適應值在offspring = toolbox.select(pop, len(pop))中進行選擇操作。

相關問題