前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >遗传算法(二)

遗传算法(二)

作者头像
巴山学长
发布2019-07-15 16:18:34
1.1K0
发布2019-07-15 16:18:34
举报
文章被收录于专栏:巴山学长

本文作者:南海一号

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

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

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

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

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

代码语言:javascript
复制
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')

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

代码语言:javascript
复制
%% 定义遗传算法参数
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”。

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

代码语言:javascript
复制
%% 优化
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 巴山学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档