Matlab遗传算法工具箱及应用

2023-11-14

目录

第一章:遗传算法概述

1.1遗传算法概念;
1.2遗传算法与爬山法的比较;
1.3遗传算法的基本原理与方法;

第二章:遗传算法应用举例

2.1简单一元函数优化实例;

参考资料:Matlab遗传算法工具箱及应用 主编:雷英杰 张善文 西安电子科技大学出版社
本文的实例均在Matlab r2016上实现

第一章:遗传算法概述

遗传算法概述:

遗传算法(Genetic Algorithm,GA)起源于对生物系统所进行的计算机模拟研究。美国Michigan大学的Holland教授及其学生受到生物模拟技术的启发,创造出了一种基于生物遗传和进化机制的适合于复杂系统优化的自适应概率优化技术——遗传算法。

1.1遗传算法概念:

生物的进化过程,主要是通过染色体之间的交叉和变异来完成的。遗传算法是模仿自然界生物进化机制的随机全局搜索和优化方法,其本质是一种高效、并行、全局搜索的办法,他能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应的控制搜索过程以求的最优解。遗传算法操作使用适者生存的原则,以潜在的解决方案种群中逐次产生一个近似最优的方案。
遗传算法是自然遗传学和计算机科学相互结合而成的新的计算方法,因此遗传算法中经常使用到自然进化的一些用语。
生物的遗传物质的主要载体是染色体,DNA是其中最主要的的遗传物质。复数个基因组成染色体,染色体中基因的位置称为基因座,基因所取的值叫做等位基因基因和基因座决定了染色体的特征,也就决定了生物个体的性质状态。染色体两种表现模式,即基因型和表现型。表现型是指生物个体所表现出来的性质状态,基因型指与表现型密切相关的基因组成
。同一种基因型的生物个体在不同的环境下可以有不同的表现型,也就是说,表现型是基因型和环境共同作用的结果
在计算机的遗传算法中,染色体通常对应的是一维的串结构数据,串上各个位置对应上述的基因座,各位置上的取值对应上述的等位基因,遗传算法处理的就是染色体,或者叫做基因型个体。一定数量的个体就组成了种群。各个个体对环境的适应程度叫做适应度。
执行遗传算法包含两个必要的操作,一个是表现型到基因型的转换,它把搜索空间中的参数或解转换成遗传空间中的染色体或个体,此过程称为编码;另一个是基因型到表现型的转换,称为译码。

1.2遗传算法与爬山法的比较:

爬山法是直接法、梯度法和Hessian法的统称。爬山法首先在最优解可能存在的地方选择一个初始点,然后通过分析目标函数的特性,由一个初始点移到一个新的点,然后再继续这个过程。爬山法的搜索过程是确定的,他通过产生一系列的点收敛到最优解(有时是局部最优),而遗传算法的搜索过程是随机的,它产生一系列随机个体构成种群。二者的主要差异归纳为如下两点:
(1)爬山法的初始点只有一个,由决策者给出,而遗传算法的初始点有很多个,是随机产生的。
(2)爬山法由上一个点产生一个新的点,而遗传算法是通过在当前种群中交叉、变异和选择产生下一代种群。

1.3遗传算法的基本原理与方法:

遗传算法的实现涉及六个主要因素:参数的编码,初始种群的设定,适应度函数的设计,遗传操作,算法控制参数的设定和约束条件的处理。
编码:
在遗传算法中,如何描述问题的可行解,即把一个问题的可行解从其解空间转换到遗传算法所能处理的搜索空间的转换方法就称为编码。遗传算法的编码就是解的遗传表示,它是遗传算法求解的第一步。
选择:
选择又称复制,是在种群中选择生命力强的个体产生新的群体的过程。遗传算法使用选择算子对群体的个体进行优胜劣汰的操作,根据每个个体的适应度值大小进行选择,适应度高的个体被遗传到下一代群体中的概率较大,适应度低的个体被遗传到下一代群体中的概率较小。这样就可以使群体中的个体的适应度不断接近最优解。轮盘赌选择法:这是一种随机选择方法,选择的方法是根据个体的适应度值,每个个体进入下一代的概率就是它的适应度值与整个种群中适应度值的和的比例,将每个个体的概率都画在圆盘上,随机拨动圆盘,当圆盘停止时,指针所指个体被选中。所以,适应度值越高,被遗传的概率就越大。
交叉:
在生物的自然进程中,两个同源染色体通过交配而重组,形成新的染色体,从而产生新的个体或物种。遗传算法中的交叉是指将个体的基因进行互换。一般来说交叉方法包括:单点交叉、两点交叉、多点交叉、均匀交叉等。
变异:
在生物的遗传和自然进化中,其细胞分裂复制环节,如二进制编码中,将0变成1,1变成0,从而形成一个新的染色体。使用变异的目的有两个:第一个是改善遗传算法的局部搜索能力。遗传算法的交叉算子已经从全局的角度出发找到了一些较好的个体编码结构,但仅使用交叉无法对搜索空间的细节进行局部搜索,若这时再使用变异,就可以提高局部搜索的能力。

