[英]Is this code fragment a genetic algorithm?
我正在嘗試學習遺傳算法和AI開發,並從一本書中復制了此代碼,但我不知道這是否是一種合適的遺傳算法。 這是代碼( main.py
):
import random
geneSet = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!.,1234567890-_=+!@#$%^&*():'[]\""
target = input()
def generate_parent(length):
genes = []
while len(genes) < length:
sampleSize = min(length - len(genes), len(geneSet))
genes.extend(random.sample(geneSet, sampleSize))
parent = ""
for i in genes:
parent += i
return parent
def get_fitness(guess):
total = 0
for i in range(len(target)):
if target[i] == guess[i]:
total = total + 1
return total
"""
return sum(1 for expected, actual in zip(target, guess)
if expected == actual)
"""
def mutate(parent):
index = random.randrange(0, len(parent))
childGenes = list(parent)
newGene, alternate = random.sample(geneSet, 2)
if newGene == childGenes[index]:
childGenes[index] = alternate
else:
childGenes[index] = newGene
child = ""
for i in childGenes:
child += i
return child
random.seed()
bestParent = generate_parent(len(target))
bestFitness = get_fitness(bestParent)
print(bestParent)
while True:
child = mutate(bestParent)
childFitness = get_fitness(child)
if bestFitness >= childFitness:
continue
print(str(child) + "\t" + str(get_fitness(child)))
if childFitness >= len(bestParent):
break
bestFitness = childFitness
bestParent = child
我看到它具有適應度函數和mutate函數,但它不會產生總體,我也不知道為什么。 我認為遺傳算法需要種群的產生以及從最佳種群成員到新一代的交叉。 這是適當的遺傳算法嗎?
盡管在AI領域有很多模糊的定義,但我的理解是:
進化算法(AE)是一種具有(多個)解決方案的算法,通過以某種方式對其進行變異(交叉在這里也稱為“變異”),您最終會獲得更好的解決方案。
遺傳算法(GA)支持交叉的概念,其中兩個或多個“解決方案”產生了新的解決方案。
但是這些術語有時是混雜的。 但是請記住,交叉絕對不是產生新個體的唯一方法(比遺傳算法產生更好的解決方案的方法更多),例如:
但是,正如前面所說的,總是有很多討論,這些術語的真正含義是什么,大多數有關概率組合優化的論文都清楚地說明了這些術語的含義。
因此,根據以上定義,您的程序是一種進化算法,而不是遺傳算法:每次迭代后,總人口為一。 此外,您的程序僅接受一個比其父級更好的新子級,使其成為本地搜索(LS)算法。 局部搜索算法的問題在於-如果某些/所有解決方案的變異空間是解決方案空間的子集,則局部搜索算法可能永遠陷入局部最優狀態。 即使不是這種情況,它們也可能在很長時間內陷入局部最優狀態。
這里沒有問題,因為沒有局部最優值(但這當然是一個簡單的問題)。 較困難(有趣)的問題通常具有(很多)局部最優值。
如果“本地搜索”與其他有助於使系統再次脫離本地最佳狀態的技術協作,則它不是一個壞技術。 其他進化技術(例如模擬退火)將以較小的概率接受更壞的解決方案(取決於解決方案的惡化程度以及我們在進化過程中的距離)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.