遗传算法理解

遗传算法的具体步骤将在下面介绍,前面先介绍工具箱安装和常用函数。

遗传工具箱算法安装

此处提供matlab遗传算法工具箱下载链接
下载链接提取码:guwt
下载压缩包后,解压,然后copy到matlab安装目录下的toolbox目录下
在这里插入图片描述
然后打开matlab点击设置路径选项(此处使用matlab2020a)
在这里插入图片描述
在弹出的界面点击添加并包含子文件夹,选择刚刚拷贝到matlab安装目录下的toolbox文件夹中的文件夹。然后点击确定,保存。
在这里插入图片描述
至此遗传算法工具箱安装完成。然后再matlab命令行输入crtbp(),如果出现下午所示的提示,则说明安装成功。(crtbp()是遗传算法工具箱中的函数,出现下面的提示,则说明matlab可以调用工具箱的函数,代表已经安装成功)
在这里插入图片描述

遗传算法工具箱结构

在这里插入图片描述在这里插入图片描述

遗传算法常用函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

遗传算法的整体思想是模拟自然界生物的“物竞天择,适者生存”规律的。下面先演示一个用遗传算法求解二元函数最大值的例子,然后再结合例子具体说明遗传算法的思想。

例子

求函数 g ( x , y ) = y ∗ s i n ( 2 π x ) + x ∗ c o s ( 2 π y ) , x ∈ [ − 2 , 2 ] , y ∈ [ − 2 , 2 ] g(x,y)=y*sin(2\pi x)+x*cos(2\pi y) ,x\in[-2,2],y\in[-2,2] g(x,y)=ysin(2πx)+xcos(2πy)x[2,2],y[2,2]的最大值

clc
clear all
figure(1);
lbx=-2;ubx=2;
lby=-2;uby=2;
ezmesh('y*sin(2*pi*x)+x*cos(2*pi*y)',[lbx,ubx,lby,uby],50);
hold on;
NIND=100;
MAXGEN=10000;
PRECI=20;
GGAP=0.95;
px=0.7;
pm=0.01;
trace=zeros(3,MAXGEN);
FieldD=[PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1];%fieldD矩阵为译码矩阵
%FieldD=[len lb ub code scale lbin rbin]
%len:chrom中每个字串的长度
%lb和ub分别是每个变量的上界和下界
%code指明子串是如何编码的,1为标准二进制,0为格雷码
%scale:指明每个子串所使用的刻度,0为算数刻度,1为对数刻度
%lbin和ubin指明表示范围中是否包含边界,0表示不包含边界,1表示包含边界

chrom=crtbp(NIND,PRECI*2);
gen=0;
xy=bs2rv(chrom,FieldD);
x=xy(:,1); 
y=xy(:,2);
objv=y.*sin(2*pi*x)+x.*cos(2*pi*y);
while gen<MAXGEN
    fitv=ranking(-objv);
    selch=select('sus',chrom,fitv,GGAP);
    selch=recombin('xovsp',selch,px);
    selch=mut(selch,pm);
    xy=bs2rv(selch,FieldD);
    x=xy(:,1);y=xy(:,2);
    objvsel=y.*sin(2*pi*x)+x.*cos(2*pi*y);
    [chrom,objv]=reins(chrom,selch,1,1,objv,objvsel);
    xy=bs2rv(chrom,FieldD);
    gen=gen+1;
    [y,i]=min(objv);
    trace(1:2,gen)=xy(i,:);
    trace(3,gen)=y;
end
plot3(trace(1,:),trace(2,:),trace(3,:),'bo');
grid on;
plot3(xy(:,1),xy(:,2),objv,'bo');
hold off;
figure(2);
plot(1:MAXGEN,trace(3,:));
grid on;
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
bestz=trace(3,end);
bestx=trace(1,end);
besty=trace(2,end);
fprintf(['最优解:\nx=',num2str(bestx),'\ny=',num2str(besty),'\nz=',num2str(bestz),'\n'])

运行结果

在这里插入图片描述

遗传算法步骤介绍

下面将结合上面求解2元函数的最值的例子类比着介绍遗传算法的步骤。
1、编码
先把解空间中数据点进行编码(编码方式可以是二进制编码也可以是格雷码编码)。就本例来说,我们要求解二元函数在[-2,2]区间内的最值,就先要分别要对x和y进行编码,此处我们采用二进制编码方式,为了提高精度,我采用了20位的二进制编码,也就是把[-2,2]这个区间分割为 2 20 2^{20} 220等分,分割出的小区间的端点都代表着一个20位的二进制数,我们有x和y两个值需编码,因此总的基因长度就是40。x和y的二进制表达为基因型,十进制为表现型。基因型(二进制)可以通过bs2rv函数转换为表现型(十进制)。

lbx=-2;ubx=2;
lby=-2;uby=2;
PRECI=20;
FieldD=[PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1];
%fieldD矩阵为译码矩阵
%FieldD=[len lb ub code scale lbin rbin]
%len:chrom中每个字串的长度
%lb和ub分别是每个变量的上界和下界
%code指明子串是如何编码的,1为标准二进制,0为格雷码
%scale:指明每个子串所使用的刻度,0为算数刻度,1为对数刻度
%lbin和ubin指明表示范围中是否包含边界,0表示不包含边界,1表示包含边界

2、初始化群体
随机产生N个初始个体,这N个个体就构成了一个种群。遗传算法就以这N个个体开始进行进化。就本例来说,我们随机取出N个点作为初始的点,然后从这些点开始进化。

chrom=crtbp(NIND,PRECI*2);

3、适应度评估
用来表明每个个体的优劣性。不同的问题,适应函数不同(在有些文献中,适应函数和叫做目标函数)。在本例中,我们的目的是求函数的最值,所以我们要先计算出我们种群中每个点对应的函数值。然后再调用适应度分配函数来根据函数值分配适应度,我们使用rank函数的第一种形式,也就是根据函数值从小到大进行排序。
4、选择
选择的目的是中种群中选出优良的个体,让他们有机会作为父代,可以繁殖下一代子孙。一般要求适应度较高的个体将有更多的机会遗传到下一代群体中。
5、交叉
交叉运算是遗传算法中产生新个体的主要操作过程,它以某一概率相互交换某两个个体之间的部分染色体。
6、变异
以一定的概率随机的改变某个的值,一般会把变异的几率取得很小。

下面放一篇认为介绍的比较好的博文。
非常好的理解遗传算法的例子

如果把遗传算法用在系统辨识方面,那他的整体思想就是,辨识参数就是所谓的个体,把我们采集到的数据带入到辨识公式,然后不断的进化,找到一个使得估计值和测量值很接近的个体,那这个个体就是我们要辨识的参数了。
利用遗传算法进行系统辨识和最小二乘法的区别在于:
1、遗传算法是把所有采集到的数据点都带入目标函数来验证个体是否符合我们的要求,如果不满足条件,则继续进化,直到在解空间找到满足我们要求的解。一次最小二乘法是把所有的采集数据,只进行一次计算就得出我们要辨识的参数。递归最小二乘是每次取一个测量数据,然后计算出一个辨识结果,下一次的辨识结果=上一次的辨识结果+修正因子*(下一次的测量结果-上一次的辨识结果)。加入遗忘因子的递归最小二乘辨识是削弱了过去的辨识结果对现在结果的影响。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值