第二章:遗传算法应用举例

2.1简单一元函数优化实例:

选择二进制编码,种群个体数目为40,每个个体的基因为20,使用代沟为0.9,最大遗传代数为25.利用遗传算法计算下面函数的最大值:

f(x) = xsin(10pi*x) + 2.0 x∈[-1,2]

[题目分析:]
首先应该利用Matlab画出目标函数的图像:
fplot(@(variable)variable.*sin(10.*pi.*variable)+2.0,[-1,2])
在这里插入图片描述
从图中可以大致看出最大值的横坐标在1.75~2之间,纵坐标>3.5
接下来使用遗传算法对这个函数求解最大值:
第一步是随机产生一个种群(应该包括种群个数,种群的染色体长度),按照题目要求,种群个体数目为40,也就是说在[-1,2]的范围内随机产生40个解的横坐标,题目指出每个个体的基因为20,选择二进制编码,也就是说把刚刚随机产生的这40个解每一个都用20位2进制数表示。
下图初始种群在目标函数上的分布图,红色的点就是随机产生的40个解的横坐标。(每一次的点都不一样,因为是随机的)
在这里插入图片描述
第二步是选择,将初始化种群中的个体(即上图的红点)按照适应度大小(这里的适应度大小是由初始化40个红点纵坐标的比较得来的,如上图,1.5-1.75之间的两个红点纵坐标最大,所以他们的对环境(也就是这道题目要求的求函数最大值)的适应度最大,1.25-1.5之间的那个红点纵坐标最小,所以它对环境的适应度最小,也就是说适应度是在本种群内,相比其他个体得到的一个适应度)进行选择,这里采用的是轮盘赌选择。
下图经过选择之后的个体的分布图,绿色的框就是从初始种群中根据适应度值选择出来的个解的横坐标。(我给的算法是只挑选了36个原种群表现好的个体,但是可以发现,图中绿色的框的个数小于36,并且初始种群中有些表现不是那么好的也被选中遗传到下一代,这是由于原始种群的有些个体被选择多次,这就体现了轮盘赌的随机性。)
在这里插入图片描述
第三步是交叉和变异。这里的交叉是指把上述选择的36个个体每两个之间(即绿色的框)进行基因互换(第一步中,将每个个体都用20位2进制数表示了,即每个个体都有20位基因),这里可以选用的交叉方式有多种。变异是指将种群中个体的某些位的值进行改变,这里就是将个体的某些位变为0或者是1.
下图蓝色经过被选中的个体交叉之后的个体的分布图,也就是说,经过交叉之后,种群个体就从红色点变为了蓝色的,可以看出解的横坐标的变化过程。为了方便后面更直观的看出解,后面我将将红色、绿色、蓝色**去除。变异后的个体如图黑色框部分。
在这里插入图片描述
在这里插入图片描述
可以看出这第一轮遗传之后,有个体已经向1.75-2之间那个最大值的范围迈进了。这个个体坐标为(1.8996,3.2048)。
上述过程是一轮遗传算法中解的变化。下面给出遗传25次的完整Matlab代码。
这段代码中有Matlab的一些内置函数,将先对这些函数进行说明。
种群创建函数:crtbp(NUM,GeneLength,Base) return matrix
入口参数:NUM:种群个体数,GeneLength:基因长度,Base:基因进制数,缺省为2进制
返回一个NUM×GeneLength的矩阵
二进制串到实值的转换:bs2rv(Chrom,FieldD) return a column vector
入口参数:Chrom二进制矩阵,也就是crtbp的返回值
FieldD:译码矩阵=[len,lb,ub,code,scale,lbin,ubin]
len:每个个体基因长度,lb,ub每个变量上下界,code=1,2进制编码,=0格雷编码,
scale=0,算术刻度,=1对数刻度,lbin,ubin=0,去掉边界
返回一个列向量,该向量的行数是Chrom的行数,也就是NUM
排序函数Ranking(Obj,Rfun) return a column vector ->得到适应度
入口参数:Obj:个体的表现,
Rfun:缺省为线性排序,从大到小,压差为2,此评定算法假设目标是最小化
种群选择个体函数Sel=Select(SEL_F,Chrom,FitV,GGAP) 从种群Chrom中选择优良个体,并返回到新种群Sel中
选择具有随机性,并不是按照适应度从大到小依次选择,
即每个个体被选中的次数随机,表现不好的也可能被选中,只是概率小一点
重插入子代到种群[Chrom,ObjVch] = reins(Chrom,Sel,1,InsOpt,ObjVch,ObjVsel)
返回插入子代后的种群以及对应子代的目标值
InsOpt是一个包含两个参数的向量。InsOpt[0]:=1表示基于适应度插入;=0为均匀选择
InsOpt[0]:为一[0,1]的常数,表示基于适应度插入 常数% 的子代
重组个体recombin(‘xovsp’,Sel,0.7) 对Sel种群中每两个个体进行单点交叉,只有70%可参与交叉
##################

