遗传算法模型Python代码——用Python实现遗传算法案例

news2024/11/15 13:03:25

一、遗传算法概述

1.1适用范围

遗传算法(Genetic Algorithm, GA)是一种启发式搜索算法,广泛应用于以下领域:

  • 优化问题:如函数优化、路径规划、资源分配等。
  • 机器学习:用于特征选择、超参数优化等。
  • 经济与金融:如投资组合优化、期权定价等。
  • 工程设计:如电路设计、结构优化等。

1.2步骤

遗传算法借鉴了自然界中生物进化的过程,主要包括以下几个步骤:

  1. 初始化:随机生成一组初始种群(解)。
  2. 适应度评估:根据适应度函数评估每个个体的适应度。
  3. 选择:根据适应度选择优秀的个体作为父代。
  4. 交叉:通过交叉操作生成新的个体(子代)。
  5. 变异:随机改变部分个体以增加种群多样性。
  6. 替换:用子代替换父代,进入下一代迭代。

1.3优点

  • 适用性广:可以应用于各种复杂的优化问题。
  • 全局搜索能力强:不容易陷入局部最优。
  • 易于并行化:可以利用多处理器环境加速计算。

1.4缺点

  • 计算复杂度高:尤其是在种群规模和迭代次数较大的情况下。
  • 参数选择敏感:如交叉率、变异率等参数需要精心调整。
  • 收敛速度慢:在某些问题上可能需要较多代数才能找到满意的解。

二、Python代码示例

2.1代码示例

以下是一个简单的遗传算法示例,用于解决函数优化问题:

import numpy as np
import random

# 目标函数(待优化)
def objective_function(x):
    return -x**2 + 4*x + 10

# 初始化种群
def initialize_population(size, bounds):
    population = []
    for _ in range(size):
        individual = random.uniform(bounds[0], bounds[1])
        population.append(individual)
    return population

# 适应度评估
def evaluate_population(population):
    return [objective_function(individual) for individual in population]

# 选择(轮盘赌选择)
def select(population, fitness):
    total_fitness = sum(fitness)
    probabilities = [f/total_fitness for f in fitness]
    selected = np.random.choice(population, size=len(population), p=probabilities)
    return selected

# 交叉(单点交叉)
def crossover(parent1, parent2):
    point = random.randint(1, len(parent1)-1)
    child1 = parent1[:point] + parent2[point:]
    child2 = parent2[:point] + parent1[point:]
    return child1, child2

# 变异
def mutate(individual, mutation_rate, bounds):
    if random.random() < mutation_rate:
        individual = random.uniform(bounds[0], bounds[1])
    return individual

# 遗传算法主函数
def genetic_algorithm(objective_function, bounds, population_size, generations, mutation_rate):
    # 初始化种群
    population = initialize_population(population_size, bounds)
    
    for generation in range(generations):
        # 评估种群适应度
        fitness = evaluate_population(population)
        
        # 选择
        selected_population = select(population, fitness)
        
        # 生成新种群
        new_population = []
        for i in range(0, len(selected_population), 2):
            parent1 = selected_population[i]
            parent2 = selected_population[i+1]
            child1, child2 = crossover(parent1, parent2)
            new_population.append(mutate(child1, mutation_rate, bounds))
            new_population.append(mutate(child2, mutation_rate, bounds))
        
        population = new_population
    
    # 返回最佳个体
    best_individual = max(population, key=objective_function)
    return best_individual

# 参数设置
bounds = [0, 10]
population_size = 20
generations = 50
mutation_rate = 0.1

# 执行遗传算法
best_solution = genetic_algorithm(objective_function, bounds, population_size, generations, mutation_rate)
print(f"最佳解:{best_solution}, 目标函数值:{objective_function(best_solution)}")

2.2代码解释

  1. objective_function: 目标函数,用于评估个体的适应度。
  2. initialize_population: 初始化种群,生成一定范围内的随机个体。
  3. evaluate_population: 评估种群中每个个体的适应度。
  4. select: 轮盘赌选择,基于适应度概率选择个体。
  5. crossover: 单点交叉操作,生成子代个体。
  6. mutate: 变异操作,随机改变个体。
  7. genetic_algorithm: 遗传算法的主函数,执行初始化、选择、交叉、变异等操作。

三、可运行案例:用Python实现遗传算法

3.1案例代码

为了演示遗传算法的运行结果,我们以优化一个简单的二次函数为例,假设我们要找到函数 f(x)=-x^{2}+4x+10 的最大值。以下是详细的代码和运行结果的分析:

import numpy as np
import random
import matplotlib.pyplot as plt

# 目标函数(待优化)
def objective_function(x):
    return -x**2 + 4*x + 10

# 初始化种群
def initialize_population(size, bounds):
    population = []
    for _ in range(size):
        individual = random.uniform(bounds[0], bounds[1])
        population.append(individual)
    return population

# 适应度评估
def evaluate_population(population):
    return [objective_function(individual) for individual in population]

