本文作者:南海一号
在上一节中我给大家讲解了如何安装遗传算法工具箱,并给出了代码,今天我就给大家讲解一下如何使用工具箱,并且讲解一下遗传算法的使用。还是按照上次的代码。
如果有同学还没有上一次的代码,或者不会安装遗传算法工具箱。请回到上一节
简单介绍一下遗传算法原理,遗传算法用到的是生物进化的原理。物竞天者,适者生存。只有更优的解才能在下一代中留下来。在数字计算中,自变量的数据都是用二进制表示的,因为二进制特别长,而且只有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