figure(1);
fplot(@(variable)variable.*sin(10.*pi.*variable)+2.0,[-1,2])%画出函数
hold on;
PARENT = 40;%种群40
MAXGEN = 25;%遗传25代
GENELEN = 20;%每个个体的基因位数为20位
GGAP = 0.9;%每次只选择90%的个体    40×0.9=36
%用trace来保存每一代中最优个体的坐标,第一行存纵坐标,第二行存横坐标
trace = zeros(2,MAXGEN);
%译码矩阵,指明每个个体有20个基因,本题只有一个变量,该变量的下界=-1,上界=+2,包含边界,采用2进制编码
field = [20;-1;2;1;0;1;1];
%初始种群 包含PRRENT=40的个体 每个个体的基因长度为GENELEN,ctrbp是matlab内置函数
Pgroup = crtbp(PARENT,GENELEN);%这里返回一个40×20的矩阵,每个位置的值为0或1
%gen变量用来表示遗传第几代
gen = 0;
variable = bs2rv(Pgroup,field);%二进制串转实值,这里相当于把解的横坐标映射到[-1,2]的范围
obj = variable.* sin(10*pi* variable) + 2.0;%计算每个个体的纵坐标,也就是计算每个个体的表现
% plot(obj,variable,'r.');%红点画出初始种群
while gen <MAXGEN,
    %根据个体表现计算每个个体的适应度,ranking假设目标是最小,所以这里是-obj
    FitnV = ranking(-obj);
    %按照适应度从Pgroup种群中选择90%的表现好的子代,返回到Sel种群中,这时Sel应该是一个36×20的矩阵
    Sel = select('sus',Pgroup,FitnV,GGAP); 
    %对选择后的Sel种群中每两个个体进行单点交叉,只有70%可参与交叉
    Sel = recombin('xovsp',Sel,0.7);
    Sel = mut(Sel);%对交叉后的种群Sel进行变异,这里的Sel仍是一个36×20的矩阵
    variable2 = bs2rv(Sel,field);%二进制串到实值的转换,将变异后的子代映射到[-1,2]的范围
    obj2 = variable2.* sin(10*pi* variable2) + 2.0;%计算每个子代的表现,即纵坐标
    %将子代插入父代,按照适应度将子代的36个替代原种群40个表现不好的个体
    [Pgroup,obj]=reins(Pgroup,Sel,1,1,obj,obj2);
    gen = gen+1;
    [Y,I] = max(obj) ;
    %将本代中表现最好的个体的横纵坐标保存在trace矩阵中
    trace(1,gen) = max(obj) ;
    trace(2,gen) = sum(obj)/length(obj) ;
end
 variable = bs2rv(Pgroup,field);
 plot(variable,obj,'k.');
 figure(2);
 plot(trace(1,:));
 figure(3);
 plot(trace(2,:),'-.');