# 选择(轮盘赌选择)
def select(population, fitness):
    min_fitness = min(fitness)
    if min_fitness < 0:
        fitness = [f - min_fitness for f in fitness]  # 平移使所有适应度非负
    total_fitness = sum(fitness)
    probabilities = [f/total_fitness for f in fitness]
    selected = np.random.choice(population, size=len(population), p=probabilities)
    return selected

# 交叉(单点交叉)
def crossover(parent1, parent2):
    child1 = (parent1 + parent2) / 2
    child2 = (parent1 + parent2) / 2
    return child1, child2

# 变异
def mutate(individual, mutation_rate, bounds):
    if random.random() < mutation_rate:
        individual = random.uniform(bounds[0], bounds[1])
    return individual

# 遗传算法主函数
def genetic_algorithm(objective_function, bounds, population_size, generations, mutation_rate):
    # 初始化种群
    population = initialize_population(population_size, bounds)
    best_fitness_over_time = []
    
    for generation in range(generations):
        # 评估种群适应度
        fitness = evaluate_population(population)
        best_fitness_over_time.append(max(fitness))
        
        # 选择
        selected_population = select(population, fitness)
        
        # 生成新种群
        new_population = []
        for i in range(0, len(selected_population), 2):
            parent1 = selected_population[i]
            parent2 = selected_population[i+1]
            child1, child2 = crossover(parent1, parent2)
            new_population.append(mutate(child1, mutation_rate, bounds))
            new_population.append(mutate(child2, mutation_rate, bounds))
        
        population = new_population
    
    # 返回最佳个体及其适应度随时间变化
    best_individual = max(population, key=objective_function)
    return best_individual, best_fitness_over_time

# 参数设置
bounds = [0, 10]
population_size = 20
generations = 50
mutation_rate = 0.1

# 执行遗传算法
best_solution, fitness_over_time = genetic_algorithm(objective_function, bounds, population_size, generations, mutation_rate)

# 输出最佳解
best_solution_value = objective_function(best_solution)

# 绘制适应度变化图
plt.plot(fitness_over_time)
plt.xlabel('Generation')
plt.ylabel('Best Fitness')
plt.title('Genetic Algorithm Optimization')
plt.show()

best_solution, best_solution_value

3.2运行结果

Result
(2.312058920926045, 13.902619229870472)

(1)运行结果

  • 最佳解:x≈2.31x \approx 2.31x≈2.31
  • 目标函数值:f(x)≈13.90f(x) \approx 13.90f(x)≈13.90

(2)适应度变化图

适应度变化图如下所示:

3.3结果分析

  1. 最佳解与目标函数值

    • 遗传算法找到了函数f(x)=-x^{2}+4x+10 的最大值点x\approx 2.31
    • 目标函数值在该点的值为f(x)\approx 13.90,这是该函数的最大值。
  2. 适应度变化图

    • 图中显示了每一代的最佳适应度值,适应度值逐渐上升并趋于稳定。
    • 适应度值的上升表示种群中个体质量的提升,算法逐步逼近最优解。

通过上述步骤,遗传算法成功找到了优化问题的近似最优解,并且从适应度变化图可以看到算法的收敛过程。如果对最终结果不满意,可以尝试调整参数(如种群规模、变异率等)以获得更好的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1943365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器系统盘存储不够,添加数据盘并挂载(阿里云)

目录 1.获取数据盘设备名称 2.为数据盘创建分区 3.为分区创建文件系统 4.配置开机自动挂载分区 阿里云数据盘挂载说明链接&#xff1a;在Linux系统中初始化小于等于2 TiB的数据盘_云服务器 ECS(ECS)-阿里云帮助中心 1.获取数据盘设备名称 sudo fdisk -lu 运行结果如下所示…

解决 elementUI 组件在 WebStorm 中显示为未知标签的问题

解决 elementUI 组件在 WebStorm 中显示为未知标签的问题 一、问题 自从转到 ts 之后&#xff0c;编辑器就一直提示用到的 elementUI 标签未知&#xff0c;一直显示一溜黄色警示&#xff0c;很烦&#xff1a; 二、解决 把它改成大写就可以了。 如下&#xff1a; 把整个项目…

【C++】学习笔记——哈希_2

文章目录 十八、哈希3. 实现哈希表哈希表的存储节点哈希函数哈希表的定义哈希表的插入哈希表的查找哈希表的删除测试函数完整代码结果 未完待续 十八、哈希 3. 实现哈希表 哈希表的实现方法有蛮多种&#xff0c;这里我们选一个比较经典的开散列法来实现哈希表。由于STL库里的…

使用PicGo操作gitee图床(及web端html不能访问图片的解决办法)

1.新建仓库 2.输入仓库名称,也就是图床名称,必须设置开源可见 也可以在创建仓库后,点击管理->基本信息->是否开源进行设置 鼠标悬浮到右上角头像->设置 点击私人令牌 点击生成新令牌,填写描述,直接点提交即可 点击提交后输入登录密码会生成一个token秘钥,如下,这个…

新版本异次元荔枝V4自动发卡系统源码

