[英]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.