【遗传算法】【机器学习】【Python】常见交叉方法(二)、多点交叉和均匀交叉

23 篇文章 0 订阅
13 篇文章 0 订阅

往期遗传算法文章见:
【遗传算法】【机器学习】【Python】常见交叉方法(一)、单点交叉和两点交叉

一、遗传算法流程图

在这里插入图片描述

交叉过程即存在于上图的”交叉“(crossover)步骤中。

二、多点交叉

多点交叉的原理就是,随机地从父代两个基因型中,选择n个位点进行交换,其中n小于等于父代基因型长度(假设双亲基因长度相同,使用一维数组进行表示),如下图所示:

在这里插入图片描述

用Python实现如下:

import random


# 简单的多点交叉算法
def multi_cross(list1, list2, n):
    # 假设list1和list2长度相同, n为交叉位点个数
    for i in range(n):
        pos = random.randint(i, len(list1) - 1)  # 保证下一个位点在上一个位点之后
        list1[pos], list2[pos] = list2[pos], list1[pos]  # 交换数组元素

    return list1, list2


for i in range(5):
    list1 = [1, 2, 3, 4, 5, 6, 7, 8]
    list2 = [10, 20, 30, 40, 50, 60, 70, 80]
    print(multi_cross(list1, list2, 3))

程序输出(5次不同的交叉结果):

在这里插入图片描述

三、均匀交叉

均匀交叉是指,从头到尾遍历双亲的每一个基因位点,每一个位点以概率p交换。在Python中,我们用random.random()方法可以产生一个0,1之间的随机小数,可以方便地模拟“概率”,见如下代码:

import random


def uniform_cross(list1, list2, prob):
    # 以概率prob对list1和list2进行均匀交叉
    # 假设list1和list2长度相同
    for i in range(len(list1)):
        val = random.random()
        if val <= prob:
            list1[i], list2[i] = list2[i], list1[i]

    return list1, list2


for i in range(5):
    list1 = [1, 2, 3, 4, 5, 6, 7, 8]
    list2 = [10, 20, 30, 40, 50, 60, 70, 80]
    print(uniform_cross(list1, list2, 0.666))

程序输出(5次不同的交叉结果):
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
遗传算法是一种模拟自然选择和遗传机制的优化算法,可以用于求解复杂的优化问题。下面介绍一下如何使用Python实现遗传算法。 首先,需要定义适应度函数,即问题的目标函数。其次,需要确定种群的初始状态,也就是随机生成一些个体。然后,对每个个体计算适应度,根据适应度大小进行选择、交叉和变异操作,得到新的种群。重复执行这些操作,直到达到预定的迭代次数或找到满足要求的解。 下面是一个简单的遗传算法实现示例: ```python import random # 定义适应度函数 def fitness(x): return x ** 2 # 随机生成初始种群 def generate_initial_population(population_size): population = [] for i in range(population_size): population.append(random.uniform(-10, 10)) return population # 计算适应度 def calculate_fitness(population): fitness_scores = [] for individual in population: fitness_scores.append(fitness(individual)) return fitness_scores # 选择操作 def selection(population, fitness_scores): selected_population = [] for i in range(len(population)): # 轮盘赌选择 total_fitness = sum(fitness_scores) pick = random.uniform(0, total_fitness) current = 0 for j in range(len(population)): current += fitness_scores[j] if current > pick: selected_population.append(population[j]) break return selected_population # 交叉操作 def crossover(population): new_population = [] for i in range(0, len(population), 2): # 单点交叉 crossover_point = random.randint(0, len(population[0]) - 1) offspring1 = population[i][:crossover_point] + population[i+1][crossover_point:] offspring2 = population[i+1][:crossover_point] + population[i][crossover_point:] new_population.append(offspring1) new_population.append(offspring2) return new_population # 变异操作 def mutation(population, mutation_rate): for i in range(len(population)): if random.random() < mutation_rate: # 随机变异一位 index = random.randint(0, len(population[0]) - 1) population[i][index] += random.uniform(-1, 1) return population # 主函数 def genetic_algorithm(population_size, generations, mutation_rate): population = generate_initial_population(population_size) for i in range(generations): fitness_scores = calculate_fitness(population) selected_population = selection(population, fitness_scores) new_population = crossover(selected_population) new_population = mutation(new_population, mutation_rate) population = new_population best_individual = max(population, key=fitness) return best_individual # 测试 best_individual = genetic_algorithm(population_size=50, generations=100, mutation_rate=0.1) print("Best individual: ", best_individual) ``` 在上面的代码中,目标函数为$x^2$,种群大小为50,迭代次数为100,变异率为0.1。程序输出最优个体的值。 这只是一个简单的遗传算法实现,实际应用中可能需要进行更多的调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不是AI

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值