遗传算法Python 教程(1)
遺傳算法Python 教程(1)
遺傳算法簡介
遺傳算法是一種通過種群演化得到最優解的搜索算法。遺傳算法受啟發與生物演化過程中的一些現象,這些現象包括自然選擇,交配,突變,遺傳等。本教程將通過Python來展示遺傳算法的本質和如何使用遺傳算法去解決問題。
遺傳算法的一般概念
遺傳算法是通過一代一代種群 population 演化來尋找對問題最優解的個體 individual。其中種群中包含了 N 個個體,而每一個個體是問題的可能解。每一次迭代,fitness 函數會計算每一個個體對目標問題解的合適成都然后選擇最適合的k個個體為下一代演化的后代。演化過程中會有一定概率的個體相互交配,互換染色體,和突變行為,這一過程可以防止種群在演化過程中的適應度被困在局部最優解。 遺傳算法的過程可以被一下步驟描述。
第一個遺傳算法的實現
首先我們實現一個簡單的遺傳算法。我們期望通過遺傳算法演化出一個長度為10 且所有元素都為 1 的 list [1111111111]。在這個簡單例子中將只會用到 變異,因為這里我們主要希望展現遺傳算法的迭代過程,所以關于交配的方法和更高級的fitness函數的構建將在后續的教程中介紹。
import numpy as np import copy# -- 定義參數 -- populationSize = 50 numGenerations = 100 # *** genomeLength = 10 population = []# -- 遺傳算法需要用到的方法 --# 變異 def mutate(Wgenome, mutationRate=0.1):for i in range(len(Wgenome)):if np.random.random() < mutationRate:Wgenome[i] = np.random.randint(2)# 選擇 def topNSelectFull(topn=10, maximize=True):global population, populationSizepopulation.sort(key=lambda x: x.fitness, reverse=maximize)selected = copy.deepcopy(population[:topn])counter = 0for i in range(populationSize):population[i] = copy.deepcopy(selected[counter])counter += 1if counter == topn:counter = 0接著我們定義一個個體
class individual:def __init__(self):self.fitness = 0 #個體的適應度self.genome = [] #個體是一個listdef setGenome(self, newGenome):self.genome = newGenomedef getGenome(self):return self.genome因為我們期望從隨機生成的個體中演化出一個全為1的list, 所以我們的fitness 函數就會是這個list的求和 sum(p.getGenome())。然后我們選擇演化過程中最大化個體的適應度,所以讓 topNSelectFull 去選擇適應度最高的5個個體。最后演化完成后我們把最后一代的所有個體打出來。
if __name__ == "__main__":for i in range(populationSize):indiv = individual()# ***#indiv.setGenome( np.random.choice(2,genomeLength) )indiv.setGenome( np.zeros(genomeLength, dtype=int) )population.append( indiv )for generation in range(numGenerations):for p in population:#計算每個個體的適應度p.fitness = sum(p.getGenome())if generation % 1 == 0:print( "Gen", generation, "Fitness: ", np.max( [p.fitness for p in population] ) )topNSelectFull(topn=5, maximize=True)# 選擇適應度最高的五個個體for i in range(populationSize):# 使 10 % 的個體變異newGenome = mutate(population[i].getGenome(), mutationRate=0.1)# *** for p in population:print ( p.getGenome() )一個簡單的遺傳算法就完成了。
總結
以上是生活随笔為你收集整理的遗传算法Python 教程(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始学python项目_从零开始可以
- 下一篇: php v9 如何获取超级管理员权限,W