遗传算法(Genetic Algorithm)

概述

遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传学原理的优化算法,广泛应用于搜索和优化问题。其基本原理可以总结如下:

1、编码(Encoding)

将解决方案表示为染色体(Chromosomes),通常是字符串或数组。每个染色体包含若干基因(Genes),基因可以是二进制位、实数或其他适合问题的表示方法。

2、初始种群(Initial Population)

随机生成一定数量的染色体作为初始种群。种群规模通常对算法性能有显著影响。

3、适应度函数(Fitness Function)

为每个染色体定义一个适应度函数,用于衡量其在解决问题上的优劣。适应度函数的设计直接影响算法的效果。

4、选择(Selection)

根据适应度值选择染色体进行繁殖,适应度高的染色体有更大概率被选中。常用的选择方法包括轮盘赌选择(Roulette Wheel Selection)、锦标赛选择(Tournament Selection)等。

5、交叉(Crossover)

通过交叉操作将两个染色体(父代)组合生成新的染色体(子代)。常用的交叉方法包括单点交叉(Single-point Crossover)、两点交叉(Two-point Crossover)和均匀交叉(Uniform Crossover)等。

6、变异(Mutation)

以一定概率对染色体中的基因进行随机修改,以引入多样性并防止算法陷入局部最优解。变异操作有单点变异(Single-point Mutation)、多点变异(Multi-point Mutation)等。

7、进化(Evolution)

经过选择、交叉和变异操作后,生成新一代种群。新一代种群将替代旧种群,并重复上述过程直到满足终止条件,如达到最大迭代次数或找到满意的解。

8、终止条件(Termination Condition)

算法通常在满足某些条件时终止,如达到预定的迭代次数、适应度值达到某个阈值或种群中个体的多样性不足。

遗传算法通过模拟自然选择和遗传机制,能够有效地在大搜索空间中找到近似最优解,特别适用于复杂的、非线性、多峰值优化问题。

算法基本流程

图1 遗传算法流程图

1、创建初始种群

GA基于数据集的每行数据创建初始种群,这个初始种群包含基于原行值和基于种子生成的染色体(chromosome),每个染色体都包含可变(operable)的和不可变的元素。在交叉和突变操作之前,这个染色体被分为两个部分,可变的部分(M)和不可变的部分(F)。一旦染色体被分开,启发式操作就可以在可操作染色体的子集完成,示意图如图2所示。

图2 常见初始种群示意图

 2、交叉操作

首先, 两个父染色体被从种群中随机选择,交叉索引(crossover index)被随机选择。然后,这个索引将父染色体分为左和右两部分。这个右染色体被父染色体之间进行随机交换形成新的可操作染色体(operable chromosome)。最后,这个形成的新的子染色体被插入种群中,示意图如图3所示。

图3 交叉示意图

 3、突变

 首先,基于突变率在种群中随机选择染色体进行突变操作。然后随机选择突变索引,在索引处随即更换里面的数值,形成新的染色体,示意图如图4所示。

图4 突变示意图

4、选择

在完成交叉和突变操作之后,染色体适应函数将会被评估。首先,我们将可操作染色体和不可变染色体结合形成一个新的染色体,即将全为M的染色体和全为F的染色体结合形成新的染色体。然后,对于每一代最好的染色体(适应度好的,不一定适应度越高越好,根据具体情况而定)作为下一代。

5、判断是否满足终止条件

选择、交叉和突变操作一直被重复,直到迭代的次数达到或者下一代的改善不明显的时候停止。

GA伪代码


1、选择交叉率、突变率,染色体的数量和最大迭代次数

2、将种子向量分为不可变和可变子向量

3、生成可变向量初始化种群

4、    创建可变种子向量作为染色体

5、    随机产生不变染色体

6、    利用固定比例的种子向量确定种群的最佳适应度

7、while(迭代次数 < 最大迭代次数 && 适应度提高量 > 最小适应度提高量)do

8、    for 交叉迭代的次数 do

9、         随机选择两个父染色体

10、       随机选择交叉索引

11、       在索引处完成交叉

12、       向种群中添加两条后代染色体

13、    for 种群中总共染色体的个数 do

14、        if 随机数 <= 突变率 then

15、             随机选择突变索引

16、             使用新的值在突变索引处更新染色体

17、     计算每个染色体的适用度

18、     更新群体最好适应度

19、     使用轮盘赌方法选择下一代


遗传算法中的精英主义(elitism)

为什么要选择精英主义策略?