####################
figure1是25代之后,个体的一个分布图,figure2是种群每一代最好的解的一个变化
在这里插入图片描述
在这里插入图片描述
如果将遗传代数MAXGEN改为50,重新得到figure1,figure2,明显看出最优解收敛了。
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab遗传算法工具箱及应用 的相关文章

  • MATLAB 在 MATLAB 7.10.0 学生版中似乎找不到 csaps()

    我有一些代码使用csaps Matlab的三次平滑样条拟合函数 http www mathworks com help toolbox curvefit csaps html我想将其提供给使用 MATLAB 7 10 0 R2010a 的学
  • MATLAB 是否已有 YAML 库/解析器?

    我想使用 YAML 跨多种语言交流一些数据 将其视为 与语言无关的序列化 其中一种语言是 MATLAB 但我似乎找不到该语言的 YAML 库 我在 Google 上检查了 matlab yaml 和 matlab yaml parse 似乎
  • 将输出从符号数学 (sym) 转换为浮点型

    我的问题类似于这个问题 https stackoverflow com questions 11114101 how to convert mupad symbol i sqrt 1 to i in matlab 11114959 1111
  • Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

    我想对 vs2008 和 matlab2007b 使用 mex 类型 我尝试了下面的代码 include
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 在 C/C++ 中调用 MATLAB API

    我刚刚从某处听说 对于数值计算 MATLAB 确实提供了一些用户友好的 API 如果你在 C C 代码中调用这些 API 你可以显着加快计算速度 但我在MATLAB文档中没有找到这样的信息 例如http www mathworks com
  • 白色像素簇提取

    我正在研究指纹毛孔提取项目 并陷入毛孔 白色像素簇 提取的最后阶段 我有两个输出图像 我们可以从中获取毛孔 但不知道该怎么做 这两个图像的尺寸不同 image1 的尺寸为 240 320 image2 的尺寸为 230 310 这是我的图像
  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • 如何从绘图处理程序中绘图?

    我有绘图的处理程序或图形的处理程序 例子 h plot 1 0 2 10 xx get h xx DisplayName Annotation 1x1 handle Color 0 0 1 LineStyle LineWidth 0 500
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • 作为动画的八度情节点

    我有以下八度脚本 TOTAL POINTS 100 figure 1 for i 1 TOTAL POINTS randX rand 1 randY rand 1 scatter randX randY hold on endfor 当我运
  • 为什么 MATLAB 在打印大量 (.png) 图形时速度会变慢?

    我正在将大量数字打印为 png 文件 每个图都是数据矩阵中的一列图 我获取 png 文件并将它们串在一起形成动画 我的问题是 前几百张图像打印得很快 但创建每个新图形的时间却迅速增加 从前几百个 png 文件的约 0 2 秒到第 800 个
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • 在Matlab中选择图像上的像素时,索引指的是什么?

    当在Matlab中查看图像的单个像素时 该索引指的是什么 X Y 指的是像素的坐标 RGB 指的是颜色 但是关于索引是什么有什么想法吗 为了澄清一下 当我在 Matlab 中查看图形并使用数据光标选择一个点时 显示的三行是 X Y 指数 R
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • Matlab颜色检测

    我试图一致地检测同一场景的图像之间的某种颜色 这个想法是根据颜色配置文件识别一组对象 因此 例如 如果给我一个带有绿色球的场景 并且我选择绿色作为我的调色板的一部分 我想要一个具有反映它检测到球的矩阵的函数 任何人都可以为这个项目推荐一些
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 如何在Matlab中绘制网络?

    我有一个矩阵AMatlab中的维数mx2每行包含两个节点的标签 显示网络中的直接链接 例如 如果网络有4矩阵的节点A可能A 1 2 1 3 2 1 2 4 3 2 4 1 4 2 其中第一行表示有一个链接来自1 to 2 第二行表示有一个链

