Skip to content

Latest commit

 

History

History
151 lines (90 loc) · 6.67 KB

understanding-and-implementing-genetic-algorithms-in-python.md

File metadata and controls

151 lines (90 loc) · 6.67 KB

理解和实现 Python 中的遗传算法

原文:www.kdnuggets.com/understanding-and-implementing-genetic-algorithms-in-python

理解和实现 Python 中的遗传算法

图片来源:作者 遗传算法是基于自然选择的技术,用于解决复杂问题。由于问题复杂,遗传算法相比其他方法能提供合理的解决方案。本文将介绍遗传算法的基本概念及如何在 Python 中实现它们。


我们的前三个课程推荐

1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。

2. 谷歌数据分析专业证书 - 提升你的数据分析技能

3. 谷歌 IT 支持专业证书 - 支持组织的 IT 需求


遗传组件

适应度函数

适应度函数评估考虑的解决方案与问题的最佳解决方案之间的接近程度。它为种群中的每个人提供一个适应度水平,这描述了当前世代的质量或效率。这个分数定义了选择标准,而较高的适应度值则意味着更优的解决方案。

比如,假设我们处理一个实际函数 f(x),其中 x 是一组参数。我们要找到的最优值是 x,使得 f(x) 取得最大值。

选择

这是一个定义在当前世代中哪些个体应被优先选择,从而繁殖并贡献给下一代的过程。可以识别出多种选择方法,每种方法都有其自身的特点和适用的背景。

  • 轮盘赌选择

    根据个体的适应度水平,选择该个体的概率也是最大化的。

  • 锦标赛选择

    随机选择一组个体,并选择其中最优秀的个体。

  • 基于排名的选择

    人员根据适应度排序,并按适应度分配选择机会。

交叉

交叉是遗传算法的基本概念,旨在交换两个父本个体的遗传信息以形成一个或多个后代。这个过程与自然界中生物学上的交叉和重组非常相似。应用遗传学的基本原则,交叉尝试生成具有父本优良特征的后代,从而在下一代中具有更好的适应性。交叉是一个相对广泛的概念,可以分为几种类型,每种类型都有其特性和有效应用的领域。

  • 单点交叉:在父染色体上选择一个交叉点,只发生一次交叉。在此位置之前的所有基因来自第一个父本,从此位置开始的所有基因来自第二个父本。

  • 双点交叉:选择两个断点,并在它们之间的部分在两个父染色体之间交换。这也比单点交叉更有利于遗传信息的交换。

突变

在遗传算法中,突变具有至关重要的意义,因为它提供了多样性,这在避免直接收敛到最优解区域时是一个关键因素。因此,通过单独的交叉操作无法到达的解空间其他区域,突变的随机变化使算法能够进入。这种随机过程确保无论如何,群体会进化或在遗传算法确定的最优搜索空间区域内移动。

实现遗传算法的步骤

让我们尝试在 Python 中实现遗传算法。

问题定义

问题:计算特定函数;f(x) = x²;仅整数值的 x。

适应度函数:对于一个二进制染色体 x,适应度函数的一个例子可以是 f(x)= x²。

def fitness(chromosome):
    x = int(''.join(map(str, chromosome)), 2)
    return x ** 2

群体初始化

生成一个给定长度的随机染色体。

def generate_chromosome(length):
    return [random.randint(0, 1) for _ in range(length)]

def generate_population(size, chromosome_length):
    return [generate_chromosome(chromosome_length) for _ in range(size)]

population_size = 10
chromosome_length = 5
population = generate_population(population_size, chromosome_length) 

适应度评估

评估群体中每个染色体的适应度。

fitnesses = [fitness(chromosome) for chromosome in population]

选择

使用轮盘赌选择法根据适应度选择父染色体。

def select_pair(population, fitnesses):
    total_fitness = sum(fitnesses)
    selection_probs = [f / total_fitness for f in fitnesses]
    parent1 = population[random.choices(range(len(population)), selection_probs)[0]]
    parent2 = population[random.choices(range(len(population)), selection_probs)[0]]
    return parent1, parent2

交叉

通过选择父染色体字符串中的随机交叉位置,并交换此位置之后的所有基因值,来使用单点交叉。

def crossover(parent1, parent2):
    point = random.randint(1, len(parent1) - 1)
    offspring1 = parent1[:point] + parent2[point:]
    offspring2 = parent2[:point] + parent1[point:]
    return offspring1, offspring2

突变

通过以一定概率翻转比特来实现突变。

def mutate(chromosome, mutation_rate):
    return [gene if random.random() > mutation_rate else 1 - gene for gene in chromosome]

mutation_rate = 0.01

总结

总结来说,遗传算法由于模拟物种进化的过程,对于解决那些无法直接解决的优化问题是稳定且高效的。因此,一旦你掌握了遗传算法的基本原理,并理解如何在 Python 中应用它们,复杂任务的解决将变得更加容易。选择、交叉和变异的关键使你能够在解决方案中进行修改,并不断获得最佳或接近最佳的答案。阅读了这篇文章,你已准备好将遗传算法应用于自己的任务,从而在不同任务和问题解决中取得进展。

Jayita Gulati 是一位机器学习爱好者和技术写作者,她对构建机器学习模型充满热情。她拥有利物浦大学的计算机科学硕士学位。

更多相关主题