我正在尝试学习遗传算法和人工智能开发,我从一本书中复制了这段代码,但我不知道它是否是一个合适的遗传算法。
这是代码(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
我看到它有健身功能和变异功能,但它不会产生人口,我不明白为什么。我认为遗传算法需要人口生成和从最佳人口成员到新一代的交叉。这是一个合适的遗传算法吗?
答案 0 :(得分:2)
虽然人工智能领域有很多含糊不清的定义,但我的理解是:
evolutionary algorithm (AE)是一种算法,它有一组(一组)解决方案,并以某种方式改变它们(交叉在这里也被视为“变异”),你最终会得到更好的解决方案(一个或多个)。
A genetic algorithm (GA)支持 crossover 的概念,其中两个或更多“解决方案”产生新的解决方案。
但这些条款有时是混合的。但是请注意,交叉绝对不是生成新个体的唯一方法(遗传算法有更多方法可以产生更好的解决方案),例如:
但正如之前所说的那样,对于这些术语的真正含义总会有很多讨论,大多数关于概率组合优化的论文都清楚地说明了它们对术语的含义。
所以根据上面的定义,你的程序是一个进化算法,但不是一个遗传算法:它在每次迭代后总是有一个一个。此外,您的程序只接受一个新的子项,如果它比其父项更好,使其成为Local Search (LS)算法。局部搜索算法的问题在于 - 如果某些/所有解决方案的变异空间是解空间的一个子集 - 局部搜索算法可能永远陷入局部最优。即使情况并非如此,它们也会在很长一段时间内陷入局部最优状态。
这不是问题,因为没有局部最优(但这当然是一个简单的问题)。更困难(和有趣)的问题通常有很多(很多)局部最优。
如果本地搜索与其他有助于使系统再次脱离本地优化的技术协作,那么本地搜索并不是一种糟糕的技术。其他进化技术,如模拟退火,将接受一个概率较小的更糟糕的解决方案(取决于解决方案有多糟糕,以及我们在进化过程中的程度)。