遗传算法及其matlab实现(示例用python库geatpy,matlab遗传工具箱geatbx和lingo三种方式求解)

本文主要是介绍遗传算法及其matlab实现(示例用python库geatpy,matlab遗传工具箱geatbx和lingo三种方式求解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

智能算法是一个边缘交叉学科,有蚁群、粒子群算法、遗传算法、免疫算法、模拟退火等,都乐意算作机器学习的一种类别。

文章目录

  • 理论
    • 生物理论基础
    • 历史
    • 算法
      • 编解码
        • 编码
        • 解码
      • 染色体交配运算产生子代染色体 crossover
      • 基因突变运算产生子代染色体
      • 染色体倒位运算产生子代染色体
      • 个体适应度评估
      • 复制运算
  • 示例
  • 示例2

遗传算法是模拟达尔文进化论和孟德尔遗传学原理的生物计算模型,是一种模拟自然进化过程以搜索最优解的方法。

理论

生物理论基础

先列出遗传算法中使用到的自然选择的基本观点:(仿佛回到了高二)

  • 种群是进化的基本单位

  • 进化的实质是种群基因频率的改变

  • 基因突变、基因重组、自然选择和隔离是物种形成过程的三个基本环节
    突变和重组产生进化的原材料
    自然选择使得种群的基因频率定向改变,决定进化方向
    隔离是新物种形成的必要条件

  • 新物种形成途径有二,渐进式和爆发式,遗传算法中用到了这两种思想。渐进式是通过变异的逐渐积累产生新物种;爆发式是通过杂交和染色体结构变化产生新物种。

历史

1975年,密歇根大学的J.Holland教授提出“遗传算法”的概念。那是最基本的遗传算法原型,现在已有很多变体。

算法

GA包括编解码、遗传运算、个体适应度评估三部分。其中遗传运算包括染色体复制、交叉、变异、倒位。

基因:染色体上的片段,取值0/1
个体:编码后的染色体,个体实际上就是参数的一种离散取值
种群:所有编码后的染色体的集合,参数的一群取值

种群规模一般取 0-100

编解码

编码

有二进制编码和浮点编码两种,但前者便于染色体交叉、变异等用得更多。

若某参数的取值范围是 ( L , U ) (L,U) (L,U), 使用k位二进制编码,则共有 2 k 2^k 2k种编码,所以
在这里插入图片描述

容易发现,实际上被编码的是 δ \delta δ的系数,即几个 δ \delta δ

可以看出编码把参数的连续的取值范围离散化了,这 2 k 2^k 2k个取值就是这个参数的参数空间,是需要被搜索的空间,由于只考虑某些离散的取值,所以k的长度越大,搜索的参数越准确。

解码

解码就是把二进制数串映射回对应的十进制数字,即 ( L , U ) (L,U) (L,U)里那些离散化的取值。

假设编码是 b k b k − 1 ⋯ b 2 b 1 b_kb_{k-1}\cdots b_2b_1 bkbk1b2b1,则
在这里插入图片描述
其中括号里main的部分实际上就是这串二进制数对应的十进制数,在这里就是 δ \delta δ的系数。所以解码公式就很容易理解啦,特别简单。

举个栗子

在这里插入图片描述

染色体交配运算产生子代染色体 crossover

交配,即单点或多点交叉算子。产生随机数作为一个或多个交配点位置,然后互换基因即可。

如, S 1 = 01001011 , s 2 = 10010101 S_1=01001011,s_2=10010101 S1=01001011s2=10010101是父代染色体,交换后四位基因,得到子代染色体 S 1 ′ = 01000101 , S 2 ′ = 10011011 S'_1=01000101,S'_2=10011011 S1=01000101,S2=10011011
在这里插入图片描述

交配概率一般取 0.4-0.99

基因突变运算产生子代染色体

基因突变即 0变1 , 1变0。但概率非常微小,主要是为了避免算法中还没搜索到尽可能多的参数空间,种群就过早收敛,得到不够好的结果。

如父代染色体 S 1 = 01001011 S_1=01001011 S1=01001011的第五位基因突变,得到子代染色体 S 1 ′ = 01000011 S'_1=01000011 S1=01000011

染色体倒位运算产生子代染色体

染色体某一区段的基因的排列顺序180度颠倒。

S 1 = 01011 10110101011 100 S_1=01011~~10110101011~~ 100 S1=01011  10110101011  100的中间区段倒位,

得到子代染色体 S 1 ′ = 01011 11010101101 100 S'_1=01011~~11010101101~~ 100 S1=01011  11010101101  100

个体适应度评估

这是很重要的一步,对每个个体(参数的一种取值)进行评价,选择适应度高的个体进入下一代的迭代。也就是说,GA依据和个体适应度大小成正比的几率决定当前种群中各个个体遗传到下一代群体的机会。

在优化问题中就是把这个值代进优化表达式运算得到的结果,目标函数就是检测个体适应度的函数。

变异概率一般取0.0001-0.2 (mutation)

复制运算

根据适应度大小决定要不要遗传到下一代。

每个个体遗传到下一次迭代的概率是适应度占的比例,分母是所有个体的总适应度。所以适应度越高的个体被遗传到下一代的概率更大。

P i = f i ∑ k = 1 N f k P_i=\frac{f_i}{\sum_{k=1}^Nf_k} Pi=k=1Nfkfi
实现方法:在0到1产生均匀随机数,随机数小于 P i P_i Pi则遗传到下一代。

示例

max ⁡ f ( x 1 , x 2 ) = 21.5 + x 1 s i n ( 4 π x 1 ) + x 2 s i n ( 20 π x 2 ) \max f(x_1,x_2)=21.5+x_1sin(4\pi x_1)+x_2sin(20\pi x_2) maxf(x1,x2)=21.5+x1sin(4πx1)+x2sin(20πx2)
s . t . { − 3.0 ≤ x 1 ≤ 12.1 4.1 ≤ x 2 ≤ 5.8 s.t.\left\{ \begin{aligned} -3.0\leq x_1\leq12.1\\ 4.1\leq x_2\leq5.8\\ \end{aligned} \right. s.t.{3.0x112.14.1x25.8

这是一个连续型决策变量最大化目标的单目标优化问题。

函数图像如下:
在这里插入图片描述

画图代码:

clear all 
clc
x1=linspace(-3,12.1,100);
x2=linspace(4.1,5.8,100);  
[x1,x2]=meshgrid(x1,x2);
f=21.5+x1.*sin(4*pi*x1)+x2.*sin(20*pi*x2);
mesh(x1,x2,f)
title('f=21.5+x1.*sin(4*pi*x1)+x2.*sin(20*pi*x2)')
xlabel('x1')
ylabel('x2')

这个最优化问题有两个参数,首先对两个参数编码:

二进制数串的长度(编码位数)取决于要求的精度,如果参数的取值范围是 ( L , U ) (L,U) (L,U),且要求的精度是小数点后4位,则应该至少有 ( U − L ) ∗ 10000 (U-L)*10000 (UL)10000个离散取值,即二进制数串需要表达这么多数字,数串的位数m的计算方法是
2 m − 1 ≤ ( U − L ) × 10000 ≤ 2 m − 1 2^{m-1}\leq (U-L)\times 10000\leq 2^m-1 2m1(UL)×100002m1
那么
{ − 3.0 ≤ x 1 ≤ 12.1 ( 12.1 + 3.0 ) ∗ 10000 = 151000 2 m 1 − 1 ≤ ( U − L ) × 10000 ≤ 2 m 1 − 1 m 1 = 18 4.1 ≤ x 2 ≤ 5.8 ( 5.8 − 4.1 ) ∗ 10000 = 17000 2 m 2 − 1 ≤ ( U − L ) × 10000 ≤ 2 m 2 − 1 m 2 = 15 m = m 1 + m 2 = 33 \left\{ \begin{aligned} -3.0\leq x_1\leq12.1\\ (12.1+3.0)*10000=151000\\ 2^{m_1-1}\leq (U-L)\times 10000\leq 2^{m_1}-1\\ m_1=18\\ 4.1\leq x_2\leq5.8\\ (5.8-4.1)*10000=17000\\ 2^{m_2-1}\leq (U-L)\times 10000\leq 2^{m_2}-1\\ m_2=15\\ m=m_1+m_2=33\\ \end{aligned} \right. 3.0x112.1(12.1+3.0)10000=1510002m11(UL)×100002m11m1=184.1x25.8(5.84.1)10000=170002m21(UL)×100002m21m2=15m=m1+m2=33

即参数 x 1 , x 2 x_1,x_2 x1,x2分别需要18,15位二进制编码以表示他们的参数空间,则优化模型总共需要33位二进制编码。
在这里插入图片描述
下面用三种工具尝试求解这个问题

  1. LINGO求解:
DATA:
PI=3.14159;
ENDDATA
MAX=21.5+X1*@SIN(4*PI*X1)+x2*@sin(20*PI*X2);
X1<=12.1;
X1>=-3.0;
X2>=4.1;
X2<=5.8;

结果:

  Local optimal solution found.Objective value:                              38.73233Infeasibilities:                              0.000000Extended solver steps:                               5Best multistart solution found at step:              3Total solver iterations:                            42Elapsed runtime seconds:                          0.31Model Class:                                       NLPTotal variables:                      2Nonlinear variables:                  2Integer variables:                    0Total constraints:                    5Nonlinear constraints:                1Total nonzeros:                       6Nonlinear nonzeros:                   2Variable           Value        Reduced CostPI        3.141590            0.000000X1        12.10000           -47.95654X2        5.725049            0.000000Row    Slack or Surplus      Dual Price1        38.73233            1.0000002        0.000000            0.0000003        15.10000            0.0000004        1.625049            0.0000005       0.7495092E-01        0.000000
  1. 用python的geatpy库计算结果:
种群信息导出完毕。
最优的目标函数值为:37.14497969389704
最优的控制变量值为:
11.11465764868793
4.6247291482284005
有效进化代数:25
最优的一代是第 25 代
评价次数:88
时间已过 0.043180227279663086 秒
  1. matlab的ga遗传工具箱(英国Sheffield大学开发的geatbx),在matlab命令行调出优化工具窗口
>> optimtool
警告: Optimization app will be removed in a future release. See release notes for details. 
> In optimtool (line 181) 

输入下列参数
在这里插入图片描述
在这里插入图片描述
由于matlab的工具箱默认优化时最小化,所以目标函数加了负号

function y=MyFunc(x);
y=-(21.5+x(1)*sin(4*pi*x(1))+x(2)*sin(20*pi*x(2)));

注意函数的输入参数只能有一个,所以函数内部要用向量的分量表示每个决策变量

可以看到,三种方式的求解结果相差很小,这是一种很少解决的优化问题。

示例2

在这里插入图片描述
N=1的图像
在这里插入图片描述

x=-30:.1:30;
N=1;
y=-2*pi*exp(-.2*sqrt((x.^2) / N))-exp((cos(2*pi*x) / N));
plot(x,y)
grid on

N=2的图像
在这里插入图片描述

x1=-30:.1:30;
x2=-30:.1:30;
N=2;
[x1,x2]=meshgrid(x1,x2);
y=-2*pi*exp(-.2*sqrt((x1.^2+x2.^2) / N))-exp((cos(2*pi*x1)+cos(2*pi*x2)) / N);
mesh(x1,x2,y)
grid on

前面两张图的函数中忘记加2pi了哈,没关系的,后面的图加上2pi,前面就不改了又没什么影响

试试N=10,matlab优化结果,右边栏目的参数都用的默认的,非常接近于自然指数e,最终的10个决策变量取值很多都是0是因为这里显示精度有限

在这里插入图片描述
画出收敛过程图,这和上图不对应,是另一次实验

在这里插入图片描述
函数定义代码

function y=func(x);
N=10;
y=-2*pi*exp(-.2*sqrt((x(1).^2+x(2).^2+x(3).^2+x(4).^2+x(5).^2+x(6).^2+x(7).^2+x(8).^2+x(9).^2+x(10).^2) / N))-exp((cos(2*pi*x(1))+cos(2*pi*x(2))+cos(2*pi*x(3))+cos(2*pi*x(4))+cos(2*pi*x(5))+cos(2*pi*x(6))+cos(2*pi*x(7))+cos(2*pi*x(8))+cos(2*pi*x(9))+cos(2*pi*x(10))) / N)+2*pi;

这篇关于遗传算法及其matlab实现(示例用python库geatpy,matlab遗传工具箱geatbx和lingo三种方式求解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

虚拟机与物理机的文件共享方式

《虚拟机与物理机的文件共享方式》文章介绍了如何在KaliLinux虚拟机中实现物理机文件夹的直接挂载,以便在虚拟机中方便地读取和使用物理机上的文件,通过设置和配置,可以实现临时挂载和永久挂载,并提供... 目录虚拟机与物理机的文件共享1 虚拟机设置2 验证Kali下分享文件夹功能是否启用3 创建挂载目录4

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交