专栏首页matlab爱好者遗传算法(二)

遗传算法(二)

本文作者:南海一号

在上一节中我给大家讲解了如何安装遗传算法工具箱,并给出了代码,今天我就给大家讲解一下如何使用工具箱,并且讲解一下遗传算法的使用。还是按照上次的代码。

如果有同学还没有上一次的代码,或者不会安装遗传算法工具箱。请回到上一节

遗传算法工具箱安装(一)

简单介绍一下遗传算法原理,遗传算法用到的是生物进化的原理。物竞天者,适者生存。只有更优的解才能在下一代中留下来。在数字计算中,自变量的数据都是用二进制表示的,因为二进制特别长,而且只有0和1两个数字。非常类似于DNA的结构。容易实现“基因突变,交叉互换,交配”等等操作。这些操作的作用就是产生新解(并要求新解遗传了父母辈的一些基因)。

这道优化题是要求解y=sin(10*pi*x)/x在一到二之间的最小值。本来这道题可以用求导的方法求解出来,但我们以此为例题,讲解一下遗传算法。

clc
clear all
close all
%% 画出函数图
figure(1);
hold on;
lb=1;ub=2; %函数自变量范围【1,2】
ezplot('sin(10*pi*X)/X',[lb,ub]);   %画出函数曲线
xlabel('自变量/X')
ylabel('函数值/Y')

第一步没什么好说的,就是简单的画出函数的曲线,限定函数的自变量范围。

%% 定义遗传算法参数
NIND=40;        %个体数目
MAXGEN=20;      %最大遗传代数
PRECI=20;       %变量的二进制位数
GGAP=0.95;      %代沟
px=0.7;         %交叉概率
pm=0.01;        %变异概率
trace=zeros(2,MAXGEN);                        %寻优结果的初始值
FieldD=[PRECI;lb;ub;1;0;1;1];                      %区域描述器
Chrom=crtbp(NIND,PRECI);                      %初始种群

这一步定义遗传算法的一些参数。NIND=40。代表的是这个地区只能容纳40个个体。如果产生的子代多于这个数,那些差的子代就会被淘汰掉。这就是“进化”的关键,要有生存竞争要有淘汰。

MAXGEN代表最大的遗传代数,表示遗传多少代以后停止,这个值当然越大越好。但是太大就会使程序运行事件变长。

PRECI代表变量的二进制位数,这就是“基因”,非常像染色体。表示的就是自变量x。其实简单的来说。x就是“生物”的“基因”,y就是“生物”的“性状”。基因是影响生物性状的关键。我们是对x的二进制码进行变异,交配等等操作。

Chrom=crtbp(NIND,PRECI)产生初始种群,我给大家看一看

这就是40个初始个体的基因状况,20代表他们的“DNA”。

下面就是优化的具体过程。

%% 优化
gen=0;                                  %代计数器
X=bs2rv(Chrom,FieldD);                 %计算初始种群的十进制转换
ObjV=sin(10*pi*X)./X;        %计算目标函数值
while gen<MAXGEN
   FitnV=ranking(ObjV);                               %分配适应度值
   SelCh=select('sus',Chrom,FitnV,GGAP);              %选择
   SelCh=recombin('xovsp',SelCh,px);                  %重组
   SelCh=mut(SelCh,pm);                               %变异
   X=bs2rv(SelCh,FieldD);               %子代个体的十进制转换
   ObjVSel=sin(10*pi*X)./X;             %计算子代的目标函数值
   [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群
   X=bs2rv(Chrom,FieldD);
   gen=gen+1;                                             %代计数器增加
   %获取每代的最优解及其序号,Y为最优解,I为个体的序号
   [Y,I]=min(ObjV);
   trace(1,gen)=X(I);                            %记下每代的最优值
   trace(2,gen)=Y;                               %记下每代的最优值
end

里面有很多乱七八糟的十进制二进制转化,大家可能不明白什么意思,简单的说,进行“交配,变异,交叉互换”的时候要用二进制。但是要计算函数值,也就是又基因显示性状的时候,就需要转化为十进制。简单的理解,二进制主导遗传过程,十进制主导“生长”过程。

大家多看看代码的注释,就能明白了。

其余的一些算法,代码注释很明白。就不再多讲了。大家有什么不懂的可以后台留言。

引用文献:MATLAB智能算法30个案例分析

图片来源:https://pixabay.com

本文分享自微信公众号 - matlab爱好者(matlabaihaozhe),作者:matlab爱好者

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你了解matlab局部函数吗?

    什么是局部函数呢?局部函数就是在某个局部范围内起作用的函数,超出作用范围,将不能被使用。通过添加局部函数,可以避免创建和管理单独的函数文件,可使代码编写一气呵成...

    艾木樨
  • Matlab 自定义函数初讲

    在Matalb中使用函数可以把一个较大的任务分解为多个较小的任务,我这个Big project就是由个数多到我都不愿意看的一个个子函数构成的。每个子函数完成特定...

    艾木樨
  • matlab常用函数

    感谢大家关注matlab爱好者,今天给大家介绍一下matlab编程中常用的函数。在聊天栏中回复“005”或“函数”即可快速获取本视频。在腾讯视频搜索“matla...

    艾木樨
  • R开发:常用R语言包介绍

    r与python差异比较大的一个地方就是,python的机器学习算法集中程度比较高,比如sklearn,就集成了很多的算法,而R语言更多时候需要一个包一个包去了...

    sladesal
  • Raft 算法原理及其在 CMQ 中的应用(下)

    Raft 算法是一种分布式一致性算法。与 paxos 相比,它更易理解和工程化。我们完整实现了该算法并将其应用在自研的高可靠消息中间件 CMQ 中,同时沉淀出对...

    腾讯云中间件团队
  • 微信小程序 wxs 使用正则替换字符串

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    叉叉敌
  • 4个简单的数据管理技巧

    它发生在我们所有人身上,你会收到新的A/B测试结果和需要验证的数据。或者你将最新漏斗分析转化到一个数据应用中,这样就可以不断地收获你努力工作带来的好处。当在检查...

    CSDN技术头条
  • VR射击游戏《Wanted Killer VR》丨论刚枪本领,俺怕过谁!

    近日,开发商Playsnak推出一款VR射击游戏——《Wanted Killer VR》。据悉,该游戏是以20世纪80年代为背景,画面风格会让人联想到《无主之地...

    VRPinea
  • Python进阶教程001内置数据类型

    关于Python的基础知识已经告一段落了,我们接下来深入的研究Python的使用方法,以及以后将要使用到的类库。

    Happy、Liu
  • [计算机视觉论文速递] 2018-03-03

    通知:这篇推文很长,有32篇论文速递信息,涉及目标检测、图像分割、网络优化、人脸表情识别、SLAM和OCR等方向。 [1]《The 2018 DAVIS Cha...

    Amusi

扫码关注云+社区

领取腾讯云代金券