新版本异次元荔枝V4自动发卡系统源码&#xff0c;增加主站货源系统&#xff0c;支持分站自定义支付接口&#xff0c;目前插件大部分免费&#xff0c;UI页面全面更新&#xff0c;分站可支持对接其他分站产品&#xff0c;分站客服可自定义&#xff0c;支持限定优惠。 源码下载&a…

matlab--legend利用for循环添加图例

第一种方法 %% 第一种方法 R 1:4; THETA1 atand(R./1.8); legend_name {}; for i 1:4THETA atand(R(i)./1.8);intTheta floor(THETA);R_THERA 1.8 - (R(i)./tand(intTheta-10:intTheta10));R_THERA1 1.8 - (R(i)/tand(intTheta));plot(R_THERA);grid on;hold onlegend…

Git之repo sync -c与repo sync -dc用法区别(四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

了解Linux中的shell脚本

目录 1、什么是shell 2、编写第一个shell文件 3、shell的权限 4、变量 5、 shell传递参数 6、shell数组 7、shell基本运算符 7.1 算术运算符 7.2 关系运算符 7.3 布尔运算符 7.4 逻辑运算符 7.5 字符串运算符 8、控制语句 8.1 if 8.2 for 8.3 while语句 9、其他 1、…

C++~~string模拟实现(3)

目录 1.传统写法和现代写法 2.对于流提取的优化 3.简单机制了解 4.string类的几个构造函数总结 4.1基本用法 4.2两个赋值方式 4.3拷贝构造 4.4获取字符 4.5一个容易混淆的对比 4.6创建对象 1.传统写法和现代写法 &#xff08;1&#xff09;上面的代码里面的左边部分是…

排序---归并排序

归并排序 一、定义二、实现原理三、代码实现 一、定义 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有…

ES中聚合查询之date_histogram查询出现key_as_string 和 key含义

ES中聚合查询之date_histogram查询出现key_as_string 和 key含义 DSL语句 #实例 GET /capture_features_202407/_search {"query": {"bool": {"must": [{"terms": {"plateNo": ["汉A00001"]}},{"range&quo…

【C++】——初识模版

文章目录 前言函数模版函数模版的原理函数模版的实例化 类模版类模版的实例化 前言 当我们使用一个通用的函数&#xff1a; //为每一个类型都编写一个重载版本 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& …

Java实现七大排序(一)

目录 一.插入排序 1.直接插入排序 2.希尔排序 二.选择排序 1.选择排序 2.堆排序 三.总结 一.插入排序 1.直接插入排序 直接插入排序的原理与线下玩扑克牌类似。我们拿到一张牌后要排序&#xff0c;方法就是一张一张对。直接插入排序也是这样的&#xff0c;我们得到一张…

融云 2024 ChinaJoy | 你有一个必逛的展位 @W4 馆 B786

惊喜闪现&#x1f447; 打开抖音搜索【融云】 关注融云官抖&#xff0c;可到展位领取好礼一份 更有惊喜内容不定时掉落~

【CTFWP】ctfshow-web32

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 题目介绍&#xff1a;题目分析&#xff1a;payload&#xff1a;payload解释&#xff1a;flag 题目介绍&#xff1a; <?php/* # -*- coding: utf-8 -*- # Autho…

昇思25天学习打卡营第23天|ShuffleNet图像分类

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointw…

誉天Cloud Service Solutions Architect(云服务)怎么样

誉天云服务课程亮点 深度融合云原生 包含原生K8s和docker内容&#xff0c;引入isito和ASM功能进行微服务治理&#xff0c;结合Linux功底设计云上性能优化&#xff0c;和架构设计。师资力量强大 课程由两名5HCIE认证讲师授课&#xff0c;认证辅导由已通过HCIE-Cloud Service专职…

【数据结构】探索排序的奥秘

若有不懂地方&#xff0c;可查阅我之前文章哦&#xff01; 个人主页&#xff1a;小八哥向前冲~_csdn博客 所属专栏&#xff1a;数据结构_专栏 目录 排序的概念 几种排序方法介绍 冒泡排序 选择排序 插入排序 堆排序 向上调整建堆排序 向下调整建堆排序 希尔排序 快速…

【数学建模】——前沿图与网络模型:新时代算法解析与应用

目录 1.图与网络的基本概念 1. 无向图和有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与图的连通性 2.图的矩阵表示 1. 关联矩阵 2. 邻接矩阵 3.最短路问题 1.Dijkstra 算法 2.Floyd 算法 4.最小生成树问题 1.Kruskal 算法 2.Prim 算法 5.着色问题 6.…

【AI大模型】程序员AI的未来——Copilot还是Claude3.5 Sonnet?

近期&#xff0c;Anthropic发布了Claude 3.5 的“大杯”模型 —— Claude 3.5 Sonnet&#xff01; 这次发布的 Sonnet 代表意大利的“十四行诗”&#xff0c;结构复杂&#xff0c;在智能水平、功能多样性和处理能力上都有所提升&#xff0c;能够应对更复杂的认知任务&#xff…