这段代码片段是遗传算法吗?

时间:2017-08-24 22:01:22

标签: python algorithm python-3.x genetic-algorithm

我正在尝试学习遗传算法和人工智能开发,我从一本书中复制了这段代码,但我不知道它是否是一个合适的遗传算法。 这是代码(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

我看到它有健身功能和变异功能,但它不会产生人口,我不明白为什么。我认为遗传算法需要人口生成和从最佳人口成员到新一代的交叉。这是一个合适的遗传算法吗?

1 个答案:

答案 0 :(得分:2)

虽然人工智能领域有很多含糊不清的定义,但我的理解是:

  1. evolutionary algorithm (AE)是一种算法,它有一组(一组)解决方案,并以某种方式改变它们(交叉在这里也被视为“变异”),你最终会得到更好的解决方案(一个或多个)。

  2. A genetic algorithm (GA)支持 crossover 的概念,其中两个或更多“解决方案”产生新的解决方案。

  3. 但这些条款有时是混合的。但是请注意,交叉绝对不是生成新个体的唯一方法(遗传算法有更多方法可以产生更好的解决方案),例如:

    • 模拟退火(SA);
    • 禁忌搜索(TS);
    • ...

    但正如之前所说的那样,对于这些术语的真正含义总会有很多讨论,大多数关于概率组合优化的论文都清楚地说明了它们对术语的含义。

    所以根据上面的定义,你的程序是一个进化算法,但不是一个遗传算法:它在每次迭代后总是有一个一个。此外,您的程序只接受一个新的子项,如果它比其父项更好,使其成为Local Search (LS)算法。局部搜索算法的问题在于 - 如果某些/所有解决方案的变异空间是解空间的一个子集 - 局部搜索算法可能永远陷入局部最优。即使情况并非如此,它们也会在很长一段时间内陷入局部最优状态。

    这不是问题,因为没有局部最优(但这当然是一个简单的问题)。更困难(和有趣)的问题通常有很多(很多)局部最优。

    如果本地搜索与其他有助于使系统再次脱离本地优化的技术协作,那么本地搜索并不是一种糟糕的技术。其他进化技术,如模拟退火,将接受一个概率较小的更糟糕的解决方案(取决于解决方案有多糟糕,以及我们在进化过程中的程度)。