当前位置: 首页 > news >正文

遗传算法(GA)

算法背景

遗传算法(Genetic Algorithm, GA)是模拟生物在自然环境中的遗传和进化的过程而形成的自适应

全局优化搜索算法。遗传算法借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种并行、

高效、全局搜索的方法,它能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制

搜索过程以求得最优解。遗传算法操作使用"适者生存”的原则,在潜在的解决方案种群中逐次产生

一个近似最优的方案。在遗传算法的每一代中,根据个体在问题域中的适应度值和从自然遗传学中

借鉴来的再造方法进行个体选择,产生一个新的近似解。这个过程导致种群中个体的进化,得到的

新个体比原个体更能适应环境,就像自然界中的改造一样。

基本原理

对每个个体进行进化,然后择优录取

编码

将问题的可行解,抽象编码为适用于遗传算法的形式

二进制编码:将数值转换为二进制串,用以求解问题

用一个二进制串表示十进制数值

给定数值解区间范围[1,10]

给定精度:1e-5,两个数值之间的间隔

进行编码:为每个数值解分配一个独一无二的二进制串,串所能表示的数值的个数大于等于解

的个数

一个长度n的串,表示2^{n}

区间范围为【1,10】长度2串提供精度\frac{10-1}{2^{n}-1}=3

数值区间长度L,精度E条件下,二进制串长度n,三者关系\frac{L}{2^{n}-1}\leqslant E

解码

二进制串的索引,当前串是第几个串,可以使用二进制转十进制得到

【1,0】为例,转化为十进制2,找对应数值1+2*3=7

一般,区间范围为【a,b】,区间长度L,L=b-a,串长n,当前串十进制T,对应实值解X=a+T*\frac{b-a}{2^{n}-1}

个体进行复制,以概率进行基因的交叉,复制交叉方式多种多样

复制

将个体适应度大小映射为概率进行复制:适应度高的个体有更大概率复制,且复制的份数越多轮盘赌法。
对适应度高的前N/4的个体进行复制,然后用这些个体把后N/4个体替换掉-精英产生精英。
一定是将当前个体的复制体将下一一个个体替换掉吗?随机可以吗? YES!
一 定只能把"坏解”替换掉吗?把随机某个适应度高5的解替换掉呢? YES!

交叉
按顺序,两两个体之间按概率交叉。如1和2,2和3等。或者1和2,2和4等,或者1和4这样。
必须两两交叉? 3个可以吗? YES!。 5个? YES!
对适应度高的前N/2个体、 甚至N/4的个体之间相互交叉? YES!
一定是按顺序交叉吗?对每个个体随机从前N/2中选一一个个体交叉? YES!
一定是只有一段交叉?多段呢? YES! 

变异

每个个体都进行变异。
只对适应度低的后N/4的,或者后N/2个个体变异? YES!
必须都变异吗?按适应度大小映射为概率变异? YES!
一 定是只有一个位点变异?多个位点呢? YES!

算法实现

复制:按适应度大小映射为概率,进行轮盘赌复制

交叉:1和2,3和4,以一定概率决定是否交叉,若交叉,则二者随机一个段进行交叉

变异:按照一定概率决定改个体是否变异,若变异,随机选择一个点进行变异,按位取反

轮盘赌基本思想:适应度越高的解,按道理越应该高概率的进行复制,且复制的份数应该越多

随机数落到不同区域,进行复制:如rand=0-0.2,则对X1复制,缺点需要一直进行比较,划分n个区域可能就需要n个判断

再具体实现时 ,先将小于0.2的都进行判断,再出现随机数只需要判断一端

优点

1)参数少,理论优势

2)变异机制赋予群体跳出局部极值的能力

缺点

容易陷入局部最优,算法实现较繁琐

相关文章:

  • Python怎么使用 SQLAlchemy 和model 查询数据呢?
  • SpringCloud如何实现SSO单点登录?
  • 计算机网络期末复习(1)计算机网络在信息时代对的作用 计算机网络的定义和分类 三种交换方法
  • STM32学习问题总结(2)—CubeMX生成项目后串口没效果和Microlib
  • Java Apache Jaccard文本相似度匹配初体验
  • Linux下Git的基本使用
  • RAG 之 Embedding 模型 (一)
  • Ubuntu 24.04 LTS 安装Docker
  • linux驱动学习(二)之点灯
  • 在潮流时尚的绿地新都会,竟然藏了一家神奇的工作室
  • 在vue3项目中使用el-tabs切换标签页时echarts图表显示不正确
  • Passion编程语言:探索其深邃的四个维度、五大特性、六大应用及七大前景
  • 如何进行时间管理
  • ML307R OpenCPU TCP使用
  • 科技云报道:大模型风起云涌,向量数据库终有“用武之地”?
  • 30秒的PHP代码片段(1)数组 - Array
  • golang中接口赋值与方法集
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java比较器对数组,集合排序
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • SSH 免密登录
  • 编写符合Python风格的对象
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #HarmonyOS:Web组件的使用
  • #HarmonyOS:基础语法
  • (13)DroneCAN 适配器节点(一)
  • (void) (_x == _y)的作用
  • (二)pulsar安装在独立的docker中,python测试
  • (分布式缓存)Redis哨兵
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (理论篇)httpmoudle和httphandler一览
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)Mysql的优化设置
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @Data注解的作用
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @取消转义
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [excel与dict] python 读取excel内容并放入字典、将字典内容写入 excel文件
  • [hdu 1711] Number Sequence [kmp]