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

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

相关文章

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

DNS查询的利器! linux的dig命令基本用法详解

《DNS查询的利器!linux的dig命令基本用法详解》dig命令可以查询各种类型DNS记录信息,下面我们将通过实际示例和dig命令常用参数来详细说明如何使用dig实用程序... dig(Domain Information Groper)是一款功能强大的 linux 命令行实用程序,通过查询名称服务器并输