随机推荐

  • 记录错误:FileNotFoundError: [WinError 3] 系统找不到指定的路径。: ‘E:\\CV_Paper_fuxian\\lesson\\B_VGG\\..\\Data\\tra

    撸代码发现错误 FileNotFoundError WinError 3 系统找不到指定的路径 E CV Paper fuxian lesson B VGG Data train 经过检查发现 是系统内文件夹名称设置错误 如果出现这样的错误
  • new与malloc

    1 属性 new delete是c 运算符 关键字 需要编译器支持 malloc free是库函数 需要头文件支持 2 参数 使用new操作符申请内存分配时无需指定内存块的大小 编译器会根据类型信息自行计算 而malloc需要显示的指出所需
  • java/php/net/python家庭财务管理系统设计

    本系统带文档lw万字以上 答辩PPT 查重 如果这个题目不合适 可以去我上传的资源里面找题目 找不到的话 评论留下题目 或者站内私信我 有时间看到机会给您发 管理员用例图 系统中的核心家庭是系统管理员 管理员登录后 通过管理员菜单来管理后台
  • 03. HTTP协议

    目录 HTTP协议 基本概念 请求 响应 请求头中最常见的 些重要内容 爬虫需要 响应头中 些重要的内容 请求方式 总结 HTTP协议 基本概念 协议 就是两个计算机之间为了能够流畅的进行沟通而设置的 个君子协定 常见的协议有TCP IP
  • firefly的使用

    https github com 9miao Firefly gitpython setup py install firefly admin py createproject myproject 就可以创建一个新的工程了 转载于 http
  • mac os 安装metasploit v5.0.23(msf)

    安装metasploit git clone https github com rapid7 metasploit framework git cd metasploit framework msfconsole 执行上面的命令时 报如下错
  • 台式机常见问题汇总

    1 第一步 必须安装硬盘 硬盘安装在中间 否则安装电源后 硬盘不好安装了 2 第二步 检查台式机的数据线 应该是给足的 3 开机启动后 电脑吱吱响 后来找到原因 硬盘四个固定角没有固定好 所以转起来震动噪音 4 硬盘安装时 用的螺丝是接触面
  • 太空狼人杀(Among US)只能QuickChat 更改年龄限制达到可以Free To chat方法

    Among us 不能自由聊天的解决方法 对于年龄数据被上传到服务器的账号 可能不适用 1 进入 C Users 你的账户名 AppData LocalLow InnerSloth Among Us playerPrefs 如果看不到App
  • centos 安装alien

    出处 http linux4you in install netapp oncommand system manger on centos 1 在root权限下执行命令 sudo su 2 安装alien需要的依赖包 yum y insta
  • springmvc源码学习(二十七)异步任务超时异常的执行流程

    目录 前言 一 示例 二 源码分析 总结 前言 本文分析异步任务出现超时及异常的情况时的处理流程 一 示例 设置超时时间为2s 但任务需要执行10s ApiOperation value test notes test GetMapping
  • zsh + oh-my-zsh 主题预览

    The Themes robbyrussell the default that Robby uses The rest of the themes in alphabetical order af magic afowler agnost
  • 区块链技术之哈希指针

    hello 大家好 我们第三期的区块链技术分享来啦 那么话不多说 我们开始吧 提起区块链 大家可能都会提到 不可篡改 但是为什么区块链不可篡改呢 先给出答案 这与区块链的数据结构哈希指针和默克尔树有关 那么我们今天先分享哈希指针相关的内容
  • cron linux_如何在Linux中使用cron

    cron linux 本文最初发布于2017年11月 现已更新以包含其他信息 成为系统管理员的挑战 其中有很多优点 之一是当您想睡觉时正在运行任务 例如 某些任务 包括定期重复执行的任务 需要在没有人使用计算机资源的情况下通宵运行或在周末运
  • 211和985区别:

    985工程 是在 211工程 的基础上 根据我国国防 民用 东 中 西部协调发展的原则而筛选出来的
  • 获取网页的html文本(用selenium+chrome headless进行js异步加载内容),返回BeautifulSoup的soup对象

    import requests from bs4 import BeautifulSoup from selenium import webdriver def gethtml url js False if js False return
  • 1.代码片断收集-数据拷贝效率问题

    上面是我创建的群聊 欢迎新朋友的加入 1 基本信息 mycode 收录一些简单的代码片段 Gitee com 克隆链接 mycode 收录一些简单的代码片段 目的 记录和收集一些常用的代码片段 同时也欢迎网友提交push申请 共同完善 开发
  • 05C++11多线程编程之使用正确的共享代码案例引入互斥量mutex的概念、用法

    05C 11多线程编程之使用正确的共享代码案例引入互斥量mutex的概念 用法 1 共享代码案例概念分析 1 网络游戏服务器 两个自己创建的线程 一个线程收集玩家命令 一个数字代表玩家发来的命令 并把命令写到一个队列中 另外一个线程从队列中
  • 基于pytorch的无需分割字符的车牌识别

    传统车牌识别 传统的车牌识别需要先检测出车牌 检测出车牌后通过 像素映射 或者 联通区查找 的方法分割出单个的文字 然后单独识别每个文字 传统的车牌识别不仅繁琐 而且切割文字的效果也很难令人满意 因此 能不能绕开字符分割的问题 直接识别车牌
  • 系分 - 系统安全分析与设计

    个人总结 仅供参考 欢迎加好友一起讨论 文章目录 系分 系统安全分析与设计 考点摘要 对称加密 非对称加密 信息摘要 数字签名 数字证书 数字信封 PKI公钥体系 网络安全 安全协议 网络安全 网络威胁与攻击 防火墙 功能 防火墙 分类 防
  • Matlab遗传算法工具箱及应用

    目录 第一章 遗传算法概述 1 1遗传算法概念 1 2遗传算法与爬山法的比较 1 3遗传算法的基本原理与方法 第二章 遗传算法应用举例 2 1简单一元函数优化实例 参考资料 Matlab遗传算法工具箱及应用 主编 雷英杰 张善文 西安电子科