尽管遗传算法群体的平均适应度通常随着世代的增加而增加,但在任何时候都有可能失去当代的最佳个体。这是由于选择、交叉和变异运算符在创建下一代的过程中改变了个体。在许多情况下,丢失是暂时的,因为这些个体(或更好的个体)将在下一代中重新引入种群。但是,如果要保证最优秀的个体总是能进入下一代,则可以选用精英主义策略

方法

这意味着,在我们使用通过选择、交叉和突变创建的后代填充种群之前,将前n个个体(n是预定义参数)复制到下一代。复制后的的精英个体仍然有资格参加选择过程,因此仍可以用作新个体的亲本。

结果

Elitism策略有时会对算法的性能产生重大的积极影响,因为它避免了重新发现遗传过程中丢失的良好解决方案所需的潜在时间浪费。

小生境与共享

什么是小生境与共享?

由于遗传算法的趋势是找到全局最大值,因此一段时间后大多数个体集中在最高峰附近。在图5中通过使用×标记的位置表示这一点,×代表了当前代的个体。

图5 遗传算法趋势


但是有时,除了全局最大值外,我们还希望找到其他部分(或全部)峰值。为此,可以将每个峰视为小生境,以与其高度成比例的方式提供资源

然后,找到一种在占用资源的个体之间共享(或分配)这些资源的方法,理想情况下,这将促使物种进行相应的分配,最高峰会吸引最多的人,因为它提供的奖励最多,而其他峰由于提供较少的奖励而相应减少物种数量(如图6所示)。

图6 小生境与共享趋势

参考:

超详细的遗传算法(Genetic Algorithm)解析 - upstreamL - 博客园 (cnblogs.com)

遗传算法(Genetic Algorithm)详解与实现-CSDN博客

https://www.sciencedirect.com/science/article/pii/S0957417421011507

  • 28
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
遗传算法是一种模拟自然进化过程的优化算法,主要用于解决复杂的优化问题。在遗传算法中,通过对个体(解)进行基因操作(交叉、变异等),不断地产生新的个体,并通过选择机制,筛选出适应度高的个体,从而逐步优化得到最优解。 下面是一个简单的遗传算法的Python实现代码: ```python import random # 定义适应度函数 def fitness(individual): # 适应度函数为 x^2 的形式,其中 x 为个体的染色体长度 return sum([gene**2 for gene in individual]) # 初始化种群 def init_population(pop_size, gene_size): population = [] for i in range(pop_size): individual = [random.randint(0, 1) for j in range(gene_size)] population.append(individual) return population # 选择操作 def selection(population): # 轮盘赌选择 fitness_values = [fitness(individual) for individual in population] total_fitness = sum(fitness_values) probabilities = [fitness/total_fitness for fitness in fitness_values] selected_population = [] for i in range(len(population)): selected_individual = None while selected_individual is None: for j in range(len(population)): if random.random() < probabilities[j]: selected_individual = population[j] break selected_population.append(selected_individual) return selected_population # 交叉操作 def crossover(parent1, parent2, crossover_rate): # 一点交叉 if random.random() > crossover_rate: return parent1, parent2 crossover_point = random.randint(1, len(parent1)-1) child1 = parent1[:crossover_point] + parent2[crossover_point:] child2 = parent2[:crossover_point] + parent1[crossover_point:] return child1, child2 # 变异操作 def mutation(individual, mutation_rate): # 每个基因以 mutation_rate 的概率发生变异 for i in range(len(individual)): if random.random() < mutation_rate: individual[i] = 1 - individual[i] return individual # 遗传算法 def genetic_algorithm(pop_size, gene_size, max_generation, crossover_rate, mutation_rate): population = init_population(pop_size, gene_size) for i in range(max_generation): population = selection(population) new_population = [] while len(new_population) < pop_size: parent1, parent2 = random.sample(population, 2) child1, child2 = crossover(parent1, parent2, crossover_rate) child1 = mutation(child1, mutation_rate) child2 = mutation(child2, mutation_rate) new_population.append(child1) new_population.append(child2) population = new_population best_individual = min(population, key=lambda individual: fitness(individual)) return best_individual # 测试 best_individual = genetic_algorithm(pop_size=100, gene_size=10, max_generation=1000, crossover_rate=0.8, mutation_rate=0.1) print(best_individual, fitness(best_individual)) ``` 在上面的代码中,定义了适应度函数、初始化种群、选择、交叉、变异等操作,并通过遗传算法不断迭代,最终得到最优解。在测试中,我们设定种群大小为100,染色体长度为10,最大迭代次数为1000,交叉率为0.8,变异率为0.1,得到的最优解为[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],适应度函数的值为0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值