遗传算法笔记:基本工作流程

2024-06-11 10:04

本文主要是介绍遗传算法笔记:基本工作流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 介绍

  • 遗传算法有5个主要任务,直到找到最终的解决方案

2  举例

2.1 问题描述

  • 比如我们有 5 个变量和约束,其中 X1、X2、X3、X4 和 X5 是非负整数且小于 10(0、1、2、4、5、6、7、8、9)
  • 我们希望找到 X1、X2、X3、X4 和 X5 的最优解
    • 3X_1+2X_2+4X_3+2X_4+5X_5=100

2.2 解决方法

2.2.0 问题转化

  • 将问题方程转化为目标函数。
    • f(x)=3X_1+2X_2+4X_3+2X_4+5X_5-100
  • 遗传算法将尝试最小化目标函数以获得 X1、X2、X3、X4 和 X5 的解决方案。

2.2.1初始化

  • 在初始化时,确定每一代的染色体数。
    • 我们记染色体的数量是 5。(一个种群有5条染色体)
    • 每个染色体有 5 个基因(X1~X5),使用 0 到 9 之间的随机数生成基因。

2.2.2 适应度函数计算(评估) 

  • 将 X1、X2、X3、X4 和 X5 代入目标函数
  • 适应度函数是 1 除以误差,其中误差为 (1 + f(x))
    • 分母+1是为了避免除零问题
  • ——>得到这个种群每个染色体的适应度

2.2.3  选择

  • 在遗传算法的背景下,具有较高适应度值的染色体将更有可能在轮盘赌中被选中
  • 计算 5 条染色体的总适应度值,然后计算每条染色体适应度的占比(每个染色体的概率)
  • 接着计算累积概率
  • 然后生成5个随机数Uniform(0,1)
    • 这些随机数决定了选择哪几条染色体(可以重复选一条)
    • 比如选择了:
      • 找到对应概率区间的那条染色体
    • ——>选择后的新染色体:

2.2.4 交叉

  • 在生物学中,交叉是指生殖的一个术语。两条染色体被随机选择并通过数学运算进行匹配。
  • 这里简单起见,使用单点交叉
    • 首先我们事先确定好交叉率(Pc)【比如为0.25】
      • 下面随机数目小于0.25的染色体将成为交叉中的亲本
    • 然后生成5个Uniform(0,1)分布的随机数
      • 小于0.25的三个对应的染色体是1,3,5,将他们结合(编号小的在前面)
  • 但此时我们只是知道了哪几个染色体交叉,那么从哪个位置开始交叉呢
    • 为了确定交叉线的位置,需要生成一个1到n之间的随机数,其中n是染色体- 1的长度
      • ——>染色体1&3 之间的交叉
      • ——>1和5号染色体之间的交叉
      • ——>3号和5号染色体

2.2.5 突变

  • 突变是赋予任何基因新价值的过程
  • 事先确定突变率Pm
  • 首先计算一个种群中的基因数量
    • 基因总数 = 染色体 x 染色体中的基因数
    • ——>这里是3
  • 然后我们生成3个1~种群基因数的随机数,这些位置就是基因突变的位置
    • 对于每一个被选中的基因,生成一个从0到9的随机数来替换旧的值

——>这就是第二代染色体了

使用生成的新一代重复这个过程,就可以以获得X1、X2、X3、X4和X5的最佳解

参考内容:手推遗传算法(Genetic Algorithm,GA)的详细步骤图解 (qq.com)

这篇关于遗传算法笔记:基本工作流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050855

相关文章

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

MySQL的cpu使用率100%的问题排查流程

《MySQL的cpu使用率100%的问题排查流程》线上mysql服务器经常性出现cpu使用率100%的告警,因此本文整理一下排查该问题的常规流程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一... 目录1. 确认CPU占用来源2. 实时分析mysql活动3. 分析慢查询与执行计划4. 检查索引与表

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一